44# integer (MPI) library written entirely in C.
55#
66
7- cmake_minimum_required (VERSION 3.7)
8- project (tommath VERSION 1.2.0)
7+ cmake_minimum_required (VERSION 3.10)
8+
9+ project (tommath
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)
919
1020#-----------------------------------------------------------------------------
1121# Include cmake modules
@@ -26,74 +36,47 @@ option(BUILD_SHARED_LIBS "Build shared library and only the shared library if \"
2636# Basic set
2737set (LTM_C_FLAGS -Wall -Wsign-compare -Wextra -Wshadow)
2838set (LTM_C_FLAGS ${LTM_C_FLAGS} -Wdeclaration-after-statement -Wbad-function-cast -Wcast-align)
29- set (LTM_C_FLAGS ${LTM_C_FLAGS} -Wstrict-prototypes -Wpointer-arith)
39+ set (LTM_C_FLAGS ${LTM_C_FLAGS} -Wstrict-prototypes -Wpointer-arith -Wsystem-headers )
3040
31- # Do we run the sanitizer?
32- if ( DEFINED ENV{SANITIZER} )
33- set (LTM_C_FLAGS ${LTM_C_FLAGS} -fsanitize=undefined -fno-sanitize-recover= all -fno-sanitize=float-divide-by-zero )
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" )
3444endif ()
3545
36- if (DEFINED ENV{CONV_WARNINGS})
37- set (LTM_C_FLAGS ${LTM_C_FLAGS} -std=c89 -Wconversion -Wsign-conversion)
38- if ($ENV{CONV_WARNINGS} EQUAL "strict" )
39- set (LTM_C_FLAGS ${LTM_C_FLAGS} -Wc++-compat)
40- endif ()
41- else ()
42- set (LTM_C_FLAGS ${LTM_C_FLAGS} -Wsystem-headers)
43- endif ()
46+ set (CMAKE_C_FLAGS_DEBUG "-g3" )
47+ set (CMAKE_C_FLAGS_RELEASE "-O3 -funroll-loops -fomit-frame-pointer" )
48+ set (CMAKE_C_FLAGS_RELWITHDEBINFO "-g3 -O2" )
49+ set (CMAKE_C_FLAGS_MINSIZEREL "-Os" )
4450
45- if (DEFINED ENV{COMPILE_DEBUG})
46- set (LTM_C_FLAGS ${LTM_C_FLAGS} -g3)
51+ if (COMPILE_LTO)
52+ set (LTM_C_FLAGS ${LTM_C_FLAGS} -flto)
53+ set (LTM_LD_FLAGS ${LTM_LD_FLAGS} -flto)
4754endif ()
4855
49- if (DEFINED ENV{COMPILE_SIZE})
50- set (LTM_C_FLAGS ${LTM_C_FLAGS} -Os)
51- else ()
52- if (NOT DEFINED ENV{IGNORE_SPEED})
53- set (LTM_C_FLAGS ${LTM_C_FLAGS} -O3 -funroll-loops)
54- #x86 optimizations [should be valid for any GCC install though]
55- set (LTM_C_FLAGS ${LTM_C_FLAGS} -fomit-frame-pointer)
56- endif ()
57- # TODO:
58- # if(DEFINED ENV{COMPILE_LTO})
59- # set(LTM_C_FLAGS "${LTM_C_FLAGS} -flto")
60- # set(LTM_LD_FLAGS "${LTM_LD_FLAGS} -flto")
61- # #AR = $(subst clang,llvm-ar,$(subst gcc,gcc-ar,$(CC)))
62- # endif()
63- endif ()
64-
65- # TODO
66- # Are the coming three checks really the best way?
67-
6856# What compiler do we have and what are their...uhm... peculiarities
69- # TODO: is the check for a C++ compiler necessary?
70- if ( (CMAKE_C_COMPILER_ID MATCHES "(C|c?)lang" ) OR (CMAKE_CXX_COMPILER_ID MATCHES "(C|c?)lang" ))
57+ if (CMAKE_C_COMPILER_ID MATCHES "(C|c?)lang" )
7158 set (LTM_C_FLAGS ${LTM_C_FLAGS} -Wno-typedef-redefinition -Wno-tautological-compare -Wno-builtin-requires-header)
59+ # Clang requires at least '-O1' for dead code eliminiation
60+ set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O1" )
7261endif ()
73-
74- if ( (CMAKE_C_COMPILER_ID MATCHES "mingw" ) OR (CMAKE_CXX_COMPILER_ID MATCHES "mingw" ))
62+ if (CMAKE_C_COMPILER MATCHES "mingw" )
7563 set (LTM_C_FLAGS ${LTM_C_FLAGS} -Wno-shadow)
7664endif ()
77-
78- if (DEFINED ENV{PLATFORM})
79- if ($ENV{PLATFORM} MATCHES "Darwin" )
80- set (LTM_C_FLAGS ${LTM_C_FLAGS} -Wno-nullability-completeness)
81- endif ()
82- if ($ENV{PLATFORM} MATCHES "CYGWIN" )
83- set (LTM_C_FLAGS ${LTM_C_FLAGS} -no -undefined)
84- endif ()
65+ if (CMAKE_SYSTEM_NAME MATCHES "Darwin" )
66+ set (LTM_C_FLAGS ${LTM_C_FLAGS} -Wno-nullability-completeness)
67+ endif ()
68+ if (CMAKE_SYSTEM_NAME MATCHES "CYGWIN" )
69+ set (LTM_C_FLAGS ${LTM_C_FLAGS} -no -undefined)
8570endif ()
8671
8772# TODO: coverage (lgcov)
8873
8974# If the user set the environment variables at generate-time, append them
9075# in order to allow overriding our defaults.
91- if (DEFINED ENV{LTM_CFLAGS})
92- set (LTM_C_FLAGS ${LTM_C_FLAGS} $ENV{LTM_CFLAGS} )
93- endif ()
94- if (DEFINED ENV{LTM_LDFLAGS})
95- set (LTM_LD_FLAGS ${LTM_LD_FLAGS} $ENV{LTM_LDFLAGS} )
96- endif ()
76+ # ${LTM_CFLAGS} means the user passed it via sth like:
77+ # $ cmake -DLTM_CFLAGS="foo"
78+ set (LTM_C_FLAGS ${LTM_C_FLAGS} ${LTM_CFLAGS} )
79+ set (LTM_LD_FLAGS ${LTM_LD_FLAGS} ${LTM_LDFLAGS} )
9780
9881#-----------------------------------------------------------------------------
9982# library target
@@ -114,8 +97,10 @@ target_link_options(${PROJECT_NAME} BEFORE PRIVATE
11497 ${LTM_LD_FLAGS}
11598)
11699
117- set_target_properties (${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION} )
118- set_target_properties (${PROJECT_NAME} PROPERTIES SOVERSION ${PROJECT_VERSION_MAJOR} )
100+ set_target_properties (${PROJECT_NAME} PROPERTIES
101+ VERSION ${PROJECT_VERSION}
102+ SOVERSION ${PROJECT_VERSION_MAJOR}
103+ )
119104
120105#-----------------------------------------------------------------------------
121106# demo target
@@ -213,19 +198,25 @@ export(PACKAGE ${PROJECT_NAME})
213198#---------------------------------------------------------------------------------------
214199# Create release packages
215200#---------------------------------------------------------------------------------------
216- # package release version
217- set (PACKAGE_RELEASE_VERSION 1)
218201
219202# determine distribution and architecture
220203find_program (LSB_RELEASE lsb_release)
221204
222205execute_process (COMMAND uname -m OUTPUT_VARIABLE MACHINE_ARCH OUTPUT_STRIP_TRAILING_WHITESPACE)
223206
224207if (LSB_RELEASE)
225- execute_process (COMMAND lsb_release -sr OUTPUT_VARIABLE LINUX_DISTRO_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
226208 execute_process (COMMAND lsb_release -si OUTPUT_VARIABLE LINUX_DISTRO OUTPUT_STRIP_TRAILING_WHITESPACE)
209+ execute_process (COMMAND lsb_release -sc OUTPUT_VARIABLE LINUX_DISTRO_CODENAME OUTPUT_STRIP_TRAILING_WHITESPACE)
210+ execute_process (COMMAND lsb_release -sr OUTPUT_VARIABLE LINUX_DISTRO_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
227211
228212 string (TOLOWER ${LINUX_DISTRO} LINUX_DISTRO)
213+ if (LINUX_DISTRO_CODENAME STREQUAL "n/a" )
214+ set (DISTRO_PACK_PATH ${LINUX_DISTRO} /${LINUX_DISTRO_VERSION} /)
215+ else ()
216+ set (DISTRO_PACK_PATH ${LINUX_DISTRO} /${LINUX_DISTRO_CODENAME} /)
217+ endif ()
218+ else ()
219+ set (DISTRO_PACK_PATH )
229220endif ()
230221
231222# default CPack generators
@@ -236,33 +227,44 @@ if(LINUX_DISTRO STREQUAL "debian" OR LINUX_DISTRO STREQUAL "ubuntu" OR LINUX_DIS
236227 list (APPEND CPACK_GENERATOR DEB)
237228elseif (LINUX_DISTRO STREQUAL "fedora" OR LINUX_DISTRO STREQUAL "opensuse" OR LINUX_DISTRO STREQUAL "centos" )
238229 list (APPEND CPACK_GENERATOR RPM)
230+ elseif (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" )
231+ list (APPEND CPACK_GENERATOR FREEBSD)
239232endif ()
240233
241234# general CPack config
242- set (CPACK_PACKAGE_DIRECTORY ${CMAKE_BINARY_DIR} /packages)
235+ set (CPACK_PACKAGE_DIRECTORY ${CMAKE_BINARY_DIR} /packages/ ${DISTRO_PACK_PATH} )
243236message (STATUS "CPack: packages will be generated under ${CPACK_PACKAGE_DIRECTORY} " )
244237set (CPACK_PACKAGE_NAME "lib${PROJECT_NAME} " )
245238set (CPACK_PACKAGE_VERSION ${PROJECT_VERSION} )
246239set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "LibTomMath" )
247- set (CPACK_PACKAGE_VENDOR "LibTomMath " )
240+ set (CPACK_PACKAGE_VENDOR "libtom projects " )
248241set (CPACK_PACKAGE_CONTACT
"[email protected] " )
249242set (CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR} /LICENSE" )
250- set (CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME} -${CPACK_PACKAGE_VERSION} -${PACKAGE_RELEASE_VERSION} _${LINUX_DISTRO} -${LINUX_DISTRO_VERSION} _${MACHINE_ARCH} )
243+ set (PACKAGE_NAME_TRAILER ${CPACK_PACKAGE_VERSION} -${PACKAGE_RELEASE_VERSION} _${MACHINE_ARCH} )
244+ set (CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME} -${PACKAGE_NAME_TRAILER} )
251245set (CPACK_STRIP_FILES ON )
252246
253247# deb specific CPack config
254- set (CPACK_DEBIAN_PACKAGE_RELEASE ${PACKAGE_RELEASE_VERSION} )
255248set (CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
256249set (CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON )
257- set (CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://www.libtom.net/LibTomMath" )
258- set (CPACK_DEBIAN_PACKAGE_SECTION "devel" )
250+ set (CPACK_DEBIAN_PACKAGE_RELEASE ${PACKAGE_RELEASE_VERSION} )
251+ if (BUILD_SHARED_LIBS )
252+ set (CPACK_DEBIAN_PACKAGE_NAME "${CPACK_PACKAGE_NAME} 1" )
253+ set (CPACK_DEBIAN_PACKAGE_SECTION "libs" )
254+ else ()
255+ set (CPACK_DEBIAN_PACKAGE_NAME "${CPACK_PACKAGE_NAME} -dev" )
256+ set (CPACK_DEBIAN_PACKAGE_SECTION "devel" )
257+ endif ()
259258
260259# rpm specific CPack config
261- set (CPACK_RPM_PACKAGE_URL "https://www.libtom.net/LibTomMath" )
262260set (CPACK_RPM_PACKAGE_RELEASE ${PACKAGE_RELEASE_VERSION} )
263261set (CPACK_RPM_PACKAGE_ARCHITECTURE ${MACHINE_ARCH} )
264- set (CPACK_RPM_PACKAGE_NAME "lib${PROJECT_NAME} -${PROJECT_VERSION} " )
265- set (CPACK_RPM_FILE_NAME "lib${PROJECT_NAME} _${PROJECT_VERSION} -${CPACK_RPM_PACKAGE_RELEASE} _${LINUX_DISTRO} -${LINUX_DISTRO_VERSION} _${CPACK_RPM_PACKAGE_ARCHITECTURE} .rpm" )
266- set (CPACK_RPM_PACKAGE_LICENSE "WTFPL" )
262+ set (CPACK_RPM_PACKAGE_NAME "${CPACK_PACKAGE_NAME} -${PROJECT_VERSION} " )
263+ set (CPACK_RPM_PACKAGE_LICENSE "The Unlicense" )
264+
265+ # FreeBSD specific CPack config
266+ set (CPACK_FREEBSD_PACKAGE_MAINTAINER
"[email protected] " )
267+ set (CPACK_FREEBSD_PACKAGE_ORIGIN "math/libtommath" )
268+ set (CPACK_FREEBSD_PACKAGE_CATEGORIES "math" )
267269
268270include (CPack)
0 commit comments