summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Klocek <michal.klocek@qt.io>2021-02-01 10:48:07 +0100
committerMichal Klocek <michal.klocek@qt.io>2021-05-12 09:40:09 +0200
commitb8fb47478db06cac231a8a7222e7afbce7b3cf90 (patch)
treea9070f10735afcabddd477406f60420680f9828e
parenta282c7a36f8707e0777df201855ef0a8a1980de1 (diff)
Setup cmake project
Add the top level cmake project and ninja and gn cmake builds. Make ninja and gn build optional. With qmake we had four stages during the build: * configure (initial dependencies check) * qmake (build ninja, build gn, run gn) * make (compilation) * make install With cmake we have some limitations: a) we need to pass the build config to gn, however cmake evaluates generator expressions during the generation phase this means we need a recursive call to cmake b) qt-cmake qtbase logic (+syncqt) assumes "fixed" build locations to handle deployment of headers and libs (it uses CMAKE_BINARY_DIR for QT_BUILD_DIR) c) cmake can not run twice in the same build directory d) running recursive/child cmake, makes all generated targets not accessible during configure time of parent's cmake e) cmake can only "build" things for subdirectories To deal with mentioned limitations and to keep things simple we will split those steps into separate projects: * SUPERBUILD - this project does dependency checks, only evaluates features to show the build summary and passes them to EXAMPLES,LIBS,TESTS projects, it also runs the generator expression to feed LIBS project's cmake, it does not try to run syncqt as result of (b) and (c) * NINJA (build ninja) * GN (build gn) * LIBS - projects runs simplified feature evaluation (CONDITIONS resolved by SUPERBUILD cmake) to generate build headers (+syncqt), it also runs gn during configure and does all libs compilation. The project's source root must be "src" directory as a result of (a),(b),(c) * EXAMPLES - builds examples as a result of (d),(e) * TESTS - builds tests as a result of (d),(e) Each of projects will have three stages: configure, compile, install. Task-number: QTBUG-91760 Done-With: Jüri Valdmann <juri.valdmann@qt.io> Change-Id: I3b44decefa17f177e5e07c563796aa158a0b0ecb Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io> Reviewed-by: Peter Varga <pvarga@inf.u-szeged.hu>
-rw-r--r--.cmake.conf1
-rw-r--r--CMakeLists.txt71
-rw-r--r--cmake/FindGn.cmake23
-rw-r--r--cmake/FindNinja.cmake31
-rw-r--r--src/core/CMakeLists.txt57
-rw-r--r--src/gn/CMakeLists.txt36
-rw-r--r--src/ninja/CMakeLists.txt37
7 files changed, 256 insertions, 0 deletions
diff --git a/.cmake.conf b/.cmake.conf
new file mode 100644
index 000000000..930548045
--- /dev/null
+++ b/.cmake.conf
@@ -0,0 +1 @@
+set(QT_REPO_MODULE_VERSION "6.0.0")
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 000000000..42c4faa7d
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,71 @@
+cmake_minimum_required(VERSION 3.18.0)
+
+include(.cmake.conf)
+include(ExternalProject)
+
+project(QtWebEngineSuperBuild
+ VERSION "${QT_REPO_MODULE_VERSION}"
+ DESCRIPTION "Qt WebEngine Libraries"
+ HOMEPAGE_URL "https://qt.io/"
+ LANGUAGES CXX C
+)
+
+find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS BuildInternals Core)
+
+set(installDir ${CMAKE_CURRENT_BINARY_DIR}/install)
+
+### 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_INSTALL_PREFIX:PATH=<INSTALL_DIR>
+ -DCMAKE_PREFIX_PATH:PATH=<INSTALL_DIR>
+ -DWEBENGINE_ROOT_BUILD_DIR=${CMAKE_CURRENT_BINARY_DIR}
+)
+endif()
+
+# 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)
+
+externalproject_add(libs
+ SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/src/core
+ BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/src/core
+ INSTALL_DIR ${installDir}
+ PREFIX libs
+ USES_TERMINAL_CONFIGURE ON
+ USES_TERMINAL_BUILD ON
+ CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
+ -DWEBENGINE_ROOT_BUILD_PATH=${CMAKE_CURRENT_BINARY_DIR}
+ -DWEBENGINE_ROOT_SOURCE_DIR=${WEBENGINE_ROOT_SOURCE_DIR}
+)
+
+if(NOT Gn_FOUND)
+ externalproject_add_stepdependencies(libs install gn)
+endif()
+
+if(NOT Ninja_FOUND)
+ externalproject_add_stepdependencies(gn install ninja)
+endif()
+
diff --git a/cmake/FindGn.cmake b/cmake/FindGn.cmake
new file mode 100644
index 000000000..dfbe5b363
--- /dev/null
+++ b/cmake/FindGn.cmake
@@ -0,0 +1,23 @@
+if (NOT DEFINED WEBENGINE_ROOT_BUILD_DIR)
+ set(WEBENGINE_ROOT_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/../..)
+endif()
+
+set(CMAKE_PROGRAM_PATH ${WEBENGINE_ROOT_BUILD_DIR}/install/bin)
+find_program(Gn_EXECUTABLE NAMES gn)
+
+include(FindPackageHandleStandardArgs)
+
+find_package_handle_standard_args(
+ Gn
+ REQUIRED_VARS Gn_EXECUTABLE)
+
+if(Gn_FOUND AND NOT TARGET Gn::gn)
+ add_executable(Gn::gn IMPORTED)
+ set_property(TARGET Gn::gn PROPERTY IMPORTED_LOCATION ${Gn_EXECUTABLE})
+endif()
+
+include(FeatureSummary)
+set_package_properties(Gn PROPERTIES
+ URL "https://gn.googlesource.com/gn/"
+ DESCRIPTION "Meta-build system"
+)
diff --git a/cmake/FindNinja.cmake b/cmake/FindNinja.cmake
new file mode 100644
index 000000000..3615d58b9
--- /dev/null
+++ b/cmake/FindNinja.cmake
@@ -0,0 +1,31 @@
+if (NOT DEFINED WEBENGINE_ROOT_BUILD_DIR)
+ set(WEBENGINE_ROOT_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/..)
+endif()
+
+set(CMAKE_PROGRAM_PATH ${WEBENGINE_ROOT_BUILD_DIR}/install/bin)
+find_program(Ninja_EXECUTABLE NAMES ninja ninja-build)
+
+if(Ninja_EXECUTABLE)
+ execute_process(
+ COMMAND ${Ninja_EXECUTABLE} --version
+ OUTPUT_VARIABLE Ninja_VERSION
+ ERROR_QUIET
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+endif()
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(
+ Ninja
+ REQUIRED_VARS Ninja_EXECUTABLE
+ VERSION_VAR Ninja_VERSION)
+
+if(Ninja_FOUND AND NOT TARGET Ninja::ninja)
+ add_executable(Ninja::ninja IMPORTED)
+ set_property(TARGET Ninja::ninja PROPERTY IMPORTED_LOCATION ${Ninja_EXECUTABLE})
+endif()
+
+include(FeatureSummary)
+set_package_properties(Ninja PROPERTIES
+ URL "https://ninja-build.org/"
+ DESCRIPTION "Build tool"
+)
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
new file mode 100644
index 000000000..e22d0230e
--- /dev/null
+++ b/src/core/CMakeLists.txt
@@ -0,0 +1,57 @@
+cmake_minimum_required(VERSION 3.18.0)
+
+project(QtWebEngineCore
+ VERSION "6.0.0"
+ DESCRIPTION "QtWebEngineCore"
+ HOMEPAGE_URL "https://doc.qt.io/qt-5/qtwebenginecore-module.html"
+ LANGUAGES CXX C)
+
+if (NOT DEFINED CMAKE_WEBENGINE_ROOT_BUILD_PATH)
+ get_filename_component(CMAKE_WEBENGINE_ROOT_BUILD_PATH ${CMAKE_CURRENT_BINARY_DIR}/../.. ABSOLUTE)
+endif()
+
+set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/../../cmake")
+set(buildDir "${CMAKE_CURRENT_BINARY_DIR}/debug")
+
+find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS BuildInternals Core)
+find_package(Qt6 ${PROJECT_VERSION} CONFIG OPTIONAL_COMPONENTS Gui Widgets Network OpenGL OpenGLWidgets Quick Qml QuickTest Test)
+find_package(Gn REQUIRED)
+find_package(Ninja REQUIRED)
+find_package(Python2 REQUIRED)
+
+qt_build_repo_begin()
+
+get_target_property(gnCmd Gn::gn IMPORTED_LOCATION)
+
+set(gnArg help)
+
+message("configure with gn")
+execute_process(
+ COMMAND ${gnCmd} ${gnArg}
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+ COMMAND_ECHO STDOUT
+ RESULT_VARIABLE gnResult
+ OUTPUT_VARIABLE gnOutput
+ ERROR_VARIABLE gnError
+ )
+
+if(NOT gnResult EQUAL 0)
+ message(FATAL_ERROR "Calling gn - FAILED ! \n${gnOutput}\n${gnError}")
+endif()
+
+add_custom_command(
+ OUTPUT QtWebEngineCore.stamp
+ WORKING_DIRECTORY ${buildDir}
+ COMMAND Ninja::ninja
+ $ENV{NINJAFLAGS}
+ -C ${buildDir}
+ ${CMAKE_PROJECT_NAME}
+ USES_TERMINAL
+ VERBATIM
+)
+add_custom_target(ninja ALL DEPENDS QtWebEngineCore.stamp)
+
+message("CMD: ${gn_cmd}\nARGS: ${gnArg}\nOUTPUT: ${gnOutput}")
+
+qt_build_repo_end()
+
diff --git a/src/gn/CMakeLists.txt b/src/gn/CMakeLists.txt
new file mode 100644
index 000000000..9e98e152b
--- /dev/null
+++ b/src/gn/CMakeLists.txt
@@ -0,0 +1,36 @@
+
+cmake_minimum_required(VERSION 3.18.0)
+
+project(Gn
+ DESCRIPTION "Meta-build system"
+ HOMEPAGE_URL "https://gn.googlesource.com/gn/"
+ LANGUAGES CXX C
+)
+
+set(GN_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/gn)
+set(GN_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/gn)
+set(GN_EXECUTABLE ${GN_BINARY_DIR}/gn)
+set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../../cmake")
+
+find_package(Python2 REQUIRED)
+find_package(Ninja 1.7.2 REQUIRED)
+
+file(MAKE_DIRECTORY ${GN_BINARY_DIR})
+add_custom_command(
+ OUTPUT ${GN_EXECUTABLE}
+ WORKING_DIRECTORY ${GN_BINARY_DIR}
+ COMMAND ${Python2_EXECUTABLE} ${GN_SOURCE_DIR}/build/gen.py
+ --no-last-commit-position
+ --out-path .
+ --cc ${CMAKE_C_COMPILER}
+ --cxx ${CMAKE_CXX_COMPILER}
+ --ld ${CMAKE_CXX_COMPILER}
+ COMMAND Ninja::ninja gn
+ VERBATIM
+ USES_TERMINAL
+ COMMAND_EXPAND_LISTS
+)
+add_custom_target(gn ALL DEPENDS ${GN_EXECUTABLE})
+install(FILES ${GN_EXECUTABLE}
+ PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE
+ DESTINATION bin)
diff --git a/src/ninja/CMakeLists.txt b/src/ninja/CMakeLists.txt
new file mode 100644
index 000000000..1ac89df5a
--- /dev/null
+++ b/src/ninja/CMakeLists.txt
@@ -0,0 +1,37 @@
+
+cmake_minimum_required(VERSION 3.18.0)
+
+project(Ninja
+ DESCRIPTION "Ninja Build Tool"
+ HOMEPAGE_URL "https://ninja-build.org/"
+ LANGUAGES CXX C
+)
+
+set(NINJA_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/ninja)
+set(NINJA_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
+
+find_package(Python2 REQUIRED)
+
+if(WIN32)
+ set(NINJA_EXECUTABLE ninja.exe)
+else()
+ set(NINJA_EXECUTABLE ninja)
+endif()
+
+file(MAKE_DIRECTORY ${NINJA_BINARY_DIR})
+
+add_custom_command(
+ OUTPUT ${NINJA_EXECUTABLE}
+ WORKING_DIRECTORY ${NINJA_BINARY_DIR}
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${NINJA_BINARY_DIR}/$<CONFIG>
+ COMMAND ${CMAKE_COMMAND} -E chdir ${NINJA_BINARY_DIR}/$<CONFIG>
+ ${Python2_EXECUTABLE} ${NINJA_SOURCE_DIR}/configure.py --bootstrap
+ USES_TERMINAL
+ VERBATIM
+)
+add_custom_target(Ninja ALL DEPENDS ${NINJA_EXECUTABLE})
+install(FILES ${NINJA_BINARY_DIR}/$<CONFIG>/${NINJA_EXECUTABLE}
+ PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE
+ DESTINATION bin
+)
+