1
+ # SPDX-License-Identifier: Unlicense
2
+ #
3
+ # LibTomCrypt, modular cryptographic library -- Tom St Denis
4
+ #
5
+
1
6
cmake_minimum_required (VERSION 3.10 )
2
7
3
- project (tomcrypt VERSION 1.18.2 )
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 )
4
18
5
19
#-----------------------------------------------------------------------------
6
- # Include required CMake modules
20
+ # Include CMake modules
7
21
#-----------------------------------------------------------------------------
8
22
include (GNUInstallDirs )
23
+ include (CheckIPOSupported )
9
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 )
10
31
11
32
#-----------------------------------------------------------------------------
12
33
# Options
13
34
#-----------------------------------------------------------------------------
14
- option (USE_LTM "Build with libtommath" TRUE )
15
- option (BUILD_SHARED_LIBS "Build shared library" FALSE )
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 )
16
39
17
40
#-----------------------------------------------------------------------------
18
- # Library targets
41
+ # Compose CFLAGS
19
42
#-----------------------------------------------------------------------------
20
- include (${CMAKE_CURRENT_SOURCE_DIR} /sources.cmake )
21
- add_library (${PROJECT_NAME} ${SOURCES} )
22
43
23
- #-----------------------------------------------------------------------------
24
- # Definitions
25
- #-----------------------------------------------------------------------------
26
- if (USE_LTM )
27
- find_package (tommath 1.2.0 REQUIRED )
44
+ # Some information ported from makefile_include.mk
28
45
29
- target_compile_definitions (${PROJECT_NAME} PUBLIC USE_LTM LTM_DESC )
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" )
30
49
endif ()
31
50
32
- #-----------------------------------------------------------------------------
33
- # Add subdirectories
34
- #-----------------------------------------------------------------------------
35
- add_subdirectory (demos )
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 ()
36
65
37
- #-----------------------------------------------------------------------------
38
- # Public headers
39
- #-----------------------------------------------------------------------------
40
- get_property (${PROJECT_NAME} -public-headers GLOBAL PROPERTY PUBLIC_HEADERS )
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} )
41
88
42
89
#-----------------------------------------------------------------------------
43
- # Library target properties
90
+ # Library targets
44
91
#-----------------------------------------------------------------------------
45
- set_target_properties (${PROJECT_NAME} PROPERTIES OUTPUT_NAME ${PROJECT_NAME} )
46
- set_target_properties (${PROJECT_NAME} PROPERTIES SOVERSION ${PROJECT_VERSION} )
47
- set_target_properties (${PROJECT_NAME} PROPERTIES PUBLIC_HEADER "${${PROJECT_NAME} -public-headers}" )
92
+ add_library (${PROJECT_NAME}
93
+ ${SOURCES}
94
+ ${PUBLIC_HEADERS}
95
+ ${PRIVATE_HEADERS}
96
+ )
48
97
49
98
target_include_directories (${PROJECT_NAME} PUBLIC
50
99
$< BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR} /src/headers>
51
- $< INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR} /lib${PROJECT_NAME} >
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} "
52
115
)
53
116
54
- # libtommath dependent
55
- if (USE_LTM )
56
- target_link_libraries (${PROJECT_NAME} PUBLIC tommath )
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 )
57
160
endif ()
58
161
59
162
#---------------------------------------------------------------------------------------
60
163
# Install/export targets and files
61
164
#---------------------------------------------------------------------------------------
62
- set (CONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR} /cmake/lib${PROJECT_NAME} " )
63
- set (PROJECT_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR} /lib${PROJECT_NAME} -config-version.cmake" )
64
- set (PROJECT_CONFIG_FILE "lib${PROJECT_NAME} -config.cmake" )
65
- set (TARGETS_EXPORT_NAME "lib${PROJECT_NAME} Targets" )
66
-
67
- # generate package version file
68
- write_basic_package_version_file (
69
- ${PROJECT_VERSION_FILE}
70
- VERSION ${PROJECT_VERSION}
71
- COMPATIBILITY SameMajorVersion
72
- )
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" )
73
169
74
170
# install targets
75
171
install (TARGETS ${PROJECT_NAME}
76
- COMPONENT "runtime"
77
172
EXPORT ${TARGETS_EXPORT_NAME}
78
173
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
79
174
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
80
- PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} /lib${PROJECT_NAME}
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
81
200
)
82
201
83
202
# install version file
84
203
install (FILES ${PROJECT_VERSION_FILE}
85
- COMPONENT "development"
86
204
DESTINATION ${CONFIG_INSTALL_DIR}
87
205
)
88
206
89
207
# build directory package config
90
208
export (EXPORT ${TARGETS_EXPORT_NAME}
91
209
FILE ${PROJECT_CONFIG_FILE}
92
- NAMESPACE "LTC::"
93
210
)
94
211
95
212
# installed package config
96
213
install (EXPORT ${TARGETS_EXPORT_NAME}
97
- COMPONENT "development"
98
214
DESTINATION ${CONFIG_INSTALL_DIR}
99
215
FILE ${PROJECT_CONFIG_FILE}
100
- NAMESPACE "LTC::"
101
216
)
102
217
103
218
# add to CMake registry
@@ -106,19 +221,33 @@ export(PACKAGE ${PROJECT_NAME})
106
221
#---------------------------------------------------------------------------------------
107
222
# Create release packages
108
223
#---------------------------------------------------------------------------------------
109
- # package release version
110
- set (PACKAGE_RELEASE_VERSION 1 )
111
224
112
225
# determine distribution and architecture
113
226
find_program (LSB_RELEASE lsb_release )
227
+ find_program (SYSCTL sysctl )
228
+ find_program (UNAME uname )
114
229
115
- execute_process (COMMAND uname -m OUTPUT_VARIABLE MACHINE_ARCH OUTPUT_STRIP_TRAILING_WHITESPACE )
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 ()
116
237
117
238
if (LSB_RELEASE )
118
- execute_process (COMMAND lsb_release -sr OUTPUT_VARIABLE LINUX_DISTRO_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE )
119
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 )
120
242
121
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} / )
122
251
endif ()
123
252
124
253
# default CPack generators
@@ -129,33 +258,47 @@ if(LINUX_DISTRO STREQUAL "debian" OR LINUX_DISTRO STREQUAL "ubuntu" OR LINUX_DIS
129
258
list (APPEND CPACK_GENERATOR DEB )
130
259
elseif (LINUX_DISTRO STREQUAL "fedora" OR LINUX_DISTRO STREQUAL "opensuse" OR LINUX_DISTRO STREQUAL "centos" )
131
260
list (APPEND CPACK_GENERATOR RPM )
261
+ elseif (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" )
262
+ list (APPEND CPACK_GENERATOR FREEBSD )
132
263
endif ()
133
264
134
265
# general CPack config
135
- set (CPACK_PACKAGE_DIRECTORY ${CMAKE_BINARY_DIR} /packages )
266
+ set (CPACK_PACKAGE_DIRECTORY ${CMAKE_BINARY_DIR} /packages/${DISTRO_PACK_PATH} )
136
267
message (STATUS "CPack: packages will be generated under ${CPACK_PACKAGE_DIRECTORY} " )
137
- set (CPACK_PACKAGE_NAME "lib${PROJECT_NAME} " )
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 ()
138
273
set (CPACK_PACKAGE_VERSION ${PROJECT_VERSION} )
139
274
set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "LibTomCrypt" )
140
- set (CPACK_PACKAGE_VENDOR "LibTomCrypt " )
275
+ set (CPACK_PACKAGE_VENDOR "libtom projects " )
141
276
set (CPACK_PACKAGE_CONTACT "libtom@googlegroups.com" )
142
277
set (CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR} /LICENSE" )
143
- set (CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME} -${CPACK_PACKAGE_VERSION}-${PACKAGE_RELEASE_VERSION}_${LINUX_DISTRO}-${LINUX_DISTRO_VERSION}_${MACHINE_ARCH} )
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} )
144
280
set (CPACK_STRIP_FILES ON )
145
281
146
282
# deb specific CPack config
147
- set (CPACK_DEBIAN_PACKAGE_RELEASE ${PACKAGE_RELEASE_VERSION} )
148
283
set (CPACK_DEBIAN_FILE_NAME DEB-DEFAULT )
149
284
set (CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON )
150
- set (CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://www.libtom.net/LibTomCrypt" )
151
- set (CPACK_DEBIAN_PACKAGE_SECTION "devel" )
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 ()
152
292
153
293
# rpm specific CPack config
154
- set (CPACK_RPM_PACKAGE_URL "https://www.libtom.net/LibTomCrypt" )
155
294
set (CPACK_RPM_PACKAGE_RELEASE ${PACKAGE_RELEASE_VERSION} )
156
295
set (CPACK_RPM_PACKAGE_ARCHITECTURE ${MACHINE_ARCH} )
157
- set (CPACK_RPM_PACKAGE_NAME "lib${PROJECT_NAME} -${PROJECT_VERSION} " )
158
- set (CPACK_RPM_FILE_NAME "lib${PROJECT_NAME} _${PROJECT_VERSION} -${CPACK_RPM_PACKAGE_RELEASE} _${LINUX_DISTRO} -${LINUX_DISTRO_VERSION} _${CPACK_RPM_PACKAGE_ARCHITECTURE} .rpm" )
159
- set (CPACK_RPM_PACKAGE_LICENSE "WTFPL" )
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" )
160
303
161
304
include (CPack )
0 commit comments