Findsodium.cmake 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. # Written in 2016 by Henrik Steffen Gaßmann <henrik@gassmann.onl>
  2. #
  3. # To the extent possible under law, the author(s) have dedicated all
  4. # copyright and related and neighboring rights to this software to the
  5. # public domain worldwide. This software is distributed without any warranty.
  6. #
  7. # You should have received a copy of the CC0 Public Domain Dedication
  8. # along with this software. If not, see
  9. #
  10. # http://creativecommons.org/publicdomain/zero/1.0/
  11. #
  12. ########################################################################
  13. # Tries to find the local libsodium installation.
  14. #
  15. # On Windows the sodium_DIR environment variable is used as a default
  16. # hint which can be overridden by setting the corresponding cmake variable.
  17. #
  18. # Once done the following variables will be defined:
  19. #
  20. # sodium_FOUND
  21. # sodium_INCLUDE_DIR
  22. # sodium_LIBRARY_DEBUG
  23. # sodium_LIBRARY_RELEASE
  24. #
  25. #
  26. # Furthermore an imported "sodium" target is created.
  27. #
  28. if (CMAKE_C_COMPILER_ID STREQUAL "GNU"
  29. OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
  30. set(_GCC_COMPATIBLE 1)
  31. endif()
  32. # static library option
  33. option(sodium_USE_STATIC_LIBS "enable to statically link against sodium")
  34. if(NOT (sodium_USE_STATIC_LIBS EQUAL sodium_USE_STATIC_LIBS_LAST))
  35. unset(sodium_LIBRARY CACHE)
  36. unset(sodium_LIBRARY_DEBUG CACHE)
  37. unset(sodium_LIBRARY_RELEASE CACHE)
  38. unset(sodium_DLL_DEBUG CACHE)
  39. unset(sodium_DLL_RELEASE CACHE)
  40. set(sodium_USE_STATIC_LIBS_LAST ${sodium_USE_STATIC_LIBS} CACHE INTERNAL "internal change tracking variable")
  41. endif()
  42. ########################################################################
  43. # UNIX
  44. if (UNIX)
  45. # import pkg-config
  46. find_package(PkgConfig QUIET)
  47. if (PKG_CONFIG_FOUND)
  48. pkg_check_modules(sodium_PKG QUIET libsodium)
  49. endif()
  50. if(sodium_USE_STATIC_LIBS)
  51. set(XPREFIX sodium_PKG_STATIC)
  52. else()
  53. set(XPREFIX sodium_PKG)
  54. endif()
  55. find_path(sodium_INCLUDE_DIR sodium.h
  56. HINTS ${${XPREFIX}_INCLUDE_DIRS}
  57. )
  58. find_library(sodium_LIBRARY_DEBUG NAMES ${${XPREFIX}_LIBRARIES} sodium
  59. HINTS ${${XPREFIX}_LIBRARY_DIRS}
  60. )
  61. find_library(sodium_LIBRARY_RELEASE NAMES ${${XPREFIX}_LIBRARIES} sodium
  62. HINTS ${${XPREFIX}_LIBRARY_DIRS}
  63. )
  64. ########################################################################
  65. # Windows
  66. elseif (WIN32)
  67. set(sodium_DIR "$ENV{sodium_DIR}" CACHE FILEPATH "sodium install directory")
  68. mark_as_advanced(sodium_DIR)
  69. find_path(sodium_INCLUDE_DIR sodium.h
  70. HINTS ${sodium_DIR}
  71. PATH_SUFFIXES include
  72. )
  73. if (MSVC)
  74. # detect target architecture
  75. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/arch.c" [=[
  76. #if defined _M_IX86
  77. #error ARCH_VALUE x86_32
  78. #elif defined _M_X64
  79. #error ARCH_VALUE x86_64
  80. #endif
  81. #error ARCH_VALUE unknown
  82. ]=])
  83. try_compile(_UNUSED_VAR "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/arch.c"
  84. OUTPUT_VARIABLE _COMPILATION_LOG
  85. )
  86. string(REGEX REPLACE ".*ARCH_VALUE ([a-zA-Z0-9_]+).*" "\\1" _TARGET_ARCH "${_COMPILATION_LOG}")
  87. # construct library path
  88. if (_TARGET_ARCH STREQUAL "x86_32")
  89. string(APPEND _PLATFORM_PATH "Win32")
  90. elseif(_TARGET_ARCH STREQUAL "x86_64")
  91. string(APPEND _PLATFORM_PATH "x64")
  92. else()
  93. message(FATAL_ERROR "the ${_TARGET_ARCH} architecture is not supported by Findsodium.cmake.")
  94. endif()
  95. string(APPEND _PLATFORM_PATH "/$$CONFIG$$")
  96. if (MSVC_VERSION LESS 1900)
  97. math(EXPR _VS_VERSION "${MSVC_VERSION} / 10 - 60")
  98. else()
  99. math(EXPR _VS_VERSION "${MSVC_VERSION} / 10 - 50")
  100. endif()
  101. string(APPEND _PLATFORM_PATH "/v${_VS_VERSION}")
  102. if (sodium_USE_STATIC_LIBS)
  103. string(APPEND _PLATFORM_PATH "/static")
  104. else()
  105. string(APPEND _PLATFORM_PATH "/dynamic")
  106. endif()
  107. string(REPLACE "$$CONFIG$$" "Debug" _DEBUG_PATH_SUFFIX "${_PLATFORM_PATH}")
  108. string(REPLACE "$$CONFIG$$" "Release" _RELEASE_PATH_SUFFIX "${_PLATFORM_PATH}")
  109. find_library(sodium_LIBRARY_DEBUG libsodium.lib
  110. HINTS ${sodium_DIR}
  111. PATH_SUFFIXES ${_DEBUG_PATH_SUFFIX}
  112. )
  113. find_library(sodium_LIBRARY_RELEASE libsodium.lib
  114. HINTS ${sodium_DIR}
  115. PATH_SUFFIXES ${_RELEASE_PATH_SUFFIX}
  116. )
  117. if (NOT sodium_USE_STATIC_LIBS)
  118. set(CMAKE_FIND_LIBRARY_SUFFIXES ".dll")
  119. find_library(sodium_DLL_DEBUG libsodium
  120. HINTS ${sodium_DIR}
  121. PATH_SUFFIXES ${_DEBUG_PATH_SUFFIX}
  122. )
  123. find_library(sodium_DLL_RELEASE libsodium
  124. HINTS ${sodium_DIR}
  125. PATH_SUFFIXES ${_RELEASE_PATH_SUFFIX}
  126. )
  127. endif()
  128. elseif(_GCC_COMPATIBLE)
  129. if (sodium_USE_STATIC_LIBS)
  130. find_library(sodium_LIBRARY_DEBUG libsodium.a
  131. HINTS ${sodium_DIR}
  132. PATH_SUFFIXES lib
  133. )
  134. find_library(sodium_LIBRARY_RELEASE libsodium.a
  135. HINTS ${sodium_DIR}
  136. PATH_SUFFIXES lib
  137. )
  138. else()
  139. find_library(sodium_LIBRARY_DEBUG libsodium.dll.a
  140. HINTS ${sodium_DIR}
  141. PATH_SUFFIXES lib
  142. )
  143. find_library(sodium_LIBRARY_RELEASE libsodium.dll.a
  144. HINTS ${sodium_DIR}
  145. PATH_SUFFIXES lib
  146. )
  147. file(GLOB _DLL
  148. LIST_DIRECTORIES false
  149. RELATIVE "${sodium_DIR}/bin"
  150. "${sodium_DIR}/bin/libsodium*.dll"
  151. )
  152. find_library(sodium_DLL_DEBUG ${_DLL} libsodium
  153. HINTS ${sodium_DIR}
  154. PATH_SUFFIXES bin
  155. )
  156. find_library(sodium_DLL_RELEASE ${_DLL} libsodium
  157. HINTS ${sodium_DIR}
  158. PATH_SUFFIXES bin
  159. )
  160. endif()
  161. else()
  162. message(FATAL_ERROR "this platform is not supported by FindSodium.cmake")
  163. endif()
  164. ########################################################################
  165. # unsupported
  166. else()
  167. message(FATAL_ERROR "this platform is not supported by FindSodium.cmake")
  168. endif()
  169. ########################################################################
  170. # common stuff
  171. # extract sodium version
  172. if (sodium_INCLUDE_DIR)
  173. set(_VERSION_HEADER "${_INCLUDE_DIR}/sodium/version.h")
  174. if (EXISTS _VERSION_HEADER)
  175. file(READ "${_VERSION_HEADER}" _VERSION_HEADER_CONTENT)
  176. string(REGEX REPLACE ".*#[ \t]*define[ \t]*SODIUM_VERSION_STRING[ \t]*\"([^\n]*)\".*" "\\1"
  177. sodium_VERSION "${_VERSION_HEADER_CONTENT}")
  178. set(sodium_VERSION "${sodium_VERSION}" PARENT_SCOPE)
  179. endif()
  180. endif()
  181. # communicate results
  182. include(FindPackageHandleStandardArgs)
  183. find_package_handle_standard_args(sodium
  184. REQUIRED_VARS
  185. sodium_LIBRARY_RELEASE
  186. sodium_LIBRARY_DEBUG
  187. sodium_INCLUDE_DIR
  188. VERSION_VAR
  189. sodium_VERSION
  190. )
  191. # mark file paths as advanced
  192. mark_as_advanced(sodium_INCLUDE_DIR)
  193. mark_as_advanced(sodium_LIBRARY_DEBUG)
  194. mark_as_advanced(sodium_LIBRARY_RELEASE)
  195. if (WIN32)
  196. mark_as_advanced(sodium_DLL_DEBUG)
  197. mark_as_advanced(sodium_DLL_RELEASE)
  198. endif()
  199. # create imported target
  200. if(sodium_USE_STATIC_LIBS)
  201. set(_LIB_TYPE STATIC)
  202. else()
  203. set(_LIB_TYPE SHARED)
  204. endif()
  205. add_library(sodium ${_LIB_TYPE} IMPORTED)
  206. set_target_properties(sodium PROPERTIES
  207. INTERFACE_INCLUDE_DIRECTORIES "${sodium_INCLUDE_DIR}"
  208. IMPORTED_LINK_INTERFACE_LANGUAGES "C"
  209. )
  210. if (sodium_USE_STATIC_LIBS)
  211. set_target_properties(sodium PROPERTIES
  212. INTERFACE_COMPILE_DEFINITIONS "SODIUM_STATIC"
  213. IMPORTED_LOCATION "${sodium_LIBRARY_RELEASE}"
  214. IMPORTED_LOCATION_DEBUG "${sodium_LIBRARY_DEBUG}"
  215. )
  216. else()
  217. if (UNIX)
  218. set_target_properties(sodium PROPERTIES
  219. IMPORTED_LOCATION "${sodium_LIBRARY_RELEASE}"
  220. IMPORTED_LOCATION_DEBUG "${sodium_LIBRARY_DEBUG}"
  221. )
  222. elseif (WIN32)
  223. set_target_properties(sodium PROPERTIES
  224. IMPORTED_IMPLIB "${sodium_LIBRARY_RELEASE}"
  225. IMPORTED_IMPLIB_DEBUG "${sodium_LIBRARY_DEBUG}"
  226. )
  227. if (NOT (sodium_DLL_DEBUG MATCHES ".*-NOTFOUND"))
  228. set_target_properties(sodium PROPERTIES
  229. IMPORTED_LOCATION_DEBUG "${sodium_DLL_DEBUG}"
  230. )
  231. endif()
  232. if (NOT (sodium_DLL_RELEASE MATCHES ".*-NOTFOUND"))
  233. set_target_properties(sodium PROPERTIES
  234. IMPORTED_LOCATION_RELWITHDEBINFO "${sodium_DLL_RELEASE}"
  235. IMPORTED_LOCATION_MINSIZEREL "${sodium_DLL_RELEASE}"
  236. IMPORTED_LOCATION_RELEASE "${sodium_DLL_RELEASE}"
  237. )
  238. endif()
  239. endif()
  240. endif()