diff options
-rw-r--r-- | CMakeLists.txt | 274 | ||||
-rw-r--r-- | cmake/FindGn.cmake | 10 | ||||
-rw-r--r-- | cmake/Functions.cmake | 319 | ||||
-rw-r--r-- | cmake/Gn.cmake | 69 | ||||
-rw-r--r-- | configure.cmake | 6 | ||||
-rw-r--r-- | examples/CMakeLists.txt | 20 | ||||
-rw-r--r-- | src/CMakeLists.txt | 163 | ||||
-rw-r--r-- | src/core/CMakeLists.txt | 171 | ||||
-rw-r--r-- | src/core/api/CMakeLists.txt | 80 | ||||
-rw-r--r-- | src/core/tools/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/pdf/CMakeLists.txt | 260 | ||||
-rw-r--r-- | src/pdf/plugins/imageformats/pdf/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/pdfquick/CMakeLists.txt | 5 | ||||
-rw-r--r-- | src/pdfwidgets/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/process/CMakeLists.txt | 3 | ||||
-rw-r--r-- | src/webenginequick/CMakeLists.txt | 9 | ||||
-rw-r--r-- | src/webenginequick/ui/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/webenginewidgets/CMakeLists.txt | 6 | ||||
-rw-r--r-- | tests/CMakeLists.txt | 29 |
19 files changed, 672 insertions, 757 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 3b5d5df2a..1fe8f394d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,279 +4,17 @@ 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 ) -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 76df23610..d9711a034 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 317de3050..e9f8fd01e 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 @@ -268,13 +262,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 ## @@ -450,17 +437,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}) @@ -470,7 +462,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 @@ -484,6 +477,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 @@ -491,101 +485,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 ## @@ -594,8 +499,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() |