build system: support module local definitions

This introduces a new helper function,
qt_internal_add_repo_local_defines and makes use of it in
qt_internal_add_{module,test,executable,benchmark,plugin}. That function
checks whether QT_EXTRA_INTERNAL_TARGET_DEFINES is set. If it is, the
defines listed in there will be aded to all targets passed to the
functions mentioned above.

The intended usage is that QT_EXTRA_INTERNAL_TARGET_DEFINES gets set
in the repository local .cmake.conf. This allows e.g. opting in to
source incompatible changes in leaf modules (as long as those are
guarded by some define).

Pick-to: 6.2 6.3
Fixes: QTBUG-101640
Change-Id: I06c3693ee69f46e95a48de724621f0c97e7cc3a8
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
This commit is contained in:
Fabian Kosmale 2022-03-11 12:41:36 +01:00
parent d743fd0d0a
commit 57c1e8d533
5 changed files with 28 additions and 0 deletions

View File

@ -70,6 +70,9 @@ function(qt_internal_add_executable name)
endif()
qt_set_common_target_properties(${name})
qt_internal_add_repo_local_defines(${name})
if(ANDROID)
# The above call to qt_set_common_target_properties() sets the symbol
# visibility to hidden, but for Android, we need main() to not be hidden

View File

@ -510,6 +510,8 @@ function(qt_internal_add_module target)
list(APPEND arg_LIBRARIES Qt::PlatformModuleInternal)
endif()
qt_internal_add_repo_local_defines("${target}")
qt_internal_extend_target("${target}"
${header_module}
SOURCES ${arg_SOURCES}

View File

@ -329,6 +329,8 @@ function(qt_internal_add_plugin target)
DISABLE_AUTOGEN_TOOLS ${arg_DISABLE_AUTOGEN_TOOLS}
)
qt_internal_add_repo_local_defines("${target}")
qt_internal_set_exceptions_flags("${target}" ${arg_EXCEPTIONS})

View File

@ -874,3 +874,19 @@ function(qt_internal_undefine_global_definition target)
set_target_properties(${target} PROPERTIES "${undef_property_name}" TRUE)
endforeach()
endfunction()
# This function adds any defines which are local to the current repository (e.g. qtbase,
# qtmultimedia). Those can be defined in the corresponding .cmake.conf file via
# QT_EXTRA_INTERNAL_TARGET_DEFINES. QT_EXTRA_INTERNAL_TARGET_DEFINES accepts a list of definitions.
# The definitions are passed to target_compile_definitions, which means that values can be provided
# via the FOO=Bar syntax
# This does nothing for interface targets
function(qt_internal_add_repo_local_defines target)
get_target_property(type "${target}" TYPE)
if (${type} STREQUAL "INTERFACE_LIBRARY")
return()
endif()
if(DEFINED QT_EXTRA_INTERNAL_TARGET_DEFINES)
target_compile_definitions("${target}" PRIVATE ${QT_EXTRA_INTERNAL_TARGET_DEFINES})
endif()
endfunction()

View File

@ -33,6 +33,9 @@ function(qt_internal_add_benchmark target)
${exec_args}
)
qt_internal_add_repo_local_defines(${target})
# Disable the QT_NO_NARROWING_CONVERSIONS_IN_CONNECT define for benchmarks
qt_internal_undefine_global_definition(${target} QT_NO_NARROWING_CONVERSIONS_IN_CONNECT)
@ -264,6 +267,8 @@ function(qt_internal_add_test name)
DISABLE_AUTOGEN_TOOLS ${arg_DISABLE_AUTOGEN_TOOLS}
)
qt_internal_add_repo_local_defines(${name})
# Disable the QT_NO_NARROWING_CONVERSIONS_IN_CONNECT define for tests
qt_internal_undefine_global_definition(${name} QT_NO_NARROWING_CONVERSIONS_IN_CONNECT)