summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Klocek <michal.klocek@qt.io>2021-08-17 08:49:47 +0200
committerMichal Klocek <michal.klocek@qt.io>2021-08-30 19:47:48 +0200
commit6bb20409cc25897df93663d2679edf8791960e94 (patch)
treec251b04975b702e394b929efce2f147ea32a0fa9
parenta6e9290ab0da6687ee8becefc706826300d7b2a2 (diff)
Use rsp files directly from gn
Do not use gn created cmake files since this requires cmake configuration step, which currently ends up in duplicated targets in main and qtwebengine external project. Use response files instead, so we can remove duplicated targets in follow up patches. This approach unfortunately has downside of cmake not being aware of gn build artifacts and hacks directly linker command. For universal builds remove not needed rsp template, since we can now use rsp files directly generated by gn. Task-number: QTBUG-95590 Change-Id: I83282ba68fa171cada7236d0587be27122315dec Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io> (cherry picked from commit 96e47e1c9b6ce5c71e2560bb95f6e59ce062c8ba) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--cmake/Functions.cmake143
-rw-r--r--src/core/CMakeLists.txt15
-rw-r--r--src/core/configure/BUILD.root.gn.in4
-rw-r--r--src/core/configure/rsp.cmake.in5
-rw-r--r--src/pdf/CMakeLists.txt6
-rw-r--r--src/pdf/configure/BUILD.root.gn.in2
6 files changed, 87 insertions, 88 deletions
diff --git a/cmake/Functions.cmake b/cmake/Functions.cmake
index 516ae79fc..96ff575fa 100644
--- a/cmake/Functions.cmake
+++ b/cmake/Functions.cmake
@@ -166,10 +166,10 @@ function(extend_gn_list outList)
set(${outList} "${${outList}}" PARENT_SCOPE)
endfunction()
-function(configure_gn_target target configType inFilePath outFilePath)
+function(configure_gn_target target config inFilePath outFilePath buildPrefix)
# GN_CONFIG
- string(TOUPPER ${configType} GN_CONFIG)
+ string(TOUPPER ${config} GN_CONFIG)
# GN_SOURCES GN_HEADERS
get_target_property(gnSources ${target} GN_SOURCES)
@@ -219,7 +219,7 @@ function(configure_gn_target target configType inFilePath outFilePath)
# GN_SOURCE_ROOT
get_filename_component(GN_SOURCE_ROOT "${CMAKE_CURRENT_LIST_DIR}" REALPATH)
-
+ set(GN_RSP_PREFIX ${buildPrefix})
if(MACOS)
recoverFrameworkBuild(GN_INCLUDE_DIRS GN_CFLAGS_C)
endif()
@@ -316,89 +316,84 @@ function(get_darwin_sdk_version result)
endif()
endfunction()
-function(add_gn_target_from_cmake_target gnTarget cmakeTarget ninjaTarget config arch buildDir)
- include(${buildDir}/${config}/${arch}/${ninjaTarget}.cmake)
+function(add_gn_target_for_cmake_target gnTarget cmakeTarget ninjaTarget config arch)
string(TOUPPER ${config} cfg)
add_custom_target(${gnTarget})
set_target_properties(${gnTarget} PROPERTIES
CONFIG ${config}
ARCH ${arch}
+ CMAKE_TARGET ${cmakeTarget}
+ NINJA_TARGET ${ninjaTarget}
)
- set_property(TARGET ${gnTarget} APPEND PROPERTY OBJECTS ${${cfg}_NINJA_OBJECTS})
- set_property(TARGET ${gnTarget} APPEND PROPERTY ARCHIVES ${${cfg}_NINJA_ARCHIVES})
- set_property(TARGET ${gnTarget} APPEND PROPERTY LIBS ${${cfg}_NINJA_LIBS})
- set_property(TARGET ${gnTarget} APPEND PROPERTY STAMP ${${cfg}_NINJA_TARGETDEPS})
endfunction()
-function(extend_target_with_gn_target gnTarget cmakeTarget)
+function(extend_target_with_gn_target gnTarget buildDir)
get_target_property(config ${gnTarget} CONFIG)
+ get_target_property(ninjaTarget ${gnTarget} NINJA_TARGET)
+ get_target_property(cmakeTarget ${gnTarget} CMAKE_TARGET)
string(TOUPPER ${cmakeTarget} tg)
string(TOUPPER ${config} cfg)
- get_target_property(ninja_objects ${gnTarget} OBJECTS)
- get_target_property(ninja_archives ${gnTarget} ARCHIVES)
- get_target_property(ninja_libs ${gnTarget} LIBS)
- get_target_property(ninja_stamp ${gnTarget} STAMP)
- add_library(GnObjects_${cmakeTarget}_${config} OBJECT IMPORTED GLOBAL)
- target_link_libraries(${cmakeTarget} PRIVATE $<$<CONFIG:${config}>:GnObjects_${cmakeTarget}_${config}>)
- add_custom_target(ninja_${cmakeTarget}_${config} DEPENDS ${ninja_stamp})
- add_dependencies(GnObjects_${cmakeTarget}_${config} ninja_${cmakeTarget}_${config})
- #TODO: remove GnObjects_${cmakeTarget}_${config} with CMAKE 3.20
- set_property(TARGET GnObjects_${cmakeTarget}_${config}
- PROPERTY IMPORTED_OBJECTS_${cfg} ${ninja_objects}
- )
+ add_custom_target(ninja_${cmakeTarget}_${config} DEPENDS ${buildDir}/${ninjaTarget}.stamp)
+ add_dependencies(${cmakeTarget} ninja_${cmakeTarget}_${config})
+ set(objects_rsp "${buildDir}/${ninjaTarget}_objects.rsp")
+ set(archives_rsp "${buildDir}/${ninjaTarget}_archives.rsp")
+ set(libs_rsp "${buildDir}/${ninjaTarget}_libs.rsp")
if(LINUX)
- target_link_libraries(${cmakeTarget}
- PRIVATE "-Wl,--start-group" "$<$<CONFIG:${config}>:${ninja_archives}>" "-Wl,--end-group")
- else()
- target_link_libraries(${cmakeTarget} PRIVATE "$<$<CONFIG:${config}>:${ninja_archives}>")
+ target_link_options(${cmakeTarget} PRIVATE
+ "$<$<CONFIG:${config}>:@${objects_rsp}>"
+ "-Wl,--start-group"
+ "$<$<CONFIG:${config}>:@${archives_rsp}>"
+ "-Wl,--end-group"
+ "$<$<CONFIG:${config}>:@${libs_rsp}>"
+ )
+ endif()
+ if(MACOS)
+ target_link_options(${cmakeTarget} PRIVATE
+ "$<$<CONFIG:${config}>:@${objects_rsp}>"
+ "$<$<CONFIG:${config}>:@${archives_rsp}>"
+ "$<$<CONFIG:${config}>:@${libs_rsp}>"
+ )
+ endif()
+ if(WIN32)
+ target_link_options(${cmakeTarget} PRIVATE
+ "$<$<CONFIG:${config}>:@${objects_rsp}>"
+ "$<$<CONFIG:${config}>:@${archives_rsp}>"
+ )
endif()
- target_link_libraries(${cmakeTarget} PUBLIC "$<$<CONFIG:${config}>:${ninja_libs}>")
-endfunction()
-
-function(create_rsp_cmake_file rspFileIn rspFileOut cmakeFile config target)
- set(CMAKE_FILE ${cmakeFile})
- set(CONFIG ${config})
- set(TARGET ${target})
- configure_file(${rspFileIn} ${rspFileOut} @ONLY)
endfunction()
-function(add_rsp_command gnTarget cmakeTarget ninjaTarget buildDir)
+function(add_rsp_command gnTarget buildDir)
get_target_property(config ${gnTarget} CONFIG)
get_target_property(arch ${gnTarget} ARCH)
+ get_target_property(ninjaTarget ${gnTarget} NINJA_TARGET)
+ get_target_property(cmakeTarget ${gnTarget} CMAKE_TARGET)
string(TOUPPER ${config} cfg)
- get_target_property(ninja_stamp ${gnTarget} STAMP)
- create_rsp_cmake_file(
- ${WEBENGINE_ROOT_SOURCE_DIR}/src/core/configure/rsp.cmake.in
- ${buildDir}/${cmakeTarget}_rsp.cmake ${buildDir}/${ninjaTarget}.cmake ${cfg} ${cmakeTarget}
- )
add_custom_command(
OUTPUT ${buildDir}/${cmakeTarget}.a
BYPRODUCTS
${buildDir}/${cmakeTarget}.o
- ${buildDir}/${cmakeTarget}_gnobjects.rsp
- ${buildDir}/${cmakeTarget}_gnarchives.rsp
- COMMAND ${CMAKE_COMMAND} -P ${buildDir}/${cmakeTarget}_rsp.cmake
COMMAND clang++ -r -nostdlib -arch ${arch}
-o ${buildDir}/${cmakeTarget}.o
-Wl,-keep_private_externs
- @${buildDir}/${cmakeTarget}_gnobjects.rsp
+ @${buildDir}/${ninjaTarget}_objects.rsp
-Wl,-all_load
- @${buildDir}/${cmakeTarget}_gnarchives.rsp
+ @${buildDir}/${ninjaTarget}_archives.rsp
COMMAND ar -cr
${buildDir}/${cmakeTarget}.a
${buildDir}/${cmakeTarget}.o
DEPENDS
- ${ninja_stamp}
+ ${buildDir}/${ninjaTarget}.stamp
+ WORKING_DIRECTORY "${buildDir}/../../.."
USES_TERMINAL
VERBATIM
COMMAND_EXPAND_LISTS
)
endfunction()
-function(add_lipo_command gnTarget cmakeTarget buildDir)
+function(add_lipo_command gnTarget buildDir)
get_target_property(config ${gnTarget} CONFIG)
- get_target_property(ninja_libs ${gnTarget} LIBS)
-
+ get_target_property(cmakeTarget ${gnTarget} CMAKE_TARGET)
+ set(libs_rsp "${buildDir}/x86_64/${ninjaTarget}_libs.rsp")
# Lipo the object files together to a single fat archive
add_library(${cmakeTarget}_${config} STATIC IMPORTED GLOBAL)
add_custom_command(
@@ -424,7 +419,8 @@ function(add_lipo_command gnTarget cmakeTarget buildDir)
target_link_libraries(${cmakeTarget} PRIVATE ${cmakeTarget}_${config})
# Just link with dynamic libs once
- target_link_libraries(${cmakeTarget} PUBLIC "$<$<CONFIG:${config}>:${ninja_libs}>")
+ # TODO: this is evil hack, since cmake has no idea about libs
+ target_link_options(${cmakeTarget} PRIVATE "$<$<CONFIG:${config}>:@${libs_rsp}>")
endfunction()
function(qt_internal_add_external_project_dependency_to_root_project name)
@@ -833,22 +829,22 @@ macro(execute_gn)
endif()
endmacro()
-function(add_ninja_command gnTarget cmakeTarget ninjaTarget ninjaOutput buildDir)
+function(add_ninja_command)
+ qt_parse_all_arguments(arg "add_ninja_comamnd"
+ "" "TARGET;OUTPUT;BUILDDIR" "BYPRODUCTS" "${ARGN}"
+ )
string(REPLACE " " ";" NINJAFLAGS "$ENV{NINJAFLAGS}")
- if(gnTarget)
- get_target_property(ninja_objects ${gnTarget} OBJECTS)
- get_target_property(ninja_archives ${gnTarget} ARCHIVES)
- endif()
+ list(TRANSFORM arg_BYPRODUCTS PREPEND "${arg_BUILDDIR}/")
add_custom_command(
OUTPUT
- ${buildDir}/${ninjaOutput}
- ${buildDir}/${ninjaTarget} # use generator expression in CMAKE 3.20
- BYPRODUCTS ${ninja_objects} ${ninja_archives}
- COMMENT "Ninja ${buildDir}"
+ ${arg_BUILDDIR}/${arg_OUTPUT}
+ ${arg_BUILDDIR}/${arg_TARGET} # use generator expression in CMAKE 3.20
+ BYPRODUCTS ${arg_BYPRODUCTS}
+ COMMENT "Ninja for ${arg_BUILDDIR}"
COMMAND Ninja::ninja
${NINJAFLAGS}
- -C ${buildDir}
- ${ninjaTarget}
+ -C ${arg_BUILDDIR}
+ ${arg_TARGET}
USES_TERMINAL
VERBATIM
COMMAND_EXPAND_LISTS
@@ -871,7 +867,7 @@ function(get_architectures result)
endif()
endfunction()
-function(add_gn_build_aritfacts_to_target cmakeTarget ninjaTarget trackByproducts buildDir)
+function(add_gn_build_aritfacts_to_target cmakeTarget ninjaTarget buildDir)
# 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
@@ -880,23 +876,26 @@ function(add_gn_build_aritfacts_to_target cmakeTarget ninjaTarget trackByproduct
foreach(config ${configs})
foreach(arch ${archs})
set(gnTarget ${ninjaTarget}_${config}_${arch})
- add_gn_target_from_cmake_target(${gnTarget} ${cmakeTarget} ${ninjaTarget} ${config} ${arch} ${buildDir})
- # TODO: this is workaround to avoid mulitples generate rules for covert_dict or sandbox
- if(trackByproducts)
- add_ninja_command(${gnTarget} ${cmakeTarget} ${ninjaTarget} ${ninjaTarget}.stamp ${buildDir}/${config}/${arch})
- else()
- add_ninja_command("" ${cmakeTarget} ${ninjaTarget} ${ninjaTarget}.stamp ${buildDir}/${config}/${arch})
- endif()
+ add_gn_target_for_cmake_target(${gnTarget} ${cmakeTarget} ${ninjaTarget} ${config} ${arch})
+ add_ninja_command(
+ TARGET ${ninjaTarget}
+ OUTPUT ${ninjaTarget}.stamp
+ BYPRODUCTS
+ ${ninjaTarget}_objects.rsp
+ ${ninjaTarget}_archives.rsp
+ ${ninjaTarget}_libs.rsp
+ BUILDDIR ${buildDir}/${config}/${arch}
+ )
if(QT_IS_MACOS_UNIVERSAL)
- add_rsp_command(${gnTarget} ${cmakeTarget} ${ninjaTarget} ${buildDir}/${config}/${arch})
+ add_rsp_command(${gnTarget} ${buildDir}/${config}/${arch})
else()
- extend_target_with_gn_target(${gnTarget} ${cmakeTarget})
+ extend_target_with_gn_target(${gnTarget} ${buildDir}/${config}/${arch})
endif()
endforeach()
if(QT_IS_MACOS_UNIVERSAL)
set(arch ${CMAKE_SYSTEM_PROCESSOR})
set(gnTarget ${ninjaTarget}_${config}_${arch})
- add_lipo_command(${gnTarget} ${cmakeTarget} ${buildDir}/${config})
+ add_lipo_command(${gnTarget} ${buildDir}/${config})
endif()
endforeach()
endfunction()
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 46121687c..e4283e1d9 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -270,8 +270,9 @@ foreach(arch ${archs})
read_gn_target(${buildGn} ${WEBENGINE_ROOT_BUILD_DIR}/src/core/api/${config}/gn_config.cxx.cmake)
read_gn_target(${buildGn} ${WEBENGINE_ROOT_BUILD_DIR}/src/core/api/${config}/gn_config.c.cmake)
configure_gn_target(${buildGn} ${config}
- ${WEBENGINE_ROOT_SOURCE_DIR}/src/core/configure/BUILD.root.gn.in ${buildDir}/${config}/${arch}/BUILD.gn)
-
+ ${WEBENGINE_ROOT_SOURCE_DIR}/src/core/configure/BUILD.root.gn.in "${buildDir}/${config}/${arch}/BUILD.gn"
+ core/${config}/${arch}
+ )
##
# GN PARAMETERS SETUP
@@ -468,7 +469,7 @@ target_include_directories(WebEngineCore PRIVATE
${buildDir}/$<CONFIG>/${arch}/gen/third_party/perfetto/build_config
)
-add_gn_build_aritfacts_to_target(WebEngineCore QtWebEngineCore ON ${buildDir})
+add_gn_build_aritfacts_to_target(WebEngineCore QtWebEngineCore ${buildDir})
##
# SANDBOX
@@ -478,8 +479,10 @@ if(WIN32)
add_library(WebEngineCoreSandbox STATIC IMPORTED GLOBAL)
foreach(config ${configs})
string(TOUPPER ${config} cfg)
- add_ninja_command("" WebEngineCoreSandbox QtWebEngineCoreSandbox
- QtWebEngineCoreSandbox.lib ${buildDir}/${config}/${arch}
+ add_ninja_command(
+ TARGET QtWebEngineCoreSandbox
+ OUTPUT QtWebEngineCoreSandbox.lib
+ BUILDDIR ${buildDir}/${config}/${arch}
)
set(sandboxLibraryPath ${buildDir}/${config}/${arch}/QtWebEngineCoreSandbox.lib)
set_property(TARGET WebEngineCoreSandbox
@@ -591,6 +594,6 @@ 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 OFF ${buildDir})
+ add_gn_build_aritfacts_to_target(${dict_target_name} convert_dict ${buildDir})
endif()
diff --git a/src/core/configure/BUILD.root.gn.in b/src/core/configure/BUILD.root.gn.in
index 2e00c50b5..b64b367b9 100644
--- a/src/core/configure/BUILD.root.gn.in
+++ b/src/core/configure/BUILD.root.gn.in
@@ -89,7 +89,7 @@ config("cpp17_config") {
}
shared_library("QtWebEngineCore") {
- cmake_config = "@GN_CONFIG@"
+ rsp_types = [ "objects", "archives", "libs" ]
configs += [
":cpp17_config",
":QtWebEngineCore_config",
@@ -612,7 +612,7 @@ if (enable_extensions) {
if (enable_spellcheck) {
shared_library("convert_dict") {
- cmake_config = "@GN_CONFIG@"
+ rsp_types = [ "objects", "archives", "libs" ]
configs += [ "//build/config/compiler:wexit_time_destructors" ]
deps = [
"//chrome/tools/convert_dict:lib",
diff --git a/src/core/configure/rsp.cmake.in b/src/core/configure/rsp.cmake.in
deleted file mode 100644
index d24299007..000000000
--- a/src/core/configure/rsp.cmake.in
+++ /dev/null
@@ -1,5 +0,0 @@
-include(@CMAKE_FILE@)
-list(JOIN @CONFIG@_NINJA_OBJECTS " " objects)
-list(JOIN @CONFIG@_NINJA_ARCHIVES " " archives)
-file(WRITE ${CMAKE_CURRENT_LIST_DIR}/@TARGET@_gnobjects.rsp ${objects})
-file(WRITE ${CMAKE_CURRENT_LIST_DIR}/@TARGET@_gnarchives.rsp ${archives})
diff --git a/src/pdf/CMakeLists.txt b/src/pdf/CMakeLists.txt
index b639b1243..12f01a73f 100644
--- a/src/pdf/CMakeLists.txt
+++ b/src/pdf/CMakeLists.txt
@@ -86,7 +86,9 @@ if(WEBENGINE_REPO_BUILD)
read_gn_target(${buildGn} ${WEBENGINE_ROOT_BUILD_DIR}/src/pdf/${config}/gn_config.cxx.cmake)
read_gn_target(${buildGn} ${WEBENGINE_ROOT_BUILD_DIR}/src/pdf/${config}/gn_config.c.cmake)
configure_gn_target(${buildGn} ${config}
- ${WEBENGINE_ROOT_SOURCE_DIR}/src/pdf/configure/BUILD.root.gn.in ${buildDir}/${config}/${arch}/BUILD.gn)
+ ${WEBENGINE_ROOT_SOURCE_DIR}/src/pdf/configure/BUILD.root.gn.in "${buildDir}/${config}/${arch}/BUILD.gn"
+ pdf/${config}/${arch}
+ )
##
# GN PARAMETERS
@@ -157,5 +159,5 @@ if(WEBENGINE_REPO_BUILD)
endforeach()
set(arch ${CMAKE_SYSTEM_PROCESSOR})
target_include_directories(Pdf PRIVATE ${buildDir}/$<CONFIG>/${arch}/gen)
- add_gn_build_aritfacts_to_target(Pdf QtPdf ON ${buildDir})
+ add_gn_build_aritfacts_to_target(Pdf QtPdf ${buildDir})
endif()
diff --git a/src/pdf/configure/BUILD.root.gn.in b/src/pdf/configure/BUILD.root.gn.in
index a0cd41747..5252b701a 100644
--- a/src/pdf/configure/BUILD.root.gn.in
+++ b/src/pdf/configure/BUILD.root.gn.in
@@ -25,7 +25,7 @@ config("cpp17_config") {
}
shared_library("QtPdf") {
- cmake_config = "@GN_CONFIG@"
+ rsp_types = [ "objects", "archives", "libs" ]
configs += [
":cpp17_config",
":QtPdf_config"