From a89cd65980153ef60b42cb26d3bef949751f87f1 Mon Sep 17 00:00:00 2001 From: Pierre Wendling Date: Sun, 6 Aug 2023 15:07:31 -0400 Subject: [PATCH] CMake: Export and install library targets. The configs can be consumed by setting LibreSSL_DIR to the build directory, or after installation using CMAKE_PREFIX_PATH/LibreSSL_DIR. For compatibility, the EXPORT_NAME of targets and the LIBRESSL_* variables are set to match the names used in FindLibreSSL. --- CMakeLists.txt | 34 +++++++++++++++++++++++++++++++++- LibreSSLConfig.cmake.in | 33 +++++++++++++++++++++++++++++++++ Makefile.am | 2 +- crypto/CMakeLists.txt | 32 +++++++++++++++++++++++++++++--- ssl/CMakeLists.txt | 32 +++++++++++++++++++++++++++++--- tls/CMakeLists.txt | 32 +++++++++++++++++++++++++++++--- 6 files changed, 154 insertions(+), 11 deletions(-) create mode 100644 LibreSSLConfig.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 991f60c4e7..8e26e4722d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,6 +39,7 @@ option(ENABLE_ASM "Enable assembly" ON) option(ENABLE_EXTRATESTS "Enable extra tests that may be unreliable on some platforms" OFF) option(ENABLE_NC "Enable installing TLS-enabled nc(1)" OFF) set(OPENSSLDIR ${OPENSSLDIR} CACHE PATH "Set the default openssl directory" FORCE) +set(LIBRESSL_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake" CACHE STRING "Installation directory for the CMake targets") option(USE_STATIC_MSVC_RUNTIMES "Use /MT instead of /MD in MSVC" OFF) if(USE_STATIC_MSVC_RUNTIMES) @@ -439,6 +440,38 @@ if (BUILD_APPLE_XCFRAMEWORK) endif(ENABLE_LIBRESSL_INSTALL) endif(BUILD_APPLE_XCFRAMEWORK) +file(STRINGS "VERSION" VERSION LIMIT_COUNT 1) +include(CMakePackageConfigHelpers) +write_basic_package_version_file( + "LibreSSLConfigVersion.cmake" + VERSION "${VERSION}" + COMPATIBILITY SameMajorVersion +) + +set(INCLUDE_DIRECTORY "${CMAKE_BINARY_DIR}/include") +configure_package_config_file( + "${CMAKE_CURRENT_LIST_DIR}/LibreSSLConfig.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/LibreSSLConfig.cmake" + PATH_VARS INCLUDE_DIRECTORY + INSTALL_DESTINATION "${CMAKE_CURRENT_BINARY_DIR}" + INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}" +) + +if(ENABLE_LIBRESSL_INSTALL) + set(INCLUDE_DIRECTORY "${CMAKE_INSTALL_INCLUDEDIR}") + configure_package_config_file( + "${CMAKE_CURRENT_LIST_DIR}/LibreSSLConfig.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/install-config/LibreSSLConfig.cmake" + PATH_VARS INCLUDE_DIRECTORY + INSTALL_DESTINATION "${LIBRESSL_INSTALL_CMAKEDIR}/LibreSSL" + ) + install(FILES + "${CMAKE_BINARY_DIR}/install-config/LibreSSLConfig.cmake" + "${CMAKE_BINARY_DIR}/LibreSSLConfigVersion.cmake" + DESTINATION "${LIBRESSL_INSTALL_CMAKEDIR}/LibreSSL" + ) +endif() + if(ENABLE_LIBRESSL_INSTALL) if(NOT MSVC) # Create pkgconfig files. @@ -449,7 +482,6 @@ if(ENABLE_LIBRESSL_INSTALL) if(PLATFORM_LIBS) string(REGEX REPLACE ";" " -l" PLATFORM_LDADD ";${PLATFORM_LIBS}") endif() - file(STRINGS "VERSION" VERSION LIMIT_COUNT 1) file(GLOB OPENSSL_PKGCONFIGS "*.pc.in") foreach(file ${OPENSSL_PKGCONFIGS}) get_filename_component(filename ${file} NAME) diff --git a/LibreSSLConfig.cmake.in b/LibreSSLConfig.cmake.in new file mode 100644 index 0000000000..d6fbe3b211 --- /dev/null +++ b/LibreSSLConfig.cmake.in @@ -0,0 +1,33 @@ +@PACKAGE_INIT@ + +set(LIBRESSL_VERSION @VERSION@) +set_and_check(LIBRESSL_INCLUDE_DIR @PACKAGE_INCLUDE_DIRECTORY@) + +if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/LibreSSL-Crypto.cmake") + include("${CMAKE_CURRENT_LIST_DIR}/LibreSSL-Crypto.cmake") + set(LIBRESSL_CRYPTO_LIBRARY LibreSSL::Crypto) +endif() + +if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/LibreSSL-SSL.cmake") + include("${CMAKE_CURRENT_LIST_DIR}/LibreSSL-SSL.cmake") + set(LIBRESSL_SSL_LIBRARY LibreSSL::SSL) +endif() + +if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/LibreSSL-TLS.cmake") + include("${CMAKE_CURRENT_LIST_DIR}/LibreSSL-TLS.cmake") + set(LIBRESSL_TLS_LIBRARY LibreSSL::TLS) +endif() + +set(LIBRESSL_LIBRARIES + ${LIBRESSL_CRYPTO_LIBRARY} + ${LIBRESSL_SSL_LIBRARY} + ${LIBRESSL_TLS_LIBRARY} +) + +check_required_components( + Crypto + SSL + TLS +) + +set(LIBRESSL_FOUND TRUE) diff --git a/Makefile.am b/Makefile.am index d28692a23d..2edef0db5a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -11,7 +11,7 @@ pkgconfig_DATA += libcrypto.pc libssl.pc openssl.pc endif EXTRA_DIST = README.md README.windows VERSION config scripts -EXTRA_DIST += CMakeLists.txt cmake_export_symbol.cmake cmake_uninstall.cmake.in FindLibreSSL.cmake +EXTRA_DIST += CMakeLists.txt cmake_export_symbol.cmake cmake_uninstall.cmake.in FindLibreSSL.cmake LibreSSLConfig.cmake.in EXTRA_DIST += cert.pem openssl.cnf x509v3.cnf .PHONY: install_sw diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt index 1e73e8854c..597ffef779 100644 --- a/crypto/CMakeLists.txt +++ b/crypto/CMakeLists.txt @@ -990,9 +990,29 @@ if (WIN32) endif() set_target_properties(crypto PROPERTIES OUTPUT_NAME crypto${CRYPTO_POSTFIX} - ARCHIVE_OUTPUT_NAME crypto${CRYPTO_POSTFIX}) -set_target_properties(crypto PROPERTIES VERSION - ${CRYPTO_VERSION} SOVERSION ${CRYPTO_MAJOR_VERSION}) + ARCHIVE_OUTPUT_NAME crypto${CRYPTO_POSTFIX} + EXPORT_NAME Crypto + VERSION ${CRYPTO_VERSION} + SOVERSION ${CRYPTO_MAJOR_VERSION} +) + +target_include_directories( + crypto + PUBLIC + $ + $ +) + +install( + TARGETS crypto + EXPORT Crypto-target +) + +export( + EXPORT Crypto-target + FILE "${LibreSSL_BINARY_DIR}/LibreSSL-Crypto.cmake" + NAMESPACE LibreSSL:: +) if(ENABLE_LIBRESSL_INSTALL) install( @@ -1001,6 +1021,12 @@ if(ENABLE_LIBRESSL_INSTALL) LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + install( + EXPORT Crypto-target + FILE "LibreSSL-Crypto.cmake" + NAMESPACE LibreSSL:: + DESTINATION "${LIBRESSL_INSTALL_CMAKEDIR}/LibreSSL" + ) endif(ENABLE_LIBRESSL_INSTALL) # build static library for regression test diff --git a/ssl/CMakeLists.txt b/ssl/CMakeLists.txt index 3d5b5df1c5..16ef277769 100644 --- a/ssl/CMakeLists.txt +++ b/ssl/CMakeLists.txt @@ -91,9 +91,29 @@ if (WIN32) endif() set_target_properties(ssl PROPERTIES OUTPUT_NAME ssl${SSL_POSTFIX} - ARCHIVE_OUTPUT_NAME ssl${SSL_POSTFIX}) -set_target_properties(ssl PROPERTIES VERSION ${SSL_VERSION} - SOVERSION ${SSL_MAJOR_VERSION}) + ARCHIVE_OUTPUT_NAME ssl${SSL_POSTFIX} + EXPORT_NAME SSL + VERSION ${SSL_VERSION} + SOVERSION ${SSL_MAJOR_VERSION} +) + +target_include_directories( + ssl + PUBLIC + $ + $ +) + +install( + TARGETS ssl + EXPORT SSL-target +) + +export( + EXPORT SSL-target + FILE "${LibreSSL_BINARY_DIR}/LibreSSL-SSL.cmake" + NAMESPACE LibreSSL:: +) if(ENABLE_LIBRESSL_INSTALL) install( @@ -102,6 +122,12 @@ if(ENABLE_LIBRESSL_INSTALL) LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + install( + EXPORT SSL-target + FILE "LibreSSL-SSL.cmake" + NAMESPACE LibreSSL:: + DESTINATION "${LIBRESSL_INSTALL_CMAKEDIR}/LibreSSL" + ) endif(ENABLE_LIBRESSL_INSTALL) # build static library for regression test diff --git a/tls/CMakeLists.txt b/tls/CMakeLists.txt index 2a9019214c..a8f29af04f 100644 --- a/tls/CMakeLists.txt +++ b/tls/CMakeLists.txt @@ -58,9 +58,29 @@ if (WIN32) endif() set_target_properties(tls PROPERTIES OUTPUT_NAME tls${TLS_POSTFIX} - ARCHIVE_OUTPUT_NAME tls${TLS_POSTFIX}) -set_target_properties(tls PROPERTIES VERSION ${TLS_VERSION} - SOVERSION ${TLS_MAJOR_VERSION}) + ARCHIVE_OUTPUT_NAME tls${TLS_POSTFIX} + EXPORT_NAME TLS + VERSION ${TLS_VERSION} + SOVERSION ${TLS_MAJOR_VERSION} +) + +target_include_directories( + tls + PUBLIC + $ + $ +) + +install( + TARGETS tls + EXPORT TLS-target +) + +export( + EXPORT TLS-target + FILE "${LibreSSL_BINARY_DIR}/LibreSSL-TLS.cmake" + NAMESPACE LibreSSL:: +) if(ENABLE_LIBRESSL_INSTALL) install( @@ -69,6 +89,12 @@ if(ENABLE_LIBRESSL_INSTALL) LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + install( + EXPORT TLS-target + FILE "LibreSSL-TLS.cmake" + NAMESPACE LibreSSL:: + DESTINATION "${LIBRESSL_INSTALL_CMAKEDIR}/LibreSSL" + ) endif(ENABLE_LIBRESSL_INSTALL) # build static library for regression test