-
Notifications
You must be signed in to change notification settings - Fork 6.1k
/
qt_install_submodule.cmake
357 lines (316 loc) · 16.3 KB
/
qt_install_submodule.cmake
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
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
include_guard(GLOBAL)
include("${CURRENT_HOST_INSTALLED_DIR}/share/vcpkg-cmake/vcpkg-port-config.cmake")
include("${CURRENT_HOST_INSTALLED_DIR}/share/vcpkg-cmake-config/vcpkg-port-config.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/qt_install_copyright.cmake")
if(NOT DEFINED QT6_DIRECTORY_PREFIX)
set(QT6_DIRECTORY_PREFIX "Qt6/")
endif()
if(VCPKG_TARGET_IS_ANDROID AND NOT ANDROID_SDK_ROOT)
message(FATAL_ERROR "${PORT} requires ANDROID_SDK_ROOT to be set. Consider adding it to the triplet." )
endif()
function(qt_download_submodule_impl)
cmake_parse_arguments(PARSE_ARGV 0 "_qarg" "" "SUBMODULE" "PATCHES")
if("${_qarg_SUBMODULE}" IN_LIST QT_FROM_QT_GIT)
# qtinterfaceframework is not available in the release, so we fall back to a `git clone`.
vcpkg_from_git(
OUT_SOURCE_PATH SOURCE_PATH
URL "https://code.qt.io/qt/${_qarg_SUBMODULE}.git"
REF "${${_qarg_SUBMODULE}_REF}"
PATCHES ${_qarg_PATCHES}
)
if(PORT STREQUAL "qttools") # Keep this for beta & rc's
vcpkg_from_git(
OUT_SOURCE_PATH SOURCE_PATH_QLITEHTML
URL git://code.qt.io/playground/qlitehtml.git # git://code.qt.io/playground/qlitehtml.git
REF "${${PORT}_qlitehtml_REF}"
FETCH_REF master
HEAD_REF master
)
# port 'litehtml' is not in vcpkg!
vcpkg_from_github(
OUT_SOURCE_PATH SOURCE_PATH_LITEHTML
REPO litehtml/litehtml
REF "${${PORT}_litehtml_REF}"
SHA512 "${${PORT}_litehtml_HASH}"
HEAD_REF master
)
file(COPY "${SOURCE_PATH_QLITEHTML}/" DESTINATION "${SOURCE_PATH}/src/assistant/qlitehtml")
file(COPY "${SOURCE_PATH_LITEHTML}/" DESTINATION "${SOURCE_PATH}/src/assistant/qlitehtml/src/3rdparty/litehtml")
elseif(PORT STREQUAL "qtwebengine")
vcpkg_from_git(
OUT_SOURCE_PATH SOURCE_PATH_WEBENGINE
URL git://code.qt.io/qt/qtwebengine-chromium.git
REF "${${PORT}_chromium_REF}"
)
if(NOT EXISTS "${SOURCE_PATH}/src/3rdparty/chromium")
file(RENAME "${SOURCE_PATH_WEBENGINE}/chromium" "${SOURCE_PATH}/src/3rdparty/chromium")
endif()
if(NOT EXISTS "${SOURCE_PATH}/src/3rdparty/gn")
file(RENAME "${SOURCE_PATH_WEBENGINE}/gn" "${SOURCE_PATH}/src/3rdparty/gn")
endif()
endif()
else()
if(VCPKG_USE_HEAD_VERSION)
set(sha512 SKIP_SHA512)
elseif(NOT DEFINED "${_qarg_SUBMODULE}_HASH")
message(FATAL_ERROR "No information for ${_qarg_SUBMODULE} -- add it to QT_PORTS and run qtbase in QT_UPDATE_VERSION mode first")
else()
set(sha512 SHA512 "${${_qarg_SUBMODULE}_HASH}")
endif()
qt_get_url_filename("${_qarg_SUBMODULE}" urls filename)
vcpkg_download_distfile(archive
URLS ${urls}
FILENAME "${filename}"
${sha512}
)
vcpkg_extract_source_archive(
SOURCE_PATH
ARCHIVE "${archive}"
PATCHES ${_qarg_PATCHES}
)
endif()
set(SOURCE_PATH "${SOURCE_PATH}" PARENT_SCOPE)
endfunction()
function(qt_download_submodule)
cmake_parse_arguments(PARSE_ARGV 0 "_qarg" "" "" "PATCHES")
qt_download_submodule_impl(SUBMODULE "${PORT}" PATCHES ${_qarg_PATCHES})
set(SOURCE_PATH "${SOURCE_PATH}" PARENT_SCOPE)
endfunction()
function(qt_cmake_configure)
cmake_parse_arguments(PARSE_ARGV 0 "_qarg" "DISABLE_NINJA;DISABLE_PARALLEL_CONFIGURE"
""
"TOOL_NAMES;OPTIONS;OPTIONS_DEBUG;OPTIONS_RELEASE;OPTIONS_MAYBE_UNUSED")
vcpkg_find_acquire_program(PERL) # Perl is probably required by all qt ports for syncqt
get_filename_component(PERL_PATH ${PERL} DIRECTORY)
vcpkg_add_to_path(${PERL_PATH})
if(NOT PORT STREQUAL "qtwebengine" OR QT_IS_LATEST) # qtwebengine requires python2; since 6.3 python3
vcpkg_find_acquire_program(PYTHON3) # Python is required by some qt ports
get_filename_component(PYTHON3_PATH ${PYTHON3} DIRECTORY)
vcpkg_add_to_path(${PYTHON3_PATH})
endif()
if(NOT PORT MATCHES "^qtbase")
list(APPEND _qarg_OPTIONS "-DQT_SYNCQT:PATH=${CURRENT_HOST_INSTALLED_DIR}/tools/Qt6/bin/syncqt.pl")
endif()
set(PERL_OPTION "-DHOST_PERL:PATH=${PERL}")
set(ninja_option "")
if(_qarg_DISABLE_NINJA)
set(ninja_option WINDOWS_USE_MSBUILD)
endif()
set(disable_parallel "")
if(_qarg_DISABLE_PARALLEL_CONFIGURE)
set(disable_parallel DISABLE_PARALLEL_CONFIGURE)
endif()
if(VCPKG_CROSSCOMPILING)
list(APPEND _qarg_OPTIONS "-DQT_HOST_PATH=${CURRENT_HOST_INSTALLED_DIR}")
list(APPEND _qarg_OPTIONS "-DQT_HOST_PATH_CMAKE_DIR:PATH=${CURRENT_HOST_INSTALLED_DIR}/share")
endif()
# Disable warning for CMAKE_(REQUIRE|DISABLE)_FIND_PACKAGE_<packagename>
string(REGEX MATCHALL "CMAKE_DISABLE_FIND_PACKAGE_[^:=]+" disabled_find_package "${_qarg_OPTIONS}")
list(APPEND _qarg_OPTIONS_MAYBE_UNUSED ${disabled_find_package})
string(REGEX MATCHALL "CMAKE_REQUIRE_FIND_PACKAGE_[^:=]+(:BOOL)?=OFF" require_find_package "${_qarg_OPTIONS}")
list(TRANSFORM require_find_package REPLACE "(:BOOL)?=OFF" "")
list(APPEND _qarg_OPTIONS_MAYBE_UNUSED ${require_find_package})
# Disable unused warnings for disabled features. Qt might decide to not emit the feature variables if other features are deactivated.
string(REGEX MATCHALL "(QT_)?FEATURE_[^:=]+(:BOOL)?=OFF" disabled_features "${_qarg_OPTIONS}")
list(TRANSFORM disabled_features REPLACE "(:BOOL)?=OFF" "")
list(APPEND _qarg_OPTIONS_MAYBE_UNUSED ${disabled_features})
list(APPEND _qarg_OPTIONS "-DQT_NO_FORCE_SET_CMAKE_BUILD_TYPE:BOOL=ON")
if(VCPKG_TARGET_IS_ANDROID)
list(APPEND _qarg_OPTIONS "-DANDROID_SDK_ROOT=${ANDROID_SDK_ROOT}")
endif()
if(NOT PORT MATCHES "qtbase")
list(APPEND _qarg_OPTIONS "-DQT_MKSPECS_DIR:PATH=${CURRENT_HOST_INSTALLED_DIR}/share/Qt6/mkspecs")
endif()
vcpkg_cmake_configure(
SOURCE_PATH "${SOURCE_PATH}"
${ninja_option}
${disable_parallel}
OPTIONS
-DQT_USE_DEFAULT_CMAKE_OPTIMIZATION_FLAGS:BOOL=ON # We don't want Qt to screw with users toolchain settings.
-DCMAKE_FIND_PACKAGE_TARGETS_GLOBAL=ON # Because Qt doesn't correctly scope find_package calls.
#-DQT_HOST_PATH=<somepath> # For crosscompiling
#-DQT_PLATFORM_DEFINITION_DIR=mkspecs/win32-msvc
#-DQT_QMAKE_TARGET_MKSPEC=win32-msvc
#-DQT_USE_CCACHE
-DQT_BUILD_EXAMPLES:BOOL=OFF
-DQT_BUILD_TESTS:BOOL=OFF
-DQT_BUILD_BENCHMARKS:BOOL=OFF
${PERL_OPTION}
-DINSTALL_BINDIR:STRING=bin
-DINSTALL_LIBEXECDIR:STRING=bin
-DINSTALL_PLUGINSDIR:STRING=${qt_plugindir}
-DINSTALL_QMLDIR:STRING=${qt_qmldir}
${_qarg_OPTIONS}
OPTIONS_RELEASE
${_qarg_OPTIONS_RELEASE}
-DINSTALL_DOCDIR:STRING=doc/${QT6_DIRECTORY_PREFIX}
-DINSTALL_INCLUDEDIR:STRING=include/${QT6_DIRECTORY_PREFIX}
-DINSTALL_DESCRIPTIONSDIR:STRING=share/Qt6/modules
-DINSTALL_MKSPECSDIR:STRING=share/Qt6/mkspecs
-DINSTALL_TRANSLATIONSDIR:STRING=translations/${QT6_DIRECTORY_PREFIX}
OPTIONS_DEBUG
# -DFEATURE_debug:BOOL=ON only needed by qtbase and auto detected?
-DINSTALL_DOCDIR:STRING=../doc/${QT6_DIRECTORY_PREFIX}
-DINSTALL_INCLUDEDIR:STRING=../include/${QT6_DIRECTORY_PREFIX}
-DINSTALL_TRANSLATIONSDIR:STRING=../translations/${QT6_DIRECTORY_PREFIX}
-DINSTALL_DESCRIPTIONSDIR:STRING=../share/Qt6/modules
-DINSTALL_MKSPECSDIR:STRING=../share/Qt6/mkspecs
${_qarg_OPTIONS_DEBUG}
MAYBE_UNUSED_VARIABLES
INSTALL_BINDIR
INSTALL_DOCDIR
INSTALL_LIBEXECDIR
INSTALL_QMLDIR # No qml files
INSTALL_TRANSLATIONSDIR # No translations
INSTALL_PLUGINSDIR # No plugins
INSTALL_DESCRIPTIONSDIR
INSTALL_INCLUDEDIR
HOST_PERL
QT_SYNCQT
QT_NO_FORCE_SET_CMAKE_BUILD_TYPE
${_qarg_OPTIONS_MAYBE_UNUSED}
INPUT_bundled_xcb_xinput
INPUT_freetype
INPUT_harfbuzz
INPUT_libjpeg
INPUT_libmd4c
INPUT_libpng
INPUT_opengl
INPUT_openssl
INPUT_xcb
INPUT_xkbcommon
)
set(Z_VCPKG_CMAKE_GENERATOR "${Z_VCPKG_CMAKE_GENERATOR}" PARENT_SCOPE)
endfunction()
function(qt_fix_prl_files)
file(TO_CMAKE_PATH "${CURRENT_PACKAGES_DIR}/lib" package_dir)
file(TO_CMAKE_PATH "${package_dir}/lib" lib_path)
file(TO_CMAKE_PATH "${package_dir}/include/Qt6" include_path)
file(TO_CMAKE_PATH "${CURRENT_INSTALLED_DIR}" install_prefix)
file(GLOB_RECURSE prl_files "${CURRENT_PACKAGES_DIR}/*.prl")
foreach(prl_file IN LISTS prl_files)
file(READ "${prl_file}" _contents)
string(REPLACE "${lib_path}" "\$\$[QT_INSTALL_LIBS]" _contents "${_contents}")
string(REPLACE "${include_path}" "\$\$[QT_INSTALL_HEADERS]" _contents "${_contents}")
string(REPLACE "${install_prefix}" "\$\$[QT_INSTALL_PREFIX]" _contents "${_contents}")
string(REPLACE "[QT_INSTALL_PREFIX]/lib/objects-Debug" "[QT_INSTALL_LIBS]/objects-Debug" _contents "${_contents}")
string(REPLACE "[QT_INSTALL_PREFIX]/Qt6/qml" "[QT_INSTALL_QML]" _contents "${_contents}")
#Note: This only works without an extra if case since QT_INSTALL_PREFIX is the same for debug and release
file(WRITE "${prl_file}" "${_contents}")
endforeach()
endfunction()
function(qt_fixup_and_cleanup)
cmake_parse_arguments(PARSE_ARGV 0 "_qarg" ""
""
"TOOL_NAMES")
vcpkg_copy_pdbs()
## Handle PRL files
qt_fix_prl_files()
## Handle CMake files.
set(COMPONENTS)
file(GLOB COMPONENTS_OR_FILES LIST_DIRECTORIES true "${CURRENT_PACKAGES_DIR}/share/Qt6*")
list(REMOVE_ITEM COMPONENTS_OR_FILES "${CURRENT_PACKAGES_DIR}/share/Qt6")
foreach(_glob IN LISTS COMPONENTS_OR_FILES)
if(IS_DIRECTORY "${_glob}")
string(REPLACE "${CURRENT_PACKAGES_DIR}/share/Qt6" "" _component "${_glob}")
debug_message("Adding cmake component: '${_component}'")
list(APPEND COMPONENTS ${_component})
endif()
endforeach()
foreach(_comp IN LISTS COMPONENTS)
if(EXISTS "${CURRENT_PACKAGES_DIR}/share/Qt6${_comp}")
vcpkg_cmake_config_fixup(PACKAGE_NAME "Qt6${_comp}" CONFIG_PATH "share/Qt6${_comp}" TOOLS_PATH "tools/Qt6/bin")
# Would rather put it into share/cmake as before but the import_prefix correction in vcpkg_cmake_config_fixup is working against that.
else()
message(STATUS "WARNING: Qt component ${_comp} not found/built!")
endif()
endforeach()
#fix debug plugin paths (should probably be fixed in vcpkg_cmake_config_fixup)
file(GLOB_RECURSE DEBUG_CMAKE_TARGETS "${CURRENT_PACKAGES_DIR}/share/**/*Targets-debug.cmake")
debug_message("DEBUG_CMAKE_TARGETS:${DEBUG_CMAKE_TARGETS}")
foreach(_debug_target IN LISTS DEBUG_CMAKE_TARGETS)
vcpkg_replace_string("${_debug_target}" "{_IMPORT_PREFIX}/${qt_plugindir}" "{_IMPORT_PREFIX}/debug/${qt_plugindir}")
vcpkg_replace_string("${_debug_target}" "{_IMPORT_PREFIX}/${qt_qmldir}" "{_IMPORT_PREFIX}/debug/${qt_qmldir}")
endforeach()
file(GLOB_RECURSE STATIC_CMAKE_TARGETS "${CURRENT_PACKAGES_DIR}/share/Qt6Qml/QmlPlugins/*.cmake")
foreach(_plugin_target IN LISTS STATIC_CMAKE_TARGETS)
# restore a single get_filename_component which was remove by vcpkg_cmake_config_fixup
vcpkg_replace_string("${_plugin_target}"
[[get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)]]
"get_filename_component(_IMPORT_PREFIX \"\${CMAKE_CURRENT_LIST_FILE}\" PATH)\nget_filename_component(_IMPORT_PREFIX \"\${_IMPORT_PREFIX}\" PATH)")
endforeach()
set(qt_tooldest "${CURRENT_PACKAGES_DIR}/tools/Qt6/bin")
set(qt_searchdir "${CURRENT_PACKAGES_DIR}/bin")
## Handle Tools
foreach(_tool IN LISTS _qarg_TOOL_NAMES)
if(NOT EXISTS "${CURRENT_PACKAGES_DIR}/bin/${_tool}${VCPKG_TARGET_EXECUTABLE_SUFFIX}")
debug_message("Removed '${_tool}' from copy tools list since it was not found!")
list(REMOVE_ITEM _qarg_TOOL_NAMES ${_tool})
endif()
endforeach()
if(_qarg_TOOL_NAMES)
set(tool_names ${_qarg_TOOL_NAMES})
vcpkg_copy_tools(TOOL_NAMES ${tool_names} SEARCH_DIR "${qt_searchdir}" DESTINATION "${qt_tooldest}" AUTO_CLEAN)
if(EXISTS "${CURRENT_PACKAGES_DIR}/${qt_plugindir}" AND NOT PORT STREQUAL "qtdeclarative") #qmllint conflict
file(COPY "${CURRENT_PACKAGES_DIR}/${qt_plugindir}/" DESTINATION "${qt_tooldest}")
endif()
endif()
if(VCPKG_TARGET_IS_WINDOWS AND VCPKG_LIBRARY_LINKAGE STREQUAL "dynamic")
if(EXISTS "${CURRENT_PACKAGES_DIR}/bin/")
file(COPY "${CURRENT_PACKAGES_DIR}/bin/" DESTINATION "${CURRENT_PACKAGES_DIR}/tools/Qt6/bin")
endif()
file(GLOB_RECURSE _installed_dll_files RELATIVE "${CURRENT_INSTALLED_DIR}/tools/Qt6/bin" "${CURRENT_INSTALLED_DIR}/tools/Qt6/bin/*.dll")
foreach(_dll_to_remove IN LISTS _installed_dll_files)
file(GLOB_RECURSE _packaged_dll_file "${CURRENT_PACKAGES_DIR}/tools/Qt6/bin/${_dll_to_remove}")
if(EXISTS "${_packaged_dll_file}")
file(REMOVE "${_packaged_dll_file}")
endif()
endforeach()
file(GLOB_RECURSE _folders LIST_DIRECTORIES true "${CURRENT_PACKAGES_DIR}/tools/Qt6/bin/**/")
file(GLOB_RECURSE _files "${CURRENT_PACKAGES_DIR}/tools/Qt6/bin/**/")
if(_files)
list(REMOVE_ITEM _folders ${_files})
endif()
foreach(_dir IN LISTS _folders)
if(NOT "${_remaining_dll_files}" MATCHES "${_dir}")
file(REMOVE_RECURSE "${_dir}")
endif()
endforeach()
endif()
file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/lib/cmake/"
"${CURRENT_PACKAGES_DIR}/debug/share"
"${CURRENT_PACKAGES_DIR}/lib/cmake/"
"${CURRENT_PACKAGES_DIR}/debug/include"
)
if(VCPKG_LIBRARY_LINKAGE STREQUAL "static")
file(GLOB_RECURSE _bin_files "${CURRENT_PACKAGES_DIR}/bin/*")
if(NOT _bin_files STREQUAL "")
message(STATUS "Remaining files in bin: '${_bin_files}'")
else() # Only clean if empty otherwise let vcpkg throw and error.
file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/bin/" "${CURRENT_PACKAGES_DIR}/debug/bin/")
endif()
endif()
vcpkg_fixup_pkgconfig()
endfunction()
function(qt_install_submodule)
cmake_parse_arguments(PARSE_ARGV 0 "_qis" "DISABLE_NINJA"
""
"PATCHES;TOOL_NAMES;CONFIGURE_OPTIONS;CONFIGURE_OPTIONS_DEBUG;CONFIGURE_OPTIONS_RELEASE;CONFIGURE_OPTIONS_MAYBE_UNUSED")
set(qt_plugindir ${QT6_DIRECTORY_PREFIX}plugins)
set(qt_qmldir ${QT6_DIRECTORY_PREFIX}qml)
qt_download_submodule(PATCHES ${_qis_PATCHES})
if(_qis_DISABLE_NINJA)
set(_opt DISABLE_NINJA)
endif()
qt_cmake_configure(${_opt}
OPTIONS ${_qis_CONFIGURE_OPTIONS}
OPTIONS_DEBUG ${_qis_CONFIGURE_OPTIONS_DEBUG}
OPTIONS_RELEASE ${_qis_CONFIGURE_OPTIONS_RELEASE}
OPTIONS_MAYBE_UNUSED ${_qis_CONFIGURE_OPTIONS_MAYBE_UNUSED}
)
vcpkg_cmake_install(ADD_BIN_TO_PATH)
qt_fixup_and_cleanup(TOOL_NAMES ${_qis_TOOL_NAMES})
qt_install_copyright("${SOURCE_PATH}")
set(SOURCE_PATH "${SOURCE_PATH}" PARENT_SCOPE)
endfunction()
include("${CMAKE_CURRENT_LIST_DIR}/qt_port_details.cmake")