FindLibLZMA.cmake 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. # file Copyright.txt or https://cmake.org/licensing for details.
  3. #[=======================================================================[.rst:
  4. FindLibLZMA
  5. -----------
  6. Find LZMA compression algorithm headers and library.
  7. Imported Targets
  8. ^^^^^^^^^^^^^^^^
  9. .. versionadded:: 3.14
  10. This module defines :prop_tgt:`IMPORTED` target ``LibLZMA::LibLZMA``, if
  11. liblzma has been found.
  12. Result variables
  13. ^^^^^^^^^^^^^^^^
  14. This module will set the following variables in your project:
  15. ``LIBLZMA_FOUND``
  16. True if liblzma headers and library were found.
  17. ``LIBLZMA_INCLUDE_DIRS``
  18. Directory where liblzma headers are located.
  19. ``LIBLZMA_LIBRARIES``
  20. Lzma libraries to link against.
  21. ``LIBLZMA_HAS_AUTO_DECODER``
  22. True if lzma_auto_decoder() is found (required).
  23. ``LIBLZMA_HAS_EASY_ENCODER``
  24. True if lzma_easy_encoder() is found (required).
  25. ``LIBLZMA_HAS_LZMA_PRESET``
  26. True if lzma_lzma_preset() is found (required).
  27. ``LIBLZMA_VERSION``
  28. .. versionadded:: 3.26
  29. the version of LZMA found.
  30. See also legacy variable ``LIBLZMA_VERSION_STRING``.
  31. Legacy Variables
  32. ^^^^^^^^^^^^^^^^
  33. The following variables are provided for backward compatibility:
  34. ``LIBLZMA_VERSION_MAJOR``
  35. The major version of lzma
  36. ``LIBLZMA_VERSION_MINOR``
  37. The minor version of lzma
  38. ``LIBLZMA_VERSION_PATCH``
  39. The patch version of lzma
  40. ``LIBLZMA_VERSION_STRING``
  41. version number as a string (ex: "5.0.3")
  42. .. versionchanged:: 3.26
  43. Superseded by ``LIBLZMA_VERSION``.
  44. #]=======================================================================]
  45. cmake_policy(PUSH)
  46. cmake_policy(SET CMP0159 NEW) # file(STRINGS) with REGEX updates CMAKE_MATCH_<n>
  47. find_path(LIBLZMA_INCLUDE_DIR lzma.h )
  48. if(NOT LIBLZMA_LIBRARY)
  49. find_library(LIBLZMA_LIBRARY_RELEASE NAMES lzma liblzma NAMES_PER_DIR PATH_SUFFIXES lib)
  50. find_library(LIBLZMA_LIBRARY_DEBUG NAMES lzmad liblzmad NAMES_PER_DIR PATH_SUFFIXES lib)
  51. include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake)
  52. select_library_configurations(LIBLZMA)
  53. else()
  54. file(TO_CMAKE_PATH "${LIBLZMA_LIBRARY}" LIBLZMA_LIBRARY)
  55. endif()
  56. if(LIBLZMA_INCLUDE_DIR AND EXISTS "${LIBLZMA_INCLUDE_DIR}/lzma/version.h")
  57. file(STRINGS "${LIBLZMA_INCLUDE_DIR}/lzma/version.h" LIBLZMA_HEADER_CONTENTS REGEX "#define LZMA_VERSION_[A-Z]+ [0-9]+")
  58. string(REGEX REPLACE ".*#define LZMA_VERSION_MAJOR ([0-9]+).*" "\\1" LIBLZMA_VERSION_MAJOR "${LIBLZMA_HEADER_CONTENTS}")
  59. string(REGEX REPLACE ".*#define LZMA_VERSION_MINOR ([0-9]+).*" "\\1" LIBLZMA_VERSION_MINOR "${LIBLZMA_HEADER_CONTENTS}")
  60. string(REGEX REPLACE ".*#define LZMA_VERSION_PATCH ([0-9]+).*" "\\1" LIBLZMA_VERSION_PATCH "${LIBLZMA_HEADER_CONTENTS}")
  61. set(LIBLZMA_VERSION_STRING "${LIBLZMA_VERSION_MAJOR}.${LIBLZMA_VERSION_MINOR}.${LIBLZMA_VERSION_PATCH}")
  62. set(LIBLZMA_VERSION ${LIBLZMA_VERSION_STRING})
  63. unset(LIBLZMA_HEADER_CONTENTS)
  64. endif()
  65. # We're using new code known now as XZ, even library still been called LZMA
  66. # it can be found in http://tukaani.org/xz/
  67. # Avoid using old codebase
  68. if (LIBLZMA_LIBRARY)
  69. include(${CMAKE_CURRENT_LIST_DIR}/CheckLibraryExists.cmake)
  70. set(CMAKE_REQUIRED_QUIET_SAVE ${CMAKE_REQUIRED_QUIET})
  71. set(CMAKE_REQUIRED_QUIET ${LibLZMA_FIND_QUIETLY})
  72. if(NOT LIBLZMA_LIBRARY_RELEASE AND NOT LIBLZMA_LIBRARY_DEBUG)
  73. set(LIBLZMA_LIBRARY_check ${LIBLZMA_LIBRARY})
  74. elseif(LIBLZMA_LIBRARY_RELEASE)
  75. set(LIBLZMA_LIBRARY_check ${LIBLZMA_LIBRARY_RELEASE})
  76. elseif(LIBLZMA_LIBRARY_DEBUG)
  77. set(LIBLZMA_LIBRARY_check ${LIBLZMA_LIBRARY_DEBUG})
  78. endif()
  79. check_library_exists(${LIBLZMA_LIBRARY_check} lzma_auto_decoder "" LIBLZMA_HAS_AUTO_DECODER)
  80. check_library_exists(${LIBLZMA_LIBRARY_check} lzma_easy_encoder "" LIBLZMA_HAS_EASY_ENCODER)
  81. check_library_exists(${LIBLZMA_LIBRARY_check} lzma_lzma_preset "" LIBLZMA_HAS_LZMA_PRESET)
  82. unset(LIBLZMA_LIBRARY_check)
  83. set(CMAKE_REQUIRED_QUIET ${CMAKE_REQUIRED_QUIET_SAVE})
  84. endif ()
  85. include(FindPackageHandleStandardArgs)
  86. find_package_handle_standard_args(LibLZMA REQUIRED_VARS LIBLZMA_LIBRARY
  87. LIBLZMA_INCLUDE_DIR
  88. LIBLZMA_HAS_AUTO_DECODER
  89. LIBLZMA_HAS_EASY_ENCODER
  90. LIBLZMA_HAS_LZMA_PRESET
  91. VERSION_VAR LIBLZMA_VERSION
  92. )
  93. mark_as_advanced( LIBLZMA_INCLUDE_DIR LIBLZMA_LIBRARY )
  94. if (LIBLZMA_FOUND)
  95. set(LIBLZMA_LIBRARIES ${LIBLZMA_LIBRARY})
  96. set(LIBLZMA_INCLUDE_DIRS ${LIBLZMA_INCLUDE_DIR})
  97. if(NOT TARGET LibLZMA::LibLZMA)
  98. add_library(LibLZMA::LibLZMA UNKNOWN IMPORTED)
  99. set_target_properties(LibLZMA::LibLZMA PROPERTIES
  100. INTERFACE_INCLUDE_DIRECTORIES "${LIBLZMA_INCLUDE_DIR}"
  101. IMPORTED_LINK_INTERFACE_LANGUAGES C)
  102. if(LIBLZMA_LIBRARY_RELEASE)
  103. set_property(TARGET LibLZMA::LibLZMA APPEND PROPERTY
  104. IMPORTED_CONFIGURATIONS RELEASE)
  105. set_target_properties(LibLZMA::LibLZMA PROPERTIES
  106. IMPORTED_LOCATION_RELEASE "${LIBLZMA_LIBRARY_RELEASE}")
  107. endif()
  108. if(LIBLZMA_LIBRARY_DEBUG)
  109. set_property(TARGET LibLZMA::LibLZMA APPEND PROPERTY
  110. IMPORTED_CONFIGURATIONS DEBUG)
  111. set_target_properties(LibLZMA::LibLZMA PROPERTIES
  112. IMPORTED_LOCATION_DEBUG "${LIBLZMA_LIBRARY_DEBUG}")
  113. endif()
  114. if(NOT LIBLZMA_LIBRARY_RELEASE AND NOT LIBLZMA_LIBRARY_DEBUG)
  115. set_target_properties(LibLZMA::LibLZMA PROPERTIES
  116. IMPORTED_LOCATION "${LIBLZMA_LIBRARY}")
  117. endif()
  118. endif()
  119. endif ()
  120. cmake_policy(POP)