[libxslt] Require dependencies based on enabled CMake options



commit 2dac1681d957035053cafb056c459e2cde6f4fd3
Author: Markus Rickert <rickert fortiss org>
Date:   Mon Nov 30 20:25:28 2020 +0100

    Require dependencies based on enabled CMake options

 CMakeLists.txt          | 54 ++++++++++++++++++++++++++++---------------------
 FindGcrypt.cmake        | 40 ++++++++++++++++++++++++++++++++++++
 libxslt-config.cmake.in |  7 +++++--
 3 files changed, 76 insertions(+), 25 deletions(-)
---
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e1def21d..13fef2a2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,6 +2,8 @@ cmake_minimum_required(VERSION 3.12)
 
 project(libxslt1 C)
 
+list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
+
 include(CheckCSourceCompiles)
 include(CheckFunctionExists)
 include(CheckIncludeFiles)
@@ -29,33 +31,30 @@ set(VERSION ${LIBXSLT_DOTTED_VERSION})
 set(LIBEXSLT_VERSION ${LIBEXSLT_DOTTED_VERSION})
 
 find_package(LibXml2 CONFIG REQUIRED)
-find_package(Python2 COMPONENTS Interpreter Development)
-find_package(Threads)
-
-check_library_exists(grypt gcry_control "gcrypt.h" HAVE_GCRYPT)
 
 option(BUILD_SHARED_LIBS "Build shared libraries" ON)
 option(LIBXSLT_WITH_DEBUGGER "Add the debugging support" ON)
-
-if(HAVE_GCRYPT)
-       option(LIBXSLT_WITH_CRYPTO "Add crypto support to exslt" ON)
-else()
-       set(LIBXSLT_WITH_CRYPTO OFF)
-endif()
-
+option(LIBXSLT_WITH_CRYPTO "Add crypto support to exslt" OFF)
 option(LIBXSLT_WITH_MEM_DEBUG "Add the memory debugging module" OFF)
 option(LIBXSLT_WITH_MODULES "Add the module support" ON)
 option(LIBXSLT_WITH_PROFILER "Add the profiling support" ON)
+option(LIBXSLT_WITH_PYTHON "Build Python bindings" ON)
+option(LIBXSLT_WITH_THREADS "Add multithread support" ON)
+set(LIBXSLT_WITH_TRIO OFF)
+option(LIBXSLT_WITH_XSLT_DEBUG "Add the debugging code" ON)
+
+if(LIBXSLT_WITH_CRYPTO)
+       find_package(Gcrypt REQUIRED)
+endif()
 
-if(Python2_FOUND)
-       option(LIBXSLT_WITH_PYTHON "Build Python bindings" ON)
+if(LIBXSLT_WITH_PYTHON)
+       find_package(Python2 COMPONENTS Interpreter Development REQUIRED)
        set(LIBXSLT_PYTHON_INSTALL_DIR ${Python2_SITEARCH} CACHE PATH "Python bindings install directory")
-else()
-       set(LIBXSLT_WITH_PYTHON OFF)
 endif()
 
-set(LIBXSLT_WITH_TRIO OFF)
-option(LIBXSLT_WITH_XSLT_DEBUG "Add the debugging code" ON)
+if(LIBXSLT_WITH_THREADS)
+       find_package(Threads REQUIRED)
+endif()
 
 foreach(VARIABLE IN ITEMS WITH_CRYPTO WITH_DEBUGGER WITH_MEM_DEBUG WITH_MODULES WITH_PROFILER WITH_PYTHON 
WITH_TRIO WITH_XSLT_DEBUG)
        if(LIBXSLT_${VARIABLE})
@@ -67,7 +66,11 @@ endforeach()
 
 set(MODULE_EXTENSION "${CMAKE_SHARED_LIBRARY_SUFFIX}")
 
-if(Threads_FOUND)
+if(LIBXSLT_WITH_CRYPTO)
+       list(APPEND CMAKE_REQUIRED_LIBRARIES Gcrypt::Gcrypt)
+endif()
+
+if(LIBXSLT_WITH_THREADS)
        list(APPEND CMAKE_REQUIRED_LIBRARIES Threads::Threads)
 endif()
 
@@ -86,6 +89,7 @@ else()
        check_function_exists(fprintf HAVE_FPRINTF)
        check_include_files(fp_class.h HAVE_FP_CLASS_H)
        check_function_exists(ftime HAVE_FTIME)
+       check_library_exists(gcrypt gcry_control "gcrypt.h" HAVE_GCRYPT)
        check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
        check_function_exists(gmtime HAVE_GMTIME)
        check_function_exists(gmtime_r HAVE_GMTIME_R)
@@ -212,7 +216,7 @@ target_include_directories(
 )
 
 if(LIBXSLT_WITH_CRYPTO)
-       target_link_libraries(LibXslt PRIVATE gcrypt)
+       target_link_libraries(LibXslt PRIVATE Gcrypt::Gcrypt)
 endif()
 
 target_link_libraries(LibXslt PUBLIC LibXml2::LibXml2)
@@ -221,7 +225,7 @@ if(UNIX)
        target_link_libraries(LibXslt PRIVATE m)
 endif()
 
-if(Threads_FOUND)
+if(LIBXSLT_WITH_THREADS)
        target_link_libraries(LibXslt PRIVATE Threads::Threads)
 endif()
 
