diff options
Diffstat (limited to 'cmake')
-rw-r--r-- | cmake/Functions.cmake | 86 |
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() |