diff options
author | Michal Klocek <michal.klocek@qt.io> | 2022-01-31 15:11:22 +0100 |
---|---|---|
committer | Michal Klocek <michal.klocek@qt.io> | 2022-02-07 12:58:16 +0100 |
commit | 1fbc256110da7f87d2b0c526d6e256c4e7ec7d5f (patch) | |
tree | a6dfb8073be39cd77ab633630f9f8643a0856947 | |
parent | 6cc86fd59f285054641fea7305f69886d41c9cc0 (diff) |
Introduce gn complete static lib target for qtpdf
With 6.x we have gn-cmake integration which allows now
in case of static builds to switch gn target output to
static_library with 'complete static' option instead of
shared_library. This way we can avoid installing dependencies
in form of internal static Chromium archives as it was done
in 5.15 in case of static builds.
Unfortunately 'complete static' option can not be used with
QtWebEngineCore build as it will exceed 4Gb static archive
limitation on Windows, however it will work fine with QtPdf.
Note the qtbase 3rdparty static libs have to be still installed
in case of qt static build, this patch only eliminates need for
Chromium specific ones.
Task-number: QTBUG-88614
Change-Id: I6fc4ce48c79a1631b013d0b29c190c62280f7304
Reviewed-by: Peter Varga <pvarga@inf.u-szeged.hu>
(cherry picked from commit 8e549e6e0ccd6078b3bd2e38b87337fd367dec55)
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
-rw-r--r-- | cmake/Functions.cmake | 119 | ||||
-rw-r--r-- | src/core/CMakeLists.txt | 4 | ||||
-rw-r--r-- | src/pdf/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/pdf/configure/BUILD.root.gn.in | 5 |
4 files changed, 70 insertions, 60 deletions
diff --git a/cmake/Functions.cmake b/cmake/Functions.cmake index 10b8596f7..110df2f0a 100644 --- a/cmake/Functions.cmake +++ b/cmake/Functions.cmake @@ -356,34 +356,31 @@ function(add_ninja_target target cmakeTarget ninjaTarget config arch buildDir) ) endfunction() -function(copy_response_files target) +function(get_copy_of_response_file result target rsp) get_target_property(config ${target} CONFIG) get_target_property(ninjaTarget ${target} NINJA_TARGET) get_target_property(cmakeTarget ${target} CMAKE_TARGET) - list(REMOVE_ITEM ARGN ${target}) - foreach(rsp IN ITEMS ${ARGN}) - set(rsp_dst "CMakeFiles_${ninjaTarget}_${config}_${rsp}.rsp") - set(rsp_src "${${rsp}_rsp}") - if(NOT QT_SUPERBUILD) - set(rsp_output ${PROJECT_BINARY_DIR}/${rsp_dst}) - else() - set(rsp_output ${PROJECT_BINARY_DIR}/../${rsp_dst}) - endif() - add_custom_command( - OUTPUT ${rsp_output} - COMMAND ${CMAKE_COMMAND} -E copy ${rsp_src} ${rsp_output} - DEPENDS ${rsp_src} - USES_TERMINAL - ) - set(${rsp}_rsp ${rsp_dst} PARENT_SCOPE) - add_custom_target(${cmakeTarget}_${rsp}_copy_${config} - DEPENDS ${rsp_output} - ) - add_dependencies(${cmakeTarget} ${cmakeTarget}_${rsp}_copy_${config}) - endforeach() + set(rsp_dst "CMakeFiles_${ninjaTarget}_${config}_${rsp}.rsp") + set(rsp_src "${${result}}") + if(NOT QT_SUPERBUILD) + set(rsp_output ${PROJECT_BINARY_DIR}/${rsp_dst}) + else() + set(rsp_output ${PROJECT_BINARY_DIR}/../${rsp_dst}) + endif() + add_custom_command( + OUTPUT ${rsp_output} + COMMAND ${CMAKE_COMMAND} -E copy ${rsp_src} ${rsp_output} + DEPENDS ${rsp_src} + USES_TERMINAL + ) + set(${result} ${rsp_dst} PARENT_SCOPE) + add_custom_target(${cmakeTarget}_${rsp}_copy_${config} + DEPENDS ${rsp_output} + ) + add_dependencies(${cmakeTarget} ${cmakeTarget}_${rsp}_copy_${config}) endfunction() -function(extend_cmake_target target buildDir) +function(extend_cmake_target target buildDir completeStatic) get_target_property(config ${target} CONFIG) get_target_property(ninjaTarget ${target} NINJA_TARGET) get_target_property(cmakeTarget ${target} CMAKE_TARGET) @@ -393,12 +390,12 @@ function(extend_cmake_target target buildDir) set(archives_rsp "${buildDir}/${ninjaTarget}_archives.rsp") set(libs_rsp "${buildDir}/${ninjaTarget}_libs.rsp") if(LINUX) - target_link_options(${cmakeTarget} PRIVATE - "$<$<CONFIG:${config}>:@${objects_rsp}>" - ) - target_link_libraries(${cmakeTarget} PRIVATE - "-Wl,--start-group $<$<CONFIG:${config}>:@${archives_rsp}> -Wl,--end-group" - ) + target_link_options(${cmakeTarget} PRIVATE "$<$<CONFIG:${config}>:@${objects_rsp}>") + if(NOT completeStatic) + target_link_libraries(${cmakeTarget} PRIVATE + "-Wl,--start-group $<$<CONFIG:${config}>:@${archives_rsp}> -Wl,--end-group" + ) + endif() # linker here options are just to prevent processing it by cmake target_link_libraries(${cmakeTarget} PRIVATE "-Wl,--no-fatal-warnings $<$<CONFIG:${config}>:@${libs_rsp}> -Wl,--no-fatal-warnings" @@ -406,51 +403,61 @@ function(extend_cmake_target target buildDir) endif() if(MACOS) - target_link_options(${cmakeTarget} PRIVATE - "$<$<CONFIG:${config}>:@${objects_rsp}>" - "$<$<CONFIG:${config}>:@${archives_rsp}>" - "$<$<CONFIG:${config}>:@${libs_rsp}>" - ) + target_link_options(${cmakeTarget} PRIVATE "$<$<CONFIG:${config}>:@${objects_rsp}>") + if(NOT completeStatic) + target_link_options(${cmakeTarget} PRIVATE "$<$<CONFIG:${config}>:@${archives_rsp}>") + endif() + target_link_options(${cmakeTarget} PRIVATE "$<$<CONFIG:${config}>:@${libs_rsp}>") endif() if(WIN32) - copy_response_files(${target} objects archives libs) - target_link_options(${cmakeTarget} PRIVATE - "$<$<CONFIG:${config}>:@${objects_rsp}>" - "$<$<CONFIG:${config}>:@${archives_rsp}>" - "$<$<CONFIG:${config}>:@${libs_rsp}>" - ) + get_copy_of_response_file(objects_rsp ${target} objects) + target_link_options(${cmakeTarget} PRIVATE "$<$<CONFIG:${config}>:@${objects_rsp}>") + if(NOT completeStatic) + get_copy_of_response_file(archives_rsp ${target} archives) + target_link_options(${cmakeTarget} PRIVATE "$<$<CONFIG:${config}>:@${archives_rsp}>") + endif() + get_copy_of_response_file(libs_rsp ${target} libs) + target_link_options(${cmakeTarget} PRIVATE "$<$<CONFIG:${config}>:@${libs_rsp}>") # we need libs rsp also when linking process with sandbox lib set_property(TARGET ${cmakeTarget} PROPERTY LIBS_RSP ${libs_rsp}) endif() endfunction() -function(add_rsp_command target buildDir) +function(add_rsp_command target buildDir completeStatic) get_target_property(config ${target} CONFIG) get_target_property(arch ${target} ARCH) get_target_property(ninjaTarget ${target} NINJA_TARGET) get_target_property(cmakeTarget ${target} CMAKE_TARGET) string(TOUPPER ${config} cfg) + set(objects_rsp "${buildDir}/${ninjaTarget}_objects.rsp") + set(objects_out "${buildDir}/${cmakeTarget}_objects.o") + if(NOT completeStatic) + set(archives_rsp "${buildDir}/${ninjaTarget}_archives.rsp") + set(archives_out "${buildDir}/${cmakeTarget}_archives.o") + set(archives_command + COMMAND clang++ -r -nostdlib -arch ${arch} + -o ${archives_out} + -Wl,-keep_private_externs + -Wl,-all_load + @${archives_rsp} + ) + endif() add_custom_command( OUTPUT ${buildDir}/${cmakeTarget}.a - BYPRODUCTS - ${buildDir}/${cmakeTarget}_objs.o - ${buildDir}/${cmakeTarget}_arcs.o + BYPRODUCTS ${objects_out} ${archives_out} COMMAND clang++ -r -nostdlib -arch ${arch} - -o ${buildDir}/${cmakeTarget}_objs.o + -o ${objects_out} -Wl,-keep_private_externs - @${buildDir}/${ninjaTarget}_objects.rsp - COMMAND clang++ -r -nostdlib -arch ${arch} - -o ${buildDir}/${cmakeTarget}_arcs.o - -Wl,-keep_private_externs - -Wl,-all_load - @${buildDir}/${ninjaTarget}_archives.rsp + @${objects_rsp} + ${archives_command} COMMAND ar -crs ${buildDir}/${cmakeTarget}.a - ${buildDir}/${cmakeTarget}_objs.o - ${buildDir}/${cmakeTarget}_arcs.o + ${objects_out} + ${archives_out} DEPENDS ${buildDir}/${ninjaTarget}.stamp WORKING_DIRECTORY "${buildDir}/../../.." + COMMENT "Creating intermediate archives for ${cmakeTarget}/${config}/${arch}" USES_TERMINAL VERBATIM COMMAND_EXPAND_LISTS @@ -932,7 +939,7 @@ function(get_architectures result) endif() endfunction() -function(add_gn_build_aritfacts_to_target cmakeTarget ninjaTarget module buildDir) +function(add_gn_build_aritfacts_to_target cmakeTarget ninjaTarget module buildDir completeStatic) # 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 @@ -959,9 +966,9 @@ function(add_gn_build_aritfacts_to_target cmakeTarget ninjaTarget module buildDi LINK_DEPENDS ${buildDir}/${config}/${arch}/${ninjaTarget}.stamp ) if(QT_IS_MACOS_UNIVERSAL) - add_rsp_command(${target} ${buildDir}/${config}/${arch}) + add_rsp_command(${target} ${buildDir}/${config}/${arch} ${completeStatic}) else() - extend_cmake_target(${target} ${buildDir}/${config}/${arch}) + extend_cmake_target(${target} ${buildDir}/${config}/${arch} ${completeStatic}) endif() endforeach() if(QT_IS_MACOS_UNIVERSAL) diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 3c1b67bf0..3eec61927 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -459,7 +459,7 @@ target_include_directories(WebEngineCore PRIVATE ${buildDir}/$<CONFIG>/${arch}/gen/third_party/perfetto/build_config ) -add_gn_build_aritfacts_to_target(WebEngineCore QtWebEngineCore core ${buildDir}) +add_gn_build_aritfacts_to_target(WebEngineCore QtWebEngineCore core ${buildDir} FALSE) add_dependencies(WebEngineCore run_core_NinjaDone) if(COIN_BUG_699) set_property(TARGET WebEngineCore PROPERTY CXX_LINKER_LAUNCHER ${PROJECT_BINARY_DIR}/linker_ulimit.sh) @@ -501,7 +501,7 @@ if(QT_FEATURE_webengine_spellchecker) ../3rdparty/chromium/third_party/boringssl/src/include ${buildDir}/$<CONFIG>/${arch}/gen ) - add_gn_build_aritfacts_to_target(${dict_target_name} convert_dict core ${buildDir}) + add_gn_build_aritfacts_to_target(${dict_target_name} convert_dict core ${buildDir} FALSE) add_dependencies(${dict_target_name} run_core_NinjaDone) add_dependencies(${dict_target_name} WebEngineCore) endif() diff --git a/src/pdf/CMakeLists.txt b/src/pdf/CMakeLists.txt index 9e4004adf..d7038d06f 100644 --- a/src/pdf/CMakeLists.txt +++ b/src/pdf/CMakeLists.txt @@ -167,6 +167,6 @@ endforeach() set(arch ${CMAKE_SYSTEM_PROCESSOR}) target_include_directories(Pdf PRIVATE ${buildDir}/$<CONFIG>/${arch}/gen) -add_gn_build_aritfacts_to_target(Pdf QtPdf pdf ${buildDir}) +add_gn_build_aritfacts_to_target(Pdf QtPdf pdf ${buildDir} TRUE) add_dependencies(Pdf run_pdf_NinjaDone) diff --git a/src/pdf/configure/BUILD.root.gn.in b/src/pdf/configure/BUILD.root.gn.in index 5252b701a..a3cd32a23 100644 --- a/src/pdf/configure/BUILD.root.gn.in +++ b/src/pdf/configure/BUILD.root.gn.in @@ -1,3 +1,5 @@ +import("//build/config/features.gni") + config("QtPdf_config") { cflags = [ @GN_CFLAGS_C@, @@ -24,7 +26,8 @@ config("cpp17_config") { } } -shared_library("QtPdf") { +static_library("QtPdf") { + complete_static_lib = true rsp_types = [ "objects", "archives", "libs" ] configs += [ ":cpp17_config", |