Skip to content

Commit

Permalink
OpenSSLConfig.cmake
Browse files Browse the repository at this point in the history
Signed-off-by: Fs <[email protected]>
  • Loading branch information
Fsu0413 committed Dec 30, 2023
1 parent 28ad3ff commit 28487a4
Show file tree
Hide file tree
Showing 3 changed files with 242 additions and 0 deletions.
30 changes: 30 additions & 0 deletions exporters/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,33 @@ configure_file(pkg-config/openssl.pc.cmake.in openssl.pc @ONLY)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/openssl.pc
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
)

get_target_property(OPENSSL_EXTERNALCMAKE_CRYPTO_ARCHIVE_OUTPUT_NAME crypto ARCHIVE_OUTPUT_NAME)
if (NOT OPENSSL_EXTERNALCMAKE_CRYPTO_ARCHIVE_OUTPUT_NAME)
set(OPENSSL_EXTERNALCMAKE_CRYPTO_ARCHIVE_OUTPUT_NAME crypto)
endif()

get_target_property(OPENSSL_EXTERNALCMAKE_CRYPTO_LIBRARY_OUTPUT_NAME crypto LIBRARY_OUTPUT_NAME)
if (NOT OPENSSL_EXTERNALCMAKE_CRYPTO_LIBRARY_OUTPUT_NAME)
set(OPENSSL_EXTERNALCMAKE_CRYPTO_LIBRARY_OUTPUT_NAME crypto)
endif()

get_target_property(OPENSSL_EXTERNALCMAKE_SSL_ARCHIVE_OUTPUT_NAME ssl ARCHIVE_OUTPUT_NAME)
if (NOT OPENSSL_EXTERNALCMAKE_SSL_ARCHIVE_OUTPUT_NAME)
set(OPENSSL_EXTERNALCMAKE_SSL_ARCHIVE_OUTPUT_NAME ssl)
endif()

get_target_property(OPENSSL_EXTERNALCMAKE_SSL_LIBRARY_OUTPUT_NAME ssl LIBRARY_OUTPUT_NAME)
if (NOT OPENSSL_EXTERNALCMAKE_SSL_LIBRARY_OUTPUT_NAME)
set(OPENSSL_EXTERNALCMAKE_SSL_LIBRARY_OUTPUT_NAME ssl)
endif()

configure_file(cmake/OpenSSLConfig.cmake.in OpenSSLConfig.cmake @ONLY)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/OpenSSLConfig.cmake
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/OpenSSL
)

configure_file(cmake/OpenSSLConfigVersion.cmake.in OpenSSLConfigVersion.cmake @ONLY)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/OpenSSLConfigVersion.cmake
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/OpenSSL
)
195 changes: 195 additions & 0 deletions exporters/cmake/OpenSSLConfig.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
# Generated by Fsu0413/openssl-externalCMake
# Most of original file copied from OpenSSL

# Commands may need to know the format version.
set(CMAKE_IMPORT_FILE_VERSION 1)

# Avoid duplicate find_package()
set(_ossl_expected_targets OpenSSL::Crypto OpenSSL::SSL
)
set(_ossl_defined_targets)
set(_ossl_undefined_targets)
foreach(t IN LISTS _ossl_expected_targets)
if(TARGET "${t}")
LIST(APPEND _ossl_defined_targets "${t}")
else()
LIST(APPEND _ossl_undefined_targets "${t}")
endif()
endforeach()
message(DEBUG "_ossl_expected_targets = ${_ossl_expected_targets}")
message(DEBUG "_ossl_defined_targets = ${_ossl_defined_targets}")
message(DEBUG "_ossl_undefined_targets = ${_ossl_undefined_targets}")
if(NOT _ossl_undefined_targets)
# All targets are defined, we're good, just undo everything and return
unset(_ossl_expected_targets)
unset(_ossl_defined_targets)
unset(_ossl_undefined_targets)
unset(CMAKE_IMPORT_FILE_VERSION)
return()
endif()
if(_ossl_defined_targets)
# We have a mix of defined and undefined targets. This is hard to reconcile,
# and probably the result of another config, or FindOpenSSL.cmake having been
# called, or whatever. Therefore, the best course of action is to quit with a
# hard error.
message(FATAL_ERROR "Some targets defined, others not:\nNot defined: ${_ossl_undefined_targets}\nDefined: ${_ossl_defined_targets}")
endif()
unset(_ossl_expected_targets)
unset(_ossl_defined_targets)
unset(_ossl_undefined_targets)

