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.

ProcessPackage.cmake 5.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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. MESSAGE(STATUS "Found package ${PKG_NAME} in pkg-config modules ${PKG_MODULES}")
  32. SET(WITH_${PKG_NAME} 1 CACHE INTERNAL "")
  33. IF(ENABLE_STATIC MATCHES "ON")
  34. SET(_XPREFIX "${PKG_NAME}_STATIC")
  35. ELSE(ENABLE_STATIC MATCHES "ON")
  36. SET(_XPREFIX "${PKG_NAME}")
  37. ENDIF(ENABLE_STATIC MATCHES "ON")
  38. FOREACH(_arg ${${_XPREFIX}_INCLUDE_DIRS})
  39. INCLUDE_DIRECTORIES("${_arg}")
  40. SET(${PKG_NAME}_INCLUDE "${_arg}" CACHE INTERNAL "")
  41. ENDFOREACH(_arg ${${_XPREFIX}_INCLUDE_DIRS})
  42. FOREACH(_arg ${${_XPREFIX}_LIBRARY_DIRS})
  43. LINK_DIRECTORIES("${_arg}")
  44. SET(${PKG_NAME}_LIBRARY_PATH "${_arg}" CACHE INTERNAL "")
  45. ENDFOREACH(_arg ${${_XPREFIX}_LIBRARY_DIRS})
  46. # Handle other CFLAGS and LDFLAGS
  47. FOREACH(_arg ${${_XPREFIX}_CFLAGS_OTHER})
  48. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_arg}")
  49. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_arg}")
  50. ENDFOREACH(_arg ${${_XPREFIX}_CFLAGS_OTHER})
  51. FOREACH(_arg ${${_XPREFIX}_LDFLAGS_OTHER})
  52. SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${_arg}")
  53. ENDFOREACH(_arg ${${_XPREFIX}_LDFLAGS_OTHER})
  54. LIST(APPEND ${PKG_LIB_OUTPUT} "${${_XPREFIX}_LIBRARIES}")
  55. INCLUDE_DIRECTORIES(${${_XPREFIX}_INCLUDEDIR})
  56. ELSE()
  57. IF(NOT ${PKG_NAME}_GUESSED)
  58. # Try some more heuristic
  59. FIND_LIBRARY(_lib NAMES ${PKG_LIBRARY}
  60. HINTS ${PKG_ROOT} ${RSPAMD_SEARCH_PATH}
  61. PATH_SUFFIXES ${PKG_LIB_SUFFIXES} lib64 lib
  62. PATHS ${RSPAMD_DEFAULT_LIBRARY_PATHS})
  63. IF(NOT _lib)
  64. IF(PKG_OPTIONAL)
  65. MESSAGE(STATUS "Cannot find library ${PKG_LIBRARY} for package ${PKG_NAME}, ignoring")
  66. ELSE()
  67. MESSAGE(FATAL_ERROR "Cannot find library ${PKG_LIBRARY} for package ${PKG_NAME}")
  68. ENDIF()
  69. ENDIF(NOT _lib)
  70. FIND_PATH(_incl ${PKG_INCLUDE}
  71. HINTS ${PKG_ROOT} ${RSPAMD_SEARCH_PATH}
  72. PATH_SUFFIXES ${PKG_INCLUDE_SUFFIXES} include
  73. PATHS {RSPAMD_DEFAULT_INCLUDE_PATHS})
  74. IF(NOT _incl)
  75. IF(PKG_OPTIONAL OR PKG_OPTIONAL_INCLUDE)
  76. MESSAGE(STATUS "Cannot find header ${PKG_INCLUDE} for package ${PKG_NAME}")
  77. ELSE()
  78. MESSAGE(FATAL_ERROR "Cannot find header ${PKG_INCLUDE} for package ${PKG_NAME}")
  79. ENDIF()
  80. ELSE()
  81. STRING(REGEX REPLACE "/[^/]+$" "" _incl_path "${PKG_INCLUDE}")
  82. STRING(REGEX REPLACE "${_incl_path}/$" "" _stripped_incl "${_incl}")
  83. INCLUDE_DIRECTORIES("${_stripped_incl}")
  84. SET(${PKG_NAME}_INCLUDE "${_stripped_incl}" CACHE INTERNAL "")
  85. ENDIF(NOT _incl)
  86. IF(_lib)
  87. # We need to apply heuristic to find the real dir name
  88. GET_FILENAME_COMPONENT(_lib_path "${_lib}" PATH)
  89. LINK_DIRECTORIES("${_lib_path}")
  90. LIST(APPEND ${PKG_LIB_OUTPUT} ${_lib})
  91. SET(${PKG_NAME}_LIBRARY_PATH "${_lib_path}" CACHE INTERNAL "")
  92. SET(${PKG_NAME}_LIBRARY "${_lib}" CACHE INTERNAL "")
  93. ENDIF()
  94. IF(_incl AND _lib)
  95. MESSAGE(STATUS "Found package ${PKG_NAME} in '${_lib_path}' (${_lib}) and '${_stripped_incl}' (${PKG_INCLUDE}).")
  96. SET(${PKG_NAME}_GUESSED 1 CACHE INTERNAL "")
  97. SET(WITH_${PKG_NAME} 1 CACHE INTERNAL "")
  98. ELSEIF(_lib)
  99. IF(PKG_OPTIONAL_INCLUDE)
  100. SET(${PKG_NAME}_GUESSED 1 INTERNAL "")
  101. SET(WITH_${PKG_NAME} 1 INTERNAL "")
  102. ENDIF()
  103. MESSAGE(STATUS "Found incomplete package ${PKG_NAME} in '${_lib_path}' (${_lib}); no includes.")
  104. ENDIF()
  105. ELSE()
  106. MESSAGE(STATUS "Found package ${PKG_NAME} (cached)")
  107. INCLUDE_DIRECTORIES("${${PKG_NAME}_INCLUDE}")
  108. LINK_DIRECTORIES("${${PKG_NAME}_LIBRARY_PATH}")
  109. LIST(APPEND ${PKG_LIB_OUTPUT} "${${PKG_NAME}_LIBRARY}")
  110. ENDIF()
  111. ENDIF(${PKG_NAME}_FOUND)
  112. UNSET(_lib CACHE)
  113. UNSET(_incl CACHE)
  114. ENDMACRO(ProcessPackage name)