@@ -300,8 +304,8 @@ target_include_directories(
        $<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>
 )
 
-if(LIBXSLT_WITH_GCRYPT)
-       target_link_libraries(LibExslt PRIVATE gcrypt)
+if(LIBXSLT_WITH_CRYPTO)
+       target_link_libraries(LibExslt PRIVATE Gcrypt::Gcrypt)
 endif()
 
 target_link_libraries(LibExslt PUBLIC LibXslt LibXml2::LibXml2)
@@ -310,7 +314,7 @@ if(UNIX)
        target_link_libraries(LibExslt PRIVATE m)
 endif()
 
-if(Threads_FOUND)
+if(LIBXSLT_WITH_THREADS)
        target_link_libraries(LibExslt PRIVATE Threads::Threads)
 endif()
 
@@ -419,6 +423,10 @@ install(FILES libxslt/libxslt.3 DESTINATION ${CMAKE_INSTALL_MANDIR}/man3 COMPONE
 install(FILES doc/xsltproc.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 COMPONENT documentation)
 install(DIRECTORY doc/ DESTINATION ${CMAKE_INSTALL_DATADIR}/doc/libxslt COMPONENT documentation PATTERN 
Makefile.* EXCLUDE)
 
+if(LIBXSLT_WITH_CRYPTO)
+       install(FILES FindGcrypt.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libxslt-${VERSION} COMPONENT 
development)
+endif()
+
 configure_package_config_file(
        libxslt-config.cmake.in libxslt-config.cmake
        INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libxslt-${VERSION}
diff --git a/FindGcrypt.cmake b/FindGcrypt.cmake
new file mode 100644
index 00000000..781113d5
--- /dev/null
+++ b/FindGcrypt.cmake
@@ -0,0 +1,40 @@
+include(FindPackageHandleStandardArgs)
+include(SelectLibraryConfigurations)
+
+find_path(GCRYPT_INCLUDE_DIRS NAMES gcrypt.h)
+
+mark_as_advanced(GCRYPT_INCLUDE_DIRS)
+
+find_library(GCRYPT_LIBRARY_DEBUG NAMES gcryptd)
+find_library(GCRYPT_LIBRARY_RELEASE NAMES gcrypt)
+
+select_library_configurations(GCRYPT)
+
+if(GCRYPT_INCLUDE_DIRS AND EXISTS "${GCRYPT_INCLUDE_DIRS}/gcrypt.h")
+       file(STRINGS "${GCRYPT_INCLUDE_DIRS}/gcrypt.h" _GCRYPT_VERSION_DEFINE REGEX "#define[\t 
]+GCRYPT_VERSION[\t ]+\"[^\"]*\".*")
+       string(REGEX REPLACE "#define[\t ]+GCRYPT_VERSION[\t ]+\"([^\"]*)\".*" "\\1" GCRYPT_VERSION 
"${_GCRYPT_VERSION_DEFINE}")
+       unset(_GCRYPT_VERSION_DEFINE)
+endif()
+
+find_package_handle_standard_args(
+       Gcrypt
+       FOUND_VAR GCRYPT_FOUND
+       REQUIRED_VARS GCRYPT_INCLUDE_DIRS GCRYPT_LIBRARIES
+       VERSION_VAR GCRYPT_VERSION
+)
+
+if(GCRYPT_FOUND AND NOT TARGET Gcrypt::Gcrypt)
+       add_library(Gcrypt::Gcrypt UNKNOWN IMPORTED)
+       if(GCRYPT_LIBRARY_RELEASE)
+               set_property(TARGET Gcrypt::Gcrypt APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
+               set_target_properties(Gcrypt::Gcrypt PROPERTIES IMPORTED_LOCATION_RELEASE 
"${GCRYPT_LIBRARY_RELEASE}")
+       endif()
+       if(GCRYPT_LIBRARY_DEBUG)
+               set_property(TARGET Gcrypt::Gcrypt APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
+               set_target_properties(Gcrypt::Gcrypt PROPERTIES IMPORTED_LOCATION_DEBUG 
"${GCRYPT_LIBRARY_DEBUG}")
+       endif()
+       set_target_properties(
+               Gcrypt::Gcrypt PROPERTIES
+               INTERFACE_INCLUDE_DIRECTORIES "${GCRYPT_INCLUDE_DIRS}"
+       )
+endif()
diff --git a/libxslt-config.cmake.in b/libxslt-config.cmake.in
index b3f9d2f2..1405e0e6 100644
--- a/libxslt-config.cmake.in
+++ b/libxslt-config.cmake.in
@@ -57,8 +57,11 @@ if(NOT @BUILD_SHARED_LIBS@)
        endif()
 
        if(@LIBXSLT_WITH_CRYPTO@)
-               list(APPEND LIBXSLT_LIBRARIES gcrypt)
-               list(APPEND LIBXSLT_EXSLT_LIBRARIES gcrypt)
+               list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
+               find_dependency(Gcrypt)
+               list(APPEND LIBXSLT_INCLUDE_DIRS ${GCRYPT_INCLUDE_DIRS})
+               list(APPEND LIBXSLT_LIBRARIES ${GCRYPT_LIBRARIES})
+               list(APPEND LIBXSLT_EXSLT_LIBRARIES ${GCRYPT_LIBRARIES})
        endif()
 
        if(UNIX)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]