# Set up the import path, so all other import paths are made relative this file
get_filename_component(_ossl_prefix "${CMAKE_CURRENT_LIST_FILE}" PATH)
get_filename_component(_ossl_prefix "${_ossl_prefix}" PATH)
get_filename_component(_ossl_prefix "${_ossl_prefix}" PATH)
get_filename_component(_ossl_prefix "${_ossl_prefix}" PATH)

if(_ossl_prefix STREQUAL "/")
set(_ossl_prefix "")
endif()

# Fsu0413/openssl-externalCMake modification start:
# Original logic of OpenSSL judges here using OPENSSL_USE_STATIC_LIBS
# Since our CMake project builds only either of shared and static library, we should judge OPENSSL_USE_STATIC_LIBS with the built version
# So the logic here should be modified

set (OPENSSL_EXTERNALCMAKE_BUILD_SHARED_LIBS @BUILD_SHARED_LIBS@)
if (OPENSSL_EXTERNALCMAKE_BUILD_SHARED_LIBS)
set(_ossl_use_static_libs false)
else()
set(_ossl_use_static_libs True)
endif()
unset(OPENSSL_EXTERNALCMAKE_BUILD_SHARED_LIBS)

if (DEFINED OPENSSL_USE_STATIC_LIBS)
if ( ( OPENSSL_USE_STATIC_LIBS ) AND ( _ossl_use_static_libs ) )
elseif ( ( NOT OPENSSL_USE_STATIC_LIBS ) AND ( NOT _ossl_use_static_libs ) )
else()
# OPENSSL_USE_STATIC_LIBS is explicitly different than _ossl_use_static_libs, indicating
# the required library variant is not available. The best course of action is to simply
# return and leave it to CMake to use another OpenSSL config.
unset(_ossl_use_static_libs)
unset(CMAKE_IMPORT_FILE_VERSION)
return()
endif()
endif()
# Fsu0413/openssl-externalCMake modification end

# Version, copied from what find_package() gives, for compatibility with FindOpenSSL.cmake
set(_ossl_external_cmake_version_pre3_suffices
";a;b;c;d;e;f;g;h;i;j;k;l;m;n;o;p;q;r;s;t;u;v;w;x;y;za;zb;zc;zd;ze;zf;zg;zh"
)
list(GET _ossl_external_cmake_version_pre3_suffices ${OpenSSL_VERSION_TWEAK} OPENSSL_VERSION_PATCH_STRING)
set(OPENSSL_VERSION "${OpenSSL_VERSION_MAJOR}.${OpenSSL_VERSION_MINOR}.${OpenSSL_VERSION_PATCH}${OPENSSL_VERSION_PATCH_STRING}")
unset(_ossl_external_cmake_version_pre3_suffices)

set(OPENSSL_VERSION_MAJOR "${OpenSSL_VERSION_MAJOR}")
set(OPENSSL_VERSION_MINOR "${OpenSSL_VERSION_MINOR}")
set(OPENSSL_VERSION_FIX "${OpenSSL_VERSION_PATCH}")
set(OPENSSL_VERSION_PATCH "${OpenSSL_VERSION_TWEAK}")

set(OPENSSL_FOUND YES)

# Directories and names
set(OPENSSL_INCLUDE_DIR "${_ossl_prefix}/@CMAKE_INSTALL_INCLUDEDIR@")
set(OPENSSL_LIBRARY_DIR "${_ossl_prefix}/@CMAKE_INSTALL_LIBDIR@")
set(OPENSSL_ENGINES_DIR "${_ossl_prefix}/@CMAKE_INSTALL_LIBDIR@/engines-1.1")
set(OPENSSL_RUNTIME_DIR "${_ossl_prefix}/@CMAKE_INSTALL_BINDIR@")

set(OPENSSL_PROGRAM "${OPENSSL_RUNTIME_DIR}/openssl")

# Set up the imported targets
# Fsu0413/openssl-externalCMake notes: Way for disabling outputs during configure is nonexistant.
# So instead of disabling output using the following "if" (which exists on original OpenSSL project) only for judging if static library is used seems enough
if(_ossl_use_static_libs)

add_library(OpenSSL::Crypto STATIC IMPORTED)
add_library(OpenSSL::SSL STATIC IMPORTED)

