summaryrefslogtreecommitdiffstats
path: root/CMakeLists.txt
blob: e853536f883a2517ef8df79250f1ae731c7a8408 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
cmake_minimum_required(VERSION 3.19)

include(.cmake.conf)
include(ExternalProject)
include(cmake/Functions.cmake)

project(QtWebEngineRepoSuperBuild
    VERSION "${QT_REPO_MODULE_VERSION}"
    DESCRIPTION "Qt WebEngine Libraries"
    HOMEPAGE_URL "https://qt.io/"
    LANGUAGES CXX C
)

# Make sure we only use latest private CMake API, aka no compatibility wrappers.
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)
qt_feature_module_end(ONLY_EVALUATE_FEATURES)

if(NOT ${webEngineSupport})
    add_custom_target(WebEngineErrorMessage ALL
        ${CMAKE_COMMAND} -E cmake_echo_color --red "QtWebEngine will not be built: ${webEngineError}"
        COMMENT "Check QtWebEngine support")
    message("-- Support check for QtWebEngine failed: ${webEngineError}")
    set(QT_FEATURE_qtwebengine_build OFF CACHE BOOL "Build QtWebEngine" FORCE)
endif()

if(NOT ${pdfSupport})
    add_custom_target(PdfErrorMessage ALL
        ${CMAKE_COMMAND} -E cmake_echo_color --red "QtPdf will not be built: ${pdfError}"
        COMMENT "Check QtPdf support")
    message("-- Support check for QtPdf failed: ${pdfError}")
    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()

add_subdirectory(src/core/api)
add_subdirectory(src/core/tools)
add_subdirectory(src/process)
add_subdirectory(src/webenginewidgets)
add_subdirectory(src/webenginequick)
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)

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
add_implicit_dependencies(qtwebengine Core Gui Widgets Network OpenGL
    OpenGLWidgets Quick QuickWidgets Qml PrintSupport WebChannel Positioning
)

# 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)
     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)
    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(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}
    )
    externalproject_add_stepdependencies(qtwebengine install hostBuild)
endif()