summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmir Masoud Abdol <amir.abdol@qt.io>2023-01-31 14:05:16 +0100
committerAmir Masoud Abdol <amir.abdol@qt.io>2023-02-08 23:47:07 +0100
commit31518f1a4e3c4a7c77ae2e008e903a849ba75dd6 (patch)
tree4d33bf20da4702697e98c3a06238c7c052942350
parent66a1a71f1f92156548da487739129fb0f494c895 (diff)
Add some utilities for UNITY_BUILD
- The following commands accepts NO_UNITY_BUILD, and NO_UNITY_BUILD_SOURCES arguments to opt out of the unity build, and to exclude some source files from unity build, respectively. - qt_internal_add_executable - qt_internal_add_module - qt_internal_add_plugin - qt_internal_add_tool - qt_internal_extend_target - qt_internal_add_common_qt_library_helper - qt_internal_add_cmake_library - qt_internal_add_simd_part - Unity build is disabled by default in these: - qt_internal_add_test - qt_internal_add_test_helper - qt_internal_add_benchmark - qt_internal_add_3rdparty_library - qt_update_ignore_pch_source also excludes the files from unity_build Pick-to: 6.5 Task-number: QTBUG-109394 Change-Id: I5d0e7df633738310a015142a6c73fbb78b6c3467 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
-rw-r--r--cmake/Qt3rdPartyLibraryHelpers.cmake21
-rw-r--r--cmake/QtBaseGlobalTargets.cmake1
-rw-r--r--cmake/QtBuild.cmake3
-rw-r--r--cmake/QtExecutableHelpers.cmake8
-rw-r--r--cmake/QtModuleHelpers.cmake9
-rw-r--r--cmake/QtPluginHelpers.cmake9
-rw-r--r--cmake/QtPrecompiledHeadersHelpers.cmake4
-rw-r--r--cmake/QtSimdHelpers.cmake4
-rw-r--r--cmake/QtTargetHelpers.cmake9
-rw-r--r--cmake/QtTestHelpers.cmake11
-rw-r--r--cmake/QtToolHelpers.cmake15
-rw-r--r--cmake/QtUnityBuildHelpers.cmake8
12 files changed, 96 insertions, 6 deletions
diff --git a/cmake/Qt3rdPartyLibraryHelpers.cmake b/cmake/Qt3rdPartyLibraryHelpers.cmake
index 03915938e2..1eef71fe0f 100644
--- a/cmake/Qt3rdPartyLibraryHelpers.cmake
+++ b/cmake/Qt3rdPartyLibraryHelpers.cmake
@@ -4,6 +4,7 @@ macro(qt_internal_get_add_library_option_args option_args)
STATIC
MODULE
INTERFACE
+ NO_UNITY_BUILD
)
endmacro()
@@ -49,7 +50,18 @@ function(qt_internal_add_common_qt_library_helper target)
set(arg_MODULE STATIC)
endif()
+ if(arg_NO_UNITY_BUILD)
+ set(arg_NO_UNITY_BUILD NO_UNITY_BUILD)
+ else()
+ set(arg_NO_UNITY_BUILD "")
+ endif()
+
_qt_internal_add_library(${target} ${arg_STATIC} ${arg_SHARED} ${arg_MODULE} ${arg_INTERFACE})
+
+ if(arg_NO_UNITY_BUILD)
+ set_property(TARGET "${target}" PROPERTY UNITY_BUILD OFF)
+ endif()
+
qt_internal_mark_as_internal_library(${target})
endfunction()
@@ -98,6 +110,12 @@ function(qt_internal_add_cmake_library target)
)
endif()
+ if(arg_NO_UNITY_BUILD)
+ set(arg_NO_UNITY_BUILD NO_UNITY_BUILD)
+ else()
+ set(arg_NO_UNITY_BUILD "")
+ endif()
+
qt_internal_extend_target("${target}"
SOURCES ${arg_SOURCES}
INCLUDE_DIRECTORIES
@@ -119,6 +137,8 @@ function(qt_internal_add_cmake_library target)
MOC_OPTIONS ${arg_MOC_OPTIONS}
ENABLE_AUTOGEN_TOOLS ${arg_ENABLE_AUTOGEN_TOOLS}
DISABLE_AUTOGEN_TOOLS ${arg_DISABLE_AUTOGEN_TOOLS}
+ NO_UNITY_BUILD_SOURCES ${arg_NO_UNITY_BUILD_SOURCES}
+ ${arg_NO_UNITY_BUILD}
)
endfunction()
@@ -240,6 +260,7 @@ function(qt_internal_add_3rdparty_library target)
MOC_OPTIONS ${arg_MOC_OPTIONS}
ENABLE_AUTOGEN_TOOLS ${arg_ENABLE_AUTOGEN_TOOLS}
DISABLE_AUTOGEN_TOOLS ${arg_DISABLE_AUTOGEN_TOOLS}
+ NO_UNITY_BUILD
)
if(NOT BUILD_SHARED_LIBS OR arg_INSTALL)
diff --git a/cmake/QtBaseGlobalTargets.cmake b/cmake/QtBaseGlobalTargets.cmake
index b3eea3006f..6a885fc4ce 100644
--- a/cmake/QtBaseGlobalTargets.cmake
+++ b/cmake/QtBaseGlobalTargets.cmake
@@ -263,6 +263,7 @@ qt_copy_or_install(FILES
cmake/QtPostProcess.cmake
cmake/QtPostProcessHelpers.cmake
cmake/QtPrecompiledHeadersHelpers.cmake
+ cmake/QtUnityBuildHelpers.cmake
cmake/QtPriHelpers.cmake
cmake/QtPrlHelpers.cmake
cmake/QtPlatformTargetHelpers.cmake
diff --git a/cmake/QtBuild.cmake b/cmake/QtBuild.cmake
index 13772fce86..6bf4a9edd5 100644
--- a/cmake/QtBuild.cmake
+++ b/cmake/QtBuild.cmake
@@ -459,6 +459,7 @@ set(__default_private_args
DISABLE_AUTOGEN_TOOLS
ENABLE_AUTOGEN_TOOLS
PLUGIN_TYPES
+ NO_UNITY_BUILD_SOURCES
)
set(__default_public_args
PUBLIC_LIBRARIES
@@ -487,6 +488,7 @@ set(__qt_internal_add_executable_optional_args
DELAY_RC
DELAY_TARGET_INFO
QT_APP
+ NO_UNITY_BUILD
)
set(__qt_internal_add_executable_single_args
CORE_LIBRARY
@@ -520,6 +522,7 @@ include(QtModuleHelpers)
include(QtNoLinkTargetHelpers)
include(QtPluginHelpers)
include(QtPrecompiledHeadersHelpers)
+include(QtUnityBuildHelpers)
include(QtPkgConfigHelpers)
include(QtPriHelpers)
include(QtPrlHelpers)
diff --git a/cmake/QtExecutableHelpers.cmake b/cmake/QtExecutableHelpers.cmake
index 91ac2cfeb6..bd41c474eb 100644
--- a/cmake/QtExecutableHelpers.cmake
+++ b/cmake/QtExecutableHelpers.cmake
@@ -110,6 +110,12 @@ function(qt_internal_add_executable name)
"removed in a future Qt version. Use the LIBRARIES option instead.")
endif()
+ if(arg_NO_UNITY_BUILD)
+ set(arg_NO_UNITY_BUILD NO_UNITY_BUILD)
+ else()
+ set(arg_NO_UNITY_BUILD "")
+ endif()
+
qt_internal_extend_target("${name}"
SOURCES ${arg_SOURCES}
INCLUDE_DIRECTORIES ${private_includes}
@@ -128,6 +134,8 @@ function(qt_internal_add_executable name)
MOC_OPTIONS ${arg_MOC_OPTIONS}
ENABLE_AUTOGEN_TOOLS ${arg_ENABLE_AUTOGEN_TOOLS}
DISABLE_AUTOGEN_TOOLS ${arg_DISABLE_AUTOGEN_TOOLS}
+ NO_UNITY_BUILD_SOURCES ${arg_NO_UNITY_BUILD_SOURCES}
+ ${arg_NO_UNITY_BUILD}
)
set_target_properties("${name}" PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${arg_OUTPUT_DIRECTORY}"
diff --git a/cmake/QtModuleHelpers.cmake b/cmake/QtModuleHelpers.cmake
index cbe8defaf8..f7c5c4b11b 100644
--- a/cmake/QtModuleHelpers.cmake
+++ b/cmake/QtModuleHelpers.cmake
@@ -18,6 +18,7 @@ macro(qt_internal_get_internal_add_module_keywords option_args single_args multi
NO_HEADERSCLEAN_CHECK
GENERATE_CPP_EXPORTS
GENERATE_PRIVATE_CPP_EXPORTS
+ NO_UNITY_BUILD
)
set(${single_args}
MODULE_INCLUDE_NAME
@@ -572,6 +573,12 @@ function(qt_internal_add_module target)
qt_internal_add_repo_local_defines("${target}")
+ if(arg_NO_UNITY_BUILD)
+ set(arg_NO_UNITY_BUILD NO_UNITY_BUILD)
+ else()
+ set(arg_NO_UNITY_BUILD "")
+ endif()
+
if(NOT arg_EXTERNAL_HEADERS)
set(arg_EXTERNAL_HEADERS "")
endif()
@@ -607,6 +614,8 @@ function(qt_internal_add_module target)
DISABLE_AUTOGEN_TOOLS ${arg_DISABLE_AUTOGEN_TOOLS}
PRECOMPILED_HEADER ${arg_PRECOMPILED_HEADER}
NO_PCH_SOURCES ${arg_NO_PCH_SOURCES}
+ NO_UNITY_BUILD_SOURCES ${arg_NO_UNITY_BUILD_SOURCES}
+ ${arg_NO_UNITY_BUILD}
)
# The public module define is not meant to be used when building the module itself,
diff --git a/cmake/QtPluginHelpers.cmake b/cmake/QtPluginHelpers.cmake
index 0e5612d70b..3da75168aa 100644
--- a/cmake/QtPluginHelpers.cmake
+++ b/cmake/QtPluginHelpers.cmake
@@ -8,6 +8,7 @@ macro(qt_internal_get_internal_add_plugin_keywords option_args single_args multi
EXCEPTIONS
ALLOW_UNDEFINED_SYMBOLS
SKIP_INSTALL
+ NO_UNITY_BUILD
)
set(${single_args}
OUTPUT_DIRECTORY
@@ -305,6 +306,12 @@ function(qt_internal_add_plugin target)
endif()
endif()
+ if(arg_NO_UNITY_BUILD)
+ set(arg_NO_UNITY_BUILD NO_UNITY_BUILD)
+ else()
+ set(arg_NO_UNITY_BUILD "")
+ endif()
+
set_property(TARGET "${target}" PROPERTY QT_DEFAULT_PLUGIN "${_default_plugin}")
set_property(TARGET "${target}" APPEND PROPERTY EXPORT_PROPERTIES "QT_PLUGIN_CLASS_NAME;QT_PLUGIN_TYPE;QT_MODULE;QT_DEFAULT_PLUGIN")
@@ -347,6 +354,8 @@ function(qt_internal_add_plugin target)
MOC_OPTIONS ${arg_MOC_OPTIONS}
ENABLE_AUTOGEN_TOOLS ${arg_ENABLE_AUTOGEN_TOOLS}
DISABLE_AUTOGEN_TOOLS ${arg_DISABLE_AUTOGEN_TOOLS}
+ NO_UNITY_BUILD_SOURCES ${arg_NO_UNITY_BUILD_SOURCES}
+ ${arg_NO_UNITY_BUILD}
)
qt_internal_add_repo_local_defines("${target}")
diff --git a/cmake/QtPrecompiledHeadersHelpers.cmake b/cmake/QtPrecompiledHeadersHelpers.cmake
index 08aa0bcc01..fe38413407 100644
--- a/cmake/QtPrecompiledHeadersHelpers.cmake
+++ b/cmake/QtPrecompiledHeadersHelpers.cmake
@@ -19,7 +19,9 @@ endfunction()
function(qt_update_ignore_pch_source target sources)
if (sources)
- set_source_files_properties(${sources} PROPERTIES SKIP_PRECOMPILE_HEADERS ON)
+ set_source_files_properties(${sources} PROPERTIES
+ SKIP_PRECOMPILE_HEADERS ON
+ SKIP_UNITY_BUILD_INCLUSION ON)
endif()
endfunction()
diff --git a/cmake/QtSimdHelpers.cmake b/cmake/QtSimdHelpers.cmake
index 6d9d6d46fe..1e77bf449f 100644
--- a/cmake/QtSimdHelpers.cmake
+++ b/cmake/QtSimdHelpers.cmake
@@ -98,7 +98,9 @@ function(qt_internal_add_simd_part target)
${arg_COMPILE_FLAGS}
)
endforeach()
- set_source_files_properties(${arg_SOURCES} PROPERTIES SKIP_PRECOMPILE_HEADERS TRUE)
+ set_source_files_properties(${arg_SOURCES} PROPERTIES
+ SKIP_PRECOMPILE_HEADERS TRUE
+ SKIP_UNITY_BUILD_INCLUSION TRUE)
target_sources(${target} PRIVATE ${arg_SOURCES})
else()
if(QT_CMAKE_DEBUG_EXTEND_TARGET)
diff --git a/cmake/QtTargetHelpers.cmake b/cmake/QtTargetHelpers.cmake
index 700b32aa3c..a98e940885 100644
--- a/cmake/QtTargetHelpers.cmake
+++ b/cmake/QtTargetHelpers.cmake
@@ -35,7 +35,9 @@ function(qt_internal_extend_target target)
return()
endif()
- set(option_args "")
+ set(option_args
+ NO_UNITY_BUILD
+ )
set(single_args
PRECOMPILED_HEADER
)
@@ -211,6 +213,7 @@ function(qt_internal_extend_target target)
qt_update_precompiled_header("${target}" "${arg_PRECOMPILED_HEADER}")
qt_update_ignore_pch_source("${target}" "${arg_NO_PCH_SOURCES}")
+ qt_update_ignore_unity_build_sources("${target}" "${arg_NO_UNITY_BUILD_SOURCES}")
## Ignore objective-c files for PCH (not supported atm)
qt_ignore_pch_obj_c_sources("${target}" "${arg_SOURCES}")
@@ -230,6 +233,10 @@ function(qt_internal_extend_target target)
set_property(TARGET ${target} APPEND PROPERTY
${sources_property} "${arg_CONDITION_INDEPENDENT_SOURCES}")
endif()
+
+ if(arg_NO_UNITY_BUILD)
+ set_target_properties(${target} PROPERTIES UNITY_BUILD OFF)
+ endif()
endfunction()
function(qt_is_imported_target target out_var)
diff --git a/cmake/QtTestHelpers.cmake b/cmake/QtTestHelpers.cmake
index 463229abd5..725c3fa0be 100644
--- a/cmake/QtTestHelpers.cmake
+++ b/cmake/QtTestHelpers.cmake
@@ -37,6 +37,7 @@ function(qt_internal_add_benchmark target)
qt_internal_add_executable(${target}
NO_INSTALL # we don't install benchmarks
+ NO_UNITY_BUILD # excluded by default
OUTPUT_DIRECTORY "${arg_OUTPUT_DIRECTORY}" # avoid polluting bin directory
${exec_args}
)
@@ -121,6 +122,7 @@ function(qt_internal_add_manual_test target)
qt_internal_add_executable(${target}
NO_INSTALL # we don't install benchmarks
+ NO_UNITY_BUILD
OUTPUT_DIRECTORY "${arg_OUTPUT_DIRECTORY}" # avoid polluting bin directory
${exec_args}
)
@@ -362,7 +364,9 @@ function(qt_internal_add_test_to_batch batch_name name)
LINK_OPTIONS ${arg_LINK_OPTIONS}
MOC_OPTIONS ${arg_MOC_OPTIONS}
ENABLE_AUTOGEN_TOOLS ${arg_ENABLE_AUTOGEN_TOOLS}
- DISABLE_AUTOGEN_TOOLS ${arg_DISABLE_AUTOGEN_TOOLS})
+ DISABLE_AUTOGEN_TOOLS ${arg_DISABLE_AUTOGEN_TOOLS}
+ NO_UNITY_BUILD # Tests should not be built using UNITY_BUILD
+ )
foreach(source ${arg_SOURCES})
# We define the test name which is later used to launch this test using
@@ -527,6 +531,7 @@ function(qt_internal_add_test name)
MOC_OPTIONS ${arg_MOC_OPTIONS}
ENABLE_AUTOGEN_TOOLS ${arg_ENABLE_AUTOGEN_TOOLS}
DISABLE_AUTOGEN_TOOLS ${arg_DISABLE_AUTOGEN_TOOLS}
+ NO_UNITY_BUILD # Tests should not be built using UNITY_BUILD
)
qt_internal_add_repo_local_defines(${name})
@@ -908,7 +913,9 @@ function(qt_internal_add_test_helper name)
endif()
endif()
- qt_internal_add_executable("${name}" NO_INSTALL ${extra_args_to_pass} ${forward_args})
+ qt_internal_add_executable("${name}" NO_INSTALL
+ NO_UNITY_BUILD # excluded by default
+ ${extra_args_to_pass} ${forward_args})
# Disable the QT_NO_NARROWING_CONVERSIONS_IN_CONNECT define for test helpers
qt_internal_undefine_global_definition(${name} QT_NO_NARROWING_CONVERSIONS_IN_CONNECT)
diff --git a/cmake/QtToolHelpers.cmake b/cmake/QtToolHelpers.cmake
index 3f97e5ac4a..92bb3dc6d1 100644
--- a/cmake/QtToolHelpers.cmake
+++ b/cmake/QtToolHelpers.cmake
@@ -37,7 +37,12 @@
# linked to the executable target by default.
function(qt_internal_add_tool target_name)
qt_tool_target_to_name(name ${target_name})
- set(option_keywords NO_INSTALL USER_FACING INSTALL_VERSIONED_LINK EXCEPTIONS)
+ set(option_keywords
+ NO_INSTALL
+ USER_FACING
+ INSTALL_VERSIONED_LINK
+ EXCEPTIONS
+ NO_UNITY_BUILD)
set(one_value_keywords
TOOLS_TARGET
INSTALL_DIR
@@ -88,6 +93,12 @@ function(qt_internal_add_tool target_name)
qt_internal_library_deprecation_level(deprecation_define)
+ if(arg_NO_UNITY_BUILD)
+ set(arg_NO_UNITY_BUILD NO_UNITY_BUILD)
+ else()
+ set(arg_NO_UNITY_BUILD "")
+ endif()
+
qt_internal_add_executable("${target_name}"
OUTPUT_DIRECTORY "${output_dir}"
${exceptions}
@@ -113,6 +124,8 @@ function(qt_internal_add_tool target_name)
TARGET_DESCRIPTION "${arg_TARGET_DESCRIPTION}"
TARGET_COMPANY "${arg_TARGET_COMPANY}"
TARGET_COPYRIGHT "${arg_TARGET_COPYRIGHT}"
+ NO_UNITY_BUILD_SOURCES "${arg_NO_UNITY_BUILD_SOURCES}"
+ ${arg_NO_UNITY_BUILD}
)
qt_internal_add_target_aliases("${target_name}")
_qt_internal_apply_strict_cpp("${target_name}")
diff --git a/cmake/QtUnityBuildHelpers.cmake b/cmake/QtUnityBuildHelpers.cmake
new file mode 100644
index 0000000000..41062b027c
--- /dev/null
+++ b/cmake/QtUnityBuildHelpers.cmake
@@ -0,0 +1,8 @@
+# Copyright (C) 2023 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+function(qt_update_ignore_unity_build_sources target sources)
+ if (sources)
+ set_source_files_properties(${sources} PROPERTIES SKIP_UNITY_BUILD_INCLUSION ON)
+ endif()
+endfunction()