diff options
Diffstat (limited to 'cmake')
-rw-r--r-- | cmake/QtBuildInternals/QtBuildInternalsConfig.cmake | 2 | ||||
-rw-r--r-- | cmake/QtCompilerOptimization.cmake | 54 | ||||
-rw-r--r-- | cmake/QtFlagHandlingHelpers.cmake | 160 |
3 files changed, 216 insertions, 0 deletions
diff --git a/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake b/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake index 9c5a2633d2..3c8692a903 100644 --- a/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake +++ b/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake @@ -179,6 +179,8 @@ macro(qt_enable_cmake_languages) enable_language(${__qt_lang}) endif() endforeach() + + qt_internal_set_up_config_optimizations_like_in_qmake() endmacro() # Minimum setup required to have any CMakeList.txt build as as a standalone diff --git a/cmake/QtCompilerOptimization.cmake b/cmake/QtCompilerOptimization.cmake index fc2922089c..4716888752 100644 --- a/cmake/QtCompilerOptimization.cmake +++ b/cmake/QtCompilerOptimization.cmake @@ -122,3 +122,57 @@ if (ICC) set(QT_CFLAGS_SHANI "-msha") endif() endif() + +# Fall through is important, so that more specific flags that might be missing are set by the +# previous base cases. +# This mirrors qmake's mkspecs QMAKE_CFLAGS_OPTIMIZE assignments (mostly). +# +# TODO: Missing mkspecs flags we don't handle below: win32-clang-g++, win32-clang-msvc, rtems-base +# +# gcc and clang base +if(GCC OR CLANG) + set(QT_CFLAGS_OPTIMIZE "-O2") + set(QT_CFLAGS_OPTIMIZE_FULL "-O3") + set(QT_CFLAGS_OPTIMIZE_DEBUG "-Og") + set(QT_CFLAGS_OPTIMIZE_SIZE "-Os") + + if(CLANG) + set(QT_CFLAGS_OPTIMIZE_SIZE "-Oz") + endif() +endif() + +# Flags that CMake might set, aka flags the compiler would see as valid values. +if(GCC OR CLANG OR QCC OR ICC) + set(QT_CFLAGS_OPTIMIZE_VALID_VALUES "-O0" "-O1" "-O2" "-O3" "-Os" "-Oz") +endif() + + +# Windows MSVC +if(MSVC) + set(QT_CFLAGS_OPTIMIZE "-O2") + set(QT_CFLAGS_OPTIMIZE_DEBUG "-Od") + set(QT_CFLAGS_OPTIMIZE_SIZE "-O1") + set(QT_CFLAGS_OPTIMIZE_VALID_VALUES "/O2" "/O1" "/Od" "/Ob0" "/Ob1" "/Ob2" "/O0" "-O0") +endif() + +# Android Clang +if(CLANG AND ANDROID) + set(QT_CFLAGS_OPTIMIZE "-Oz") + set(QT_CFLAGS_OPTIMIZE_FULL "-Oz") +endif() + +# qcc +if (QCC) + set(QT_CFLAGS_OPTIMIZE "-O2") + set(QT_CFLAGS_OPTIMIZE_FULL "-O3") +endif() + +if(ICC) + if(MSVC) + set(QT_CFLAGS_OPTIMIZE_FULL "-O3") + else() + # Should inherit gcc base + set(QT_CFLAGS_OPTIMIZE "-O2") + set(QT_CFLAGS_OPTIMIZE_SIZE "-Os") + endif() +endif() diff --git a/cmake/QtFlagHandlingHelpers.cmake b/cmake/QtFlagHandlingHelpers.cmake index ea06a24865..cddaa0da39 100644 --- a/cmake/QtFlagHandlingHelpers.cmake +++ b/cmake/QtFlagHandlingHelpers.cmake @@ -241,3 +241,163 @@ function(qt_enable_utf8_sources target) target_compile_options("${target}" INTERFACE "${utf8_flags}") endif() endfunction() + +function(qt_internal_get_all_possible_optimization_flag_values out_var) + set(flag_values "") + set(vars QT_CFLAGS_OPTIMIZE QT_CFLAGS_OPTIMIZE_FULL + QT_CFLAGS_OPTIMIZE_DEBUG QT_CFLAGS_OPTIMIZE_SIZE) + foreach(optimize_var ${vars}) + set(value "${${optimize_var}}") + if(value) + list(APPEND flag_values "${value}") + endif() + endforeach() + + # Additional flag values which might not be used in qmake mkspecs, but might be set by CMake, + # aka flags that are recognized by the compile which we might want to remove. + if(QT_CFLAGS_OPTIMIZE_VALID_VALUES) + list(APPEND flag_values ${QT_CFLAGS_OPTIMIZE_VALID_VALUES}) + endif() + + set("${out_var}" "${flag_values}" PARENT_SCOPE) +endfunction() + +function(qt_internal_print_optimization_flags_values languages configs target_link_types) + foreach(lang ${languages}) + set(flag_var_name "CMAKE_${lang}_FLAGS") + message(STATUS "${flag_var_name}: ${${flag_var_name}}") + + foreach(config ${configs}) + set(flag_var_name "CMAKE_${lang}_FLAGS_${config}") + message(STATUS "${flag_var_name}: ${${flag_var_name}}") + endforeach() + endforeach() + + foreach(t ${target_link_types}) + set(flag_var_name "CMAKE_${t}_LINKER_FLAGS") + message(STATUS "${flag_var_name}: ${${flag_var_name}}") + + foreach(config ${configs}) + set(flag_var_name "CMAKE_${t}_LINKER_FLAGS_${config}") + message(STATUS "${flag_var_name}: ${${flag_var_name}}") + endforeach() + endforeach() +endfunction() + +# This function finds the optimization flags set by the default CMake modules or toolchains, and +# replaces them with ones that Qt qmake builds expect for all the default CMAKE_BUILD_TYPE +# configurations. +# This normalizes things like using -O2 for both Release and RelWithDebInfo, among other flags. +# See QTBUG-85992 for details. +function(qt_internal_set_up_config_optimizations_like_in_qmake) + # Allow opt out. + if(QT_USE_DEFAULT_CMAKE_OPTIMIZATION_FLAGS) + return() + endif() + + # Limit flag modification to c-like code. We don't want to accidentally add incompatible + # flags to MSVC's RC or Swift. + set(languages_to_process C CXX OBJC OBJCXX) + get_property(globally_enabled_languages GLOBAL PROPERTY ENABLED_LANGUAGES) + set(enabled_languages "") + foreach(lang ${languages_to_process}) + if(lang IN_LIST globally_enabled_languages) + list(APPEND enabled_languages "${lang}") + endif() + endforeach() + + set(configs RELEASE RELWITHDEBINFO MINSIZEREL DEBUG) + set(target_link_types EXE SHARED MODULE STATIC) + + # Opt into additional non-standard configs for flag removal only. + if(QT_ADDITIONAL_OPTIMIZATION_FLAG_CONFIGS) + list(APPEND configs ${QT_ADDITIONAL_OPTIMIZATION_FLAG_CONFIGS}) + endif() + + # You can set QT_DEBUG_OPTIMIZATION_FLAGS to see the before and after results. + if(QT_DEBUG_OPTIMIZATION_FLAGS) + message(STATUS "") + message(STATUS "DEBUG: Original CMake optimization flags.\n") + qt_internal_print_optimization_flags_values("${enabled_languages}" "${configs}" + "${target_link_types}") + endif() + + # Remove known optimization flags. + qt_internal_get_all_possible_optimization_flag_values(flag_values) + foreach(lang ${enabled_languages}) + foreach(config ${configs}) + set(flag_var_name "CMAKE_${lang}_FLAGS_${config}") + foreach(flag_value ${flag_values}) + # Remove any existing optimization flags, they will be re-added later on. + string(REPLACE "${flag_value}" "" "${flag_var_name}" "${${flag_var_name}}") + string(STRIP "${${flag_var_name}}" "${flag_var_name}") + endforeach() + endforeach() + endforeach() + + # Re-add optimization flags as per qmake mkspecs. + foreach(lang ${enabled_languages}) + foreach(config ${configs}) + set(flag_var_name "CMAKE_${lang}_FLAGS_${config}") + + # Release and RelWithDebInfo should get the same base optimization flags. + if(config STREQUAL "RELEASE" AND QT_CFLAGS_OPTIMIZE) + string(APPEND "${flag_var_name}" " ${QT_CFLAGS_OPTIMIZE}") + elseif(config STREQUAL "RELWITHDEBINFO" AND QT_CFLAGS_OPTIMIZE) + string(APPEND "${flag_var_name}" " ${QT_CFLAGS_OPTIMIZE}") + + # MinSizeRel should get the optimize size flag if available, otherwise the regular + # release flag. + elseif(config STREQUAL "MINSIZEREL") + if(QT_CFLAGS_OPTIMIZE_SIZE) + string(APPEND "${flag_var_name}" " ${QT_CFLAGS_OPTIMIZE_SIZE}") + else() + string(APPEND "${flag_var_name}" " ${QT_CFLAGS_OPTIMIZE}") + endif() + endif() + + # Assign value to the cache entry. + get_property(help_text CACHE "${flag_var_name}" PROPERTY HELPSTRING) + set("${flag_var_name}" "${${flag_var_name}}" CACHE STRING "${help_text}" FORCE) + endforeach() + endforeach() + + if(MSVC) + # Handle MSVC /INCREMENTAL flag which should not be enabled for Release configurations. + # First remove them from all configs, and re-add INCREMENTAL for Debug only. + set(flag_values "/INCREMENTAL:YES" "/INCREMENTAL:NO" "/INCREMENTAL") + foreach(config ${configs}) + foreach(t ${target_link_types}) + set(flag_var_name "CMAKE_${t}_LINKER_FLAGS_${config}") + foreach(flag_value ${flag_values}) + string(REPLACE "${flag_value}" "" "${flag_var_name}" "${${flag_var_name}}") + string(STRIP "${${flag_var_name}}" "${flag_var_name}") + endforeach() + endforeach() + endforeach() + + foreach(config ${configs}) + foreach(t ${target_link_types}) + set(flag_var_name "CMAKE_${t}_LINKER_FLAGS_${config}") + + if(config STREQUAL "RELEASE" OR config STREQUAL "RELWITHDEBINFO" + OR config STREQUAL "MINSIZEREL") + string(APPEND "${flag_var_name}" " /INCREMENTAL:NO") + elseif(config STREQUAL "DEBUG") + string(APPEND "${flag_var_name}" " /INCREMENTAL:YES") + endif() + + # Assign value to the cache entry. + get_property(help_text CACHE "${flag_var_name}" PROPERTY HELPSTRING) + set("${flag_var_name}" "${${flag_var_name}}" CACHE STRING "${help_text}" FORCE) + endforeach() + endforeach() + endif() + + if(QT_DEBUG_OPTIMIZATION_FLAGS) + message(STATUS "") + message(STATUS "DEBUG: Modified optimization flags to mirror qmake mkspecs.\n") + qt_internal_print_optimization_flags_values("${enabled_languages}" "${configs}" + "${target_link_types}") + endif() +endfunction() |