diff options
Diffstat (limited to 'cmake/QtBuildInformation.cmake')
-rw-r--r-- | cmake/QtBuildInformation.cmake | 186 |
1 files changed, 167 insertions, 19 deletions
diff --git a/cmake/QtBuildInformation.cmake b/cmake/QtBuildInformation.cmake index a3adf81094..11fa9996b1 100644 --- a/cmake/QtBuildInformation.cmake +++ b/cmake/QtBuildInformation.cmake @@ -1,5 +1,32 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +function(qt_internal_set_message_log_level out_var) + # Decide whether output should be verbose or not. + # Default to verbose (--log-level=STATUS) in a developer-build and + # non-verbose (--log-level=NOTICE) otherwise. + # If a custom CMAKE_MESSAGE_LOG_LEVEL was specified, it takes priority. + # Passing an explicit --log-level=Foo has the highest priority. + if(NOT CMAKE_MESSAGE_LOG_LEVEL) + if(FEATURE_developer_build OR QT_FEATURE_developer_build) + set(CMAKE_MESSAGE_LOG_LEVEL "STATUS") + else() + set(CMAKE_MESSAGE_LOG_LEVEL "NOTICE") + endif() + set(${out_var} "${CMAKE_MESSAGE_LOG_LEVEL}" PARENT_SCOPE) + endif() +endfunction() + function(qt_print_feature_summary) - include(FeatureSummary) + if(QT_SUPERBUILD) + qt_internal_set_message_log_level(message_log_level) + if(message_log_level) + # In a top-level build, ensure that the feature_summary is affected by the + # selected log-level. + set(CMAKE_MESSAGE_LOG_LEVEL "${message_log_level}") + endif() + endif() + # Show which packages were found. feature_summary(INCLUDE_QUIET_PACKAGES WHAT PACKAGES_FOUND @@ -8,17 +35,43 @@ function(qt_print_feature_summary) OPTIONAL_PACKAGES_NOT_FOUND RUNTIME_PACKAGES_NOT_FOUND FATAL_ON_MISSING_REQUIRED_PACKAGES) + qt_internal_run_additional_summary_checks() qt_configure_print_summary() endfunction() +function(qt_internal_run_additional_summary_checks) + get_property( + rpath_workaround_enabled + GLOBAL PROPERTY _qt_internal_staging_prefix_build_rpath_workaround) + if(rpath_workaround_enabled) + set(message + "Due to CMAKE_STAGING_PREFIX usage and an unfixed CMake bug, + to ensure correct build time rpaths, directory-level install + rules like ninja src/gui/install will not work. + Check QTBUG-102592 for further details.") + qt_configure_add_report_entry( + TYPE NOTE + MESSAGE "${message}" + ) + endif() +endfunction() + function(qt_print_build_instructions) if((NOT PROJECT_NAME STREQUAL "QtBase" AND - NOT PROJECT_NAME STREQUAL "Qt") OR - QT_BUILD_STANDALONE_TESTS) + NOT PROJECT_NAME STREQUAL "Qt") OR QT_INTERNAL_BUILD_STANDALONE_PARTS) return() endif() + if(QT_SUPERBUILD) + qt_internal_set_message_log_level(message_log_level) + if(message_log_level) + # In a top-level build, ensure that qt_print_build_instructions is affected by the + # selected log-level. + set(CMAKE_MESSAGE_LOG_LEVEL "${message_log_level}") + endif() + endif() + set(build_command "cmake --build . --parallel") set(install_command "cmake --install .") @@ -38,18 +91,63 @@ function(qt_print_build_instructions) set(local_install_prefix "${CMAKE_STAGING_PREFIX}") endif() - message("Qt is now configured for building. Just run '${build_command}'\n") + set(msg "\n") + + list(APPEND msg "Qt is now configured for building. Just run '${build_command}'\n") if(QT_WILL_INSTALL) - message("Once everything is built, you must run '${install_command}'") - message("Qt will be installed into '${CMAKE_INSTALL_PREFIX}'") + list(APPEND msg "Once everything is built, you must run '${install_command}'") + list(APPEND msg "Qt will be installed into '${CMAKE_INSTALL_PREFIX}'") else() - message("Once everything is built, Qt is installed. You should NOT run '${install_command}'") - message("Note that this build cannot be deployed to other machines or devices.") + list(APPEND msg + "Once everything is built, Qt is installed. You should NOT run '${install_command}'") + list(APPEND msg + "Note that this build cannot be deployed to other machines or devices.") endif() - message("\nTo configure and build other Qt modules, you can use the following convenience script: + list(APPEND msg + "\nTo configure and build other Qt modules, you can use the following convenience script: ${local_install_prefix}/${INSTALL_BINDIR}/${configure_module_command}") - message("\nIf reconfiguration fails for some reason, try to remove 'CMakeCache.txt' \ -from the build directory \n") + list(APPEND msg "\nIf reconfiguration fails for some reason, try removing 'CMakeCache.txt' \ +from the build directory") + if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.24") + list(APPEND msg "Alternatively, you can add the --fresh flag to your CMake flags.\n") + else() + list(APPEND msg "\n") + endif() + + list(JOIN msg "\n" msg) + + if(NOT QT_INTERNAL_BUILD_INSTRUCTIONS_SHOWN) + qt_configure_print_build_instructions_helper("${msg}") + endif() + + set(QT_INTERNAL_BUILD_INSTRUCTIONS_SHOWN "TRUE" CACHE STRING "" FORCE) + + if(QT_SUPERBUILD) + qt_internal_save_previously_visited_packages() + endif() +endfunction() + +function(qt_configure_print_summary_helper summary_reports force_show) + # We force show the summary by temporarily (within the scope of the function) resetting the + # current log level. + if(force_show) + set(CMAKE_MESSAGE_LOG_LEVEL "STATUS") + + # Need 2 flushes to ensure no interleaved input is printed due to a mix of message(STATUS) + # and message(NOTICE) calls. + execute_process(COMMAND ${CMAKE_COMMAND} -E echo " ") + + message(STATUS "Configure summary:\n${summary_reports}") + + execute_process(COMMAND ${CMAKE_COMMAND} -E echo " ") + endif() +endfunction() + +function(qt_configure_print_build_instructions_helper msg) + # We want to ensure build instructions are always shown the first time, regardless of the + # current log level. + set(CMAKE_MESSAGE_LOG_LEVEL "STATUS") + message(STATUS "${msg}") endfunction() function(qt_configure_print_summary) @@ -58,11 +156,53 @@ function(qt_configure_print_summary) set(summary_file "${CMAKE_BINARY_DIR}/config.summary") file(WRITE "${summary_file}" "") - # Show Qt-specific configure summary and any notes, wranings, etc. + + get_property(features_possibly_changed GLOBAL PROPERTY _qt_dirty_build) + + # Show Qt-specific configuration summary. if(__qt_configure_reports) - message("Configure summary:\n${__qt_configure_reports}") + # The summary will only be printed for log level STATUS or above. + # Check whether the log level is sufficient for printing the summary. + set(log_level_sufficient_for_printed_summary TRUE) + if(CMAKE_VERSION GREATER_EQUAL "3.25") + cmake_language(GET_MESSAGE_LOG_LEVEL log_level) + set(sufficient_log_levels STATUS VERBOSE DEBUG TRACE) + if(NOT log_level IN_LIST sufficient_log_levels) + set(log_level_sufficient_for_printed_summary FALSE) + endif() + endif() + + # We want to show the configuration summary file and log level message only on + # first configuration or when we detect a feature change, to keep most + # reconfiguration output as quiet as possible. + # Currently feature change detection is not entirely reliable. + if(log_level_sufficient_for_printed_summary + AND (NOT QT_INTERNAL_SUMMARY_INSTRUCTIONS_SHOWN OR features_possibly_changed)) + set(force_show_summary TRUE) + message( + "\n" + "-- Configuration summary shown below. It has also been written to" + " ${CMAKE_BINARY_DIR}/config.summary") + message( + "-- Configure with --log-level=STATUS or higher to increase " + "CMake's message verbosity. " + "The log level does not persist across reconfigurations.") + else() + set(force_show_summary FALSE) + message( + "\n" + "-- Configuration summary has been written to" + " ${CMAKE_BINARY_DIR}/config.summary") + endif() + + qt_configure_print_summary_helper( + "${__qt_configure_reports}" + ${force_show_summary}) + file(APPEND "${summary_file}" "${__qt_configure_reports}") endif() + + # Show Qt specific notes, warnings, errors. if(__qt_configure_notes) message("${__qt_configure_notes}") file(APPEND "${summary_file}" "${__qt_configure_notes}") @@ -80,6 +220,7 @@ function(qt_configure_print_summary) message(FATAL_ERROR "Check the configuration messages for an error that has occurred.") endif() file(APPEND "${summary_file}" "\n") + set(QT_INTERNAL_SUMMARY_INSTRUCTIONS_SHOWN "TRUE" CACHE STRING "" FORCE) endfunction() # Takes a list of arguments, and saves them to be evaluated at the end of the configuration @@ -198,9 +339,11 @@ function(qt_configure_add_summary_entry) endfunction() function(qt_configure_process_add_summary_entry) - qt_parse_all_arguments(arg "qt_configure_add_summary_entry" + cmake_parse_arguments(PARSE_ARGV 0 arg "" - "ARGS;TYPE;MESSAGE" "CONDITION" ${ARGN}) + "ARGS;TYPE;MESSAGE" + "CONDITION") + _qt_internal_validate_all_args_are_parsed(arg) if(NOT arg_TYPE) set(arg_TYPE "feature") @@ -357,8 +500,11 @@ function(qt_configure_add_summary_section) endfunction() function(qt_configure_process_add_summary_section) - qt_parse_all_arguments(arg "qt_configure_add_summary_section" - "" "NAME" "" ${ARGN}) + cmake_parse_arguments(PARSE_ARGV 0 arg + "" + "NAME" + "") + _qt_internal_validate_all_args_are_parsed(arg) qt_configure_add_report("${__qt_configure_indent}${arg_NAME}:") if(NOT DEFINED __qt_configure_indent) @@ -390,9 +536,11 @@ function(qt_configure_add_report_error error) endfunction() function(qt_configure_process_add_report_entry) - qt_parse_all_arguments(arg "qt_configure_add_report_entry" + cmake_parse_arguments(PARSE_ARGV 0 arg "" - "TYPE;MESSAGE" "CONDITION" ${ARGN}) + "TYPE;MESSAGE" + "CONDITION") + _qt_internal_validate_all_args_are_parsed(arg) set(possible_types NOTE WARNING ERROR FATAL_ERROR) if(NOT "${arg_TYPE}" IN_LIST possible_types) |