summaryrefslogtreecommitdiffstats
path: root/cmake/QtFlagHandlingHelpers.cmake
Commit message (Collapse)AuthorAgeFilesLines
* CMake: Fix deprecation defines not being set properlyAlexandru Croitor2020-10-231-1/+1
| | | | | | | | | Instead of propagating the deprecation wranings, we compiled all code with -Ddeprecations. Change-Id: I0233ddc85bdbdcb93d366073b2cea5d47bdbe52a Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Cristian Adam <cristian.adam@qt.io>
* CMake: Remove leftover debug outputAlexandru Croitor2020-10-061-1/+0
| | | | | | | Amends 07b6d3367debd8f15974abf0f5cdf48f0fe3a536 Change-Id: I8d5922af13903c6a10f967035bca70a89b19f86f Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
* CMake: Allow embedding debug info in object files with MSVCAlexandru Croitor2020-10-061-0/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Introduce a new feature called 'FEATURE_msvc_obj_debug_info' which should allow usage of sccache for Windows MSVC configs. Enabling the feature will replace the default '/Zi' compile flag that CMake sets in Windows-MSVC.cmake with '/Z7'. This ensures that the debug info is placed into the compiled object file instead of placing it in the compilation .pdb file via mspdbsrv.exe. The final pdb file will still be created for shared libraries and executables due to the linker '/debug' flag. Static libraries will not have a .pdb file, instead the debug info being embeeded in the .lib file. The downsides of using '/Z7' are more disk space usage, slower link times, more memory used for linking because the linker needs to deal with more symbols. The upside is that caching each indepedent cl.exe call is possible. This is what Chromium uses with goma, and Firefox with sccache. We're not enabling the feature by default to allow easier testing (and switching it off) in the CI if it proves not to be feasible. It will probably have to be disabled at least for building qtwebengine due to high memory requirements. Task-number: QTQAINFRA-3934 Change-Id: I89e0e57995e938a780be318d1faec700194aa93f Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
* CMake: Introduce CMake-only optimize_full featureAlexandru Croitor2020-10-061-0/+9
| | | | | | | | | Enabling it will force usage of '-O3' flag when building Qt. If the platform has no '-O3' flag, use '-O2' as a fallback. Task-number: QTBUG-86866 Change-Id: If13f7de954ba5c01dc9634f06a85529828fe90a9 Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
* CMake: Refactor optimization flag handling and add optimize_fullAlexandru Croitor2020-10-061-56/+474
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Introduce a bunch of helper functions to manipulate compiler flags and linker flags for the CMAKE_<LANG>_FLAGS_<CONFIG> and CMAKE_<LINK_TYPE>_LINKER_FLAGS_<CONFIG> CMake variables. These variables can be assigned and modified either in the cache or for a specific subdirectory scope, which will apply the flags only to targets in that scope. Add qt_internal_add_optimize_full_flags() function which mimics qmake's CONFIG += optimize_full behavior. Calling it will force usage of the '-O3' optimization flag on supported platforms (falling back '-O2' where not supported). Use the function for the Core and Gui subdirectories, to enable full optimization for the respective Qt modules as it is done in the qmake projects. To ensure that the global qmake-like compiler flags are assigned eveywhere, qt_internal_set_up_config_optimizations_like_in_qmake() needs to be called after Qt global features like optimize_size and optimize_full are available. This means that qtbase and its standalone tests need some special handling in regards to when to call that function. Task-number: QTBUG-86866 Change-Id: Ic7ac23de0265561cb06a0ba55089b6c0d3347441 Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
* CMake: Fix sanitizer build when using Clang on LinuxAlexandru Croitor2020-09-241-0/+3
| | | | | | | | | | | | | | Apparently the combination of the --no-undefined linker flag together with ASAN when building on Linux with Clang does not work. Disable --no-undefined flag in such a scenario. Note that linux-clang mkspec doesn't add that flag at all, which is why asan builds work there. Change-Id: I6167c757ce4be5d2263311bc84e5fb445b0f7c2d Fixes: QTBUG-86879 Reviewed-by: Cristian Adam <cristian.adam@qt.io> Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
* Remove /INCREMENTAL:YES from linker flagsMarcel Krems2020-09-051-2/+0
| | | | | | | | | This flag doesn't exist in MSVC 2015+: LINK : warning LNK4224: /INCREMENTAL:YES is no longer supported; ignored https://docs.microsoft.com/en-us/cpp/build/reference/incremental-link-incrementally?view=vs-2015 Change-Id: I3b2aace619351e2dc9cc86e1df28facc21b7d9fe Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
* CMake: Implement configure -optimize-sizeJoerg Bornemann2020-08-231-0/+5
| | | | | | | | | | | | This configure switch controls the feature 'optimize_size'. This isn't merely a mapping to CMAKE_BUILD_TYPE=MinSizeRel, because we potentially want to combine -optimize-size with -force-debug-info, which maps to CMAKE_BUILD_CONFIG=RelWithDebInfo. Task-number: QTBUG-85373 Change-Id: I1a9343ebc54816f52e90e9d33ea3df4c99b1ec9f Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
* CMake: Implement configure -optimize-debugJoerg Bornemann2020-08-201-0/+5
| | | | | | Task-number: QTBUG-85373 Change-Id: I3aba1fcf96e36544dd75a5e6adc5f770a9a45726 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
* CMake: Adjust compiler flag optimizations to qmake mkspec onesAlexandru Croitor2020-08-191-0/+160
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | There are inconsistencies in the default optimization flags added by CMake across configurations like Release and RelWithDebInfo. In particular Release uses -O3, whereas RelWithDebInfo uses -O2, as well as usage of /INCREMENTAL in release configs with MSVC, etc. To make sure that the Qt 6 binaries built with CMake are consistent across configs, as well as consistent with the flags we used when building Qt 5 with qmake, add a horrible search and replace mechanism to replaces the CMake flags with what our mkspecs indicate to use. Ideally this would be done by providing custom CMake toolchain files for each platform we support, and we might revisit that later if the need really arises. To implement the replacing, we first need the flags that should be added. Port the QMAKE_CFLAGS_OPTIMIZE variables to CMake, which is done in QtCompilerOptimization.cmake. Then a new function called qt_internal_set_up_config_optimizations_like_in_qmake will look for any kind of optimization flags set in the CMAKE_<LANG>_FLAGS_<CONFIG> style variables, remove them, and add the appropriate flags that qmake mkspecs provide. On some platforms (like Windows MSVC) the function also alters the linker CMAKE_${TYPE}_LINKER_FLAGS_<CONFIG> style variables. The mechanism allows opting out of this replacing by setting the QT_USE_DEFAULT_CMAKE_OPTIMIZATION_FLAGS value. It also allows opting into removal of flags for custom configs by providing QT_ADDITIONAL_OPTIMIZATION_FLAG_CONFIGS. It's only removal, because we wouldn't know what kind of config it is, and thus what flags to add. The currently modified configs are: Release, RelWithDebInfo, MinSizeRel, Debug aka the usual default CMake provided ones. The mechanism is only applied to C-like languages. ASM is not handled to be on the safe side due to not knowing what kind of compiler flags the platform assembler might take. It's also important to skip RC on MSVC platforms. Task-number: QTBUG-85992 Change-Id: I3712d5cd5a34fceab54f56a6fa46b4e678952362 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Cristian Adam <cristian.adam@qt.io>
* CMake: Split QtBuild.cmake into smaller filesAlexandru Croitor2020-08-141-0/+243
QtBuild.cmake is huge. Split it. Move module, plugin, tools, executables and test related functions out of QtBuild.cmake into separate files. Do the same for many other things too. An additional requirement is that all the new Helpers files only define functions and macros. No global variable definitions are allowed, nor execution of commands with side effects. Some notes: qt_install_qml_files is removed because it's dead code. Some functions still need to be figured out, because they are interspersed and depend on various global state assignments. Task-number: QTBUG-86035 Change-Id: I21d79ff02eef923c202eb1000422888727cb0e2c Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>