summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Klocek <michal.klocek@qt.io>2022-01-31 15:11:22 +0100
committerMichal Klocek <michal.klocek@qt.io>2022-02-07 12:58:16 +0100
commit1fbc256110da7f87d2b0c526d6e256c4e7ec7d5f (patch)
treea6dfb8073be39cd77ab633630f9f8643a0856947
parent6cc86fd59f285054641fea7305f69886d41c9cc0 (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.cmake119
-rw-r--r--src/core/CMakeLists.txt4
-rw-r--r--src/pdf/CMakeLists.txt2
-rw-r--r--src/pdf/configure/BUILD.root.gn.in5
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",