set(OPENSSL_LIBCRYPTO_STATIC "${OPENSSL_LIBRARY_DIR}/@CMAKE_STATIC_LIBRARY_PREFIX@@OPENSSL_EXTERNALCMAKE_CRYPTO_ARCHIVE_OUTPUT_NAME@@CMAKE_STATIC_LIBRARY_SUFFIX@")
set(OPENSSL_LIBCRYPTO_DEPENDENCIES )
set_target_properties(OpenSSL::Crypto PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
IMPORTED_LOCATION ${OPENSSL_LIBCRYPTO_STATIC})
set_property(TARGET OpenSSL::Crypto
PROPERTY INTERFACE_LINK_LIBRARIES ${OPENSSL_LIBCRYPTO_DEPENDENCIES})

set(OPENSSL_LIBSSL_STATIC "${OPENSSL_LIBRARY_DIR}/@CMAKE_STATIC_LIBRARY_PREFIX@@OPENSSL_EXTERNALCMAKE_SSL_ARCHIVE_OUTPUT_NAME@@CMAKE_STATIC_LIBRARY_SUFFIX@")
set(OPENSSL_LIBSSL_DEPENDENCIES OpenSSL::Crypto)
set_target_properties(OpenSSL::SSL PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
IMPORTED_LOCATION ${OPENSSL_LIBSSL_STATIC})
set_property(TARGET OpenSSL::SSL
PROPERTY INTERFACE_LINK_LIBRARIES ${OPENSSL_LIBSSL_DEPENDENCIES})

# Directories and names compatible with CMake's FindOpenSSL.cmake
set(OPENSSL_CRYPTO_LIBRARY ${OPENSSL_LIBCRYPTO_STATIC})
set(OPENSSL_CRYPTO_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY} ${OPENSSL_LIBCRYPTO_DEPENDENCIES})
set(OPENSSL_SSL_LIBRARY ${OPENSSL_LIBSSL_STATIC})
set(OPENSSL_SSL_LIBRARIES ${OPENSSL_SSL_LIBRARY} ${OPENSSL_LIBSSL_DEPENDENCIES})
set(OPENSSL_LIBRARIES ${OPENSSL_SSL_LIBRARY} ${OPENSSL_LIBSSL_DEPENDENCIES} ${OPENSSL_LIBCRYPTO_DEPENDENCIES})

else()

add_library(OpenSSL::Crypto SHARED IMPORTED)
add_library(OpenSSL::SSL SHARED IMPORTED)

# Fsu0413/openssl-externalCMake modification: judging if export library needed by querying the target platform
if (WIN32 OR CYGWIN)
set(OPENSSL_LIBCRYPTO_SHARED "${OPENSSL_RUNTIME_DIR}/@CMAKE_SHARED_LIBRARY_PREFIX@@OPENSSL_EXTERNALCMAKE_CRYPTO_LIBRARY_OUTPUT_NAME@@CMAKE_SHARED_LIBRARY_SUFFIX@")
set(OPENSSL_LIBCRYPTO_IMPORT "${OPENSSL_LIBRARY_DIR}/@CMAKE_IMPORT_LIBRARY_PREFIX@@OPENSSL_EXTERNALCMAKE_CRYPTO_ARCHIVE_OUTPUT_NAME@@CMAKE_IMPORT_LIBRARY_SUFFIX@")
set(OPENSSL_LIBCRYPTO_DEPENDENCIES )
set_target_properties(OpenSSL::Crypto PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
IMPORTED_IMPLIB ${OPENSSL_LIBCRYPTO_IMPORT}
IMPORTED_LOCATION ${OPENSSL_LIBCRYPTO_SHARED})
set_property(TARGET OpenSSL::Crypto
PROPERTY INTERFACE_LINK_LIBRARIES ${OPENSSL_LIBCRYPTO_DEPENDENCIES})

