2
0

CMakeLists.txt 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444
  1. # SPDX-License-Identifier: Unlicense
  2. #
  3. # LibTomCrypt, modular cryptographic library -- Tom St Denis
  4. #
  5. cmake_minimum_required(VERSION 3.10)
  6. project(
  7. libtomcrypt
  8. VERSION 1.18.2
  9. DESCRIPTION "A modular cryptographic library."
  10. HOMEPAGE_URL "https://www.libtom.net/LibTomCrypt"
  11. LANGUAGES C
  12. )
  13. # package release version
  14. #
  15. # * bump if re-releasing the same VERSION + patches
  16. # * set to 1 if releasing a new VERSION
  17. set(PACKAGE_RELEASE_VERSION 1)
  18. # -----------------------------------------------------------------------------
  19. # Include CMake modules
  20. # -----------------------------------------------------------------------------
  21. include(GNUInstallDirs)
  22. include(CheckIPOSupported)
  23. include(CMakePackageConfigHelpers)
  24. # for potential builds against gnump
  25. include(FindPkgConfig)
  26. # for potential builds with MSVC
  27. include(CMakePushCheckState)
  28. include(CheckSymbolExists)
  29. # default is "No tests"
  30. option(BUILD_TESTING "" OFF)
  31. include(CTest)
  32. include(sources.cmake)
  33. # -----------------------------------------------------------------------------
  34. # Options
  35. # -----------------------------------------------------------------------------
  36. option(WITH_LTM "Build with support for libtommath" TRUE)
  37. option(WITH_TFM "Build with support for tomsfastmath" FALSE)
  38. option(WITH_GMP "Build with support for GNU Multi Precision Arithmetic Library" FALSE)
  39. set(MPI_PROVIDER
  40. "LTM"
  41. CACHE STRING "Build tests and demos against 'LTM', 'TFM' or 'GMP', default is LTM"
  42. )
  43. option(BUILD_SHARED_LIBS
  44. "Build shared library and only the shared library if \"ON\", default is static" OFF
  45. )
  46. option(WITH_PTHREAD "Build with pthread support" FALSE)
  47. # -----------------------------------------------------------------------------
  48. # Add support for ccache if desired
  49. # -----------------------------------------------------------------------------
  50. find_program(CCACHE ccache)
  51. if(CCACHE)
  52. option(ENABLE_CCACHE "Enable ccache." ON)
  53. endif()
  54. # use ccache if installed
  55. if(CCACHE AND ENABLE_CCACHE)
  56. set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE})
  57. endif()
  58. # -----------------------------------------------------------------------------
  59. # Compose CFLAGS
  60. # -----------------------------------------------------------------------------
  61. # Some information ported from makefile_include.mk
  62. if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
  63. message(STATUS "Setting build type to 'Release' as none was specified.")
  64. set(CMAKE_BUILD_TYPE "Release")
  65. endif()
  66. # We differentiate between MSVC, WATCOM and GCC-compatible compilers
  67. if(MSVC)
  68. set(LTC_C_FLAGS -W3)
  69. elseif(WATCOM)
  70. set(LTC_C_FLAGS -fo=.obj -oaxt -3r -w3)
  71. else()
  72. set(LTC_C_FLAGS
  73. -Wall
  74. -Wsign-compare
  75. -Wextra
  76. -Wshadow
  77. -Wdeclaration-after-statement
  78. -Wbad-function-cast
  79. -Wcast-align
  80. -Wstrict-prototypes
  81. -Wpointer-arith
  82. -Wsystem-headers
  83. )
  84. set(CMAKE_C_FLAGS_DEBUG "-g3")
  85. set(CMAKE_C_FLAGS_RELEASE "-O3 -funroll-loops -fomit-frame-pointer")
  86. set(CMAKE_C_FLAGS_RELWITHDEBINFO "-g3 -O2")
  87. set(CMAKE_C_FLAGS_MINSIZEREL "-Os")
  88. endif()
  89. # What compiler do we have and what are their...uhm... peculiarities
  90. if(CMAKE_C_COMPILER_ID MATCHES "(C|c?)lang")
  91. list(APPEND LTC_C_FLAGS -Wno-typedef-redefinition -Wno-tautological-compare
  92. -Wno-builtin-requires-header
  93. )
  94. # Clang requires at least '-O1' for dead code eliminiation
  95. set(CMAKE_C_FLAGS_DEBUG "-O1 ${CMAKE_C_FLAGS_DEBUG}")
  96. endif()
  97. if(CMAKE_C_COMPILER MATCHES "mingw")
  98. list(APPEND LTC_C_FLAGS -Wno-shadow -Wno-expansion-to-defined -Wno-declaration-after-statement
  99. -Wno-bad-function-cast
  100. )
  101. endif()
  102. if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
  103. list(APPEND LTC_C_FLAGS -Wno-nullability-completeness)
  104. endif()
  105. if(CMAKE_SYSTEM_NAME MATCHES "CYGWIN")
  106. list(APPEND LTC_C_FLAGS -no-undefined)
  107. endif()
  108. # If the user set the environment variables at generate-time, append them in order to allow
  109. # overriding our defaults.
  110. # ~~~
  111. # ${LTC_CFLAGS} means the user passed it via sth like:
  112. # $ cmake -DLTC_CFLAGS="foo"
  113. # ~~~
  114. list(APPEND LTC_C_FLAGS ${LTC_CFLAGS})
  115. list(APPEND LTC_LD_FLAGS ${LTC_LDFLAGS})
  116. # -----------------------------------------------------------------------------
  117. # Library targets
  118. # -----------------------------------------------------------------------------
  119. add_library(${PROJECT_NAME} ${SOURCES} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS})
  120. target_include_directories(
  121. ${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/headers>
  122. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}>
  123. )
  124. target_compile_options(${PROJECT_NAME} BEFORE PRIVATE ${LTC_C_FLAGS})
  125. target_link_options(${PROJECT_NAME} BEFORE PRIVATE ${LTC_LD_FLAGS})
  126. set_target_properties(
  127. ${PROJECT_NAME}
  128. PROPERTIES OUTPUT_NAME tomcrypt
  129. VERSION ${PROJECT_VERSION}
  130. SOVERSION ${PROJECT_VERSION_MAJOR}
  131. PUBLIC_HEADER "${PUBLIC_HEADERS}"
  132. )
  133. if(MSVC)
  134. cmake_push_check_state()
  135. set(CMAKE_REQUIRED_LIBRARIES bcrypt)
  136. check_symbol_exists(BCryptGenRandom "Windows.h;bcrypt.h" BCRYPT_AVAILABLE)
  137. cmake_pop_check_state()
  138. if(BCRYPT_AVAILABLE)
  139. target_link_libraries(${PROJECT_NAME} PRIVATE Bcrypt)
  140. list(APPEND LTC_C_FLAGS -DLTC_WIN32_BCRYPT)
  141. endif()
  142. endif()
  143. option(COMPILE_LTO "Build with LTO enabled")
  144. if(COMPILE_LTO)
  145. check_ipo_supported(RESULT COMPILER_SUPPORTS_LTO)
  146. if(COMPILER_SUPPORTS_LTO)
  147. set_property(TARGET ${PROJECT_NAME} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
  148. else()
  149. message(
  150. SEND_ERROR
  151. "This compiler does not support LTO. Reconfigure ${PROJECT_NAME} with -DCOMPILE_LTO=OFF."
  152. )
  153. endif()
  154. endif()
  155. # -----------------------------------------------------------------------------
  156. # MPI provider
  157. # -----------------------------------------------------------------------------
  158. # libtommath
  159. if(WITH_LTM)
  160. find_package(libtommath 1.2.0 REQUIRED)
  161. target_compile_definitions(${PROJECT_NAME} PUBLIC LTM_DESC)
  162. if(MPI_PROVIDER MATCHES "LTM")
  163. target_compile_definitions(${PROJECT_NAME} PUBLIC USE_LTM)
  164. endif()
  165. target_link_libraries(${PROJECT_NAME} PUBLIC libtommath)
  166. list(APPEND LTC_PKG_CONFIG_CFLAGS -DLTM_DESC)
  167. list(APPEND LTC_PKG_CONFIG_LIBS -ltommath)
  168. list(APPEND LTC_DEBIAN_MPI_PROVIDER_DEPENDS libtommath-dev)
  169. endif()
  170. # tomsfastmath
  171. if(WITH_TFM)
  172. find_package(tomsfastmath 0.13.1 REQUIRED)
  173. target_compile_definitions(${PROJECT_NAME} PUBLIC TFM_DESC)
  174. if(MPI_PROVIDER MATCHES "TFM")
  175. target_compile_definitions(${PROJECT_NAME} PUBLIC USE_TFM)
  176. endif()
  177. target_link_libraries(${PROJECT_NAME} PUBLIC tomsfastmath)
  178. list(APPEND LTC_PKG_CONFIG_CFLAGS -DTFM_DESC)
  179. list(APPEND LTC_PKG_CONFIG_LIBS -ltfm)
  180. list(APPEND LTC_DEBIAN_MPI_PROVIDER_DEPENDS libtfm-dev)
  181. endif()
  182. # GNU MP
  183. if(WITH_GMP)
  184. pkg_check_modules(GMP REQUIRED gmp>=6.1.2)
  185. target_compile_definitions(${PROJECT_NAME} PUBLIC GMP_DESC)
  186. if(MPI_PROVIDER MATCHES "GMP")
  187. target_compile_definitions(${PROJECT_NAME} PUBLIC USE_GMP)
  188. endif()
  189. target_link_libraries(${PROJECT_NAME} PUBLIC ${GMP_LIBRARIES})
  190. list(APPEND LTC_PKG_CONFIG_CFLAGS -DGMP_DESC)
  191. list(APPEND LTC_PKG_CONFIG_LIBS -lgmp)
  192. list(APPEND LTC_DEBIAN_MPI_PROVIDER_DEPENDS libgmp-dev)
  193. endif()
  194. # -----------------------------------------------------------------------------
  195. # other options
  196. # -----------------------------------------------------------------------------
  197. if(WITH_PTHREAD)
  198. set(THREADS_PREFER_PTHREAD_FLAG ON)
  199. find_package(Threads REQUIRED)
  200. if(CMAKE_USE_PTHREADS_INIT)
  201. target_compile_definitions(${PROJECT_NAME} PUBLIC LTC_PTHREAD)
  202. target_link_libraries(${PROJECT_NAME} PRIVATE Threads::Threads)
  203. list(APPEND LTC_PKG_CONFIG_CFLAGS -DLTC_PTHREAD)
  204. else()
  205. message(
  206. SEND_ERROR
  207. "pthreads not supported. Reconfigure ${PROJECT_NAME} with -DWITH_PTHREAD=OFF."
  208. )
  209. endif()
  210. endif()
  211. list(JOIN LTC_PKG_CONFIG_CFLAGS " " PKG_CONFIG_CFLAGS)
  212. list(JOIN LTC_PKG_CONFIG_LIBS " " PKG_CONFIG_LIBS)
  213. list(JOIN LTC_DEBIAN_MPI_PROVIDER_DEPENDS " " DEBIAN_MPI_PROVIDER_DEPENDS)
  214. # -----------------------------------------------------------------------------
  215. # demos&test targets
  216. # -----------------------------------------------------------------------------
  217. add_subdirectory(demos)
  218. if(BUILD_TESTING)
  219. enable_testing()
  220. add_subdirectory(tests)
  221. endif()
  222. # ---------------------------------------------------------------------------------------
  223. # Install/export targets and files
  224. # ---------------------------------------------------------------------------------------
  225. set(CONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
  226. set(PROJECT_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake")
  227. set(PROJECT_CONFIG_FILE "${PROJECT_NAME}-config.cmake")
  228. set(TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets")
  229. # install targets
  230. install(
  231. TARGETS ${PROJECT_NAME}
  232. EXPORT ${TARGETS_EXPORT_NAME}
  233. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  234. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT Libraries
  235. RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}
  236. PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}
  237. )
  238. # Install libtomcrypt.pc for pkg-config if we build a shared library
  239. if(BUILD_SHARED_LIBS)
  240. # Let the user override the default directory of the pkg-config file (usually this shouldn't be
  241. # required to be changed)
  242. set(CMAKE_INSTALL_PKGCONFIGDIR
  243. "${CMAKE_INSTALL_LIBDIR}/pkgconfig"
  244. CACHE PATH "Folder where to install .pc files"
  245. )
  246. configure_file(
  247. ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc.in
  248. ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc @ONLY
  249. )
  250. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc
  251. DESTINATION ${CMAKE_INSTALL_PKGCONFIGDIR}
  252. )
  253. endif()
  254. # generate package version file
  255. write_basic_package_version_file(
  256. ${PROJECT_VERSION_FILE}
  257. VERSION ${PROJECT_VERSION}
  258. COMPATIBILITY SameMajorVersion
  259. )
  260. # install version file
  261. install(FILES ${PROJECT_VERSION_FILE} DESTINATION ${CONFIG_INSTALL_DIR})
  262. # build directory package config
  263. export(EXPORT ${TARGETS_EXPORT_NAME} FILE ${PROJECT_CONFIG_FILE})
  264. # installed package config
  265. install(
  266. EXPORT ${TARGETS_EXPORT_NAME}
  267. DESTINATION ${CONFIG_INSTALL_DIR}
  268. FILE ${PROJECT_CONFIG_FILE}
  269. )
  270. # add to CMake registry
  271. export(PACKAGE ${PROJECT_NAME})
  272. # ---------------------------------------------------------------------------------------
  273. # Create release packages
  274. # ---------------------------------------------------------------------------------------
  275. # determine distribution and architecture
  276. find_program(LSB_RELEASE lsb_release)
  277. find_program(SYSCTL sysctl)
  278. find_program(UNAME uname)
  279. if(UNAME)
  280. execute_process(
  281. COMMAND uname -m
  282. OUTPUT_VARIABLE MACHINE_ARCH
  283. OUTPUT_STRIP_TRAILING_WHITESPACE
  284. )
  285. elseif(SYSCTL)
  286. execute_process(
  287. COMMAND sysctl -b hw.machine_arch
  288. OUTPUT_VARIABLE MACHINE_ARCH
  289. OUTPUT_STRIP_TRAILING_WHITESPACE
  290. )
  291. else()
  292. string(TOLOWER ${CMAKE_SYSTEM_NAME} MACHINE_ARCH)
  293. endif()
  294. if(LSB_RELEASE)
  295. execute_process(
  296. COMMAND lsb_release -si
  297. OUTPUT_VARIABLE LINUX_DISTRO
  298. OUTPUT_STRIP_TRAILING_WHITESPACE
  299. )
  300. execute_process(
  301. COMMAND lsb_release -sc
  302. OUTPUT_VARIABLE LINUX_DISTRO_CODENAME
  303. OUTPUT_STRIP_TRAILING_WHITESPACE
  304. )
  305. execute_process(
  306. COMMAND lsb_release -sr
  307. OUTPUT_VARIABLE LINUX_DISTRO_VERSION
  308. OUTPUT_STRIP_TRAILING_WHITESPACE
  309. )
  310. string(TOLOWER ${LINUX_DISTRO} LINUX_DISTRO)
  311. if(LINUX_DISTRO_CODENAME STREQUAL "n/a")
  312. set(DISTRO_PACK_PATH ${LINUX_DISTRO}/${LINUX_DISTRO_VERSION}/)
  313. else()
  314. set(DISTRO_PACK_PATH ${LINUX_DISTRO}/${LINUX_DISTRO_CODENAME}/)
  315. endif()
  316. else()
  317. set(DISTRO_PACK_PATH ${CMAKE_SYSTEM_NAME}/)
  318. endif()
  319. # make sure untagged versions get a different package name
  320. execute_process(
  321. COMMAND git describe --exact-match --tags
  322. ERROR_QUIET
  323. RESULT_VARIABLE REPO_HAS_TAG
  324. )
  325. if(REPO_HAS_TAG EQUAL 0)
  326. set(PACKAGE_NAME_SUFFIX "")
  327. else()
  328. set(PACKAGE_NAME_SUFFIX "-git")
  329. message(STATUS "Use -git suffix")
  330. endif()
  331. # default CPack generators
  332. set(CPACK_GENERATOR TGZ STGZ)
  333. # extra CPack generators
  334. if(LINUX_DISTRO STREQUAL "debian"
  335. OR LINUX_DISTRO STREQUAL "ubuntu"
  336. OR LINUX_DISTRO STREQUAL "linuxmint"
  337. )
  338. list(APPEND CPACK_GENERATOR DEB)
  339. elseif(
  340. LINUX_DISTRO STREQUAL "fedora"
  341. OR LINUX_DISTRO STREQUAL "opensuse"
  342. OR LINUX_DISTRO STREQUAL "centos"
  343. )
  344. list(APPEND CPACK_GENERATOR RPM)
  345. elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
  346. list(APPEND CPACK_GENERATOR FREEBSD)
  347. endif()
  348. set(LTC_DEBIAN_SHARED_PACKAGE_NAME "${PROJECT_NAME}${PACKAGE_NAME_SUFFIX}${PROJECT_VERSION_MAJOR}")
  349. # general CPack config
  350. set(CPACK_PACKAGE_DIRECTORY ${CMAKE_BINARY_DIR}/packages/${DISTRO_PACK_PATH})
  351. message(STATUS "CPack: packages will be generated under ${CPACK_PACKAGE_DIRECTORY}")
  352. if(BUILD_SHARED_LIBS)
  353. set(CPACK_PACKAGE_NAME "${PROJECT_NAME}${PROJECT_VERSION_MAJOR}")
  354. set(CPACK_DEBIAN_PACKAGE_NAME "${LTC_DEBIAN_SHARED_PACKAGE_NAME}")
  355. else()
  356. set(CPACK_PACKAGE_NAME "${PROJECT_NAME}-devel")
  357. set(CPACK_DEBIAN_LIBRARIES_PACKAGE_NAME "${PROJECT_NAME}${PACKAGE_NAME_SUFFIX}-dev")
  358. endif()
  359. set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
  360. set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "LibTomCrypt")
  361. set(CPACK_PACKAGE_VENDOR "libtom projects")
  362. set(CPACK_PACKAGE_CONTACT "[email protected]")
  363. set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
  364. set(PACKAGE_NAME_TRAILER ${CPACK_PACKAGE_VERSION}-${PACKAGE_RELEASE_VERSION}_${MACHINE_ARCH})
  365. set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${PACKAGE_NAME_TRAILER})
  366. set(CPACK_STRIP_FILES ON)
  367. # deb specific CPack config
  368. set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
  369. set(CPACK_DEBIAN_DEBUGINFO_PACKAGE ON)
  370. set(CPACK_DEBIAN_PACKAGE_RELEASE ${PACKAGE_RELEASE_VERSION})
  371. set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
  372. if(BUILD_SHARED_LIBS)
  373. set(CPACK_DEBIAN_PACKAGE_SECTION "libs")
  374. set(CPACK_DEBIAN_PACKAGE_DEPENDS ${DEBIAN_MPI_PROVIDER_DEPENDS})
  375. else()
  376. set(CPACK_DEBIAN_PACKAGE_SECTION "libdevel")
  377. set(CPACK_DEBIAN_PACKAGE_DEPENDS ${LTC_DEBIAN_SHARED_PACKAGE_NAME})
  378. set(CPACK_DEB_COMPONENT_INSTALL ON)
  379. set(CPACK_ARCHIVE_COMPONENT_INSTALL ON)
  380. set(CPACK_COMPONENTS_ALL Libraries)
  381. endif()
  382. # rpm specific CPack config
  383. set(CPACK_RPM_PACKAGE_RELEASE ${PACKAGE_RELEASE_VERSION})
  384. set(CPACK_RPM_PACKAGE_ARCHITECTURE ${MACHINE_ARCH})
  385. set(CPACK_RPM_PACKAGE_NAME "${CPACK_PACKAGE_NAME}-${PROJECT_VERSION}")
  386. set(CPACK_RPM_PACKAGE_LICENSE "The Unlicense")
  387. # FreeBSD specific CPack config
  388. set(CPACK_FREEBSD_PACKAGE_MAINTAINER "[email protected]")
  389. set(CPACK_FREEBSD_PACKAGE_ORIGIN "security/libtomcrypt")
  390. set(CPACK_FREEBSD_PACKAGE_CATEGORIES "security")
  391. include(CPack)