Skip to content

Commit cdc1dbe

Browse files
committed
port cmake integration changes from libtommath
... also enable building of tests. Signed-off-by: Steffen Jaeckel <s@jaeckel.eu>
1 parent a9a010d commit cdc1dbe

File tree

11 files changed

+384
-72
lines changed

11 files changed

+384
-72
lines changed

CMakeLists.txt

Lines changed: 204 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,103 +1,218 @@
1+
# SPDX-License-Identifier: Unlicense
2+
#
3+
# LibTomCrypt, modular cryptographic library -- Tom St Denis
4+
#
5+
16
cmake_minimum_required(VERSION 3.10)
27

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)
418

519
#-----------------------------------------------------------------------------
6-
# Include required CMake modules
20+
# Include CMake modules
721
#-----------------------------------------------------------------------------
822
include(GNUInstallDirs)
23+
include(CheckIPOSupported)
924
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)
1031

1132
#-----------------------------------------------------------------------------
1233
# Options
1334
#-----------------------------------------------------------------------------
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)
1639

1740
#-----------------------------------------------------------------------------
18-
# Library targets
41+
# Compose CFLAGS
1942
#-----------------------------------------------------------------------------
20-
include(${CMAKE_CURRENT_SOURCE_DIR}/sources.cmake)
21-
add_library(${PROJECT_NAME} ${SOURCES})
2243

23-
#-----------------------------------------------------------------------------
24-
# Definitions
25-
#-----------------------------------------------------------------------------
26-
if(USE_LTM)
27-
find_package(tommath 1.2.0 REQUIRED)
44+
# Some information ported from makefile_include.mk
2845

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")
3049
endif()
3150

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()
3665

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})
4188

4289
#-----------------------------------------------------------------------------
43-
# Library target properties
90+
# Library targets
4491
#-----------------------------------------------------------------------------
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+
)
4897

4998
target_include_directories(${PROJECT_NAME} PUBLIC
5099
$<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}"
52115
)
53116

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)
57160
endif()
58161

59162
#---------------------------------------------------------------------------------------
60163
# Install/export targets and files
61164
#---------------------------------------------------------------------------------------
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")
73169

74170
# install targets
75171
install(TARGETS ${PROJECT_NAME}
76-
COMPONENT "runtime"
77172
EXPORT ${TARGETS_EXPORT_NAME}
78173
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
79174
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
81200
)
82201

83202
# install version file
84203
install(FILES ${PROJECT_VERSION_FILE}
85-
COMPONENT "development"
86204
DESTINATION ${CONFIG_INSTALL_DIR}
87205
)
88206

89207
# build directory package config
90208
export(EXPORT ${TARGETS_EXPORT_NAME}
91209
FILE ${PROJECT_CONFIG_FILE}
92-
NAMESPACE "LTC::"
93210
)
94211

95212
# installed package config
96213
install(EXPORT ${TARGETS_EXPORT_NAME}
97-
COMPONENT "development"
98214
DESTINATION ${CONFIG_INSTALL_DIR}
99215
FILE ${PROJECT_CONFIG_FILE}
100-
NAMESPACE "LTC::"
101216
)
102217

103218
# add to CMake registry
@@ -106,19 +221,33 @@ export(PACKAGE ${PROJECT_NAME})
106221
#---------------------------------------------------------------------------------------
107222
# Create release packages
108223
#---------------------------------------------------------------------------------------
109-
# package release version
110-
set(PACKAGE_RELEASE_VERSION 1)
111224

112225
# determine distribution and architecture
113226
find_program(LSB_RELEASE lsb_release)
227+
find_program(SYSCTL sysctl)
228+
find_program(UNAME uname)
114229

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()
116237

117238
if(LSB_RELEASE)
118-
execute_process(COMMAND lsb_release -sr OUTPUT_VARIABLE LINUX_DISTRO_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
119239
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)
120242

121243
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}/)
122251
endif()
123252

124253
# default CPack generators
@@ -129,33 +258,47 @@ if(LINUX_DISTRO STREQUAL "debian" OR LINUX_DISTRO STREQUAL "ubuntu" OR LINUX_DIS
129258
list(APPEND CPACK_GENERATOR DEB)
130259
elseif(LINUX_DISTRO STREQUAL "fedora" OR LINUX_DISTRO STREQUAL "opensuse" OR LINUX_DISTRO STREQUAL "centos")
131260
list(APPEND CPACK_GENERATOR RPM)
261+
elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
262+
list(APPEND CPACK_GENERATOR FREEBSD)
132263
endif()
133264

134265
# general CPack config
135-
set(CPACK_PACKAGE_DIRECTORY ${CMAKE_BINARY_DIR}/packages)
266+
set(CPACK_PACKAGE_DIRECTORY ${CMAKE_BINARY_DIR}/packages/${DISTRO_PACK_PATH})
136267
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()
138273
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
139274
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "LibTomCrypt")
140-
set(CPACK_PACKAGE_VENDOR "LibTomCrypt")
275+
set(CPACK_PACKAGE_VENDOR "libtom projects")
141276
set(CPACK_PACKAGE_CONTACT "libtom@googlegroups.com")
142277
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})
144280
set(CPACK_STRIP_FILES ON)
145281

146282
# deb specific CPack config
147-
set(CPACK_DEBIAN_PACKAGE_RELEASE ${PACKAGE_RELEASE_VERSION})
148283
set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
149284
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()
152292

153293
# rpm specific CPack config
154-
set(CPACK_RPM_PACKAGE_URL "https://www.libtom.net/LibTomCrypt")
155294
set(CPACK_RPM_PACKAGE_RELEASE ${PACKAGE_RELEASE_VERSION})
156295
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")
160303

161304
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)