summaryrefslogtreecommitdiff
path: root/cmake
diff options
context:
space:
mode:
authorMichal Klocek <michal.klocek@qt.io>2021-12-14 09:54:33 +0100
committerMichal Klocek <michal.klocek@qt.io>2022-02-19 01:52:32 +0100
commitbe2745e4788cecb0d3122081e3328e4b66923609 (patch)
treebf15fa44c91f82dd9fb1ade44620de3d175deab5 /cmake
parent6944b4df7bac464eaee8e03ea724db25303fdbc1 (diff)
downloadqtbase-be2745e4788cecb0d3122081e3328e4b66923609.tar.gz
Install 3rdparty headers for static builds
For static builds we need 3rdparty headers to be installed. Leaf modules like qtwebengine needs 3rdparty libs and header for zlib, freetype, harfbuzz, png, jpeg. Without those the Chromium bundled versions are used, however it might end up badly if qt has already bundled one. Introduce new header only modules with additional arguments for qt_internal_add_module: * EXTERNAL_HEADERS to pick exactly which headers are public * EXTERNAL_HEADERS_DIR to include whole directory preserving the files directory structure Fix qtsync so it keep directory structure for all non-qt modules when syncing headers and do not generate warnings for headers files. Task-number: QTBUG-87154 Task-number: QTBUG-88614 Change-Id: If1c27bf8608791cd4e0a21839d6316a445a96e9f Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io> Reviewed-by: Alexey Edelev <alexey.edelev@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Diffstat (limited to 'cmake')
-rw-r--r--cmake/FindWrapJpeg.cmake11
-rw-r--r--cmake/FindWrapSystemJpeg.cmake32
-rw-r--r--cmake/Qt3rdPartyLibraryHelpers.cmake24
-rw-r--r--cmake/QtModuleHelpers.cmake27
4 files changed, 93 insertions, 1 deletions
diff --git a/cmake/FindWrapJpeg.cmake b/cmake/FindWrapJpeg.cmake
new file mode 100644
index 0000000000..194296e3a6
--- /dev/null
+++ b/cmake/FindWrapJpeg.cmake
@@ -0,0 +1,11 @@
+include(QtFindWrapHelper NO_POLICY_SCOPE)
+
+qt_find_package_system_or_bundled(wrap_jpeg
+ FRIENDLY_PACKAGE_NAME "Jpeg"
+ WRAP_PACKAGE_TARGET "WrapJpeg::WrapJpeg"
+ WRAP_PACKAGE_FOUND_VAR_NAME "WrapJpeg_FOUND"
+ BUNDLED_PACKAGE_NAME "BundledLibjpeg"
+ BUNDLED_PACKAGE_TARGET "BundledLibjpeg"
+ SYSTEM_PACKAGE_NAME "WrapSystemJpeg"
+ SYSTEM_PACKAGE_TARGET "WrapSystemJpeg::WrapSystemJpeg"
+)
diff --git a/cmake/FindWrapSystemJpeg.cmake b/cmake/FindWrapSystemJpeg.cmake
new file mode 100644
index 0000000000..2853654ea1
--- /dev/null
+++ b/cmake/FindWrapSystemJpeg.cmake
@@ -0,0 +1,32 @@
+if(TARGET WrapSystemJpeg::WrapSystemJpeg)
+ set(WrapSystemJpeg_FOUND TRUE)
+ return()
+endif()
+set(WrapSystemJpeg_REQUIRED_VARS __jpeg_found)
+
+find_package(JPEG ${${CMAKE_FIND_PACKAGE_NAME}_FIND_VERSION} QUIET)
+
+set(__jpeg_target_name "JPEG::JPEG")
+if(JPEG_FOUND AND TARGET "${__jpeg_target_name}")
+ set(__jpeg_found TRUE)
+endif()
+
+if(JPEG_LIBRARIES)
+ list(PREPEND WrapSystemJpeg_REQUIRED_VARS JPEG_LIBRARIES)
+endif()
+if(JPEG_VERSION)
+ set(WrapSystemJpeg_VERSION "${JPEG_VERSION}")
+endif()
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(WrapSystemJpeg
+ REQUIRED_VARS ${WrapSystemJpeg_REQUIRED_VARS}
+ VERSION_VAR WrapSystemJpeg_VERSION)
+
+if(WrapSystemJpeg_FOUND)
+ add_library(WrapSystemJpeg::WrapSystemJpeg INTERFACE IMPORTED)
+ target_link_libraries(WrapSystemJpeg::WrapSystemJpeg
+ INTERFACE "${__jpeg_target_name}")
+endif()
+unset(__jpeg_target_name)
+unset(__jpeg_found)
diff --git a/cmake/Qt3rdPartyLibraryHelpers.cmake b/cmake/Qt3rdPartyLibraryHelpers.cmake
index 1cc5ebea44..904f81fb76 100644
--- a/cmake/Qt3rdPartyLibraryHelpers.cmake
+++ b/cmake/Qt3rdPartyLibraryHelpers.cmake
@@ -312,3 +312,27 @@ function(qt_install_3rdparty_library_wrap_config_extra_file target)
COMPONENT Devel
)
endfunction()
+
+# This function implements qmake's qt_helper_lib MODULE_EXT_HEADERS and MODULE_EXT_HEADERS_DIR features.
+# It creates a header-only module exposing a subset or all headers of a 3rd-party library.
+function(qt_internal_add_3rdparty_header_module target)
+ set(single_args
+ EXTERNAL_HEADERS_DIR
+ )
+ set(multi_args
+ EXTERNAL_HEADERS
+ )
+ qt_parse_all_arguments(arg "qt_internal_add_header_module"
+ "${option_args}"
+ "${single_args}"
+ "${multi_args}"
+ ${ARGN}
+ )
+ qt_internal_add_module(${target}
+ INTERNAL_MODULE
+ HEADER_MODULE
+ NO_CONFIG_HEADER_FILE
+ EXTERNAL_HEADERS ${arg_EXTERNAL_HEADERS}
+ EXTERNAL_HEADERS_DIR ${arg_EXTERNAL_HEADERS_DIR}
+ )
+endfunction()
diff --git a/cmake/QtModuleHelpers.cmake b/cmake/QtModuleHelpers.cmake
index 98edb19f8c..98d8b80d36 100644
--- a/cmake/QtModuleHelpers.cmake
+++ b/cmake/QtModuleHelpers.cmake
@@ -23,6 +23,7 @@ macro(qt_internal_get_internal_add_module_keywords option_args single_args multi
PRECOMPILED_HEADER
CONFIGURE_FILE_PATH
CPP_EXPORT_HEADER_BASE_NAME
+ EXTERNAL_HEADERS_DIR
${__default_target_info_args}
)
set(${multi_args}
@@ -30,6 +31,7 @@ macro(qt_internal_get_internal_add_module_keywords option_args single_args multi
EXTRA_CMAKE_FILES
EXTRA_CMAKE_INCLUDES
NO_PCH_SOURCES
+ EXTERNAL_HEADERS
${__default_private_args}
${__default_public_args}
${__default_private_module_args}
@@ -69,6 +71,16 @@ endmacro()
# Creates a static library instead of following the Qt configuration default. Mutually
# exclusive with HEADER_MODULE.
#
+# EXTERNAL_HEADERS
+# A explicit list of non qt headers (like 3rdparty) to be installed.
+# Note this option overrides install headers used as PUBLIC_HEADER by cmake install(TARGET)
+# otherwise set by syncqt.
+#
+# EXTERNAL_HEADERS_DIR
+# A module directory with non qt headers (like 3rdparty) to be installed.
+# Note this option overrides install headers used as PUBLIC_HEADER by cmake install(TARGET)
+# otherwise set by syncqt.
+
function(qt_internal_add_module target)
qt_internal_get_internal_add_module_keywords(
module_option_args
@@ -317,6 +329,10 @@ function(qt_internal_add_module target)
### FIXME: Can we replace headers.pri?
qt_read_headers_pri("${module_build_interface_include_dir}" "module_headers")
+ if(arg_EXTERNAL_HEADERS)
+ set(module_headers_public ${arg_EXTERNAL_HEADERS})
+ endif()
+
set_property(TARGET ${target} APPEND PROPERTY
_qt_module_timestamp_dependencies "${module_headers_public}")
@@ -680,14 +696,23 @@ set(QT_LIBINFIX \"${QT_LIBINFIX}\")")
list(APPEND exported_targets ${target_private})
endif()
set(export_name "${INSTALL_CMAKE_NAMESPACE}${target}Targets")
+ if(arg_EXTERNAL_HEADERS_DIR)
+ qt_install(DIRECTORY "${arg_EXTERNAL_HEADERS_DIR}/"
+ DESTINATION "${module_install_interface_include_dir}"
+ )
+ unset(public_header_destination)
+ else()
+ set(public_header_destination PUBLIC_HEADER DESTINATION "${module_install_interface_include_dir}")
+ endif()
+
qt_install(TARGETS ${exported_targets}
EXPORT ${export_name}
RUNTIME DESTINATION ${INSTALL_BINDIR}
LIBRARY DESTINATION ${INSTALL_LIBDIR}
ARCHIVE DESTINATION ${INSTALL_LIBDIR}
FRAMEWORK DESTINATION ${INSTALL_LIBDIR}
- PUBLIC_HEADER DESTINATION "${module_install_interface_include_dir}"
PRIVATE_HEADER DESTINATION "${module_install_interface_private_include_dir}"
+ ${public_header_destination}
)
if(BUILD_SHARED_LIBS)