FindLibLZMA.cmake 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. # file LICENSE.rst or https://cmake.org/licensing for details.
  3. #[=======================================================================[.rst:
  4. FindLibLZMA
  5. -----------
  6. Finds the liblzma, a data compression library that implements the LZMA
  7. (Lempel–Ziv–Markov chain algorithm):
  8. .. code-block:: cmake
  9. find_package(LibLZMA [<version>] [...])
  10. Imported Targets
  11. ^^^^^^^^^^^^^^^^
  12. This module provides the following :ref:`Imported Targets`:
  13. ``LibLZMA::LibLZMA``
  14. .. versionadded:: 3.14
  15. Target encapsulating the liblzma library usage requirements, available only if
  16. liblzma is found.
  17. Result Variables
  18. ^^^^^^^^^^^^^^^^
  19. This module defines the following variables:
  20. ``LibLZMA_FOUND``
  21. .. versionadded:: 3.3
  22. Boolean indicating whether (the requested version of) liblzma was found.
  23. ``LibLZMA_VERSION``
  24. .. versionadded:: 4.2
  25. The version of liblzma found (available as a string, for example, ``5.0.3``).
  26. ``LIBLZMA_INCLUDE_DIRS``
  27. Include directories containing headers needed to use liblzma.
  28. ``LIBLZMA_LIBRARIES``
  29. Libraries needed to link against to use liblzma.
  30. Cache Variables
  31. ^^^^^^^^^^^^^^^
  32. The following cache variables may also be set:
  33. ``LIBLZMA_HAS_AUTO_DECODER``
  34. Boolean sanity check result indicating whether the ``lzma_auto_decoder()``
  35. function (automatic decoder functionality) is found in liblzma (required).
  36. ``LIBLZMA_HAS_EASY_ENCODER``
  37. Boolean sanity check result indicating whether the ``lzma_easy_encoder()``
  38. function (basic encoder API) is found in liblzma (required).
  39. ``LIBLZMA_HAS_LZMA_PRESET``
  40. Boolean sanity check result indicating whether the ``lzma_lzma_preset()``
  41. function (preset compression configuration) is found in liblzma (required).
  42. Deprecated Variables
  43. ^^^^^^^^^^^^^^^^^^^^
  44. The following variables are provided for backward compatibility:
  45. ``LIBLZMA_FOUND``
  46. .. deprecated:: 4.2
  47. Use ``LibLZMA_FOUND``, which has the same value.
  48. Boolean indicating whether (the requested version of) liblzma was found.
  49. ``LIBLZMA_VERSION``
  50. .. versionadded:: 3.26
  51. .. deprecated:: 4.2
  52. Superseded by the ``LibLZMA_VERSION``.
  53. The version of liblzma found.
  54. ``LIBLZMA_VERSION_STRING``
  55. .. deprecated:: 3.26
  56. Superseded by the ``LIBLZMA_VERSION`` (and ``LibLZMA_VERSION``).
  57. The version of liblzma found.
  58. ``LIBLZMA_VERSION_MAJOR``
  59. .. deprecated:: 3.26
  60. The major version of liblzma found.
  61. ``LIBLZMA_VERSION_MINOR``
  62. .. deprecated:: 3.26
  63. The minor version of liblzma found.
  64. ``LIBLZMA_VERSION_PATCH``
  65. .. deprecated:: 3.26
  66. The patch version of liblzma found.
  67. Examples
  68. ^^^^^^^^
  69. Finding the liblzma library and linking it to a project target:
  70. .. code-block:: cmake
  71. find_package(LibLZMA)
  72. target_link_libraries(project_target PRIVATE LibLZMA::LibLZMA)
  73. #]=======================================================================]
  74. cmake_policy(PUSH)
  75. cmake_policy(SET CMP0159 NEW) # file(STRINGS) with REGEX updates CMAKE_MATCH_<n>
  76. find_path(LIBLZMA_INCLUDE_DIR lzma.h )
  77. if(NOT LIBLZMA_LIBRARY)
  78. find_library(LIBLZMA_LIBRARY_RELEASE NAMES lzma liblzma NAMES_PER_DIR PATH_SUFFIXES lib)
  79. find_library(LIBLZMA_LIBRARY_DEBUG NAMES lzmad liblzmad NAMES_PER_DIR PATH_SUFFIXES lib)
  80. include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake)
  81. select_library_configurations(LIBLZMA)
  82. else()
  83. file(TO_CMAKE_PATH "${LIBLZMA_LIBRARY}" LIBLZMA_LIBRARY)
  84. endif()
  85. if(LIBLZMA_INCLUDE_DIR AND EXISTS "${LIBLZMA_INCLUDE_DIR}/lzma/version.h")
  86. file(STRINGS "${LIBLZMA_INCLUDE_DIR}/lzma/version.h" LIBLZMA_HEADER_CONTENTS REGEX "#define LZMA_VERSION_[A-Z]+ [0-9]+")
  87. string(REGEX REPLACE ".*#define LZMA_VERSION_MAJOR ([0-9]+).*" "\\1" LIBLZMA_VERSION_MAJOR "${LIBLZMA_HEADER_CONTENTS}")
  88. string(REGEX REPLACE ".*#define LZMA_VERSION_MINOR ([0-9]+).*" "\\1" LIBLZMA_VERSION_MINOR "${LIBLZMA_HEADER_CONTENTS}")
  89. string(REGEX REPLACE ".*#define LZMA_VERSION_PATCH ([0-9]+).*" "\\1" LIBLZMA_VERSION_PATCH "${LIBLZMA_HEADER_CONTENTS}")
  90. set(LibLZMA_VERSION "${LIBLZMA_VERSION_MAJOR}.${LIBLZMA_VERSION_MINOR}.${LIBLZMA_VERSION_PATCH}")
  91. set(LIBLZMA_VERSION "${LibLZMA_VERSION}")
  92. set(LIBLZMA_VERSION_STRING "${LibLZMA_VERSION}")
  93. unset(LIBLZMA_HEADER_CONTENTS)
  94. endif()
  95. # We're using new code known now as XZ, even library still been called LZMA
  96. # it can be found in http://tukaani.org/xz/
  97. # Avoid using old codebase
  98. if (LIBLZMA_LIBRARY)
  99. include(${CMAKE_CURRENT_LIST_DIR}/CheckLibraryExists.cmake)
  100. set(CMAKE_REQUIRED_QUIET_SAVE ${CMAKE_REQUIRED_QUIET})
  101. set(CMAKE_REQUIRED_QUIET ${LibLZMA_FIND_QUIETLY})
  102. if(NOT LIBLZMA_LIBRARY_RELEASE AND NOT LIBLZMA_LIBRARY_DEBUG)
  103. set(LIBLZMA_LIBRARY_check ${LIBLZMA_LIBRARY})
  104. elseif(LIBLZMA_LIBRARY_RELEASE)
  105. set(LIBLZMA_LIBRARY_check ${LIBLZMA_LIBRARY_RELEASE})
  106. elseif(LIBLZMA_LIBRARY_DEBUG)
  107. set(LIBLZMA_LIBRARY_check ${LIBLZMA_LIBRARY_DEBUG})
  108. endif()
  109. check_library_exists(${LIBLZMA_LIBRARY_check} lzma_auto_decoder "" LIBLZMA_HAS_AUTO_DECODER)
  110. check_library_exists(${LIBLZMA_LIBRARY_check} lzma_easy_encoder "" LIBLZMA_HAS_EASY_ENCODER)
  111. check_library_exists(${LIBLZMA_LIBRARY_check} lzma_lzma_preset "" LIBLZMA_HAS_LZMA_PRESET)
  112. unset(LIBLZMA_LIBRARY_check)
  113. set(CMAKE_REQUIRED_QUIET ${CMAKE_REQUIRED_QUIET_SAVE})
  114. endif ()
  115. include(FindPackageHandleStandardArgs)
  116. find_package_handle_standard_args(LibLZMA REQUIRED_VARS LIBLZMA_LIBRARY
  117. LIBLZMA_INCLUDE_DIR
  118. LIBLZMA_HAS_AUTO_DECODER
  119. LIBLZMA_HAS_EASY_ENCODER
  120. LIBLZMA_HAS_LZMA_PRESET
  121. VERSION_VAR LibLZMA_VERSION
  122. )
  123. mark_as_advanced( LIBLZMA_INCLUDE_DIR LIBLZMA_LIBRARY )
  124. if (LibLZMA_FOUND)
  125. set(LIBLZMA_LIBRARIES ${LIBLZMA_LIBRARY})
  126. set(LIBLZMA_INCLUDE_DIRS ${LIBLZMA_INCLUDE_DIR})
  127. if(NOT TARGET LibLZMA::LibLZMA)
  128. add_library(LibLZMA::LibLZMA UNKNOWN IMPORTED)
  129. set_target_properties(LibLZMA::LibLZMA PROPERTIES
  130. INTERFACE_INCLUDE_DIRECTORIES "${LIBLZMA_INCLUDE_DIR}"
  131. IMPORTED_LINK_INTERFACE_LANGUAGES C)
  132. if(LIBLZMA_LIBRARY_RELEASE)
  133. set_property(TARGET LibLZMA::LibLZMA APPEND PROPERTY
  134. IMPORTED_CONFIGURATIONS RELEASE)
  135. set_target_properties(LibLZMA::LibLZMA PROPERTIES
  136. IMPORTED_LOCATION_RELEASE "${LIBLZMA_LIBRARY_RELEASE}")
  137. endif()
  138. if(LIBLZMA_LIBRARY_DEBUG)
  139. set_property(TARGET LibLZMA::LibLZMA APPEND PROPERTY
  140. IMPORTED_CONFIGURATIONS DEBUG)
  141. set_target_properties(LibLZMA::LibLZMA PROPERTIES
  142. IMPORTED_LOCATION_DEBUG "${LIBLZMA_LIBRARY_DEBUG}")
  143. endif()
  144. if(NOT LIBLZMA_LIBRARY_RELEASE AND NOT LIBLZMA_LIBRARY_DEBUG)
  145. set_target_properties(LibLZMA::LibLZMA PROPERTIES
  146. IMPORTED_LOCATION "${LIBLZMA_LIBRARY}")
  147. endif()
  148. endif()
  149. endif ()
  150. cmake_policy(POP)