Skip to content

Commit e10c62e

Browse files
authored
Merge pull request #586 from libtom/feature/cmake-support
Feature/cmake support
2 parents e6be20b + cdc1dbe commit e10c62e

File tree

13 files changed

+1105
-10
lines changed

13 files changed

+1105
-10
lines changed

.gitignore

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ timing.exe
6060
.cproject
6161
.settings/
6262

63+
# KDevelop special files
64+
*.kdev4
65+
66+
6367
# macOS special files
6468
.DS_Store
6569

@@ -102,3 +106,6 @@ coverage*.info
102106
cov-int/
103107
.coverity_*
104108
libtomcrypt.lzma
109+
110+
# cmake build directories
111+
build*/

CMakeLists.txt

Lines changed: 304 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,304 @@
1+
# SPDX-License-Identifier: Unlicense
2+
#
3+
# LibTomCrypt, modular cryptographic library -- Tom St Denis
4+
#
5+
6+
cmake_minimum_required(VERSION 3.10)
7+
8+
project(libtomcrypt
9+
VERSION 1.18.2
10+
DESCRIPTION "A modular cryptographic library."
11+
HOMEPAGE_URL "https://www.libtom.net/LibTomCrypt"
12+
LANGUAGES C)
13+
14+
# package release version
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+
#-----------------------------------------------------------------------------
20+
# Include CMake modules
21+
#-----------------------------------------------------------------------------
22+
include(GNUInstallDirs)
23+
include(CheckIPOSupported)
24+
include(CMakePackageConfigHelpers)
25+
# for potential builds against gnump
26+
include(FindPkgConfig)
27+
# default is "No tests"
28+
option(BUILD_TESTING "" OFF)
29+
include(CTest)
30+
include(sources.cmake)
31+
32+
#-----------------------------------------------------------------------------
33+
# Options
34+
#-----------------------------------------------------------------------------
35+
option(WITH_LTM "Build with support for libtommath" TRUE)
36+
option(WITH_GMP "Build with support for GNU Multi Precision Arithmetic Library" FALSE)
37+
set(MPI_PROVIDER "LTM" CACHE STRING "Build tests and demos against 'LTM', 'TFM' or 'GMP', default is LTM")
38+
option(BUILD_SHARED_LIBS "Build shared library and only the shared library if \"ON\", default is static" OFF)
39+
40+
#-----------------------------------------------------------------------------
41+
# Compose CFLAGS
42+
#-----------------------------------------------------------------------------
43+
44+
# Some information ported from makefile_include.mk
45+
46+
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
47+
message(STATUS "Setting build type to 'Release' as none was specified.")
48+
set(CMAKE_BUILD_TYPE "Release")
49+
endif()
50+
51+
# We differentiate between MSVC, WATCOM and GCC-compatible compilers
52+
if(MSVC)
53+
set(LTC_C_FLAGS -W3)
54+
elseif(WATCOM)
55+
set(LTC_C_FLAGS -fo=.obj -oaxt -3r -w3)
56+
else()
57+
set(LTC_C_FLAGS -Wall -Wsign-compare -Wextra -Wshadow
58+
-Wdeclaration-after-statement -Wbad-function-cast -Wcast-align
59+
-Wstrict-prototypes -Wpointer-arith -Wsystem-headers)
60+
set(CMAKE_C_FLAGS_DEBUG "-g3")
61+
set(CMAKE_C_FLAGS_RELEASE "-O3 -funroll-loops -fomit-frame-pointer")
62+
set(CMAKE_C_FLAGS_RELWITHDEBINFO "-g3 -O2")
63+
set(CMAKE_C_FLAGS_MINSIZEREL "-Os")
64+
endif()
65+
66+
# What compiler do we have and what are their...uhm... peculiarities
67+
if(CMAKE_C_COMPILER_ID MATCHES "(C|c?)lang")
68+
list(APPEND LTC_C_FLAGS -Wno-typedef-redefinition -Wno-tautological-compare -Wno-builtin-requires-header)
69+
# Clang requires at least '-O1' for dead code eliminiation
70+
set(CMAKE_C_FLAGS_DEBUG "-O1 ${CMAKE_C_FLAGS_DEBUG}")
71+
endif()
72+
if(CMAKE_C_COMPILER MATCHES "mingw")
73+
list(APPEND LTC_C_FLAGS -Wno-shadow -Wno-expansion-to-defined -Wno-declaration-after-statement -Wno-bad-function-cast)
74+
endif()
75+
if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
76+
list(APPEND LTC_C_FLAGS -Wno-nullability-completeness)
77+
endif()
78+
if(CMAKE_SYSTEM_NAME MATCHES "CYGWIN")
79+
list(APPEND LTC_C_FLAGS -no-undefined)
80+
endif()
81+
82+
# If the user set the environment variables at generate-time, append them
83+
# in order to allow overriding our defaults.
84+
# ${LTC_CFLAGS} means the user passed it via sth like:
85+
# $ cmake -DLTC_CFLAGS="foo"
86+
list(APPEND LTC_C_FLAGS ${LTC_CFLAGS})
87+
list(APPEND LTC_LD_FLAGS ${LTC_LDFLAGS})
88+
89+
#-----------------------------------------------------------------------------
90+
# Library targets
91+
#-----------------------------------------------------------------------------
92+
add_library(${PROJECT_NAME}
93+
${SOURCES}
94+
${PUBLIC_HEADERS}
95+
${PRIVATE_HEADERS}
96+
)
97+
98+
target_include_directories(${PROJECT_NAME} PUBLIC
99+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/headers>
100+
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}>
101+
)
102+
103+
target_compile_options(${PROJECT_NAME} BEFORE PRIVATE
104+
${LTM_C_FLAGS}
105+
)
106+
target_link_options(${PROJECT_NAME} BEFORE PRIVATE
107+
${LTM_LD_FLAGS}
108+
)
109+
110+
set_target_properties(${PROJECT_NAME} PROPERTIES
111+
OUTPUT_NAME tomcrypt
112+
VERSION ${PROJECT_VERSION}
113+
SOVERSION ${PROJECT_VERSION_MAJOR}
114+
PUBLIC_HEADER "${PUBLIC_HEADERS}"
115+
)
116+
117+
option(COMPILE_LTO "Build with LTO enabled")
118+
if(COMPILE_LTO)
119+
check_ipo_supported(RESULT COMPILER_SUPPORTS_LTO)
120+
if(COMPILER_SUPPORTS_LTO)
121+
set_property(TARGET ${PROJECT_NAME} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
122+
else()
123+
message(SEND_ERROR "This compiler does not support LTO. Reconfigure ${PROJECT_NAME} with -DCOMPILE_LTO=OFF.")
124+
endif()
125+
endif()
126+
127+
#-----------------------------------------------------------------------------
128+
# MPI provider
129+
#-----------------------------------------------------------------------------
130+
# libtommath
131+
if(WITH_LTM)
132+
find_package(libtommath 1.2.0 REQUIRED)
133+
134+
target_compile_definitions(${PROJECT_NAME} PUBLIC LTM_DESC)
135+
if(MPI_PROVIDER MATCHES "LTM")
136+
target_compile_definitions(${PROJECT_NAME} PUBLIC USE_LTM)
137+
endif()
138+
target_link_libraries(${PROJECT_NAME} PUBLIC libtommath)
139+
endif()
140+
# GNU MP
141+
if(WITH_GMP)
142+
pkg_check_modules(GMP REQUIRED gmp>=6.1.2)
143+
144+
target_compile_definitions(${PROJECT_NAME} PUBLIC GMP_DESC)
145+
if(MPI_PROVIDER MATCHES "GMP")
146+
target_compile_definitions(${PROJECT_NAME} PUBLIC USE_GMP)
147+
endif()
148+
target_link_libraries(${PROJECT_NAME} PUBLIC ${GMP_LIBRARIES})
149+
endif()
150+
151+
152+
#-----------------------------------------------------------------------------
153+
# demos&test targets
154+
#-----------------------------------------------------------------------------
155+
156+
add_subdirectory(demos)
157+
if(BUILD_TESTING)
158+
enable_testing()
159+
add_subdirectory(tests)
160+
endif()
161+
162+
#---------------------------------------------------------------------------------------
163+
# Install/export targets and files
164+
#---------------------------------------------------------------------------------------
165+
set(CONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
166+
set(PROJECT_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake")
167+
set(PROJECT_CONFIG_FILE "${PROJECT_NAME}-config.cmake")
168+
set(TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets")
169+
170+
# install targets
171+
install(TARGETS ${PROJECT_NAME}
172+
EXPORT ${TARGETS_EXPORT_NAME}
173+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
174+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
175+
RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}
176+
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}
177+
)
178+
179+
# Install libtomcrypt.pc for pkg-config if we build a shared library
180+
if(BUILD_SHARED_LIBS)
181+
# Let the user override the default directory of the pkg-config file (usually this shouldn't be required to be changed)
182+
set(CMAKE_INSTALL_PKGCONFIGDIR "${CMAKE_INSTALL_LIBDIR}/pkgconfig" CACHE PATH "Folder where to install .pc files")
183+
184+
configure_file(
185+
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc.in
186+
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc
187+
@ONLY
188+
)
189+
190+
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc
191+
DESTINATION ${CMAKE_INSTALL_PKGCONFIGDIR}
192+
)
193+
endif()
194+
195+
# generate package version file
196+
write_basic_package_version_file(
197+
${PROJECT_VERSION_FILE}
198+
VERSION ${PROJECT_VERSION}
199+
COMPATIBILITY SameMajorVersion
200+
)
201+
202+
# install version file
203+
install(FILES ${PROJECT_VERSION_FILE}
204+
DESTINATION ${CONFIG_INSTALL_DIR}
205+
)
206+
207+
# build directory package config
208+
export(EXPORT ${TARGETS_EXPORT_NAME}
209+
FILE ${PROJECT_CONFIG_FILE}
210+
)
211+
212+
# installed package config
213+
install(EXPORT ${TARGETS_EXPORT_NAME}
214+
DESTINATION ${CONFIG_INSTALL_DIR}
215+
FILE ${PROJECT_CONFIG_FILE}
216+
)
217+
218+
# add to CMake registry
219+
export(PACKAGE ${PROJECT_NAME})
220+
221+
#---------------------------------------------------------------------------------------
222+
# Create release packages
223+
#---------------------------------------------------------------------------------------
224+
225+
# determine distribution and architecture
226+
find_program(LSB_RELEASE lsb_release)
227+
find_program(SYSCTL sysctl)
228+
find_program(UNAME uname)
229+
230+
if(UNAME)
231+
execute_process(COMMAND uname -m OUTPUT_VARIABLE MACHINE_ARCH OUTPUT_STRIP_TRAILING_WHITESPACE)
232+
elseif(SYSCTL)
233+
execute_process(COMMAND sysctl -b hw.machine_arch OUTPUT_VARIABLE MACHINE_ARCH OUTPUT_STRIP_TRAILING_WHITESPACE)
234+
else()
235+
string(TOLOWER ${CMAKE_SYSTEM_NAME} MACHINE_ARCH)
236+
endif()
237+
238+
if(LSB_RELEASE)
239+
execute_process(COMMAND lsb_release -si OUTPUT_VARIABLE LINUX_DISTRO OUTPUT_STRIP_TRAILING_WHITESPACE)
240+
execute_process(COMMAND lsb_release -sc OUTPUT_VARIABLE LINUX_DISTRO_CODENAME OUTPUT_STRIP_TRAILING_WHITESPACE)
241+
execute_process(COMMAND lsb_release -sr OUTPUT_VARIABLE LINUX_DISTRO_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
242+
243+
string(TOLOWER ${LINUX_DISTRO} LINUX_DISTRO)
244+
if(LINUX_DISTRO_CODENAME STREQUAL "n/a")
245+
set(DISTRO_PACK_PATH ${LINUX_DISTRO}/${LINUX_DISTRO_VERSION}/)
246+
else()
247+
set(DISTRO_PACK_PATH ${LINUX_DISTRO}/${LINUX_DISTRO_CODENAME}/)
248+
endif()
249+
else()
250+
set(DISTRO_PACK_PATH ${CMAKE_SYSTEM_NAME}/)
251+
endif()
252+
253+
# default CPack generators
254+
set(CPACK_GENERATOR TGZ STGZ)
255+
256+
# extra CPack generators
257+
if(LINUX_DISTRO STREQUAL "debian" OR LINUX_DISTRO STREQUAL "ubuntu" OR LINUX_DISTRO STREQUAL "linuxmint")
258+
list(APPEND CPACK_GENERATOR DEB)
259+
elseif(LINUX_DISTRO STREQUAL "fedora" OR LINUX_DISTRO STREQUAL "opensuse" OR LINUX_DISTRO STREQUAL "centos")
260+
list(APPEND CPACK_GENERATOR RPM)
261+
elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
262+
list(APPEND CPACK_GENERATOR FREEBSD)
263+
endif()
264+
265+
# general CPack config
266+
set(CPACK_PACKAGE_DIRECTORY ${CMAKE_BINARY_DIR}/packages/${DISTRO_PACK_PATH})
267+
message(STATUS "CPack: packages will be generated under ${CPACK_PACKAGE_DIRECTORY}")
268+
if(BUILD_SHARED_LIBS)
269+
set(CPACK_PACKAGE_NAME "${PROJECT_NAME}${PROJECT_VERSION_MAJOR}")
270+
else()
271+
set(CPACK_PACKAGE_NAME "${PROJECT_NAME}-devel")
272+
endif()
273+
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
274+
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "LibTomCrypt")
275+
set(CPACK_PACKAGE_VENDOR "libtom projects")
276+
set(CPACK_PACKAGE_CONTACT "libtom@googlegroups.com")
277+
set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
278+
set(PACKAGE_NAME_TRAILER ${CPACK_PACKAGE_VERSION}-${PACKAGE_RELEASE_VERSION}_${MACHINE_ARCH})
279+
set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${PACKAGE_NAME_TRAILER})
280+
set(CPACK_STRIP_FILES ON)
281+
282+
# deb specific CPack config
283+
set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
284+
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
285+
set(CPACK_DEBIAN_PACKAGE_RELEASE ${PACKAGE_RELEASE_VERSION})
286+
if(BUILD_SHARED_LIBS)
287+
set(CPACK_DEBIAN_PACKAGE_SECTION "libs")
288+
else()
289+
set(CPACK_DEBIAN_PACKAGE_NAME "${PROJECT_NAME}-dev")
290+
set(CPACK_DEBIAN_PACKAGE_SECTION "devel")
291+
endif()
292+
293+
# rpm specific CPack config
294+
set(CPACK_RPM_PACKAGE_RELEASE ${PACKAGE_RELEASE_VERSION})
295+
set(CPACK_RPM_PACKAGE_ARCHITECTURE ${MACHINE_ARCH})
296+
set(CPACK_RPM_PACKAGE_NAME "${CPACK_PACKAGE_NAME}-${PROJECT_VERSION}")
297+
set(CPACK_RPM_PACKAGE_LICENSE "The Unlicense")
298+
299+
# FreeBSD specific CPack config
300+
set(CPACK_FREEBSD_PACKAGE_MAINTAINER "gahr@FreeBSD.org")
301+
set(CPACK_FREEBSD_PACKAGE_ORIGIN "security/libtomcrypt")
302+
set(CPACK_FREEBSD_PACKAGE_CATEGORIES "security")
303+
304+
include(CPack)

README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,21 @@ You want to install the shared library to a special path and use it from this pa
180180

181181
Have a look at the developer documentation, [[GNU]] or [[FreeBSD]] to get a detailed explanation of all the variables.
182182

183+
## CMake support
184+
185+
The project provides support for the CMake build system.
186+
187+
```
188+
git clone https://github.com/libtom/libtomcrypt.git
189+
mkdir -p libtomcrypt/build
190+
cd libtomcrypt/build
191+
cmake ..
192+
make -j$(nproc)
193+
```
194+
195+
More details around building with CMake can be found in the developer documentation.
196+
197+
183198
[GNU]: https://www.gnu.org/prep/standards/html_node/DESTDIR.html
184199

185200
[FreeBSD]: https://www.freebsd.org/doc/en/books/porters-handbook/porting-prefix.html

0 commit comments

Comments
 (0)