summaryrefslogtreecommitdiffstats
path: root/cmake
diff options
context:
space:
mode:
authorMichal Klocek <michal.klocek@qt.io>2023-04-20 11:06:18 +0200
committerMichal Klocek <michal.klocek@qt.io>2023-05-03 12:35:32 +0200
commit4aca44bbf6d63c6a73cb9c3220055a39c4cbd2b1 (patch)
treebf07aa6d82ab140c291900b04641ff0c9c457b4b /cmake
parentbd1d854d03f169f005511b2204d124dc05213571 (diff)
Fix build race condition between data_dep and WebEngineCore.stamp
For v8 context generator data_dep race condition occurs on universal builds. As data_dep is runtime dependency, it will be not included into our linker WebEngineCore.stamp, changing the behavior in gn would look ugly as it would require introducing another flag to just to handle this case to force this dependency for build time. Therefore add extra v8_context_snapshot.stamp to cmake to cover that case. Change-Id: Ia8b2320fc8e615235bde483d282dfca73a38f215 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'cmake')
-rw-r--r--cmake/Functions.cmake86
1 files changed, 55 insertions, 31 deletions
diff --git a/cmake/Functions.cmake b/cmake/Functions.cmake
index 56f13f2ae..b460dbbe8 100644
--- a/cmake/Functions.cmake
+++ b/cmake/Functions.cmake
@@ -384,14 +384,20 @@ function(get_ios_target_triple_and_sysroot result arch)
)
endfunction()
-function(add_ninja_target target cmakeTarget ninjaTarget config arch buildDir)
- string(TOUPPER ${config} cfg)
- add_custom_target(${target} DEPENDS ${buildDir}/${config}/${arch}/${ninjaTarget}.stamp)
- set_target_properties(${target} PROPERTIES
- CONFIG ${config}
- ARCH ${arch}
- CMAKE_TARGET ${cmakeTarget}
- NINJA_TARGET ${ninjaTarget}
+function(add_ninja_target)
+ cmake_parse_arguments(PARSE_ARGV 0 arg
+ "" "TARGET;CMAKE_TARGET;NINJA_TARGET;BUILDDIR;NINJA_STAMP;NINJA_DATA_STAMP;CONFIG;ARCH" ""
+ )
+ _qt_internal_validate_all_args_are_parsed(arg)
+ set(stamps ${arg_NINJA_STAMP} ${arg_NINJA_DATA_STAMP})
+ list(TRANSFORM stamps PREPEND "${arg_BUILDDIR}/${arg_CONFIG}/${arg_ARCH}/")
+ add_custom_target(${arg_TARGET} DEPENDS ${stamps})
+ set_target_properties(${arg_TARGET} PROPERTIES
+ CONFIG ${arg_CONFIG}
+ ARCH ${arg_ARCH}
+ CMAKE_TARGET ${arg_CMAKE_TARGET}
+ NINJA_TARGET ${arg_NINJA_TARGET}
+ NINJA_STAMP ${arg_NINJA_STAMP}
)
endfunction()
@@ -507,6 +513,7 @@ function(add_intermediate_archive target buildDir completeStatic)
get_target_property(arch ${target} ARCH)
get_target_property(ninjaTarget ${target} NINJA_TARGET)
get_target_property(cmakeTarget ${target} CMAKE_TARGET)
+ get_target_property(ninjaStamp ${target} NINJA_STAMP)
string(TOUPPER ${config} cfg)
set(objects_rsp "${buildDir}/${ninjaTarget}_objects.rsp")
set(objects_out "${buildDir}/${cmakeTarget}_objects.o")
@@ -534,7 +541,7 @@ function(add_intermediate_archive target buildDir completeStatic)
${objects_out}
${archives_out}
DEPENDS
- ${buildDir}/${ninjaTarget}.stamp
+ ${buildDir}/${ninjaStamp}
WORKING_DIRECTORY "${buildDir}/../../.."
COMMENT "Creating intermediate archives for ${cmakeTarget}/${config}/${arch}"
USES_TERMINAL
@@ -548,6 +555,7 @@ function(add_intermediate_object target buildDir completeStatic)
get_target_property(arch ${target} ARCH)
get_target_property(ninjaTarget ${target} NINJA_TARGET)
get_target_property(cmakeTarget ${target} CMAKE_TARGET)
+ get_target_property(ninjaStamp ${target} NINJA_STAMP)
string(TOUPPER ${config} cfg)
if(IOS)
get_ios_target_triple_and_sysroot(args ${arch})
@@ -562,7 +570,7 @@ function(add_intermediate_object target buildDir completeStatic)
-Wl,-keep_private_externs
@${objects_rsp}
DEPENDS
- ${buildDir}/${ninjaTarget}.stamp
+ ${buildDir}/${ninjaStamp}
WORKING_DIRECTORY "${buildDir}/../../.."
COMMENT "Creating intermediate object files for ${cmakeTarget}/${config}/${arch}"
USES_TERMINAL
@@ -610,6 +618,7 @@ endfunction()
function(add_lipo_command target buildDir)
get_target_property(config ${target} CONFIG)
get_target_property(cmakeTarget ${target} CMAKE_TARGET)
+ get_target_property(ninjaTarget ${target} NINJA_TARGET)
set(fileName ${cmakeTarget}.a)
create_lipo_command(${target} ${buildDir} ${fileName})
add_library(${cmakeTarget}_${config} STATIC IMPORTED GLOBAL)
@@ -1086,15 +1095,16 @@ endmacro()
function(add_ninja_command)
cmake_parse_arguments(PARSE_ARGV 0 arg
- "" "TARGET;OUTPUT;BUILDDIR;MODULE" "BYPRODUCTS"
+ "" "TARGET;BUILDDIR;MODULE" "OUTPUT;BYPRODUCTS"
)
_qt_internal_validate_all_args_are_parsed(arg)
string(REPLACE " " ";" NINJAFLAGS "$ENV{NINJAFLAGS}")
+ list(TRANSFORM arg_OUTPUT PREPEND "${arg_BUILDDIR}/")
list(TRANSFORM arg_BYPRODUCTS PREPEND "${arg_BUILDDIR}/")
add_custom_command(
OUTPUT
- ${arg_BUILDDIR}/${arg_OUTPUT}
+ ${arg_OUTPUT}
${arg_BUILDDIR}/${arg_TARGET} # use generator expression in CMAKE 3.20
BYPRODUCTS ${arg_BYPRODUCTS}
COMMENT "Running ninja for ${arg_TARGET} in ${arg_BUILDDIR}"
@@ -1133,7 +1143,12 @@ function(get_architectures result)
set(${result} ${${result}} PARENT_SCOPE)
endfunction()
-function(add_gn_build_aritfacts_to_target cmakeTarget ninjaTarget module buildDir completeStatic)
+function(add_gn_build_aritfacts_to_target)
+ cmake_parse_arguments(PARSE_ARGV 0 arg
+ "" "CMAKE_TARGET;NINJA_TARGET;BUILDDIR;MODULE;COMPLETE_STATIC;NINJA_STAMP;NINJA_DATA_STAMP" ""
+ )
+ _qt_internal_validate_all_args_are_parsed(arg)
+
# config loop is a workaround to be able to add_custom_command per config
# note this is fixed in CMAKE.3.20 and should be cleaned up when 3.20 is
# the minimum cmake we support
@@ -1141,41 +1156,50 @@ function(add_gn_build_aritfacts_to_target cmakeTarget ninjaTarget module buildDi
get_architectures(archs)
foreach(config ${configs})
foreach(arch ${archs})
-
- set(target ${ninjaTarget}_${config}_${arch})
- add_ninja_target(${target} ${cmakeTarget} ${ninjaTarget} ${config} ${arch} ${buildDir})
+ set(target ${arg_NINJA_TARGET}_${config}_${arch})
+ set(stamps ${arg_NINJA_STAMP} ${arg_NINJA_DATA_STAMP})
+ add_ninja_target(
+ TARGET ${target}
+ NINJA_TARGET ${arg_NINJA_TARGET}
+ CMAKE_TARGET ${arg_CMAKE_TARGET}
+ NINJA_STAMP ${arg_NINJA_STAMP}
+ NINJA_DATA_STAMP ${arg_NINJA_DATA_STAMP}
+ CONFIG ${config}
+ ARCH ${arch}
+ BUILDDIR ${arg_BUILDDIR}
+ )
add_ninja_command(
- TARGET ${ninjaTarget}
- OUTPUT ${ninjaTarget}.stamp
- BUILDDIR ${buildDir}/${config}/${arch}
- MODULE ${module}
+ TARGET ${arg_NINJA_TARGET}
+ OUTPUT ${stamps}
+ BUILDDIR ${arg_BUILDDIR}/${config}/${arch}
+ MODULE ${arg_MODULE}
)
- add_dependencies(run_${module}_NinjaDone ${target})
- set_target_properties(${cmakeTarget} PROPERTIES
- LINK_DEPENDS ${buildDir}/${config}/${arch}/${ninjaTarget}.stamp
+ add_dependencies(run_${arg_MODULE}_NinjaDone ${target})
+ set_target_properties(${arg_CMAKE_TARGET} PROPERTIES
+ LINK_DEPENDS ${arg_BUILDDIR}/${config}/${arch}/${arg_NINJA_STAMP}
)
if(QT_IS_MACOS_UNIVERSAL)
- add_intermediate_archive(${target} ${buildDir}/${config}/${arch} ${completeStatic})
+ add_intermediate_archive(${target} ${arg_BUILDDIR}/${config}/${arch} ${arg_COMPLETE_STATIC})
elseif(IOS)
- add_intermediate_object(${target} ${buildDir}/${config}/${arch} ${completeStatic})
+ add_intermediate_object(${target} ${arg_BUILDDIR}/${config}/${arch} ${arg_COMPLETE_STATIC})
else()
if(MACOS AND QT_FEATURE_static)
# mac archiver does not support @file notation, do intermediate object istead
- add_intermediate_object(${target} ${buildDir}/${config}/${arch} ${completeStatic})
- add_archiver_options(${target} ${buildDir}/${config}/${arch} ${completeStatic})
+ add_intermediate_object(${target} ${arg_BUILDDIR}/${config}/${arch} ${arg_COMPLETE_STATIC})
+ add_archiver_options(${target} ${arg_BUILDDIR}/${config}/${arch} ${arg_COMPLETE_STATIC})
else()
- add_linker_options(${target} ${buildDir}/${config}/${arch} ${completeStatic})
+ add_linker_options(${target} ${arg_BUILDDIR}/${config}/${arch} ${arg_COMPLETE_STATIC})
endif()
endif()
unset(target)
endforeach()
list(GET archs 0 arch)
- set(target ${ninjaTarget}_${config}_${arch})
+ set(target ${arg_NINJA_TARGET}_${config}_${arch})
if(QT_IS_MACOS_UNIVERSAL)
- add_lipo_command(${target} ${buildDir}/${config})
+ add_lipo_command(${target} ${arg_BUILDDIR}/${config})
endif()
if(IOS)
- add_ios_lipo_command(${target} ${buildDir}/${config})
+ add_ios_lipo_command(${target} ${arg_BUILDDIR}/${config})
endif()
endforeach()
endfunction()