Rapid spam filtering system https://rspamd.com/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

126 lines
5.6 KiB

  1. # Process required package by using FindPackage and calling for INCLUDE_DIRECTORIES and
  2. # setting list of required libraries
  3. # Usage:
  4. # ProcessPackage(VAR [OPTIONAL] [ROOT path] [INCLUDE path]
  5. # [LIBRARY path] [INCLUDE_SUFFIXES path1 path2 ...] [LIB_SUFFIXES path1 path2 ...]
  6. # [MODULES module1 module2 ...])
  7. # params:
  8. # OPTIONAL - do not fail if a package has not been found
  9. # ROOT - defines root directory for a package
  10. # INCLUDE - name of the include file to check
  11. # LIBRARY - name of the library to check
  12. # INCLUDE_SUFFIXES - list of include suffixes (relative to ROOT)
  13. # LIB_SUFFIXES - list of library suffixes
  14. # MODULES - modules to search using pkg_config
  15. MACRO(ProcessPackage PKG_NAME)
  16. CMAKE_PARSE_ARGUMENTS(PKG "OPTIONAL;OPTIONAL_INCLUDE" "ROOT;INCLUDE"
  17. "LIBRARY;INCLUDE_SUFFIXES;LIB_SUFFIXES;MODULES;LIB_OUTPUT" ${ARGN})
  18. IF(NOT PKG_LIBRARY)
  19. SET(PKG_LIBRARY "${PKG_NAME}")
  20. ENDIF()
  21. IF(NOT PKG_INCLUDE)
  22. SET(PKG_INCLUDE "${PKG_NAME}.h")
  23. ENDIF()
  24. IF(NOT PKG_LIB_OUTPUT)
  25. SET(PKG_LIB_OUTPUT RSPAMD_REQUIRED_LIBRARIES)
  26. ENDIF()
  27. IF(NOT PKG_ROOT AND PKG_MODULES)
  28. PKG_SEARCH_MODULE(${PKG_NAME} ${PKG_MODULES})
  29. ENDIF()
  30. IF(${PKG_NAME}_FOUND)
  31. SET(_ver ${${PKG_NAME}_VERSION})
  32. IF(_ver)
  33. MESSAGE(STATUS "Found package ${PKG_NAME} (${_ver}) in pkg-config modules ${PKG_MODULES}")
  34. ELSE()
  35. MESSAGE(STATUS "Found package ${PKG_NAME} in pkg-config modules ${PKG_MODULES}")
  36. ENDIF()
  37. SET(WITH_${PKG_NAME} 1 CACHE INTERNAL "")
  38. IF(ENABLE_STATIC MATCHES "ON")
  39. SET(_XPREFIX "${PKG_NAME}_STATIC")
  40. ELSE(ENABLE_STATIC MATCHES "ON")
  41. SET(_XPREFIX "${PKG_NAME}")
  42. ENDIF(ENABLE_STATIC MATCHES "ON")
  43. FOREACH(_arg ${${_XPREFIX}_INCLUDE_DIRS})
  44. INCLUDE_DIRECTORIES("${_arg}")
  45. SET(${PKG_NAME}_INCLUDE "${_arg}" CACHE INTERNAL "")
  46. ENDFOREACH(_arg ${${_XPREFIX}_INCLUDE_DIRS})
  47. FOREACH(_arg ${${_XPREFIX}_LIBRARY_DIRS})
  48. LINK_DIRECTORIES("${_arg}")
  49. SET(${PKG_NAME}_LIBRARY_PATH "${_arg}" CACHE INTERNAL "")
  50. ENDFOREACH(_arg ${${_XPREFIX}_LIBRARY_DIRS})
  51. # Handle other CFLAGS and LDFLAGS
  52. FOREACH(_arg ${${_XPREFIX}_CFLAGS_OTHER})
  53. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_arg}")
  54. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_arg}")
  55. ENDFOREACH(_arg ${${_XPREFIX}_CFLAGS_OTHER})
  56. FOREACH(_arg ${${_XPREFIX}_LDFLAGS_OTHER})
  57. SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${_arg}")
  58. ENDFOREACH(_arg ${${_XPREFIX}_LDFLAGS_OTHER})
  59. LIST(APPEND ${PKG_LIB_OUTPUT} "${${_XPREFIX}_LIBRARIES}")
  60. INCLUDE_DIRECTORIES(${${_XPREFIX}_INCLUDEDIR})
  61. ELSE()
  62. IF(NOT ${PKG_NAME}_GUESSED)
  63. # Try some more heuristic
  64. FIND_LIBRARY(_lib NAMES ${PKG_LIBRARY}
  65. HINTS ${PKG_ROOT} ${RSPAMD_SEARCH_PATH}
  66. PATH_SUFFIXES ${PKG_LIB_SUFFIXES} lib64 lib
  67. PATHS ${RSPAMD_DEFAULT_LIBRARY_PATHS})
  68. IF(NOT _lib)
  69. IF(PKG_OPTIONAL)
  70. MESSAGE(STATUS "Cannot find library ${PKG_LIBRARY} for package ${PKG_NAME}, ignoring")
  71. ELSE()
  72. MESSAGE(FATAL_ERROR "Cannot find library ${PKG_LIBRARY} for package ${PKG_NAME}")
  73. ENDIF()
  74. ENDIF(NOT _lib)
  75. FIND_PATH(_incl ${PKG_INCLUDE}
  76. HINTS ${PKG_ROOT} ${RSPAMD_SEARCH_PATH}
  77. PATH_SUFFIXES ${PKG_INCLUDE_SUFFIXES} include
  78. PATHS {RSPAMD_DEFAULT_INCLUDE_PATHS})
  79. IF(NOT _incl)
  80. IF(PKG_OPTIONAL OR PKG_OPTIONAL_INCLUDE)
  81. MESSAGE(STATUS "Cannot find header ${PKG_INCLUDE} for package ${PKG_NAME}")
  82. ELSE()
  83. MESSAGE(FATAL_ERROR "Cannot find header ${PKG_INCLUDE} for package ${PKG_NAME}")
  84. ENDIF()
  85. ELSE()
  86. STRING(REGEX REPLACE "/[^/]+$" "" _incl_path "${PKG_INCLUDE}")
  87. STRING(REGEX REPLACE "${_incl_path}/$" "" _stripped_incl "${_incl}")
  88. INCLUDE_DIRECTORIES("${_stripped_incl}")
  89. SET(${PKG_NAME}_INCLUDE "${_stripped_incl}" CACHE INTERNAL "")
  90. ENDIF(NOT _incl)
  91. IF(_lib)
  92. # We need to apply heuristic to find the real dir name
  93. GET_FILENAME_COMPONENT(_lib_path "${_lib}" PATH)
  94. LINK_DIRECTORIES("${_lib_path}")
  95. LIST(APPEND ${PKG_LIB_OUTPUT} ${_lib})
  96. SET(${PKG_NAME}_LIBRARY_PATH "${_lib_path}" CACHE INTERNAL "")
  97. SET(${PKG_NAME}_LIBRARY "${_lib}" CACHE INTERNAL "")
  98. ENDIF()
  99. IF(_incl AND _lib)
  100. MESSAGE(STATUS "Found package ${PKG_NAME} in '${_lib_path}' (${_lib}) and '${_stripped_incl}' (${PKG_INCLUDE}).")
  101. SET(${PKG_NAME}_GUESSED 1 CACHE INTERNAL "")
  102. SET(WITH_${PKG_NAME} 1 CACHE INTERNAL "")
  103. ELSEIF(_lib)
  104. IF(PKG_OPTIONAL_INCLUDE)
  105. SET(${PKG_NAME}_GUESSED 1 INTERNAL "")
  106. SET(WITH_${PKG_NAME} 1 INTERNAL "")
  107. ENDIF()
  108. MESSAGE(STATUS "Found incomplete package ${PKG_NAME} in '${_lib_path}' (${_lib}); no includes.")
  109. ENDIF()
  110. ELSE()
  111. MESSAGE(STATUS "Found package ${PKG_NAME} (cached)")
  112. INCLUDE_DIRECTORIES("${${PKG_NAME}_INCLUDE}")
  113. LINK_DIRECTORIES("${${PKG_NAME}_LIBRARY_PATH}")
  114. LIST(APPEND ${PKG_LIB_OUTPUT} "${${PKG_NAME}_LIBRARY}")
  115. ENDIF()
  116. ENDIF(${PKG_NAME}_FOUND)
  117. UNSET(_lib CACHE)
  118. UNSET(_incl CACHE)
  119. ENDMACRO(ProcessPackage name)