When a Qt module Foo links against a Qt module Bar then we add the ${QT_BUILD_DIR}/include/QtBar/QtBar header to the list of precompiled header files. However, this only works if Foo and Bar are in the same build system, e.g. in the same repository or in a top-level build. For example, the QtCore header was never precompiled when in a per-repo build of QtSvg. Now, we determine whether Foo and Bar are in the same build system. If they are, we proceed as before. Otherwise, we calculate the QtBar header's location from the following data: - the location of Qt6BarConfig.cmake - the relative path to Bar's include directory The Q*Application tests' project files had to be adjusted to use NO_PCH_SOURCES now, because they use the source file apphelper_plugin.cpp that specifically checks that pre-compiled headers are not used for its compilation. Fixes: QTBUG-134424 Change-Id: I04ede51e4d853e8b813f660f29be8cfeb684c0b2 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io> Reviewed-by: Alexey Edelev <alexey.edelev@qt.io>
72 lines
2.6 KiB
CMake
72 lines
2.6 KiB
CMake
# Copyright (C) 2022 The Qt Company Ltd.
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
function(qt_update_precompiled_header target precompiled_header)
|
|
if (precompiled_header AND BUILD_WITH_PCH)
|
|
set_property(TARGET "${target}" APPEND PROPERTY "PRECOMPILE_HEADERS" "$<$<COMPILE_LANGUAGE:CXX,OBJCXX>:${precompiled_header}>")
|
|
endif()
|
|
endfunction()
|
|
|
|
function(qt_update_precompiled_header_with_library target library)
|
|
if(NOT TARGET "${library}")
|
|
return()
|
|
endif()
|
|
|
|
get_target_property(target_type "${library}" TYPE)
|
|
if(target_type STREQUAL "INTERFACE_LIBRARY")
|
|
return()
|
|
endif()
|
|
|
|
get_target_property(header_file_path "${library}" MODULE_HEADER)
|
|
if(NOT header_file_path)
|
|
# The Qt module is imported from the Qt installation prefix.
|
|
# Calculate the module header location.
|
|
get_target_property(include_name "${library}" _qt_module_include_name)
|
|
if(NOT include_name)
|
|
message(DEBUG "Property _qt_module_include_name is not set on ${library}.")
|
|
return()
|
|
endif()
|
|
|
|
get_target_property(relative_include_dir "${library}" _qt_module_relative_include_dir)
|
|
if(NOT relative_include_dir)
|
|
message(DEBUG "Property _qt_module_relative_include_dir is not set on ${library}.")
|
|
return()
|
|
endif()
|
|
|
|
get_target_property(package_name ${library} _qt_package_name)
|
|
if(NOT package_name)
|
|
message(DEBUG "No package name found for ${library}.")
|
|
return()
|
|
endif()
|
|
set(package_location "${${package_name}_DIR}")
|
|
get_filename_component(absolute_include_dir
|
|
"${package_location}/${relative_include_dir}"
|
|
ABSOLUTE
|
|
)
|
|
|
|
set(header_file_path "${absolute_include_dir}/${include_name}")
|
|
if(NOT EXISTS "${header_file_path}")
|
|
message(DEBUG "Module header '${header_file_path}' does not exist.")
|
|
return()
|
|
endif()
|
|
endif()
|
|
|
|
qt_update_precompiled_header("${target}" "${header_file_path}")
|
|
endfunction()
|
|
|
|
function(qt_update_ignore_pch_source target sources)
|
|
if (sources)
|
|
set_source_files_properties(${sources} PROPERTIES
|
|
SKIP_PRECOMPILE_HEADERS ON
|
|
SKIP_UNITY_BUILD_INCLUSION ON)
|
|
endif()
|
|
endfunction()
|
|
|
|
function(qt_ignore_pch_obj_c_sources target sources)
|
|
# No obj-cxx PCH support for versions lower than 3.16.
|
|
if(CMAKE_VERSION VERSION_LESS 3.16.0)
|
|
list(FILTER sources INCLUDE REGEX "\\.mm$")
|
|
qt_update_ignore_pch_source("${target}" "${sources}")
|
|
endif()
|
|
endfunction()
|