1# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2# file Copyright.txt or https://cmake.org/licensing for details.
3
4#[=======================================================================[.rst:
5FindLibXslt
6-----------
7
8Find the XSL Transformations, Extensible Stylesheet Language
9Transformations (XSLT) library (LibXslt)
10
11IMPORTED Targets
12^^^^^^^^^^^^^^^^
13
14.. versionadded:: 3.18
15
16The following :prop_tgt:`IMPORTED` targets may be defined:
17
18``LibXslt::LibXslt``
19  If the libxslt library has been found
20``LibXslt::LibExslt``
21  If the libexslt library has been found
22``LibXslt::xsltproc``
23  If the xsltproc command-line executable has been found
24
25Result variables
26^^^^^^^^^^^^^^^^
27
28This module will set the following variables in your project:
29
30  LIBXSLT_FOUND - system has LibXslt
31  LIBXSLT_INCLUDE_DIR - the LibXslt include directory
32  LIBXSLT_LIBRARIES - Link these to LibXslt
33  LIBXSLT_DEFINITIONS - Compiler switches required for using LibXslt
34  LIBXSLT_VERSION_STRING - version of LibXslt found (since CMake 2.8.8)
35
36Additionally, the following two variables are set (but not required
37for using xslt):
38
39``LIBXSLT_EXSLT_INCLUDE_DIR``
40  .. versionadded:: 3.18
41    The include directory for exslt.
42``LIBXSLT_EXSLT_LIBRARIES``
43  Link to these if you need to link against the exslt library.
44``LIBXSLT_XSLTPROC_EXECUTABLE``
45  Contains the full path to the xsltproc executable if found.
46#]=======================================================================]
47
48# use pkg-config to get the directories and then use these values
49# in the find_path() and find_library() calls
50find_package(PkgConfig QUIET)
51PKG_CHECK_MODULES(PC_LIBXSLT QUIET libxslt)
52set(LIBXSLT_DEFINITIONS ${PC_LIBXSLT_CFLAGS_OTHER})
53
54find_path(LIBXSLT_INCLUDE_DIR NAMES libxslt/xslt.h
55    HINTS
56   ${PC_LIBXSLT_INCLUDEDIR}
57   ${PC_LIBXSLT_INCLUDE_DIRS}
58  )
59
60# CMake 3.17 and below used 'LIBXSLT_LIBRARIES' as the name of
61# the cache entry storing the find_library result.  Use the
62# value if it was set by the project or user.
63if(DEFINED LIBXSLT_LIBRARIES AND NOT DEFINED LIBXSLT_LIBRARY)
64  set(LIBXSLT_LIBRARY ${LIBXSLT_LIBRARIES})
65endif()
66
67find_library(LIBXSLT_LIBRARY NAMES xslt libxslt
68    HINTS
69   ${PC_LIBXSLT_LIBDIR}
70   ${PC_LIBXSLT_LIBRARY_DIRS}
71  )
72
73set(LIBXSLT_LIBRARIES ${LIBXSLT_LIBRARY})
74
75PKG_CHECK_MODULES(PC_LIBXSLT_EXSLT QUIET libexslt)
76set(LIBXSLT_EXSLT_DEFINITIONS ${PC_LIBXSLT_EXSLT_CFLAGS_OTHER})
77
78find_path(LIBXSLT_EXSLT_INCLUDE_DIR NAMES libexslt/exslt.h
79  HINTS
80  ${PC_LIBXSLT_EXSLT_INCLUDEDIR}
81  ${PC_LIBXSLT_EXSLT_INCLUDE_DIRS}
82)
83
84find_library(LIBXSLT_EXSLT_LIBRARY NAMES exslt libexslt
85    HINTS
86    ${PC_LIBXSLT_LIBDIR}
87    ${PC_LIBXSLT_LIBRARY_DIRS}
88    ${PC_LIBXSLT_EXSLT_LIBDIR}
89    ${PC_LIBXSLT_EXSLT_LIBRARY_DIRS}
90  )
91
92set(LIBXSLT_EXSLT_LIBRARIES ${LIBXSLT_EXSLT_LIBRARY} )
93
94find_program(LIBXSLT_XSLTPROC_EXECUTABLE xsltproc)
95
96if(PC_LIBXSLT_VERSION)
97    set(LIBXSLT_VERSION_STRING ${PC_LIBXSLT_VERSION})
98elseif(LIBXSLT_INCLUDE_DIR AND EXISTS "${LIBXSLT_INCLUDE_DIR}/libxslt/xsltconfig.h")
99    file(STRINGS "${LIBXSLT_INCLUDE_DIR}/libxslt/xsltconfig.h" libxslt_version_str
100         REGEX "^#define[\t ]+LIBXSLT_DOTTED_VERSION[\t ]+\".*\"")
101
102    string(REGEX REPLACE "^#define[\t ]+LIBXSLT_DOTTED_VERSION[\t ]+\"([^\"]*)\".*" "\\1"
103           LIBXSLT_VERSION_STRING "${libxslt_version_str}")
104    unset(libxslt_version_str)
105endif()
106
107include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
108FIND_PACKAGE_HANDLE_STANDARD_ARGS(LibXslt
109                                  REQUIRED_VARS LIBXSLT_LIBRARIES LIBXSLT_INCLUDE_DIR
110                                  VERSION_VAR LIBXSLT_VERSION_STRING)
111
112mark_as_advanced(LIBXSLT_INCLUDE_DIR
113                 LIBXSLT_LIBRARIES
114                 LIBXSLT_EXSLT_LIBRARY
115                 LIBXSLT_XSLTPROC_EXECUTABLE)
116
117if(LIBXSLT_FOUND AND NOT TARGET LibXslt::LibXslt)
118  add_library(LibXslt::LibXslt UNKNOWN IMPORTED)
119  set_target_properties(LibXslt::LibXslt PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${LIBXSLT_INCLUDE_DIR}")
120  set_target_properties(LibXslt::LibXslt PROPERTIES INTERFACE_COMPILE_OPTIONS "${LIBXSLT_DEFINITIONS}")
121  set_property(TARGET LibXslt::LibXslt APPEND PROPERTY IMPORTED_LOCATION "${LIBXSLT_LIBRARY}")
122endif()
123
124if(LIBXSLT_FOUND AND NOT TARGET LibXslt::LibExslt)
125  add_library(LibXslt::LibExslt UNKNOWN IMPORTED)
126  set_target_properties(LibXslt::LibExslt PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${LIBXSLT_EXSLT_INCLUDE_DIR}")
127  set_target_properties(LibXslt::LibExslt PROPERTIES INTERFACE_COMPILE_OPTIONS "${LIBXSLT_EXSLT_DEFINITIONS}")
128  set_property(TARGET LibXslt::LibExslt APPEND PROPERTY IMPORTED_LOCATION "${LIBXSLT_EXSLT_LIBRARY}")
129endif()
130
131if(LIBXSLT_XSLTPROC_EXECUTABLE AND NOT TARGET LibXslt::xsltproc)
132  add_executable(LibXslt::xsltproc IMPORTED)
133  set_target_properties(LibXslt::xsltproc PROPERTIES IMPORTED_LOCATION "${LIBXSLT_XSLTPROC_EXECUTABLE}")
134endif()
135