diff options
-rw-r--r-- | cmake/FindWrapOpenSSL.cmake | 21 | ||||
-rw-r--r-- | cmake/FindWrapOpenSSLHeaders.cmake | 34 | ||||
-rw-r--r-- | src/network/.prev_CMakeLists.txt | 4 | ||||
-rw-r--r-- | src/network/CMakeLists.txt | 4 | ||||
-rw-r--r-- | src/network/configure.cmake | 12 | ||||
-rw-r--r-- | tests/CMakeLists.txt | 3 | ||||
-rw-r--r-- | tests/auto/network/CMakeLists.txt | 2 | ||||
-rw-r--r-- | tests/benchmarks/network/CMakeLists.txt | 2 | ||||
-rwxr-xr-x | util/cmake/configurejson2cmake.py | 4 | ||||
-rw-r--r-- | util/cmake/helper.py | 47 |
10 files changed, 114 insertions, 19 deletions
diff --git a/cmake/FindWrapOpenSSL.cmake b/cmake/FindWrapOpenSSL.cmake new file mode 100644 index 0000000000..6e80862258 --- /dev/null +++ b/cmake/FindWrapOpenSSL.cmake @@ -0,0 +1,21 @@ +# We can't create the same interface imported target multiple times, CMake will complain if we do +# that. This can happen if the find_package call is done in multiple different subdirectories. +if(TARGET WrapOpenSSL::WrapOpenSSL) + set(WrapOpenSSL_FOUND ON) + return() +endif() + +set(WrapOpenSSL_FOUND OFF) + +# Reuse logic from the headers find script. +find_package(WrapOpenSSLHeaders ${WrapOpenSSL_FIND_VERSION}) + +if(OpenSSL_FOUND) + set(WrapOpenSSL_FOUND ON) + + add_library(WrapOpenSSL::WrapOpenSSL INTERFACE IMPORTED) + target_link_libraries(WrapOpenSSL::WrapOpenSSL INTERFACE OpenSSL::SSL) +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(WrapOpenSSL DEFAULT_MSG WrapOpenSSL_FOUND) diff --git a/cmake/FindWrapOpenSSLHeaders.cmake b/cmake/FindWrapOpenSSLHeaders.cmake new file mode 100644 index 0000000000..52e6df3b0a --- /dev/null +++ b/cmake/FindWrapOpenSSLHeaders.cmake @@ -0,0 +1,34 @@ +# We can't create the same interface imported target multiple times, CMake will complain if we do +# that. This can happen if the find_package call is done in multiple different subdirectories. +if(TARGET WrapOpenSSLHeaders::WrapOpenSSLHeaders) + set(WrapOpenSSLHeaders_FOUND ON) + return() +endif() + +set(WrapOpenSSLHeaders_FOUND OFF) + +# When cross-compiling (to Android for example), we need to add the OPENSSL_ROOT_DIR as a root path, +# otherwise the value would just be appended to the sysroot, which is wrong. +if(OPENSSL_ROOT_DIR) + set(__find_wrap_openssl_headers_backup_root_dir "${CMAKE_FIND_ROOT_PATH}") + list(APPEND CMAKE_FIND_ROOT_PATH "${OPENSSL_ROOT_DIR}") +endif() + +find_package(OpenSSL ${WrapOpenSSLHeaders_FIND_VERSION}) + +if(OPENSSL_ROOT_DIR) + set(CMAKE_FIND_ROOT_PATH "${__find_wrap_openssl_headers_backup_root_dir}") +endif() + +# We are interested only in include headers. The libraries might be missing, so we can't check the +# _FOUND variable. +if(OPENSSL_INCLUDE_DIR) + set(WrapOpenSSLHeaders_FOUND ON) + + add_library(WrapOpenSSLHeaders::WrapOpenSSLHeaders INTERFACE IMPORTED) + target_include_directories(WrapOpenSSLHeaders::WrapOpenSSLHeaders INTERFACE + ${OPENSSL_INCLUDE_DIR}) +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(WrapOpenSSLHeaders DEFAULT_MSG WrapOpenSSLHeaders_FOUND) diff --git a/src/network/.prev_CMakeLists.txt b/src/network/.prev_CMakeLists.txt index 6b0af4bcc9..1af21c806b 100644 --- a/src/network/.prev_CMakeLists.txt +++ b/src/network/.prev_CMakeLists.txt @@ -411,12 +411,12 @@ qt_extend_target(Network CONDITION ANDROID AND QT_FEATURE_openssl AND QT_FEATURE qt_extend_target(Network CONDITION QT_FEATURE_openssl AND QT_FEATURE_openssl_linked AND QT_FEATURE_ssl AND NOT ANDROID LIBRARIES - OpenSSL::SSL + WrapOpenSSL::WrapOpenSSL ) qt_extend_target(Network CONDITION QT_FEATURE_openssl AND QT_FEATURE_ssl AND NOT QT_FEATURE_openssl_linked LIBRARIES - OpenSSL::SSL_nolink + WrapOpenSSLHeaders::WrapOpenSSLHeaders ) qt_extend_target(Network CONDITION QT_FEATURE_openssl AND QT_FEATURE_ssl AND WIN32 diff --git a/src/network/CMakeLists.txt b/src/network/CMakeLists.txt index a779eeb6a0..6ff806fef9 100644 --- a/src/network/CMakeLists.txt +++ b/src/network/CMakeLists.txt @@ -411,12 +411,12 @@ qt_extend_target(Network CONDITION ANDROID AND QT_FEATURE_openssl AND QT_FEATURE qt_extend_target(Network CONDITION QT_FEATURE_openssl AND QT_FEATURE_openssl_linked AND QT_FEATURE_ssl AND NOT ANDROID LIBRARIES - OpenSSL::SSL + WrapOpenSSL::WrapOpenSSL ) qt_extend_target(Network CONDITION QT_FEATURE_openssl AND QT_FEATURE_ssl AND NOT QT_FEATURE_openssl_linked LIBRARIES - OpenSSL::SSL_nolink + WrapOpenSSLHeaders::WrapOpenSSLHeaders ) qt_extend_target(Network CONDITION QT_FEATURE_openssl AND QT_FEATURE_ssl AND WIN32 diff --git a/src/network/configure.cmake b/src/network/configure.cmake index cea673e943..ae9deb79ed 100644 --- a/src/network/configure.cmake +++ b/src/network/configure.cmake @@ -7,11 +7,11 @@ #### Libraries qt_find_package(Libproxy PROVIDED_TARGETS PkgConfig::Libproxy) -qt_find_package(OpenSSL PROVIDED_TARGETS OpenSSL::SSL) +qt_find_package(WrapOpenSSLHeaders PROVIDED_TARGETS WrapOpenSSLHeaders::WrapOpenSSLHeaders) # openssl_headers qt_config_compile_test(openssl_headers LIBRARIES - OpenSSL::SSL + WrapOpenSSLHeaders::WrapOpenSSLHeaders CODE " #include <openssl/ssl.h> @@ -32,11 +32,11 @@ int main(int argc, char **argv) } ") -qt_find_package(OpenSSL PROVIDED_TARGETS OpenSSL::SSL) +qt_find_package(WrapOpenSSL PROVIDED_TARGETS WrapOpenSSL::WrapOpenSSL) # openssl qt_config_compile_test(openssl LIBRARIES - OpenSSL::SSL + WrapOpenSSL::WrapOpenSSL CODE " #include <openssl/ssl.h> @@ -164,7 +164,7 @@ socklen_t sctpInitMsgSize = sizeof(sctpInitMsg); qt_config_compile_test(dtls LABEL "DTLS support in OpenSSL" LIBRARIES - OpenSSL::SSL + WrapOpenSSLHeaders::WrapOpenSSLHeaders CODE " #include <openssl/ssl.h> @@ -185,7 +185,7 @@ int main(int argc, char **argv) qt_config_compile_test(ocsp LABEL "OCSP stapling support in OpenSSL" LIBRARIES - OpenSSL::SSL + WrapOpenSSLHeaders::WrapOpenSSLHeaders CODE " #include <openssl/ssl.h> diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index d1a395c9f3..3642db7ee3 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -7,7 +7,8 @@ if(QT_BUILD_STANDALONE_TESTS) qt_find_package(WrapDBus1 PROVIDED_TARGETS dbus-1) qt_find_package(ICU COMPONENTS i18n uc data PROVIDED_TARGETS ICU::i18n ICU::uc ICU::data) qt_find_package(Threads PROVIDED_TARGETS Threads::Threads) - qt_find_package(OpenSSL PROVIDED_TARGETS OpenSSL::OpenSSL) + qt_find_package(WrapOpenSSL PROVIDED_TARGETS WrapOpenSSL::WrapOpenSSL) + qt_find_package(WrapOpenSSLHeaders PROVIDED_TARGETS WrapOpenSSLHeaders::WrapOpenSSLHeaders) # special case end endif() qt_build_tests() diff --git a/tests/auto/network/CMakeLists.txt b/tests/auto/network/CMakeLists.txt index 0e2415daac..b85ff6c0de 100644 --- a/tests/auto/network/CMakeLists.txt +++ b/tests/auto/network/CMakeLists.txt @@ -9,7 +9,7 @@ if (QT_FEATURE_private_tests) endif() if (QT_FEATURE_openssl AND QT_FEATURE_ssl AND NOT QT_FEATURE_openssl_linked) - include_directories($<TARGET_PROPERTY:${INSTALL_CMAKE_NAMESPACE}::SSL_nolink,INTERFACE_INCLUDE_DIRECTORIES>) + include_directories($<TARGET_PROPERTY:WrapOpenSSLHeaders::WrapOpenSSLHeaders,INTERFACE_INCLUDE_DIRECTORIES>) endif() endif() # special case end diff --git a/tests/benchmarks/network/CMakeLists.txt b/tests/benchmarks/network/CMakeLists.txt index 4175518f34..4f20fb5ccd 100644 --- a/tests/benchmarks/network/CMakeLists.txt +++ b/tests/benchmarks/network/CMakeLists.txt @@ -10,7 +10,7 @@ if (QT_FEATURE_private_tests) endif() if (QT_FEATURE_openssl AND QT_FEATURE_ssl AND NOT QT_FEATURE_openssl_linked) - include_directories($<TARGET_PROPERTY:${INSTALL_CMAKE_NAMESPACE}::SSL_nolink,INTERFACE_INCLUDE_DIRECTORIES>) + include_directories($<TARGET_PROPERTY:WrapOpenSSLHeaders::WrapOpenSSLHeaders,INTERFACE_INCLUDE_DIRECTORIES>) endif() endif() # special case end diff --git a/util/cmake/configurejson2cmake.py b/util/cmake/configurejson2cmake.py index b98aece55b..5a77c36b4e 100755 --- a/util/cmake/configurejson2cmake.py +++ b/util/cmake/configurejson2cmake.py @@ -40,6 +40,7 @@ from helper import ( map_platform, find_3rd_party_library_mapping, generate_find_package_info, + get_compile_test_dependent_library_mapping, ) knownTests = set() # type: Set[str] @@ -700,7 +701,8 @@ def write_compile_test( if len(library) == 0: continue - library_usage = get_library_usage_for_compile_test(library) + adjusted_library = get_compile_test_dependent_library_mapping(name, library) + library_usage = get_library_usage_for_compile_test(adjusted_library) if "fixme" in library_usage: qmakeFixme += library_usage["fixme"] continue diff --git a/util/cmake/helper.py b/util/cmake/helper.py index 56bf864adb..aae67555f6 100644 --- a/util/cmake/helper.py +++ b/util/cmake/helper.py @@ -44,6 +44,7 @@ class LibraryMapping: is_bundled_with_qt: bool = False, test_library_overwrite: str = "", run_library_test: bool = False, + no_link_so_name: str = "", ) -> None: self.soName = soName self.packageName = packageName @@ -66,6 +67,9 @@ class LibraryMapping: # Run the library compile test of configure.json self.run_library_test = run_library_test + # The custom nolink library mapping associated with this one. + self.no_link_so_name = no_link_so_name + def is_qt(self) -> bool: return self.packageName == "Qt" or self.packageName == "Qt5" or self.packageName == "Qt6" @@ -447,20 +451,21 @@ _library_map = [ LibraryMapping("opengl", "OpenGL", "OpenGL::GL", resultVariable="OpenGL_OpenGL"), LibraryMapping( "openssl_headers", - "OpenSSL", - "OpenSSL::SSL_nolink", + "WrapOpenSSLHeaders", + "WrapOpenSSLHeaders::WrapOpenSSLHeaders", resultVariable="TEST_openssl_headers", appendFoundSuffix=False, - test_library_overwrite="OpenSSL::SSL", + test_library_overwrite="WrapOpenSSLHeaders::WrapOpenSSLHeaders", run_library_test=True, ), LibraryMapping( "openssl", - "OpenSSL", - "OpenSSL::SSL", + "WrapOpenSSL", + "WrapOpenSSL::WrapOpenSSL", resultVariable="TEST_openssl", appendFoundSuffix=False, run_library_test=True, + no_link_so_name="openssl_headers", ), LibraryMapping("oci", "Oracle", "Oracle::OCI"), LibraryMapping( @@ -698,24 +703,56 @@ def map_platform(platform: str) -> str: def is_known_3rd_party_library(lib: str) -> bool: + handling_no_link = False if lib.endswith("/nolink") or lib.endswith("_nolink"): lib = lib[:-7] + handling_no_link = True mapping = find_3rd_party_library_mapping(lib) + if handling_no_link and mapping and mapping.no_link_so_name: + no_link_mapping = find_3rd_party_library_mapping(mapping.no_link_so_name) + if no_link_mapping: + mapping = no_link_mapping return mapping is not None def map_3rd_party_library(lib: str) -> str: + handling_no_link = False libpostfix = "" if lib.endswith("/nolink"): lib = lib[:-7] libpostfix = "_nolink" + handling_no_link = True + mapping = find_3rd_party_library_mapping(lib) + + if handling_no_link and mapping and mapping.no_link_so_name: + no_link_mapping = find_3rd_party_library_mapping(mapping.no_link_so_name) + if no_link_mapping: + mapping = no_link_mapping + libpostfix = "" + if not mapping or not mapping.targetName: return lib + return mapping.targetName + libpostfix +compile_test_dependent_library_mapping = { + "dtls": {"openssl": "openssl_headers"}, + "ocsp": {"openssl": "openssl_headers"}, +} + + +def get_compile_test_dependent_library_mapping(compile_test_name: str, dependency_name: str): + if compile_test_name in compile_test_dependent_library_mapping: + mapping = compile_test_dependent_library_mapping[compile_test_name] + if dependency_name in mapping: + return mapping[dependency_name] + + return dependency_name + + def generate_find_package_info( lib: LibraryMapping, use_qt_find_package: bool = True, |