set(OPENSSL_LIBSSL_SHARED "${OPENSSL_RUNTIME_DIR}/@CMAKE_SHARED_LIBRARY_PREFIX@@OPENSSL_EXTERNALCMAKE_SSL_LIBRARY_OUTPUT_NAME@@CMAKE_SHARED_LIBRARY_SUFFIX@")
set(OPENSSL_LIBSSL_IMPORT "${OPENSSL_LIBRARY_DIR}/@CMAKE_IMPORT_LIBRARY_PREFIX@@OPENSSL_EXTERNALCMAKE_SSL_ARCHIVE_OUTPUT_NAME@@CMAKE_IMPORT_LIBRARY_SUFFIX@")
set(OPENSSL_LIBSSL_DEPENDENCIES OpenSSL::Crypto )
set_target_properties(OpenSSL::SSL PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
IMPORTED_IMPLIB ${OPENSSL_LIBSSL_IMPORT}
IMPORTED_LOCATION ${OPENSSL_LIBSSL_SHARED})
set_property(TARGET OpenSSL::SSL
PROPERTY INTERFACE_LINK_LIBRARIES ${OPENSSL_LIBSSL_DEPENDENCIES})

# Directories and names compatible with CMake's FindOpenSSL.cmake
set(OPENSSL_CRYPTO_LIBRARY ${OPENSSL_LIBCRYPTO_IMPORT})
set(OPENSSL_CRYPTO_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY} ${OPENSSL_LIBCRYPTO_DEPENDENCIES})
set(OPENSSL_SSL_LIBRARY ${OPENSSL_LIBSSL_IMPORT})
set(OPENSSL_SSL_LIBRARIES ${OPENSSL_SSL_LIBRARY} ${OPENSSL_LIBSSL_DEPENDENCIES})
set(OPENSSL_LIBRARIES ${OPENSSL_SSL_LIBRARY} ${OPENSSL_LIBSSL_DEPENDENCIES} ${OPENSSL_LIBCRYPTO_DEPENDENCIES})
else()
# Dependencies are assumed to be implied in the shared libraries
set(OPENSSL_LIBCRYPTO_SHARED "${OPENSSL_LIBRARY_DIR}/@CMAKE_SHARED_LIBRARY_PREFIX@@OPENSSL_EXTERNALCMAKE_CRYPTO_LIBRARY_OUTPUT_NAME@@CMAKE_SHARED_LIBRARY_SUFFIX@")
set_target_properties(OpenSSL::Crypto PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
IMPORTED_LOCATION ${OPENSSL_LIBCRYPTO_SHARED})

set(OPENSSL_LIBSSL_SHARED "${OPENSSL_LIBRARY_DIR}/@CMAKE_SHARED_LIBRARY_PREFIX@@OPENSSL_EXTERNALCMAKE_SSL_LIBRARY_OUTPUT_NAME@@CMAKE_SHARED_LIBRARY_SUFFIX@")
set_target_properties(OpenSSL::SSL PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
IMPORTED_LOCATION ${OPENSSL_LIBSSL_SHARED})

# Directories and names compatible with CMake's FindOpenSSL.cmake
set(OPENSSL_CRYPTO_LIBRARY ${OPENSSL_LIBCRYPTO_SHARED})
set(OPENSSL_CRYPTO_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
set(OPENSSL_SSL_LIBRARY ${OPENSSL_LIBSSL_SHARED})
set(OPENSSL_SSL_LIBRARIES ${OPENSSL_SSL_LIBRARY})
set(OPENSSL_LIBRARIES ${OPENSSL_SSL_LIBRARIES})
endif()

endif()

set_target_properties(OpenSSL::Crypto PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${OPENSSL_INCLUDE_DIR}")
set_target_properties(OpenSSL::SSL PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${OPENSSL_INCLUDE_DIR}")



unset(_ossl_prefix)
unset(_ossl_use_static_libs)
17 changes: 17 additions & 0 deletions exporters/cmake/OpenSSLConfigVersion.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by OpenSSL

set(PACKAGE_VERSION @OpenSSL_VERSION@)

if(NOT PACKAGE_FIND_VERSION)
# find_package() was called without any version information. This is assumed to
# mean that the caller accepts whatever they get.
set(PACKAGE_VERSION_COMPATIBLE 1)
elseif(PACKAGE_FIND_VERSION_MAJOR LESS @OpenSSL_VERSION_MAJOR@.@OpenSSL_VERSION_MINOR@
OR PACKAGE_FIND_VERSION VERSION_GREATER @OpenSSL_VERSION@)
set(PACKAGE_VERSION_UNSUITABLE 1)
else()
set(PACKAGE_VERSION_COMPATIBLE 1)
if(PACKAGE_FIND_VERSION VERSION_EQUAL @OpenSSL_VERSION@)
set(PACKAGE_VERSION_EXACT 1)
endif()
endif()

0 comments on commit 28487a4

Please sign in to comment.