FindPAM.cmake 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. # FindPAM.cmake - Find PAM (Pluggable Authentication Modules) library
  2. #
  3. # This module defines:
  4. # PAM_FOUND - True if PAM is found
  5. # PAM_INCLUDE_DIRS - Include directories for PAM
  6. # PAM_LIBRARIES - Libraries to link against
  7. # PAM_VERSION - Version of PAM (if available)
  8. # Try to find PAM using pkg-config first
  9. find_package(PkgConfig QUIET)
  10. if(PKG_CONFIG_FOUND)
  11. pkg_check_modules(PAM QUIET pam)
  12. endif()
  13. # If pkg-config didn't find it, try manual search
  14. if(NOT PAM_FOUND)
  15. # Find the header file
  16. find_path(PAM_INCLUDE_DIR
  17. NAMES security/pam_appl.h pam/pam_appl.h
  18. PATHS
  19. /usr/include
  20. /usr/local/include
  21. /opt/local/include
  22. /sw/include
  23. DOC "PAM include directory"
  24. )
  25. # Find the library
  26. find_library(PAM_LIBRARY
  27. NAMES pam libpam
  28. PATHS
  29. /usr/lib
  30. /usr/local/lib
  31. /opt/local/lib
  32. /sw/lib
  33. /usr/lib/x86_64-linux-gnu
  34. /usr/lib/aarch64-linux-gnu
  35. /usr/lib/arm-linux-gnueabihf
  36. DOC "PAM library"
  37. )
  38. # Set the variables
  39. if(PAM_INCLUDE_DIR AND PAM_LIBRARY)
  40. set(PAM_FOUND TRUE)
  41. set(PAM_INCLUDE_DIRS ${PAM_INCLUDE_DIR})
  42. set(PAM_LIBRARIES ${PAM_LIBRARY})
  43. endif()
  44. endif()
  45. # Try to get version information
  46. if(PAM_FOUND)
  47. # Try to extract version from header
  48. if(EXISTS "${PAM_INCLUDE_DIRS}/security/pam_appl.h")
  49. file(READ "${PAM_INCLUDE_DIRS}/security/pam_appl.h" PAM_HEADER_CONTENT)
  50. string(REGEX MATCH "PAM_VERSION_MAJOR[ ]+([0-9]+)" PAM_VERSION_MAJOR_MATCH "${PAM_HEADER_CONTENT}")
  51. string(REGEX MATCH "PAM_VERSION_MINOR[ ]+([0-9]+)" PAM_VERSION_MINOR_MATCH "${PAM_HEADER_CONTENT}")
  52. string(REGEX MATCH "PAM_VERSION_PATCH[ ]+([0-9]+)" PAM_VERSION_PATCH_MATCH "${PAM_HEADER_CONTENT}")
  53. if(PAM_VERSION_MAJOR_MATCH AND PAM_VERSION_MINOR_MATCH AND PAM_VERSION_PATCH_MATCH)
  54. string(REGEX REPLACE "PAM_VERSION_MAJOR[ ]+([0-9]+)" "\\1" PAM_VERSION_MAJOR "${PAM_VERSION_MAJOR_MATCH}")
  55. string(REGEX REPLACE "PAM_VERSION_MINOR[ ]+([0-9]+)" "\\1" PAM_VERSION_MINOR "${PAM_VERSION_MINOR_MATCH}")
  56. string(REGEX REPLACE "PAM_VERSION_PATCH[ ]+([0-9]+)" "\\1" PAM_VERSION_PATCH "${PAM_VERSION_PATCH_MATCH}")
  57. set(PAM_VERSION "${PAM_VERSION_MAJOR}.${PAM_VERSION_MINOR}.${PAM_VERSION_PATCH}")
  58. endif()
  59. endif()
  60. # Fallback: try to get version from pkg-config
  61. if(NOT PAM_VERSION AND PKG_CONFIG_FOUND)
  62. pkg_get_variable(PAM_VERSION pam version)
  63. endif()
  64. # If still no version, set a default
  65. if(NOT PAM_VERSION)
  66. set(PAM_VERSION "Unknown")
  67. endif()
  68. endif()
  69. # Handle the QUIETLY and REQUIRED arguments
  70. include(FindPackageHandleStandardArgs)
  71. find_package_handle_standard_args(PAM
  72. REQUIRED_VARS PAM_LIBRARIES PAM_INCLUDE_DIRS
  73. VERSION_VAR PAM_VERSION
  74. )
  75. # Create imported target if found
  76. if(PAM_FOUND AND NOT TARGET PAM::PAM)
  77. add_library(PAM::PAM UNKNOWN IMPORTED)
  78. set_target_properties(PAM::PAM PROPERTIES
  79. IMPORTED_LOCATION "${PAM_LIBRARIES}"
  80. INTERFACE_INCLUDE_DIRECTORIES "${PAM_INCLUDE_DIRS}"
  81. )
  82. endif()
  83. # Mark variables as advanced
  84. mark_as_advanced(PAM_INCLUDE_DIR PAM_LIBRARY)