summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Klocek <michal.klocek@qt.io>2021-08-20 10:33:57 +0200
committerMichal Klocek <michal.klocek@qt.io>2021-08-30 19:47:56 +0200
commit68e724bf48eab90aca310d700b4aad0127b61d35 (patch)
tree7ac33f0adf9d38fd4b639ee75192cf8748f9ee8b
parentadd4dd7c1f50e09677f968a47c75309351e16743 (diff)
Rewrite gn-cmake integration
The previous gn-cmake integration was driven towards having the complete cmake build tree which included gn build artifacts. These were marked as IMPORTED in cmake build files, this way cmake "knew" all object files and static libs coming from gn. To achieve that we needed to run the cmake configure twice. First to feed gn with the build information from cmake and then the second run to import all the build information to cmake based on gn run. As a side effect of this the first run cmake was creating incomplete targets, so we could use generator expressions to gather all the data needed for gn run. The second run of cmake was able to create fully initialized targets. We used 'external project' to run cmake the second time. This approach worked well when doing "module" builds and having two targets, one in the main project and one in external was not an issue. Moreover, this approach could be integrated nicely since CI does only "module" builds. Unfortunately "top level" builds are implemented to import all qt targets into one build tree. This created issue for qtwebengine since fully initialized targets were 'hidden' by 'external project' and including half baked (dummy) targets from the main project resulted in bunch of issues related to the dependency tracking and build race conditions. Also using 'external project' complicated installation rules and in the end installation worked differently than in other modules. With current approach we use response files, so we hide all build artifacts coming from gn and feed cmake with those response files. This way we run the cmake configure once and we create all the targets once. Using rsp files hacks linker options in cmake, so this approach is sub-optimal, however allows to have working "top level" builds. It is worth mentioning here that the final module linking has to take place with cmake's part of build since doing one static lib in gn is not possible due to the toolchain limitation (msvc is not able to process static libs over 4Gb and has no support for thin archives, so only a shared lib is doable at time of writing) Following changes are made: * remove 'external project' for qtwebengine target, we keep it however for ninja ,gn and a host project * call gn from cmake in a scripting mode during build and not configure run, this way BUILD.gn is assembled as a build step so after generator expressions are executed * BUILD.gn is assembled now from 4 files: - root template BUILD.root.gn.in - compiler data gn_config_c.cmake, gn_config_cxx.cmake - sources data gn_cofnig_target.cmake * since we use gn wrapper script use gn.args file to pass arguments instead of a command line, so this file can be now easily modified when running gn and ninja 'manually' * since a script mode does not support handling of properties with TARGET as such, use the DIRECTORY scope in some of our functions which handle GN_TARGET * use qt_build_repo() in main CMakeFile and remove all coin and top level build hacks * remove 'external project' for examples and tests, this is no longer required as all qt targets are not hidden by external project * remove leftovers from gn feedback call used for GN_TARGET * improve installation rules, WebEgineCore target is not by default installed during build, therefore we need to copy resources and translations to root so tests and examples still can be built without a module being installed first * adjust GN lookup paths, we look for gn in main configure and during scripting mode when gn is executed Fixes: QTBUG-94349 Fixes: QTBUG-94709 Fixes: QTBUG-94922 Fixes: QTBUG-94997 Fixes: QTBUG-95051 Fixes: QTBUG-95152 Fixes: QTBUG-95158 Fixes: QTBUG-95972 Task-number: QTBUG-95231 Task-number: QTBUG-95590 Change-Id: I5e7a34287ee59d904103fe310fc7c6a36a8dfbc9 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io> (cherry picked from commit bd75c51f2a7f7384d3303e86764211cb3e32f03d)
-rw-r--r--CMakeLists.txt274
-rw-r--r--cmake/FindGn.cmake10
-rw-r--r--cmake/Functions.cmake319
-rw-r--r--cmake/Gn.cmake69
-rw-r--r--configure.cmake6
-rw-r--r--examples/CMakeLists.txt20
-rw-r--r--src/CMakeLists.txt163
-rw-r--r--src/core/CMakeLists.txt171
-rw-r--r--src/core/api/CMakeLists.txt80
-rw-r--r--src/core/tools/CMakeLists.txt1
-rw-r--r--src/pdf/CMakeLists.txt260
-rw-r--r--src/pdf/plugins/imageformats/pdf/CMakeLists.txt1
-rw-r--r--src/pdfquick/CMakeLists.txt5
-rw-r--r--src/pdfwidgets/CMakeLists.txt1
-rw-r--r--src/process/CMakeLists.txt3
-rw-r--r--src/webenginequick/CMakeLists.txt9
-rw-r--r--src/webenginequick/ui/CMakeLists.txt2
-rw-r--r--src/webenginewidgets/CMakeLists.txt6
-rw-r--r--tests/CMakeLists.txt29
19 files changed, 672 insertions, 757 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 823945088..f80888064 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -4,9 +4,9 @@ include(.cmake.conf)
include(ExternalProject)
include(cmake/Functions.cmake)
-project(QtWebEngineRepoSuperBuild
+project(QtWebEngineAndQtPdf
VERSION "${QT_REPO_MODULE_VERSION}"
- DESCRIPTION "Qt WebEngine Libraries"
+ DESCRIPTION "QtWebEngine and QtPdf modules"
HOMEPAGE_URL "https://qt.io/"
LANGUAGES CXX C
)
@@ -17,272 +17,10 @@ set(QT_NO_INTERNAL_COMPATIBILITY_FUNCTIONS TRUE)
# Make sure we use the fixed BASE argument of qt_add_resource.
set(QT_USE_FIXED_QT_ADD_RESOURCE_BASE TRUE)
-option(FORCE_TEST_RUN "Forces test run after compilation" FALSE)
-
find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS BuildInternals Core)
-
-# coin configures 'just' for test build
-if(QT_BUILD_STANDALONE_TESTS)
- qt_build_repo()
- return()
-endif()
-
-set(installDir ${CMAKE_CURRENT_BINARY_DIR}/install)
-
-### FEATURES
-
-qt_build_repo_begin()
-qt_feature_module_begin(ONLY_EVALUATE_FEATURES)
-# Enable printing of feature summary by forcing qt_configure_record_command
-# to work in spite of ONLY_EVALUATE_FEATURES.
-set(__QtFeature_only_evaluate_features OFF)
-include(configure.cmake)
-include(src/core/api/configure.cmake)
-include(src/webenginequick/configure.cmake)
-include(src/pdf/configure.cmake)
-qt_feature_module_end(ONLY_EVALUATE_FEATURES)
-if(NOT ${QtWebEngine_SUPPORT})
- add_custom_target(WebEngineErrorMessage ALL
- ${CMAKE_COMMAND} -E cmake_echo_color --red "QtWebEngine will not be built: ${QtWebEngine_ERROR}"
- COMMENT "Check QtWebEngine support"
- VERBATIM
- )
- message("-- Support check for QtWebEngine failed: ${QtWebEngine_ERROR}")
- set(QT_FEATURE_qtwebengine_build OFF CACHE BOOL "Build QtWebEngine" FORCE)
-endif()
-
-if(NOT ${QtPdf_SUPPORT})
- add_custom_target(PdfErrorMessage ALL
- ${CMAKE_COMMAND} -E cmake_echo_color --red "QtPdf will not be built: ${QtPdf_ERROR}"
- COMMENT "Check QtPdf support"
- VERBATIM
- )
- message("-- Support check for QtPdf failed: ${QtPdf_ERROR}")
- set(QT_FEATURE_qtpdf_build OFF CACHE BOOL "Build QtPdf" FORCE)
-endif()
-
-if(NOT QT_FEATURE_qtwebengine_build AND NOT QT_FEATURE_qtpdf_build)
- # coin missing artifacts workaround
- install(FILES coin-bug-707 DESTINATION ${INSTALL_DATADIR})
- return()
-endif()
-
-if(QT_FEATURE_qtwebengine_build)
- add_subdirectory(src/core/api)
- add_subdirectory(src/core/tools)
- add_subdirectory(src/process)
- add_subdirectory(src/webenginewidgets)
- add_subdirectory(src/webenginequick)
-endif()
-
-if(QT_FEATURE_qtpdf_build)
- add_subdirectory(src/pdf)
- add_subdirectory(src/pdfwidgets)
- add_subdirectory(src/pdfquick)
-endif()
-qt_build_repo_end()
-get_install_config(installConfig)
-
-### NINJA
-
-if(NOT Ninja_FOUND)
- externalproject_add(ninja
- SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/src/ninja
- BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/ninja
- INSTALL_DIR ${installDir}
- PREFIX ninja
- USES_TERMINAL_BUILD ON
- CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release
- -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
- -DCMAKE_PREFIX_PATH:PATH=<INSTALL_DIR>
- )
-endif()
-
-### GN
-
-if(NOT Gn_FOUND)
- externalproject_add(gn
- SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/src/gn
- BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/gn
- INSTALL_DIR ${installDir}
- PREFIX gn
- USES_TERMINAL_BUILD ON
- CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release
- -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
- -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
- -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
- -DCMAKE_PREFIX_PATH:PATH=<INSTALL_DIR>
- -DWEBENGINE_ROOT_BUILD_DIR=${CMAKE_CURRENT_BINARY_DIR}
- )
-endif()
-
-
-### LIBS
-
-# on windows source path can be specified without hard drive letter,
-# however we need that for gn use REALPATH
-get_filename_component(WEBENGINE_ROOT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}" REALPATH)
-get_qt_features(featureList webengine)
-get_qt_features(featureList qtwebengine)
-get_qt_features(featureList qtpdf)
-
-if(NOT DEFINED CMAKE_TOOLCHAIN_FILE AND QT_SUPERBUILD)
- set(CMAKE_TOOLCHAIN_FILE "${CMAKE_BINARY_DIR}/qtbase/lib/cmake/Qt6/qt.toolchain.cmake")
- list(APPEND libsCmakeArgs
- "-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}"
- )
-endif()
-
-if(NOT DEFINED CMAKE_TOOLCHAIN_FILE)
- message(FATAL_ERROR "QtWebEngine build requires CMAKE_TOOLCHAIN_FILE. Please provide one or use qt-cmake.")
-endif()
-
-list(TRANSFORM featureList PREPEND "-D")
-list(APPEND libsCmakeArgs
- "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}"
- "-DWEBENGINE_ROOT_BUILD_DIR=${CMAKE_CURRENT_BINARY_DIR}"
- "-DWEBENGINE_ROOT_SOURCE_DIR=${WEBENGINE_ROOT_SOURCE_DIR}"
- "-DWEBENGINE_REPO_BUILD=TRUE"
- "${featureList}"
-)
-
-if (CMAKE_C_COMPILER_LAUNCHER)
- list(APPEND libsCmakeArgs "-DCMAKE_C_COMPILER_LAUNCHER=${CMAKE_C_COMPILER_LAUNCHER}")
-endif()
-if (CMAKE_CXX_COMPILER_LAUNCHER)
- list(APPEND libsCmakeArgs "-DCMAKE_CXX_COMPILER_LAUNCHER=${CMAKE_CXX_COMPILER_LAUNCHER}")
-endif()
-
-if(QT_HOST_PATH)
- list(APPEND libsCmakeArgs "-DQT_HOST_PATH=${QT_HOST_PATH}")
-endif()
-
-if(LINUX)
- set(cmd "${CMAKE_COMMAND} --build ${CMAKE_CURRENT_BINARY_DIR}/src")
- file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/src/build.sh CONTENT "ulimit -n 4096 && ${cmd}\n")
- set(coinBug699 COMMAND bash build.sh)
-else()
- if ("${CMAKE_DEFAULT_CONFIGS}" STREQUAL "all")
- set(coinBug699 COMMAND ${CMAKE_COMMAND} --build ${CMAKE_CURRENT_BINARY_DIR}/src)
- else()
- set(coinBug699 COMMAND ${CMAKE_COMMAND} --build ${CMAKE_CURRENT_BINARY_DIR}/src --config $<CONFIG>)
- endif()
-endif()
-
-# use qtwebengine as name since it is should visible for topLevel builds
-externalproject_add(qtwebengine
- SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/src
- BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/src
- PREFIX libs
- USES_TERMINAL_CONFIGURE ON
- USES_TERMINAL_BUILD ON
- BUILD_ALWAYS TRUE
- CMAKE_ARGS ${libsCmakeArgs}
- BUILD_COMMAND ${CMAKE_COMMAND} -E echo "Starting $<CONFIG> build"
- ${coinBug699}
- COMMAND ${CMAKE_COMMAND} -E echo "$<CONFIG> build complete"
- # TODO: this is aworkaround for broken qt_lib_webengine*.pri files,
- # coin does the in-source build and later calls qmake to build examples
- # and this leftover file gets sucked instead of install or src/mkspecs,
- # simply remove it, we need to implment a dry run in qt base to fix it.
- COMMAND ${CMAKE_COMMAND} -E remove_directory ../mkspecs
-)
-
-# required for topLevel build
-qt_get_tool_target_name(cacheGenTarget qmlcachegen)
-add_implicit_dependencies(qtwebengine Core Gui Widgets Network OpenGL
- OpenGLWidgets Quick QuickWidgets Qml PrintSupport WebChannel Positioning ${cacheGenTarget}
+find_package(Qt6 ${PROJECT_VERSION} CONFIG QUIET OPTIONAL_COMPONENTS
+ Gui Widgets Network OpenGL OpenGLWidgets Quick Qml PrintSupport
+ WebChannel Positioning QuickControls2 Test QuickWidgets QuickTest WebSockets
)
-# Ensure the libs project is reconfigured if the root project is reconfigured, so that the
-# correct CMake and qmake support files are used when building examples, rather than
-# using the incomplete support files created by the root project.
-qt_internal_add_external_project_dependency_to_root_project(qtwebengine)
-
-if(QT_BUILD_EXAMPLES AND BUILD_SHARED_LIBS)
- externalproject_add(qtwebengine_examples
- SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/examples
- BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/examples
- PREFIX examples
- USES_TERMINAL_BUILD ON
- BUILD_ALWAYS TRUE
- CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
- "${featureList}"
- )
- externalproject_add_stepdependencies(qtwebengine_examples install qtwebengine)
-endif()
-
-if(FORCE_TEST_RUN OR QT_BUILD_TESTS)
- find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS QuickTest Test)
- find_package(Qt6 ${PROJECT_VERSION} CONFIG QUIET OPTIONAL_COMPONENTS WebSockets)
- unset(testRunCommand)
- if(FORCE_TEST_RUN)
- set(testRunCommand TEST_COMMAND ctest)
- endif()
- externalproject_add(qtwebengine_tests
- SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/tests
- BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/tests
- PREFIX tests
- USES_TERMINAL_BUILD ON
- USES_TERMINAL_TEST ON
- BUILD_ALWAYS TRUE
- CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
- "${featureList}"
- INSTALL_COMMAND ""
- ${testRunCommand}
- )
- externalproject_add_stepdependencies(qtwebengine_tests install qtwebengine)
- add_implicit_dependencies(qtwebengine_tests Test QuickTest WebSockets)
- if(QT_BUILD_EXAMPLES AND BUILD_SHARED_LIBS)
- externalproject_add_stepdependencies(qtwebengine_tests install qtwebengine_examples)
- endif()
-endif()
-
-if(NOT Gn_FOUND)
- externalproject_add_stepdependencies(qtwebengine install gn)
-endif()
-
-if(NOT Ninja_FOUND)
- externalproject_add_stepdependencies(gn install ninja)
-endif()
-
-if(QT_FEATURE_qtwebengine_build AND NOT QT_FEATURE_framework)
- # install resources (again), coin calls install with DESTDIR
- install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/translations/qtwebengine_locales
- DESTINATION ${CMAKE_INSTALL_PREFIX}/translations
- )
- install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/resources
- DESTINATION ${CMAKE_INSTALL_PREFIX}
- )
-endif()
-
-### CROSS BUILD SETUP
-
-# install gn for cross build
-# TODO: is this really needed, should we skip it and just build gn as host build ?
-if(LINUX AND NOT Gn_FOUND OR INSTALL_GN)
- set(INSTALL_GN 1 CACHE INTERNAL "")
- install(
- PROGRAMS ${installDir}/bin/gn
- CONFIGURATIONS ${installConfig}
- RUNTIME DESTINATION "${INSTALL_LIBEXECDIR}"
- )
-endif()
-
-if(CMAKE_CROSSCOMPILING)
- externalproject_add(hostBuild
- SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/src/host
- BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/host
- PREFIX host
- USES_TERMINAL_BUILD ON
- CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${QT_HOST_PATH}/lib/cmake/Qt6/qt.toolchain.cmake
- -DWEBENGINE_ROOT_BUILD_DIR=${CMAKE_CURRENT_BINARY_DIR}
- -DWEBENGINE_ROOT_SOURCE_DIR=${WEBENGINE_ROOT_SOURCE_DIR}
- -DGN_TARGET_CPU=${TEST_architecture_arch}
- -DCMAKE_C_FLAGS=
- -DCMAKE_CXX_FLAGS=
- -DQT_FEATURE_qtwebengine_build=${QT_FEATURE_qtwebengine_build}
- -DQT_FEATURE_qtpdf_build=${QT_FEATURE_qtpdf_build}
- )
- externalproject_add_stepdependencies(qtwebengine install hostBuild)
-endif()
+qt_build_repo()
diff --git a/cmake/FindGn.cmake b/cmake/FindGn.cmake
index abfa0fe26..6bef6009e 100644
--- a/cmake/FindGn.cmake
+++ b/cmake/FindGn.cmake
@@ -1,10 +1,14 @@
-if (NOT DEFINED WEBENGINE_ROOT_BUILD_DIR)
+if(NOT DEFINED WEBENGINE_ROOT_BUILD_DIR)
set(WEBENGINE_ROOT_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR})
endif()
find_program(Gn_EXECUTABLE NAMES gn PATHS "${WEBENGINE_ROOT_BUILD_DIR}/install/bin" NO_DEFAULT_PATH)
if(NOT QT_HOST_PATH STREQUAL "")
find_program(Gn_EXECUTABLE NAMES gn PATHS ${QT_HOST_PATH}/${INSTALL_LIBEXECDIR} NO_DEFAULT_PATH)
endif()
+# script mode does not have QT_HOST_PATH or INSTALL_LIBEXECDIR instead it uses QT_HOST_GN_PATH
+if(NOT QT_HOST_GN_PATH STREQUAL "")
+ find_program(Gn_EXECUTABLE NAMES gn PATHS ${QT_HOST_GN_PATH} NO_DEFAULT_PATH)
+endif()
find_program(Gn_EXECUTABLE NAMES gn)
if(Gn_EXECUTABLE)
@@ -15,7 +19,7 @@ if(Gn_EXECUTABLE)
OUTPUT_STRIP_TRAILING_WHITESPACE)
endif()
-string(REGEX MATCHALL "([1-9]\.[0-9]\.[0-9])\.qtwebengine\.qt\.io.*" Gn_QT_VERSION "${Gn_VERSION}")
+string(REGEX MATCHALL "([1-9]\\.[0-9]\\.[0-9])\\.qtwebengine\\.qt\\.io.*" Gn_QT_VERSION "${Gn_VERSION}")
if("${Gn_QT_VERSION}")
set(Gn_VERSION "${Gn_QT_VERSION}")
endif()
@@ -31,7 +35,7 @@ find_package_handle_standard_args(Gn
Gn_EXECUTABLE
)
-if(Gn_FOUND AND NOT TARGET Gn::gn)
+if(Gn_FOUND AND NOT TARGET Gn::gn AND NOT CMAKE_SCRIPT_MODE_FILE)
add_executable(Gn::gn IMPORTED)
set_property(TARGET Gn::gn PROPERTY IMPORTED_LOCATION ${Gn_EXECUTABLE})
endif()
diff --git a/cmake/Functions.cmake b/cmake/Functions.cmake
index 59ee72799..36f554827 100644
--- a/cmake/Functions.cmake
+++ b/cmake/Functions.cmake
@@ -19,6 +19,7 @@ function(assertTargets)
endforeach()
endfunction()
+#TODO: remove me
function(add_implicit_dependencies target)
if(TARGET ${target})
list(REMOVE_ITEM ARGN ${target})
@@ -74,36 +75,40 @@ function(get_qt_features outList module)
endif()
endfunction()
-function(get_configure_mode configureMode)
- if(NOT DEFINED WEBENGINE_REPO_BUILD AND NOT DEFINED QT_SUPERBUILD)
- set(${configureMode} NO_CONFIG_HEADER_FILE NO_SYNC_QT PARENT_SCOPE)
- endif()
+function(create_cxx_config cmakeTarget arch configFileName)
+ file(GENERATE
+ OUTPUT $<CONFIG>/${arch}/${configFileName}
+ CONTENT "\
+ set(GN_INCLUDES $<TARGET_PROPERTY:INCLUDE_DIRECTORIES>)\n\
+ set(GN_DEFINES $<TARGET_PROPERTY:COMPILE_DEFINITIONS>)\n\
+ set(GN_LINK_OPTIONS $<TARGET_PROPERTY:LINK_OPTIONS>)\n\
+ set(GN_CXX_COMPILE_OPTIONS $<TARGET_PROPERTY:COMPILE_OPTIONS>)"
+# set(GN_LIBS $<TARGET_PROPERTY:LINK_LIBRARIES>)
+ CONDITION $<COMPILE_LANGUAGE:CXX>
+ TARGET ${cmakeTarget}
+ )
endfunction()
-function(make_config_for_gn target configFileName)
- if(NOT DEFINED WEBENGINE_REPO_BUILD)
- file(GENERATE
- OUTPUT $<CONFIG>/${configFileName}.cxx.cmake
- CONTENT [[
- set(GN_INCLUDES $<TARGET_PROPERTY:INCLUDE_DIRECTORIES>)
- set(GN_DEFINES $<TARGET_PROPERTY:COMPILE_DEFINITIONS>)
- set(GN_LIBS $<TARGET_PROPERTY:LINK_LIBRARIES>)
- set(GN_LINK_OPTIONS $<TARGET_PROPERTY:LINK_OPTIONS>)
- set(GN_CXX_COMPILE_OPTIONS $<TARGET_PROPERTY:COMPILE_OPTIONS>)]]
- CONDITION $<COMPILE_LANGUAGE:CXX>
- TARGET ${target})
- file(GENERATE
- OUTPUT $<CONFIG>/${configFileName}.c.cmake
- CONTENT [[ set(GN_C_COMPILE_OPTIONS $<TARGET_PROPERTY:COMPILE_OPTIONS>)]]
- CONDITION $<COMPILE_LANGUAGE:C>
- TARGET ${target})
- endif()
-endfunction()
-
-function(make_install_only target)
- if(NOT DEFINED WEBENGINE_REPO_BUILD)
- set_target_properties(${target} PROPERTIES EXCLUDE_FROM_ALL TRUE)
- endif()
+function(create_c_config cmakeTarget arch configFileName)
+ file(GENERATE
+ OUTPUT $<CONFIG>/${arch}/${configFileName}
+ CONTENT "set(GN_C_COMPILE_OPTIONS $<TARGET_PROPERTY:COMPILE_OPTIONS>)"
+ CONDITION $<COMPILE_LANGUAGE:C>
+ TARGET ${cmakeTarget})
+endfunction()
+
+function(create_gn_target_config target configFile)
+ get_target_property(elementList ${target} ELEMENTS)
+ get_target_property(prefix ${target} PREFIX)
+ file(WRITE ${configFile}
+ "set(PREFIX ${prefix})\nset(ELEMENTS ${elementList})\n"
+ )
+ foreach(element IN LISTS elementList)
+ get_target_property(prop ${target} ${prefix}_${element})
+ if(prop)
+ file(APPEND ${configFile} "set(${prefix}_${element} ${prop})\n")
+ endif()
+ endforeach()
endfunction()
function(add_gn_target target config arch)
@@ -119,18 +124,30 @@ function(add_gn_target target config arch)
)
endfunction()
-function(read_gn_target target filePath)
+function(init_gn_config filePath)
include(${filePath})
- applyToGnTarget(${target})
+ set_directory_properties(PROPERTIES
+ ELEMENTS "${ELEMENTS}"
+ PREFIX "${PREFIX}"
+ )
+ applyToGnTarget(DIRECTORY)
endfunction()
-macro(applyToGnTarget target)
- get_target_property(elementList ${target} ELEMENTS)
- get_target_property(prefix ${target} PREFIX)
+function(read_gn_config filePath)
+ include(${filePath})
+ applyToGnTarget(DIRECTORY)
+endfunction()
+
+# this runs also in script mode, so we use than DIRECTORY
+macro(applyToGnTarget)
+ set(type ${ARGV0})
+ set(target ${ARGV1})
+ get_property(elementList ${type} ${target} PROPERTY ELEMENTS)
+ get_property(prefix ${type} ${target} PROPERTY PREFIX)
foreach(element IN LISTS elementList)
if(${prefix}_${element})
message(DEBUG "${prefix}_${element} = ${${prefix}_${element}}")
- set_property(TARGET ${target} APPEND PROPERTY ${prefix}_${element} ${${prefix}_${element}})
+ set_property(${type} ${target} APPEND PROPERTY ${prefix}_${element} ${${prefix}_${element}})
endif()
endforeach()
endmacro()
@@ -144,7 +161,7 @@ function(extend_gn_target target)
qt_evaluate_config_expression(result ${GN_CONDITION})
if(${result})
message(DEBUG "extend_gn_target(${target} CONDITION ${GN_CONDITION} ...): Evaluated")
- applyToGnTarget(${target})
+ applyToGnTarget(TARGET ${target})
endif()
endfunction()
@@ -166,15 +183,14 @@ function(extend_gn_list outList)
set(${outList} "${${outList}}" PARENT_SCOPE)
endfunction()
-function(configure_gn_target target config inFilePath outFilePath buildPrefix)
-
- # GN_CONFIG
- string(TOUPPER ${config} GN_CONFIG)
+function(configure_gn_target sourceDir inFilePath outFilePath)
+ # FIXME: GN_CONFIG
+ set(GN_CONFIG NOTUSED)
# GN_SOURCES GN_HEADERS
- get_target_property(gnSources ${target} GN_SOURCES)
+ get_property(gnSources DIRECTORY PROPERTY GN_SOURCES)
foreach(gnSourceFile ${gnSources})
- get_filename_component(gnSourcePath ${gnSourceFile} REALPATH)
+ get_filename_component(gnSourcePath ${sourceDir}/${gnSourceFile} REALPATH)
list(APPEND sourceList \"${gnSourcePath}\")
endforeach()
set(GN_HEADERS ${sourceList})
@@ -183,7 +199,7 @@ function(configure_gn_target target config inFilePath outFilePath buildPrefix)
list(FILTER GN_SOURCES EXCLUDE REGEX "^.+\\.h\"$")
# GN_DEFINES
- get_target_property(gnDefines ${target} GN_DEFINES)
+ get_property(gnDefines DIRECTORY PROPERTY GN_DEFINES)
list(REMOVE_DUPLICATES gnDefines)
foreach(gnDefine ${gnDefines})
list(APPEND GN_ARGS_DEFINES \"-D${gnDefine}\")
@@ -191,7 +207,7 @@ function(configure_gn_target target config inFilePath outFilePath buildPrefix)
endforeach()
# GN_INCLUDES
- get_target_property(gnIncludes ${target} GN_INCLUDES)
+ get_property(gnIncludes DIRECTORY PROPERTY GN_INCLUDES)
list(REMOVE_DUPLICATES gnIncludes)
foreach(gnInclude ${gnIncludes})
get_filename_component(gnInclude ${gnInclude} REALPATH)
@@ -200,27 +216,30 @@ function(configure_gn_target target config inFilePath outFilePath buildPrefix)
endforeach()
# MOC
- get_target_property(GN_MOC_BIN_IN Qt6::moc IMPORTED_LOCATION)
- set(GN_ARGS_MOC_BIN \"${GN_MOC_BIN_IN}\")
+ get_property(mocFilePath DIRECTORY PROPERTY GN_MOC_PATH)
+ set(GN_ARGS_MOC_BIN \"${mocFilePath}\")
# GN_CFLAGS_CC
- get_target_property(gnCxxCompileOptions ${target} GN_CXX_COMPILE_OPTIONS)
+ get_property(gnCxxCompileOptions DIRECTORY PROPERTY GN_CXX_COMPILE_OPTIONS)
foreach(gnCxxCompileOption ${gnCxxCompileOptions})
list(APPEND GN_CFLAGS_CC \"${gnCxxCompileOption}\")
endforeach()
list(REMOVE_DUPLICATES GN_CFLAGS_CC)
# GN_CFLAGS_C
- get_target_property(gnCCompileOptions ${target} GN_C_COMPILE_OPTIONS)
+ get_property(gnCCompileOptions DIRECTORY PROPERTY GN_C_COMPILE_OPTIONS)
foreach(gnCCompileOption ${gnCCompileOptions})
list(APPEND GN_CFLAGS_C \"${gnCCompileOption}\")
endforeach()
list(REMOVE_DUPLICATES GN_CFLAGS_C)
# GN_SOURCE_ROOT
- get_filename_component(GN_SOURCE_ROOT "${CMAKE_CURRENT_LIST_DIR}" REALPATH)
- set(GN_RSP_PREFIX ${buildPrefix})
- if(MACOS)
+ get_filename_component(GN_SOURCE_ROOT "${sourceDir}" REALPATH)
+
+ # GN_RSP_PREFIX
+ get_property(GN_RSP_PREFIX DIRECTORY PROPERTY GN_RSP_PREFIX)
+
+ if(APPLE) # this runs in scrpit mode without qt-cmake so on MACOS here
recoverFrameworkBuild(GN_INCLUDE_DIRS GN_CFLAGS_C)
endif()
@@ -260,8 +279,8 @@ function(get_install_config result)
endif()
endfunction()
-macro(assertRunAsTopLevelBuild condition)
- if(NOT DEFINED WEBENGINE_REPO_BUILD AND ${condition})
+macro(assertRunAsTopLevelBuild)
+ if(NOT DEFINED WEBENGINE_REPO_BUILD)
message(FATAL_ERROR "This cmake file should run as top level build.")
return()
endif()
@@ -285,7 +304,7 @@ endfunction()
# forward declarations of NSString.
function(get_forward_declaration_macro result)
if(MACOS)
- set(${result} "Q_FORWARD_DECLARE_OBJC_CLASS(name)=class name;" PARENT_SCOPE)
+ set(${result} " \"Q_FORWARD_DECLARE_OBJC_CLASS(name)=class name;\" " PARENT_SCOPE)
else()
set(${result} "Q_FORWARD_DECLARE_OBJC_CLASS=QT_FORWARD_DECLARE_CLASS" PARENT_SCOPE)
endif()
@@ -316,10 +335,10 @@ function(get_darwin_sdk_version result)
endif()
endfunction()
-function(add_gn_target_for_cmake_target gnTarget cmakeTarget ninjaTarget config arch)
+function(add_ninja_target target cmakeTarget ninjaTarget config arch buildDir)
string(TOUPPER ${config} cfg)
- add_custom_target(${gnTarget})
- set_target_properties(${gnTarget} PROPERTIES
+ add_custom_target(${target} DEPENDS ${buildDir}/${config}/${arch}/${ninjaTarget}.stamp)
+ set_target_properties(${target} PROPERTIES
CONFIG ${config}
ARCH ${arch}
CMAKE_TARGET ${cmakeTarget}
@@ -327,11 +346,11 @@ function(add_gn_target_for_cmake_target gnTarget cmakeTarget ninjaTarget config
)
endfunction()
-function(copy_response_files gnTarget)
- get_target_property(config ${gnTarget} CONFIG)
- get_target_property(ninjaTarget ${gnTarget} NINJA_TARGET)
- get_target_property(cmakeTarget ${gnTarget} CMAKE_TARGET)
- list(REMOVE_ITEM ARGN ${gnTarget})
+function(copy_response_files target)
+ 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}")
@@ -339,6 +358,7 @@ function(copy_response_files gnTarget)
OUTPUT ${PROJECT_BINARY_DIR}/${rsp_dst}
COMMAND ${CMAKE_COMMAND} -E copy ${rsp_src} ${PROJECT_BINARY_DIR}/${rsp_dst}
DEPENDS ${rsp_src}
+ USES_TERMINAL
)
set(${rsp}_rsp ${rsp_dst} PARENT_SCOPE)
add_custom_target(${cmakeTarget}_${rsp}_copy_${config}
@@ -348,25 +368,27 @@ function(copy_response_files gnTarget)
endforeach()
endfunction()
-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)
+function(extend_cmake_target target buildDir)
+ get_target_property(config ${target} CONFIG)
+ get_target_property(ninjaTarget ${target} NINJA_TARGET)
+ get_target_property(cmakeTarget ${target} CMAKE_TARGET)
string(TOUPPER ${cmakeTarget} tg)
string(TOUPPER ${config} cfg)
- 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_options(${cmakeTarget} PRIVATE
"$<$<CONFIG:${config}>:@${objects_rsp}>"
- "-Wl,--start-group"
- "$<$<CONFIG:${config}>:@${archives_rsp}>"
- "-Wl,--end-group"
- "$<$<CONFIG:${config}>:@${libs_rsp}>"
)
+ target_link_libraries(${cmakeTarget} PRIVATE
+ "-Wl,--start-group $<$<CONFIG:${config}>:@${archives_rsp}> -Wl,--end-group"
+ )
+ # 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"
+ )
+
endif()
if(MACOS)
target_link_options(${cmakeTarget} PRIVATE
@@ -376,7 +398,7 @@ function(extend_target_with_gn_target gnTarget buildDir)
)
endif()
if(WIN32)
- copy_response_files(${gnTarget} objects archives libs)
+ copy_response_files(${target} objects archives libs)
target_link_options(${cmakeTarget} PRIVATE
"$<$<CONFIG:${config}>:@${objects_rsp}>"
"$<$<CONFIG:${config}>:@${archives_rsp}>"
@@ -387,11 +409,11 @@ function(extend_target_with_gn_target gnTarget buildDir)
endif()
endfunction()
-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)
+function(add_rsp_command target buildDir)
+ 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)
add_custom_command(
OUTPUT ${buildDir}/${cmakeTarget}.a
@@ -415,9 +437,9 @@ function(add_rsp_command gnTarget buildDir)
)
endfunction()
-function(add_lipo_command gnTarget buildDir)
- get_target_property(config ${gnTarget} CONFIG)
- get_target_property(cmakeTarget ${gnTarget} CMAKE_TARGET)
+function(add_lipo_command target buildDir)
+ get_target_property(config ${target} CONFIG)
+ get_target_property(cmakeTarget ${target} 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)
@@ -606,7 +628,7 @@ function(check_thumb result)
set(${result} FALSE PARENT_SCOPE)
endfunction()
-macro(create_pkg_config_host_wrapper)
+macro(create_pkg_config_host_wrapper buildDir)
find_package(PkgConfigHost)
if(CMAKE_CROSSCOMPILING)
create_pkg_config_wrapper("${buildDir}/pkg-config-host_wrapper.sh" "${PKG_CONFIG_HOST_EXECUTABLE}")
@@ -825,38 +847,9 @@ macro(append_pkg_config_setup)
endif()
endmacro()
-macro(execute_gn)
- get_target_property(gnCmd Gn::gn IMPORTED_LOCATION)
- set(gnArg gen ${buildDir}/${config}/${arch})
-
- list(APPEND gnArg
- --script-executable=${Python2_EXECUTABLE}
- --root=${WEBENGINE_ROOT_SOURCE_DIR}/src/3rdparty/chromium)
- list(JOIN gnArgArg " " gnArgArg)
-
- list(APPEND gnArg "--args=${gnArgArg}")
-
- list(JOIN gnArg " " printArg)
- message("-- Running gn for ${config} ${arch}\n-- ${gnCmd} ${printArg}")
- execute_process(
- COMMAND ${gnCmd} ${gnArg}
- WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
- RESULT_VARIABLE gnResult
- OUTPUT_VARIABLE gnOutput
- ERROR_VARIABLE gnError
- )
-
- if(NOT gnResult EQUAL 0)
- message(FATAL_ERROR "\n-- GN FAILED\n${gnOutput}\n${gnError}")
- else()
- string(REGEX REPLACE "\n$" "" gnOutput "${gnOutput}")
- message("-- GN ${gnOutput}")
- endif()
-endmacro()
-
function(add_ninja_command)
- qt_parse_all_arguments(arg "add_ninja_comamnd"
- "" "TARGET;OUTPUT;BUILDDIR" "BYPRODUCTS" "${ARGN}"
+ qt_parse_all_arguments(arg "add_ninja_command"
+ "" "TARGET;OUTPUT;BUILDDIR;MODULE" "BYPRODUCTS" "${ARGN}"
)
string(REPLACE " " ";" NINJAFLAGS "$ENV{NINJAFLAGS}")
list(TRANSFORM arg_BYPRODUCTS PREPEND "${arg_BUILDDIR}/")
@@ -865,7 +858,7 @@ function(add_ninja_command)
${arg_BUILDDIR}/${arg_OUTPUT}
${arg_BUILDDIR}/${arg_TARGET} # use generator expression in CMAKE 3.20
BYPRODUCTS ${arg_BYPRODUCTS}
- COMMENT "Ninja for ${arg_BUILDDIR}"
+ COMMENT "Running ninja for ${arg_TARGET} in ${arg_BUILDDIR}"
COMMAND Ninja::ninja
${NINJAFLAGS}
-C ${arg_BUILDDIR}
@@ -873,6 +866,7 @@ function(add_ninja_command)
USES_TERMINAL
VERBATIM
COMMAND_EXPAND_LISTS
+ DEPENDS run_${arg_MODULE}_NinjaReady
)
endfunction()
@@ -892,7 +886,7 @@ function(get_architectures result)
endif()
endfunction()
-function(add_gn_build_aritfacts_to_target cmakeTarget ninjaTarget buildDir)
+function(add_gn_build_aritfacts_to_target cmakeTarget ninjaTarget module 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
@@ -900,28 +894,105 @@ function(add_gn_build_aritfacts_to_target cmakeTarget ninjaTarget buildDir)
get_architectures(archs)
foreach(config ${configs})
foreach(arch ${archs})
- set(gnTarget ${ninjaTarget}_${config}_${arch})
- add_gn_target_for_cmake_target(${gnTarget} ${cmakeTarget} ${ninjaTarget} ${config} ${arch})
+ set(target ${ninjaTarget}_${config}_${arch})
+ add_ninja_target(${target} ${cmakeTarget} ${ninjaTarget} ${config} ${arch} ${buildDir})
add_ninja_command(
TARGET ${ninjaTarget}
OUTPUT ${ninjaTarget}.stamp
- BYPRODUCTS
- ${ninjaTarget}_objects.rsp
- ${ninjaTarget}_archives.rsp
- ${ninjaTarget}_libs.rsp
BUILDDIR ${buildDir}/${config}/${arch}
+ MODULE ${module}
+ )
+ add_dependencies(run_${module}_NinjaDone ${target})
+ set_target_properties(${cmakeTarget} PROPERTIES
+ LINK_DEPENDS ${buildDir}/${config}/${arch}/${ninjaTarget}.stamp
)
if(QT_IS_MACOS_UNIVERSAL)
- add_rsp_command(${gnTarget} ${buildDir}/${config}/${arch})
+ add_rsp_command(${target} ${buildDir}/${config}/${arch})
else()
- extend_target_with_gn_target(${gnTarget} ${buildDir}/${config}/${arch})
+ extend_cmake_target(${target} ${buildDir}/${config}/${arch})
endif()
endforeach()
if(QT_IS_MACOS_UNIVERSAL)
set(arch ${CMAKE_SYSTEM_PROCESSOR})
- set(gnTarget ${ninjaTarget}_${config}_${arch})
- add_lipo_command(${gnTarget} ${buildDir}/${config})
+ set(target ${ninjaTarget}_${config}_${arch})
+ add_lipo_command(${target} ${buildDir}/${config})
endif()
endforeach()
endfunction()
+function(get_config_filenames c_config cxx_config target_config)
+ set(${target_config} gn_config_target.cmake PARENT_SCOPE)
+ set(${cxx_config} gn_config_cxx.cmake PARENT_SCOPE)
+ set(${c_config} gn_config_c.cmake PARENT_SCOPE)
+endfunction()
+
+function(add_gn_command)
+ qt_parse_all_arguments(arg "add_gn_command"
+ "" "CMAKE_TARGET;GN_TARGET;MODULE;BUILDDIR" "NINJA_TARGETS;GN_ARGS" "${ARGN}"
+ )
+
+ get_config_filenames(cConfigFileName cxxConfigFileName targetConfigFileName)
+ set(gnArgArgFile ${arg_BUILDDIR}/args.gn)
+
+ list(JOIN arg_GN_ARGS "\n" arg_GN_ARGS)
+ file(WRITE ${gnArgArgFile} ${arg_GN_ARGS})
+
+ foreach(ninjaTarget ${arg_NINJA_TARGETS})
+ list(APPEND output ${ninjaTarget}_objects.rsp ${ninjaTarget}_archives.rsp ${ninjaTarget}_libs.rsp)
+ endforeach()
+ list(TRANSFORM output PREPEND "${arg_BUILDDIR}/")
+
+ if(QT_HOST_PATH)
+ set(QT_HOST_GN_PATH ${QT_HOST_PATH}/${INSTALL_LIBEXECDIR})
+ endif()
+
+ add_custom_command(
+ OUTPUT ${output}
+ COMMAND ${CMAKE_COMMAND}
+ -DBUILD_DIR=${arg_BUILDDIR}
+ -DSOURCE_DIR=${CMAKE_CURRENT_LIST_DIR}
+ -DMODULE=${arg_MODULE}
+ -DQT_HOST_GN_PATH=${QT_HOST_GN_PATH}
+ -P ${WEBENGINE_ROOT_SOURCE_DIR}/cmake/Gn.cmake
+ WORKING_DIRECTORY ${WEBENGINE_ROOT_BUILD_DIR}
+ COMMENT "Run gn for target ${arg_CMAKE_TARGET} in ${arg_BUILDDIR}"
+ DEPENDS ${gnArgArgFile} run_${arg_MODULE}_GnReady
+ USES_TERMINAL
+ )
+ add_custom_target(runGn_${arg_GN_TARGET}
+ DEPENDS #TODO this is fixed in cmake 3.20 so we could simply use GN_TARGET and not create new one
+ ${output}
+ ${arg_BUILDDIR}/${cxxConfigFileName}
+ ${arg_BUILDDIR}/${cConfigFileName}
+ ${arg_BUILDDIR}/${targetConfigFileName}
+ )
+ add_dependencies(run_${arg_MODULE}_GnDone runGn_${arg_GN_TARGET})
+ create_gn_target_config(${arg_GN_TARGET} ${arg_BUILDDIR}/${targetConfigFileName})
+endfunction()
+
+function(create_cxx_configs cmakeTarget arch)
+ get_config_filenames(cConfigFileName cxxConfigFileName targetConfigFileName)
+ create_c_config(${cmakeTarget} ${arch} ${cConfigFileName})
+ create_cxx_config(${cmakeTarget} ${arch} ${cxxConfigFileName})
+endfunction()
+
+# targets to gather per config / architecture targets
+function(addSyncTargets module)
+ add_custom_target(run_${module}_GnReady)
+ add_custom_target(run_${module}_GnDone)
+ add_custom_target(run_${module}_NinjaReady)
+ add_custom_target(run_${module}_NinjaDone)
+ # make nicer log so all gn has to finish before any ninja build starts
+ add_dependencies(run_${module}_NinjaReady run_${module}_GnDone)
+endfunction()
+
+function(addCopyCommand target src dst)
+ add_custom_command(
+ POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${dst}
+ COMMAND ${CMAKE_COMMAND} -E copy ${src} ${dst}
+ TARGET ${target}
+ DEPENDS ${src}
+ USES_TERMINAL
+ )
+endfunction()
diff --git a/cmake/Gn.cmake b/cmake/Gn.cmake
new file mode 100644
index 000000000..e8dc956ee
--- /dev/null
+++ b/cmake/Gn.cmake
@@ -0,0 +1,69 @@
+# This is gn wrapper script and it assables final BUILD.gn based on:
+# gn_config_target.cmake gn_config_c.cmake gn_config_cxx.cmake
+
+if(NOT CMAKE_SCRIPT_MODE_FILE)
+ message("This files should run only in script mode")
+ return()
+endif()
+
+get_filename_component(WEBENGINE_ROOT_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/.." REALPATH)
+get_filename_component(WEBENGINE_ROOT_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}" REALPATH)
+
+include(${WEBENGINE_ROOT_SOURCE_DIR}/.cmake.conf)
+include(${WEBENGINE_ROOT_SOURCE_DIR}/cmake/Functions.cmake)
+
+set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
+
+find_package(Gn ${QT_REPO_MODULE_VERSION} EXACT)
+find_package(Python2 2.7.5 REQUIRED)
+
+set(gnCmd ${Gn_EXECUTABLE})
+set(buildDir ${BUILD_DIR})
+set(sourceDir ${SOURCE_DIR})
+set(module ${MODULE})
+set(gnArg gen ${buildDir})
+file(READ ${buildDir}/args.gn gnArgArg)
+
+if(NOT gnCmd)
+ message(FATAL_ERROR "\nCould not find suitable gn to run.\n")
+endif()
+
+init_gn_config(${buildDir}/gn_config_target.cmake)
+read_gn_config(${buildDir}/gn_config_cxx.cmake)
+read_gn_config(${buildDir}/gn_config_c.cmake)
+
+configure_gn_target(
+ "${sourceDir}"
+ "${WEBENGINE_ROOT_SOURCE_DIR}/src/${module}/configure/BUILD.root.gn.in"
+ "${buildDir}/BUILD.gn"
+)
+
+list(APPEND gnArg
+ --script-executable=${Python2_EXECUTABLE}
+ --root=${WEBENGINE_ROOT_SOURCE_DIR}/src/3rdparty/chromium)
+
+STRING(REGEX REPLACE "\n" ";" printArgArg "${gnArgArg}")
+LIST(SORT printArgArg)
+STRING(REGEX REPLACE ";" "\n" printArgArg "${printArgArg}")
+list(JOIN gnArg " " printArg)
+
+message("-- Running gn in ${buildDir}\n"
+ "-- GN command:\n${gnCmd} ${printArg}\n"
+ "-- GN arg file:\n${buildDir}/args.gn\n"
+ "-- GN args: \n${printArgArg}"
+)
+
+execute_process(
+ COMMAND ${gnCmd} ${gnArg}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ RESULT_VARIABLE gnResult
+ OUTPUT_VARIABLE gnOutput
+ ERROR_VARIABLE gnError
+)
+
+if(NOT gnResult EQUAL 0)
+ message(FATAL_ERROR "\n-- GN FAILED\n${gnOutput}\n${gnError}")
+else()
+ string(REGEX REPLACE "\n$" "" gnOutput "${gnOutput}")
+ message("-- GN ${gnOutput}")
+endif()
diff --git a/configure.cmake b/configure.cmake
index 1086ba43a..c01dd2e14 100644
--- a/configure.cmake
+++ b/configure.cmake
@@ -1,6 +1,3 @@
-#### Inputs
-
-#### Libraries
if(QT_CONFIGURE_RUNNING)
function(assertTargets)
@@ -9,7 +6,7 @@ if(QT_CONFIGURE_RUNNING)
endfunction()
else()
find_package(Ninja 1.7.2)
- find_package(Gn ${QT_REPO_MODULES_VERSION} EXACT)
+ find_package(Gn ${QT_REPO_MODULE_VERSION} EXACT)
find_package(Python2 2.7.5)
find_package(GPerf)
find_package(BISON)
@@ -18,7 +15,6 @@ else()
find_package(PkgConfig)
find_package(Snappy)
find_package(Nodejs 10.19)
- find_package(Qt6 ${PROJECT_VERSION} CONFIG QUIET OPTIONAL_COMPONENTS Gui Widgets Network OpenGL OpenGLWidgets Quick Qml)
endif()
if(PkgConfig_FOUND)
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index 2bd079b43..fcc2fa2c7 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -1,24 +1,6 @@
cmake_minimum_required(VERSION 3.16)
-include(${CMAKE_CURRENT_LIST_DIR}/../.cmake.conf)
-
-project(QtWebEngineExamples
- VERSION "${QT_REPO_MODULE_VERSION}"
- DESCRIPTION "Qt WebEngine Examples"
- HOMEPAGE_URL "https://qt.io/"
- LANGUAGES CXX C
-)
-
-# Make sure we use the fixed BASE argument of qt_add_resource.
-set(QT_USE_FIXED_QT_ADD_RESOURCE_BASE TRUE)
-
-find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS BuildInternals Core)
-find_package(Qt6 ${PROJECT_VERSION} CONFIG OPTIONAL_COMPONENTS
- WebEngineCore WebEngineWidgets WebEngineQuick PdfWidgets QuickControls2 Svg
-)
-qt_build_repo_begin()
qt_examples_build_begin()
-
if(QT_FEATURE_qtwebengine_build AND QT_FEATURE_qtwebengine_quick_build)
add_subdirectory(webengine)
endif()
@@ -31,6 +13,4 @@ endif()
if(QT_FEATURE_qtpdf_build AND QT_FEATURE_qtpdf_widgets_build)
add_subdirectory(pdfwidgets)
endif()
-
qt_examples_build_end()
-qt_build_repo_end()
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 2db5f81e7..a8c331738 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,28 +1,55 @@
cmake_minimum_required(VERSION 3.19)
+##
+# MAIN CONFIGURE
+##
-if(NOT DEFINED WEBENGINE_ROOT_SOURCE_DIR)
- get_filename_component(WEBENGINE_ROOT_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/.." REALPATH)
-endif()
+get_filename_component(WEBENGINE_ROOT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/.." REALPATH)
+get_filename_component(WEBENGINE_ROOT_BUILD_DIR "${PROJECT_BINARY_DIR}" REALPATH)
-include(${WEBENGINE_ROOT_SOURCE_DIR}/.cmake.conf)
-include(${WEBENGINE_ROOT_SOURCE_DIR}/cmake/Functions.cmake)
+# Note this is configure that does not belong to any module
+qt_feature_module_begin(ONLY_EVALUATE_FEATURES)
+# Enable printing of feature summary by forcing qt_configure_record_command
+# to work in spite of ONLY_EVALUATE_FEATURES.
+set(__QtFeature_only_evaluate_features OFF)
+include(../configure.cmake)
+qt_feature_module_end(ONLY_EVALUATE_FEATURES)
-set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${WEBENGINE_ROOT_SOURCE_DIR}/cmake")
+##
+# SUPPORT CHECK
+##
-assertRunAsTopLevelBuild(TRUE)
+if(NOT ${QtWebEngine_SUPPORT})
+ add_custom_target(WebEngineErrorMessage ALL
+ ${CMAKE_COMMAND} -E cmake_echo_color --red "QtWebEngine will not be built: ${QtWebEngine_ERROR}"
+ COMMENT "Check QtWebEngine support"
+ VERBATIM
+ )
+ message("-- Support check for QtWebEngine failed: ${QtWebEngine_ERROR}")
+ set(QT_FEATURE_qtwebengine_build OFF CACHE BOOL "Build QtWebEngine" FORCE)
+ set(QT_FEATURE_qtwebengine_widgets_build OFF CACHE BOOL "Build QtWebEngineWidgets" FORCE)
+ set(QT_FEATURE_qtwebengine_quick_build OFF CACHE BOOL "Build QtWebEngineQuick" FORCE)
+endif()
-project(QtWebEngineRepo
- VERSION "${QT_REPO_MODULE_VERSION}"
- DESCRIPTION "QtWebEngineRepo for QtWebEngineCore, QtWebEngine, QtWebEngineWidgets, QtPdf modules"
- HOMEPAGE_URL "https://qt.io"
- LANGUAGES CXX C)
+if(NOT ${QtPdf_SUPPORT})
+ add_custom_target(PdfErrorMessage ALL
+ ${CMAKE_COMMAND} -E cmake_echo_color --red "QtPdf will not be built: ${QtPdf_ERROR}"
+ COMMENT "Check QtPdf support"
+ VERBATIM
+ )
+ message("-- Support check for QtPdf failed: ${QtPdf_ERROR}")
+ set(QT_FEATURE_qtpdf_build OFF CACHE BOOL "Build QtPdf" FORCE)
+ set(QT_FEATURE_qtpdf_widgets_build OFF CACHE BOOL "Build QtPdfWidgets" FORCE)
+ set(QT_FEATURE_qtpdf_quick_build OFF CACHE BOOL "Build QtPdfQuick" FORCE)
+endif()
-# Make sure we use the fixed BASE argument of qt_add_resource.
-set(QT_USE_FIXED_QT_ADD_RESOURCE_BASE TRUE)
+if(NOT QT_FEATURE_qtwebengine_build AND NOT QT_FEATURE_qtpdf_build)
+ return()
+endif()
-find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS BuildInternals Core)
+##
+# MODULES
+##
-qt_build_repo_begin()
if(QT_FEATURE_qtwebengine_build)
add_subdirectory(core)
add_subdirectory(process)
@@ -35,6 +62,16 @@ if(QT_FEATURE_qtwebengine_build)
endif()
if(QT_FEATURE_qtpdf_build)
add_subdirectory(pdf)
+ # keep log order, pdf build after webengine
+ if(QT_FEATURE_qtwebengine_build)
+ add_dependencies(run_pdf_GnReady WebEngineCore)
+ endif()
+ if(QT_FEATURE_qtwebengine_widgets_build)
+ add_dependencies(run_pdf_GnReady WebEngineWidgets)
+ endif()
+ if(QT_FEATURE_qtwebengine_quick_build)
+ add_dependencies(run_pdf_GnReady WebEngineQuick)
+ endif()
if(QT_FEATURE_qtpdf_widgets_build)
add_subdirectory(pdfwidgets)
endif()
@@ -42,5 +79,97 @@ if(QT_FEATURE_qtpdf_build)
add_subdirectory(pdfquick)
endif()
endif()
-qt_build_repo_end()
+
+##
+# NINJA PROJECT
+##
+
+set(installDir ${PROJECT_BINARY_DIR}/install)
+
+if(NOT Ninja_FOUND)
+ externalproject_add(ninja
+ SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/ninja
+ BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/ninja
+ INSTALL_DIR ${installDir}
+ PREFIX ninja
+ USES_TERMINAL_BUILD TRUE
+ EXCLUDE_FROM_ALL TRUE
+ CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release
+ -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
+ -DCMAKE_PREFIX_PATH:PATH=<INSTALL_DIR>
+ )
+ if(QT_FEATURE_qtwebengine_build)
+ add_dependencies(run_core_NinjaReady ninja)
+ endif()
+ if(QT_FEATURE_qtpdf_build)
+ add_dependencies(run_pdf_NinjaReady ninja)
+ endif()
+endif()
+
+##
+# GN PROJECT
+##
+
+if(NOT Gn_FOUND)
+ externalproject_add(gn
+ SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/gn
+ BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/gn
+ INSTALL_DIR ${installDir}
+ PREFIX gn
+ USES_TERMINAL_BUILD TRUE
+ EXCLUDE_FROM_ALL TRUE
+ CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release
+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+ -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
+ -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
+ -DCMAKE_PREFIX_PATH:PATH=<INSTALL_DIR>
+ -DWEBENGINE_ROOT_BUILD_DIR=${PROJECT_BINARY_DIR}
+ )
+ if(QT_FEATURE_qtwebengine_build)
+ add_dependencies(run_core_GnReady gn)
+ endif()
+ if(QT_FEATURE_qtpdf_build)
+ add_dependencies(run_pdf_GnReady gn)
+ endif()
+ set(INSTALL_GN 1 CACHE INTERNAL "")
+endif()
+
+##
+# HOST PROJECT
+##
+
+if(CMAKE_CROSSCOMPILING)
+
+ if(NOT Gn_FOUND)
+ message(FATAL_ERROR "\nHost gn not found - cross compilation not possible")
+ endif()
+
+ externalproject_add(hostBuild
+ SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/host
+ BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/host
+ PREFIX host
+ USES_TERMINAL_BUILD TRUE
+ EXCLUDE_FROM_ALL TRUE
+ CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${QT_HOST_PATH}/lib/cmake/Qt6/qt.toolchain.cmake
+ -DWEBENGINE_ROOT_BUILD_DIR=${PROJECT_BINARY_DIR}
+ -DWEBENGINE_ROOT_SOURCE_DIR=${WEBENGINE_ROOT_SOURCE_DIR}
+ -DGN_TARGET_CPU=${TEST_architecture_arch}
+ -DCMAKE_C_FLAGS=
+ -DCMAKE_CXX_FLAGS=
+ -DQT_FEATURE_qtwebengine_build=${QT_FEATURE_qtwebengine_build}
+ -DQT_FEATURE_qtpdf_build=${QT_FEATURE_qtpdf_build}
+ )
+ add_dependencies(run_core_GnReady hostBuild)
+endif()
+
+# install gn for cross build
+if(LINUX AND INSTALL_GN)
+ get_install_config(installConfig)
+ message(${installConfig})
+ install(
+ PROGRAMS ${installDir}/bin/gn
+ CONFIGURATIONS ${installConfig}
+ RUNTIME DESTINATION "${INSTALL_LIBEXECDIR}"
+ )
+endif()
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index ffb327c2e..74ae345dc 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -1,32 +1,19 @@
cmake_minimum_required(VERSION 3.19)
-if(NOT DEFINED WEBENGINE_ROOT_SOURCE_DIR)
- get_filename_component(WEBENGINE_ROOT_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/../.." REALPATH)
-endif()
-if (NOT DEFINED WEBENGINE_ROOT_BUILD_DIR)
- get_filename_component(WEBENGINE_ROOT_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/../.." REALPATH)
-endif()
-
-set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${WEBENGINE_ROOT_SOURCE_DIR}/cmake")
-set(buildDir "${CMAKE_CURRENT_BINARY_DIR}")
-
-include(${WEBENGINE_ROOT_SOURCE_DIR}/cmake/Functions.cmake)
-assertRunAsTopLevelBuild(TRUE)
-
-add_subdirectory(api)
-add_subdirectory(tools)
-
-find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS BuildInternals Core)
-find_package(Gn ${QT_REPO_MODULE_VERSION} EXACT REQUIRED)
find_package(Ninja 1.7.2 REQUIRED)
find_package(Python2 2.7.5 REQUIRED)
find_package(Nodejs 10.19 REQUIRED)
find_package(PkgConfig)
if(PkgConfig_FOUND)
pkg_check_modules(XSCRNSAVER xscrnsaver)
- create_pkg_config_host_wrapper()
+ create_pkg_config_host_wrapper(${CMAKE_CURRENT_BINARY_DIR})
endif()
+set(buildDir "${CMAKE_CURRENT_BINARY_DIR}")
+
+add_subdirectory(api)
+add_subdirectory(tools)
+
##
# TOOLCHAIN SETUP
##
@@ -36,9 +23,11 @@ if(LINUX)
endif()
##
-# MULTICONFIG SETUP
+# GN BUILD SETUP
##
+addSyncTargets(core)
+
get_configs(configs)
get_architectures(archs)
@@ -49,13 +38,14 @@ foreach(arch ${archs})
# BUILD.gn SETUP
##
- unset(buildGn)
set(buildGn core_${config}_${arch})
- add_gn_target(${buildGn} ${config} ${arch} SOURCES DEFINES CXX_COMPILE_OPTIONS C_COMPILE_OPTIONS INCLUDES)
-
+ add_gn_target(${buildGn} ${config} ${arch}
+ SOURCES DEFINES CXX_COMPILE_OPTIONS C_COMPILE_OPTIONS INCLUDES MOC_PATH RSP_PREFIX
+ )
resolve_target_includes(gnIncludes WebEngineCore)
get_forward_declaration_macro(forwardDeclarationMacro)
get_target_property(qtWebEngineProcessName WebEngineCore QTWEBENGINEPROCESS_NAME)
+ get_target_property(mocFilePath Qt6::moc IMPORTED_LOCATION)
if(QT_FEATURE_debug_and_release AND ("${config}" STREQUAL "Debug"))
set(qtWebEngineProcessName "${qtWebEngineProcessName}${CMAKE_DEBUG_POSTFIX}")
@@ -74,15 +64,19 @@ foreach(arch ${archs})
endif()
extend_gn_target(${buildGn}
+ MOC_PATH
+ ${mocFilePath}
+ RSP_PREFIX
+ src/core/${config}/${arch}
INCLUDES
${gnIncludes}
DEFINES
QT_NO_KEYWORDS
QT_USE_QSTRINGBUILDER
- QTWEBENGINECORE_VERSION_STR=\\\\\"${QT_REPO_MODULE_VERSION}\\\\\"
- QTWEBENGINEPROCESS_NAME=\\\\\"${qtWebEngineProcessName}\\\\\"
+ QTWEBENGINECORE_VERSION_STR=\\\\\\\\\"${QT_REPO_MODULE_VERSION}\\\\\\\\\"
+ QTWEBENGINEPROCESS_NAME=\\\\\\\\\"${qtWebEngineProcessName}\\\\\\\\\"
BUILDING_CHROMIUM
- ${forwardDeclarationMacro}
+ "${forwardDeclarationMacro}"
CXX_COMPILE_OPTIONS
${gnCxxCompileOptions}
SOURCES
@@ -267,13 +261,6 @@ foreach(arch ${archs})
renderer/extensions/resource_request_policy_qt.cpp renderer/extensions/resource_request_policy_qt.h
)
- 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"
- core/${config}/${arch}
- )
-
##
# GN PARAMETERS SETUP
##
@@ -449,17 +436,22 @@ foreach(arch ${archs})
)
endif()
- ##
- # GN CALL
- ##
-
- execute_gn(gnArgArg)
+ add_gn_command(
+ CMAKE_TARGET WebEngineCore
+ NINJA_TARGETS QtWebEngineCore convert_dict
+ GN_TARGET ${buildGn}
+ GN_ARGS "${gnArgArg}"
+ BUILDDIR ${buildDir}/${config}/${arch}
+ MODULE core
+ )
endforeach()
+ create_cxx_configs(WebEngineCore ${arch})
endforeach()
+
##
-# WEBENGINECORE
+# WEBENGINECORE SETUP
##
set(arch ${CMAKE_SYSTEM_PROCESSOR})
@@ -469,7 +461,8 @@ target_include_directories(WebEngineCore PRIVATE
${buildDir}/$<CONFIG>/${arch}/gen/third_party/perfetto/build_config
)
-add_gn_build_aritfacts_to_target(WebEngineCore QtWebEngineCore ${buildDir})
+add_gn_build_aritfacts_to_target(WebEngineCore QtWebEngineCore core ${buildDir})
+add_dependencies(WebEngineCore run_core_NinjaDone)
##
# SANDBOX
@@ -483,6 +476,7 @@ if(WIN32)
TARGET QtWebEngineCoreSandbox
OUTPUT QtWebEngineCoreSandbox.lib
BUILDDIR ${buildDir}/${config}/${arch}
+ MODULE core
)
set(sandboxLibraryPath ${buildDir}/${config}/${arch}/QtWebEngineCoreSandbox.lib)
set_property(TARGET WebEngineCoreSandbox
@@ -490,101 +484,12 @@ if(WIN32)
)
add_custom_target(sandboxLibrary_${config}
DEPENDS ${buildDir}/${config}/${arch}/QtWebEngineCoreSandbox.lib)
- add_dependencies(WebEngineCoreSandbox sandboxLibrary_${config})
+ add_dependencies(run_core_NinjaDone sandboxLibrary_${config})
add_dependencies(WebEngineCoreSandbox WebEngineCore)
endforeach()
endif()
##
-# WEBENGINECORE RESOURCES
-##
-
-#TODO: use simply filter / globbing-expressions
-set(localeList am ar bg bn ca cs da de el en-GB en-US es-419 es et fa fi fil fr
- gu he hi hr hu id it ja kn ko lt lv ml mr ms nb nl pl pt-BR pt-PT ro ru sk
- sl sr sv sw ta te th tr uk vi zh-CN zh-TW)
-
-set(resourceList qtwebengine_resources.pak
- qtwebengine_resources_100p.pak
- qtwebengine_resources_200p.pak
- qtwebengine_devtools_resources.pak)
-
-get_install_config(config)
-
-foreach(loc ${localeList})
- get_filename_component(locSourcePath ${buildDir}/${config}/${arch}/qtwebengine_locales/${loc}.pak REALPATH)
- list(APPEND localeFiles ${locSourcePath})
-endforeach()
-
-foreach(res ${resourceList})
- get_filename_component(resSourcePath ${buildDir}/${config}/${arch}/${res} REALPATH)
- list(APPEND resourceFiles ${resSourcePath})
-endforeach()
-
-if (NOT QT_FEATURE_webengine_system_icu)
- get_filename_component(icuFile ${buildDir}/${config}/${arch}/icudtl.dat REALPATH)
- list(APPEND resourceFiles ${icuFile})
-endif()
-
-if(QT_FEATURE_framework)
- set(allResourceFiles ${localeFiles} ${resourceFiles})
- target_sources(WebEngineCore PRIVATE ${allResourceFiles})
-
- set_source_files_properties(${localeFiles}
- TARGET_DIRECTORY WebEngineCore
- PROPERTIES MACOSX_PACKAGE_LOCATION Resources/qtwebengine_locales
- GENERATED TRUE
- )
- set_source_files_properties(${resourceFiles}
- TARGET_DIRECTORY WebEngineCore
- PROPERTIES MACOSX_PACKAGE_LOCATION Resources
- GENERATED TRUE
- )
-
- add_custom_command(OUTPUT ${allResourceFiles} DEPENDS ${buildDir}/${config}/${arch}/QtWebEngineCore.stamp)
- add_custom_target(generate_resources_${config} DEPENDS ${allResourceFiles})
-else()
- install(FILES ${localeFiles}
- DESTINATION translations/qtwebengine_locales
- CONFIGURATIONS ${config}
- )
- install(FILES ${resourceFiles}
- DESTINATION resources
- CONFIGURATIONS ${config}
- )
-# install (again) for superbuild
- install(FILES ${localeFiles}
- DESTINATION ${WEBENGINE_ROOT_BUILD_DIR}/translations/qtwebengine_locales
- CONFIGURATIONS ${config}
- )
- install(FILES ${resourceFiles}
- DESTINATION ${WEBENGINE_ROOT_BUILD_DIR}/resources
- CONFIGURATIONS ${config}
- )
- if(NOT QT_WILL_INSTALL)
- # TODO: Could we get rid of ALL?
- add_custom_target(
- install_resources_${config}
- ALL
- DEPENDS ${buildDir}/${config}/${arch}/QtWebEngineCore.stamp
- COMMAND ${CMAKE_COMMAND} -E make_directory
- ${CMAKE_INSTALL_PREFIX}/resources
- COMMAND ${CMAKE_COMMAND} -E copy
- ${resourceFiles}
- ${CMAKE_INSTALL_PREFIX}/resources)
- add_custom_target(
- install_locales_${config}
- ALL
- DEPENDS ${buildDir}/${config}/${arch}/QtWebEngineCore.stamp
- COMMAND ${CMAKE_COMMAND} -E make_directory
- ${CMAKE_INSTALL_PREFIX}/translations/qtwebengine_locales
- COMMAND ${CMAKE_COMMAND} -E copy
- ${localeFiles}
- ${CMAKE_INSTALL_PREFIX}/translations/qtwebengine_locales)
- endif()
-endif()
-
-##
# WEBENGINECORE DICT TOOL SETUP
##
@@ -593,8 +498,10 @@ if(QT_FEATURE_webengine_spellchecker)
target_include_directories(${dict_target_name} PRIVATE
../3rdparty/chromium
../3rdparty/chromium/third_party/boringssl/src/include
- ${buildDir}/${config}/${arch}/gen
+ ${buildDir}/$<CONFIG>/${arch}/gen
)
- add_gn_build_aritfacts_to_target(${dict_target_name} convert_dict ${buildDir})
+ add_gn_build_aritfacts_to_target(${dict_target_name} convert_dict core ${buildDir})
+ add_dependencies(${dict_target_name} run_core_NinjaDone)
+ add_dependencies(${dict_target_name} WebEngineCore)
endif()
diff --git a/src/core/api/CMakeLists.txt b/src/core/api/CMakeLists.txt
index cee72966d..192afd01b 100644
--- a/src/core/api/CMakeLists.txt
+++ b/src/core/api/CMakeLists.txt
@@ -1,16 +1,9 @@
-if(NOT DEFINED WEBENGINE_ROOT_SOURCE_DIR)
- get_filename_component(WEBENGINE_ROOT_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/../../.." REALPATH)
-endif()
find_package(Qt6 ${PROJECT_VERSION} REQUIRED COMPONENTS Gui Network OpenGL Quick)
find_package(Qt6 ${PROJECT_VERSION} QUIET OPTIONAL_COMPONENTS WebChannel Positioning)
-include(${WEBENGINE_ROOT_SOURCE_DIR}/cmake/Functions.cmake)
-
-get_configure_mode(configureMode)
set(qtWebEngineProcessName QtWebEngineProcess)
qt_internal_add_module(WebEngineCore
- ${configureMode}
SOURCES
qtwebenginecoreglobal.cpp qtwebenginecoreglobal.h qtwebenginecoreglobal_p.h
qwebenginecertificateerror.cpp qwebenginecertificateerror.h
@@ -63,8 +56,6 @@ set_target_properties(WebEngineCore PROPERTIES QTWEBENGINEPROCESS_NAME ${qtWebEn
# Chromium included headers are not clean
qt_skip_warnings_are_errors(WebEngineCore)
-make_install_only(WebEngineCore)
-make_config_for_gn(WebEngineCore gn_config)
if(CLANG OR GCC)
target_compile_options(WebEngineCore PRIVATE "-Wno-unused-parameter")
@@ -79,6 +70,77 @@ qt_internal_extend_target(WebEngineCore CONDITION QT_FEATURE_webengine_geolocati
Qt::Positioning
)
+##
+# DOCS
+##
+
qt_internal_add_docs(WebEngineCore
../doc/qtwebengine.qdocconf
)
+
+##
+# WEBENGINECORE RESOURCES
+##
+
+set(arch ${CMAKE_SYSTEM_PROCESSOR})
+#TODO: use simply filter / globbing-expressions
+set(localeList am ar bg bn ca cs da de el en-GB en-US es-419 es et fa fi fil fr
+ gu he hi hr hu id it ja kn ko lt lv ml mr ms nb nl pl pt-BR pt-PT ro ru sk
+ sl sr sv sw ta te th tr uk vi zh-CN zh-TW)
+
+set(resourceList qtwebengine_resources.pak
+ qtwebengine_resources_100p.pak
+ qtwebengine_resources_200p.pak
+ qtwebengine_devtools_resources.pak)
+
+get_install_config(config)
+
+foreach(loc ${localeList})
+ get_filename_component(locSourcePath ${buildDir}/${config}/${arch}/qtwebengine_locales/${loc}.pak REALPATH)
+ list(APPEND localeFiles ${locSourcePath})
+endforeach()
+
+foreach(res ${resourceList})
+ get_filename_component(resSourcePath ${buildDir}/${config}/${arch}/${res} REALPATH)
+ list(APPEND resourceFiles ${resSourcePath})
+endforeach()
+
+if (NOT QT_FEATURE_webengine_system_icu)
+ get_filename_component(icuFile ${buildDir}/${config}/${arch}/icudtl.dat REALPATH)
+ list(APPEND resourceFiles ${icuFile})
+endif()
+
+if(QT_FEATURE_framework)
+ set(allResourceFiles ${localeFiles} ${resourceFiles})
+ target_sources(WebEngineCore PRIVATE ${allResourceFiles})
+
+ set_source_files_properties(${localeFiles}
+ TARGET_DIRECTORY WebEngineCore
+ PROPERTIES MACOSX_PACKAGE_LOCATION Resources/qtwebengine_locales
+ GENERATED TRUE
+ )
+ set_source_files_properties(${resourceFiles}
+ TARGET_DIRECTORY WebEngineCore
+ PROPERTIES MACOSX_PACKAGE_LOCATION Resources
+ GENERATED TRUE
+ )
+
+ add_custom_command(OUTPUT ${allResourceFiles} DEPENDS ${buildDir}/${config}/${arch}/QtWebEngineCore.stamp)
+ add_custom_target(generate_resources_${config} DEPENDS ${allResourceFiles})
+else()
+ install(FILES ${localeFiles}
+ DESTINATION translations/qtwebengine_locales
+ CONFIGURATIONS ${config}
+ )
+ install(FILES ${resourceFiles}
+ DESTINATION resources
+ CONFIGURATIONS ${config}
+ )
+ if(NOT QT_WILL_INSTALL)
+ set(rootPath ${CMAKE_INSTALL_PREFIX})
+ else()
+ set(rootPath ${PROJECT_BINARY_DIR})
+ endif()
+ addCopyCommand(WebEngineCore "${localeFiles}" ${rootPath}/translations/qtwebengine_locales)
+ addCopyCommand(WebEngineCore "${resourceFiles}" ${rootPath}/resources)
+endif()
diff --git a/src/core/tools/CMakeLists.txt b/src/core/tools/CMakeLists.txt
index 9d778bb08..e16bfb926 100644
--- a/src/core/tools/CMakeLists.txt
+++ b/src/core/tools/CMakeLists.txt
@@ -12,7 +12,6 @@ if(QT_FEATURE_webengine_spellchecker)
SOURCES main.cpp
)
qt_skip_warnings_are_errors(${dict_target_name})
- make_install_only(${dict_target_name})
add_dependencies(${dict_target_name} WebEngineCore)
qt_internal_extend_target(${dict_target_name} CONDITION WIN32
DEFINES WIN32_LEAN_AND_MEAN NOMINMAX
diff --git a/src/pdf/CMakeLists.txt b/src/pdf/CMakeLists.txt
index 12f01a73f..da1aa93ff 100644
--- a/src/pdf/CMakeLists.txt
+++ b/src/pdf/CMakeLists.txt
@@ -1,14 +1,19 @@
-if(NOT DEFINED WEBENGINE_ROOT_SOURCE_DIR)
- get_filename_component(WEBENGINE_ROOT_SOURCE_DIR
- "${CMAKE_CURRENT_LIST_DIR}/../.." REALPATH
- )
+cmake_minimum_required(VERSION 3.19)
+find_package(Ninja 1.7.2 REQUIRED)
+find_package(Python2 2.7.5 REQUIRED)
+find_package(Nodejs 10.19 REQUIRED)
+find_package(PkgConfig)
+if(PkgConfig_FOUND)
+ create_pkg_config_host_wrapper(${CMAKE_CURRENT_BINARY_DIR})
endif()
-find_package(Qt6 ${PROJECT_VERSION} REQUIRED COMPONENTS Gui Network OpenGL Quick)
-include(${WEBENGINE_ROOT_SOURCE_DIR}/cmake/Functions.cmake)
-set(buildDir "${CMAKE_CURRENT_BINARY_DIR}")
+set(buildDir "${CMAKE_CURRENT_BINARY_DIR}")
add_subdirectory(plugins/imageformats/pdf)
+##
+# PDF MODULE
+##
+
qt_internal_add_module(Pdf
SOURCES
qpdfbookmarkmodel.cpp qpdfbookmarkmodel.h
@@ -36,128 +41,135 @@ qt_internal_add_module(Pdf
Qt::Gui
)
-make_config_for_gn(Pdf gn_config)
-make_install_only(Pdf)
+##
+# PDF DOCS
+##
+
qt_internal_add_docs(Pdf
doc/qtpdf.qdocconf
)
+
##
-# REPO BUILD
+# TOOLCHAIN SETUP
##
-if(WEBENGINE_REPO_BUILD)
- find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS BuildInternals Core)
- find_package(Gn ${QT_REPO_MODULE_VERSION} EXACT REQUIRED)
- find_package(Ninja 1.7.2 REQUIRED)
- find_package(Python2 2.7.5 REQUIRED)
- find_package(Nodejs 10.19 REQUIRED)
- find_package(PkgConfig)
- if(PkgConfig_FOUND)
- create_pkg_config_host_wrapper()
- endif()
-
- ##
- # TOOLCHAIN SETUP
- ##
-
- if(LINUX)
- setup_toolchains()
- endif()
-
- ##
- # MULTICONFIG SETUP
- ##
-
- get_configs(configs)
- get_architectures(archs)
-
- foreach(arch ${archs})
- foreach(config ${configs})
-
- ##
- # BULID.gn SETUP
- ##
-
- set(buildGn pdf_${config}_${arch})
- add_gn_target(${buildGn} ${config} ${arch} SOURCES DEFINES CXX_COMPILE_OPTIONS C_COMPILE_OPTIONS INCLUDES)
- resolve_target_includes(gnIncludes Pdf)
- get_forward_declaration_macro(forwardDeclarationMacro)
- 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"
- pdf/${config}/${arch}
- )
-
- ##
- # GN PARAMETERS
- ##
-
- unset(gnArgArg)
- append_build_type_setup(gnArgArg)
- append_compiler_linker_sdk_setup(gnArgArg)
- append_sanitizer_setup(gnArgArg)
- append_toolchain_setup(gnArgArg)
- append_pkg_config_setup(gnArgArg)
-
- list(APPEND gnArgArg
- qtwebengine_target="${buildDir}/${config}/${arch}:QtPdf"
- enable_remoting=false
- enable_web_speech=false
- chrome_pgo_phase=0
- )
-
- if(LINUX)
- list(APPEND gnArgArg
- use_x11=false
- is_cfi=false
- ozone_auto_platforms=false
- use_gnome_keyring=false)
- endif()
- if(MACOS)
- list(APPEND gnArgArg angle_enable_vulkan=false)
- endif()
- if(WIN32)
- list(APPEND gnArgArg
- ninja_use_custom_environment_files=false
- safe_browsing_mode=0
- )
- endif()
-
- extend_gn_list(gnArgArg
- ARGS pdf_enable_v8
- CONDITION QT_FEATURE_pdf_v8
- )
- extend_gn_list(gnArgArg
- ARGS pdf_enable_xfa
- CONDITION QT_FEATURE_pdf_xfa
- )
- extend_gn_list(gnArgArg
- ARGS pdf_enable_xfa_bmp
- CONDITION QT_FEATURE_pdf_xfa_bmp
- )
- extend_gn_list(gnArgArg
- ARGS pdf_enable_xfa_gif
- CONDITION QT_FEATURE_pdf_xfa_gif
- )
- extend_gn_list(gnArgArg
- ARGS pdf_enable_xfa_png
- CONDITION QT_FEATURE_pdf_xfa_png
- )
- extend_gn_list(gnArgArg
- ARGS pdf_enable_xfa_tiff
- CONDITION QT_FEATURE_pdf_xfa_tiff
- )
-
- ##
- # GN CALL
- ##
-
- execute_gn(gnArgArg)
- endforeach()
- endforeach()
- set(arch ${CMAKE_SYSTEM_PROCESSOR})
- target_include_directories(Pdf PRIVATE ${buildDir}/$<CONFIG>/${arch}/gen)
- add_gn_build_aritfacts_to_target(Pdf QtPdf ${buildDir})
+if(LINUX)
+ setup_toolchains()
endif()
+
+##
+# GN BUILD SETUP
+##
+
+addSyncTargets(pdf)
+
+get_configs(configs)
+get_architectures(archs)
+
+foreach(arch ${archs})
+ foreach(config ${configs})
+
+ ##
+ # BULID.gn SETUP
+ ##
+
+ set(buildGn pdf_${config}_${arch})
+ add_gn_target(${buildGn} ${config} ${arch}
+ SOURCES DEFINES CXX_COMPILE_OPTIONS C_COMPILE_OPTIONS INCLUDES MOC_PATH RSP_PREFIX
+ )
+ resolve_target_includes(gnIncludes Pdf)
+ get_forward_declaration_macro(forwardDeclarationMacro)
+
+ extend_gn_target(${buildGn}
+ MOC_PATH
+ ${mocFilePath}
+ RSP_PREFIX
+ src/pdf/${config}/${arch}
+ INCLUDES
+ ${gnIncludes}
+ )
+
+ ##
+ # GN PARAMETERS
+ ##
+
+ unset(gnArgArg)
+ append_build_type_setup(gnArgArg)
+ append_compiler_linker_sdk_setup(gnArgArg)
+ append_sanitizer_setup(gnArgArg)
+ append_toolchain_setup(gnArgArg)
+ append_pkg_config_setup(gnArgArg)
+
+ list(APPEND gnArgArg
+ qtwebengine_target="${buildDir}/${config}/${arch}:QtPdf"
+ enable_remoting=false
+ enable_web_speech=false
+ chrome_pgo_phase=0
+ )
+
+ if(LINUX)
+ list(APPEND gnArgArg
+ use_x11=false
+ is_cfi=false
+ ozone_auto_platforms=false
+ use_gnome_keyring=false)
+ endif()
+ if(MACOS)
+ list(APPEND gnArgArg angle_enable_vulkan=false)
+ endif()
+ if(WIN32)
+ list(APPEND gnArgArg
+ ninja_use_custom_environment_files=false
+ safe_browsing_mode=0
+ )
+ endif()
+
+ extend_gn_list(gnArgArg
+ ARGS pdf_enable_v8
+ CONDITION QT_FEATURE_pdf_v8
+ )
+ extend_gn_list(gnArgArg
+ ARGS pdf_enable_xfa
+ CONDITION QT_FEATURE_pdf_xfa
+ )
+ extend_gn_list(gnArgArg
+ ARGS pdf_enable_xfa_bmp
+ CONDITION QT_FEATURE_pdf_xfa_bmp
+ )
+ extend_gn_list(gnArgArg
+ ARGS pdf_enable_xfa_gif
+ CONDITION QT_FEATURE_pdf_xfa_gif
+ )
+ extend_gn_list(gnArgArg
+ ARGS pdf_enable_xfa_png
+ CONDITION QT_FEATURE_pdf_xfa_png
+ )
+ extend_gn_list(gnArgArg
+ ARGS pdf_enable_xfa_tiff
+ CONDITION QT_FEATURE_pdf_xfa_tiff
+ )
+
+ add_gn_command(
+ CMAKE_TARGET Pdf
+ NINJA_TARGETS QtPdf
+ GN_TARGET ${buildGn}
+ GN_ARGS "${gnArgArg}"
+ BUILDDIR ${buildDir}/${config}/${arch}
+ MODULE pdf
+ )
+
+ endforeach()
+ create_cxx_configs(Pdf ${arch})
+endforeach()
+
+
+##
+# PDF SETUP
+##
+
+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_dependencies(Pdf run_pdf_NinjaDone)
+
diff --git a/src/pdf/plugins/imageformats/pdf/CMakeLists.txt b/src/pdf/plugins/imageformats/pdf/CMakeLists.txt
index 8a33e590b..ee290782b 100644
--- a/src/pdf/plugins/imageformats/pdf/CMakeLists.txt
+++ b/src/pdf/plugins/imageformats/pdf/CMakeLists.txt
@@ -8,4 +8,3 @@ qt_internal_add_plugin(QPdfPlugin
Qt::PdfPrivate
)
-make_install_only(QPdfPlugin)
diff --git a/src/pdfquick/CMakeLists.txt b/src/pdfquick/CMakeLists.txt
index 12cb393ff..5bbe66959 100644
--- a/src/pdfquick/CMakeLists.txt
+++ b/src/pdfquick/CMakeLists.txt
@@ -1,7 +1,5 @@
find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS Core Gui Qml Quick)
-get_configure_mode(configureMode)
-
set(qml_files
# TODO:
# "qml/+material/PdfStyle.qml"
@@ -48,8 +46,5 @@ qt_internal_extend_target(qtpdfquickplugin
Qt::PdfQuickPrivate
)
-make_install_only(PdfQuick)
-make_install_only(qtpdfquickplugin)
-
diff --git a/src/pdfwidgets/CMakeLists.txt b/src/pdfwidgets/CMakeLists.txt
index 04ca1387e..2d2616556 100644
--- a/src/pdfwidgets/CMakeLists.txt
+++ b/src/pdfwidgets/CMakeLists.txt
@@ -12,4 +12,3 @@ qt_internal_add_module(PdfWidgets
Qt::Widgets
Qt::Pdf
)
-make_install_only(PdfWidgets)
diff --git a/src/process/CMakeLists.txt b/src/process/CMakeLists.txt
index 9b515f1d9..5e7c1130b 100644
--- a/src/process/CMakeLists.txt
+++ b/src/process/CMakeLists.txt
@@ -56,6 +56,7 @@ if(isFramework)
"$<TARGET_BUNDLE_DIR:WebEngineCore>/Versions/A/Helpers/${qtWebEngineProcessName}.app"
COMMAND ${CMAKE_COMMAND} -E create_symlink "Versions/Current/Helpers"
"$<TARGET_BUNDLE_DIR:WebEngineCore>/Helpers"
+ USES_TERMINAL
)
install(TARGETS ${qtWebEngineProcessName}
BUNDLE DESTINATION ./lib/QtWebEngineCore.framework/Versions/A/Helpers
@@ -73,5 +74,3 @@ if(MSVC)
DESTINATION "${INSTALL_LIBEXECDIR}"
)
endif()
-
-make_install_only(${qtWebEngineProcessName})
diff --git a/src/webenginequick/CMakeLists.txt b/src/webenginequick/CMakeLists.txt
index ac9c905e2..30b0fa2cf 100644
--- a/src/webenginequick/CMakeLists.txt
+++ b/src/webenginequick/CMakeLists.txt
@@ -1,12 +1,6 @@
-find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS Gui Qml Quick)
-find_package(Qt6 ${PROJECT_VERSION} CONFIG QUIET OPTIONAL_COMPONENTS PrintSupport WebChannel Positioning Test)
-
-get_configure_mode(configureMode)
-
add_subdirectory(ui)
qt_internal_add_qml_module(WebEngineQuick
- ${configureMode}
URI "QtWebEngine"
VERSION "${PROJECT_VERSION}"
CLASS_NAME QtWebEnginePlugin
@@ -61,6 +55,3 @@ qt_internal_extend_target(qtwebenginequickplugin
Qt::CorePrivate
Qt::WebEngineQuickPrivate
)
-
-make_install_only(WebEngineQuick)
-make_install_only(qtwebenginequickplugin)
diff --git a/src/webenginequick/ui/CMakeLists.txt b/src/webenginequick/ui/CMakeLists.txt
index 2de01a210..aa5832ba6 100644
--- a/src/webenginequick/ui/CMakeLists.txt
+++ b/src/webenginequick/ui/CMakeLists.txt
@@ -35,6 +35,4 @@ qt_internal_add_resource(qtwebenginequickdelegatesplugin "qtwebenginequickdelega
${resource_files}
)
-make_install_only(WebEngineQuickDelegatesQml)
-make_install_only(qtwebenginequickdelegatesplugin)
diff --git a/src/webenginewidgets/CMakeLists.txt b/src/webenginewidgets/CMakeLists.txt
index 425eb1d73..6dedf2187 100644
--- a/src/webenginewidgets/CMakeLists.txt
+++ b/src/webenginewidgets/CMakeLists.txt
@@ -1,10 +1,5 @@
-find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS Gui Widgets Quick QuickWidgets)
-find_package(Qt6 ${PROJECT_VERSION} CONFIG QUIET OPTIONAL_COMPONENTS PrintSupport WebChannel Positioning)
-
-get_configure_mode(configureMode)
qt_internal_add_module(WebEngineWidgets
- ${configureMode}
SOURCES
api/qtwebenginewidgetsglobal.h
api/qwebenginenotificationpresenter.cpp api/qwebenginenotificationpresenter_p.h
@@ -28,7 +23,6 @@ qt_internal_add_module(WebEngineWidgets
Qt::Widgets
Qt::WebEngineCore
)
-make_install_only(WebEngineWidgets)
qt_internal_extend_target(WebEngineWidgets CONDITION QT_FEATURE_webengine_printing_and_pdf
PUBLIC_LIBRARIES
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index ace11de4a..a8f031a5d 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -1,28 +1 @@
-if(NOT QT_BUILD_STANDALONE_TESTS)
- cmake_minimum_required(VERSION 3.19)
-
- include(${CMAKE_CURRENT_LIST_DIR}/../.cmake.conf)
-
- project(QtWebEngineTests
- VERSION "${QT_REPO_MODULE_VERSION}"
- DESCRIPTION "Qt WebEngine Tests"
- HOMEPAGE_URL "https://qt.io/"
- LANGUAGES CXX C
- )
-
- # Make sure we use the fixed BASE argument of qt_add_resource.
- set(QT_USE_FIXED_QT_ADD_RESOURCE_BASE TRUE)
-endif()
-
-find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS BuildInternals Core)
-find_package(Qt6 ${PROJECT_VERSION} CONFIG OPTIONAL_COMPONENTS Gui Widgets
- WebEngineCore WebEngineWidgets WebEngineQuick Pdf QuickWidgets Test QuickTest WebSockets
-)
-
-if(NOT QT_BUILD_STANDALONE_TESTS)
- qt_build_repo_begin()
- qt_build_tests()
- qt_build_repo_end()
-else()
- qt_build_tests()
-endif()
+qt_build_tests()