Skip to content

Commit 5108f12

Browse files
authored
Merge pull request #528 from libtom/add-cmake-support
Add cmake support
2 parents 66de864 + 72ce1e5 commit 5108f12

File tree

9 files changed

+598
-13
lines changed

9 files changed

+598
-13
lines changed

.github/workflows/main.yml

+39-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ on:
2525
- /^ci\/.*$/
2626

2727
jobs:
28-
Build:
28+
Testme:
2929
runs-on: ${{ matrix.os }}
3030
strategy:
3131
matrix:
@@ -146,3 +146,41 @@ jobs:
146146
cat test_*.log || true
147147
cat valgrind_test.log || true
148148
cat gcc_errors_*.log || true
149+
150+
CMake:
151+
runs-on: ${{ matrix.os }}
152+
strategy:
153+
matrix:
154+
os: [ ubuntu-18.04, ubuntu-20.04 ]
155+
build_type: [ '', -DCMAKE_BUILD_TYPE=Debug, -DCMAKE_BUILD_TYPE=Release, -DCMAKE_BUILD_TYPE=RelWithDebInfo, -DCMAKE_BUILD_TYPE=MinSizeRel ]
156+
cc: [ clang, gcc ]
157+
config:
158+
# Static library build
159+
- { CMAKEOPTIONS: '-DBUILD_SHARED_LIBS=Off' }
160+
# Shared library build
161+
- { CMAKEOPTIONS: '-DBUILD_SHARED_LIBS=On' }
162+
steps:
163+
- uses: actions/checkout@v2
164+
- name: install dependencies
165+
run: |
166+
sudo apt-get update -qq
167+
sudo apt-get install -y cmake gcc clang llvm
168+
- name: build
169+
run: |
170+
mkdir build
171+
cd build
172+
CC=${{ matrix.cc }} cmake ${{ matrix.config.CMAKEOPTIONS }} ${{ matrix.build_type }} ..
173+
make -j$(nproc)
174+
- name: test
175+
run: |
176+
cd build
177+
CC=${{ matrix.cc }} cmake ${{ matrix.config.CMAKEOPTIONS }} ${{ matrix.build_type }} -DBUILD_TESTING=On ..
178+
make -j$(nproc)
179+
ctest
180+
- name: test (in demo folder)
181+
run: |
182+
mkdir -p demo/build
183+
cd demo/build
184+
CC=${{ matrix.cc }} cmake ${{ matrix.config.CMAKEOPTIONS }} ${{ matrix.build_type }} ..
185+
make -j$(nproc)
186+
ctest

.gitignore

+7
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,10 @@ logs/*.png
104104
logs/*-*.dem
105105

106106
callgraph.txt
107+
108+
# cmake build directories
109+
build*/
110+
111+
# kdevelop section
112+
.kdev4/
113+
*.kdev4

CMakeLists.txt

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

README.md

+16-2
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ This is the git repository for [LibTomMath](http://www.libtom.net/LibTomMath/),
66

77
### Travis CI
88

9-
master: [![Build Status](https://api.travis-ci.org/libtom/libtommath.png?branch=master)](https://travis-ci.org/libtom/libtommath)
9+
master: [![Build Status](https://github.com/libtom/libtommath/actions/workflows/main.yml/badge.svg?branch=master)](https://github.com/libtom/libtommath/actions/workflows/main.yml?query=branch%3Amaster+++)
1010

11-
develop: [![Build Status](https://api.travis-ci.org/libtom/libtommath.png?branch=develop)](https://travis-ci.org/libtom/libtommath)
11+
develop: [![Build Status](https://github.com/libtom/libtommath/actions/workflows/main.yml/badge.svg?branch=develop)](https://github.com/libtom/libtommath/actions/workflows/main.yml?query=branch%3Adevelop+++)
1212

1313
### AppVeyor
1414

@@ -42,3 +42,17 @@ Tests are located in `demo/` and can be built in two flavors.
4242
## Building and Installing
4343

4444
Building is straightforward for GNU Linux only, the section "Building LibTomMath" in the documentation in `doc/bn.pdf` has the details.
45+
46+
### CMake support
47+
48+
The project provides support for the CMake build system.
49+
50+
```
51+
git clone https://github.com/libtom/libtommath.git
52+
mkdir -p libtommath/build
53+
cd libtommath/build
54+
cmake ..
55+
make -j$(nproc)
56+
```
57+
58+
A shared library build can be done by setting `-DBUILD_SHARED_LIBS=On` when invoking the `cmake` command.

0 commit comments

Comments
 (0)