@@ -21,7 +21,11 @@ set(PACKAGE_RELEASE_VERSION 1)
21
21
# Include cmake modules
22
22
#-----------------------------------------------------------------------------
23
23
include (GNUInstallDirs)
24
+ include (CheckIPOSupported)
24
25
include (CMakePackageConfigHelpers)
26
+ # default is "No tests"
27
+ option (BUILD_TESTING "" OFF )
28
+ include (CTest)
25
29
include (sources .cmake)
26
30
27
31
# The only direct cmake argument for now
@@ -31,42 +35,41 @@ option(BUILD_SHARED_LIBS "Build shared library and only the shared library if \"
31
35
# Compose CFLAGS
32
36
#-----------------------------------------------------------------------------
33
37
34
- # Some information copied from makefile_include.mk
38
+ # Some information ported from makefile_include.mk
35
39
36
- # Basic set
37
- set (LTM_C_FLAGS -Wall -Wsign-compare -Wextra -Wshadow)
38
- set (LTM_C_FLAGS ${LTM_C_FLAGS} -Wdeclaration-after-statement -Wbad-function-cast -Wcast-align)
39
- set (LTM_C_FLAGS ${LTM_C_FLAGS} -Wstrict-prototypes -Wpointer-arith -Wsystem-headers)
40
40
41
41
if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES )
42
42
message (STATUS "Setting build type to 'Release' as none was specified." )
43
43
set (CMAKE_BUILD_TYPE "Release" )
44
44
endif ()
45
45
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" )
50
-
51
- if (COMPILE_LTO)
52
- set (LTM_C_FLAGS ${LTM_C_FLAGS} -flto)
53
- set (LTM_LD_FLAGS ${LTM_LD_FLAGS} -flto)
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" )
54
57
endif ()
55
58
56
59
# What compiler do we have and what are their...uhm... peculiarities
57
60
if (CMAKE_C_COMPILER_ID MATCHES "(C|c?)lang" )
58
- set (LTM_C_FLAGS ${ LTM_C_FLAGS} -Wno-typedef-redefinition -Wno-tautological-compare -Wno-builtin-requires-header)
61
+ list ( APPEND LTM_C_FLAGS -Wno-typedef-redefinition -Wno-tautological-compare -Wno-builtin-requires-header)
59
62
# Clang requires at least '-O1' for dead code eliminiation
60
- set (CMAKE_C_FLAGS_DEBUG " ${CMAKE_C_FLAGS_DEBUG} -O1 " )
63
+ set (CMAKE_C_FLAGS_DEBUG "-O1 ${CMAKE_C_FLAGS_DEBUG} " )
61
64
endif ()
62
65
if (CMAKE_C_COMPILER MATCHES "mingw" )
63
- set ( LTM_C_FLAGS ${LTM_C_FLAGS} -Wno-shadow )
66
+ list ( APPEND LTM_C_FLAGS -Wno-shadow -Wno-expansion-to- defined -Wno-declaration-after-statement -Wno-bad-function-cast )
64
67
endif ()
65
68
if (CMAKE_SYSTEM_NAME MATCHES "Darwin" )
66
- set (LTM_C_FLAGS ${ LTM_C_FLAGS} -Wno-nullability-completeness)
69
+ list ( APPEND LTM_C_FLAGS -Wno-nullability-completeness)
67
70
endif ()
68
71
if (CMAKE_SYSTEM_NAME MATCHES "CYGWIN" )
69
- set (LTM_C_FLAGS ${ LTM_C_FLAGS} -no -undefined)
72
+ list ( APPEND LTM_C_FLAGS -no -undefined)
70
73
endif ()
71
74
72
75
# TODO: coverage (lgcov)
@@ -75,14 +78,15 @@ endif()
75
78
# in order to allow overriding our defaults.
76
79
# ${LTM_CFLAGS} means the user passed it via sth like:
77
80
# $ cmake -DLTM_CFLAGS="foo"
78
- set (LTM_C_FLAGS ${ LTM_C_FLAGS} ${LTM_CFLAGS} )
79
- set (LTM_LD_FLAGS ${ LTM_LD_FLAGS} ${LTM_LDFLAGS} )
81
+ list ( APPEND LTM_C_FLAGS ${LTM_CFLAGS} )
82
+ list ( APPEND LTM_LD_FLAGS ${LTM_LDFLAGS} )
80
83
81
84
#-----------------------------------------------------------------------------
82
85
# library target
83
86
#-----------------------------------------------------------------------------
84
87
add_library (${PROJECT_NAME}
85
88
${SOURCES}
89
+ ${HEADERS}
86
90
)
87
91
88
92
target_include_directories (${PROJECT_NAME} PUBLIC
@@ -100,13 +104,27 @@ target_link_options(${PROJECT_NAME} BEFORE PRIVATE
100
104
set_target_properties (${PROJECT_NAME} PROPERTIES
101
105
VERSION ${PROJECT_VERSION}
102
106
SOVERSION ${PROJECT_VERSION_MAJOR}
107
+ PUBLIC_HEADER tommath.h
103
108
)
104
109
110
+ option (COMPILE_LTO "Build with LTO enabled" )
111
+ if (COMPILE_LTO)
112
+ check_ipo_supported(RESULT COMPILER_SUPPORTS_LTO)
113
+ if (COMPILER_SUPPORTS_LTO)
114
+ set_property (TARGET ${PROJECT_NAME} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE )
115
+ else ()
116
+ message (SEND_ERROR "This compiler does not support LTO. Reconfigure ${PROJECT_NAME} with -DCOMPILE_LTO=OFF." )
117
+ endif ()
118
+ endif ()
105
119
106
120
#-----------------------------------------------------------------------------
107
121
# demo target
108
122
#-----------------------------------------------------------------------------
109
- add_subdirectory (demo)
123
+
124
+ if (BUILD_TESTING)
125
+ enable_testing ()
126
+ add_subdirectory (demo)
127
+ endif ()
110
128
111
129
#-----------------------------------------------------------------------------
112
130
# Install/export targets and files
@@ -120,22 +138,23 @@ install(TARGETS ${PROJECT_NAME}
120
138
EXPORT ${TARGETS_EXPORT_NAME}
121
139
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
122
140
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
123
- )
124
-
125
- install (FILES ${HEADERS}
126
- DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} /${PROJECT_NAME}
141
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
142
+ PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} /${PROJECT_NAME}
127
143
)
128
144
129
145
# Install libtommath.pc for pkg-config if we build a shared library
130
146
if (BUILD_SHARED_LIBS )
147
+ # Let the user override the default directory of the pkg-config file (usually this shouldn't be required to be changed)
148
+ set (CMAKE_INSTALL_PKGCONFIGDIR "${CMAKE_INSTALL_LIBDIR} /pkgconfig" CACHE PATH "Folder where to install .pc files" )
149
+
131
150
configure_file (
132
151
${CMAKE_CURRENT_SOURCE_DIR} /lib${PROJECT_NAME} .pc.in
133
152
${CMAKE_CURRENT_BINARY_DIR} /lib${PROJECT_NAME} .pc
134
153
@ONLY
135
154
)
136
155
137
156
install (FILES ${CMAKE_CURRENT_BINARY_DIR} /lib${PROJECT_NAME} .pc
138
- DESTINATION ${CMAKE_INSTALL_DATAROOTDIR} /pkgconfig
157
+ DESTINATION ${CMAKE_INSTALL_PKGCONFIGDIR}
139
158
)
140
159
endif ()
141
160
@@ -170,9 +189,14 @@ export(PACKAGE ${PROJECT_NAME})
170
189
#---------------------------------------------------------------------------------------
171
190
172
191
# determine distribution and architecture
192
+ find_program (UNAME uname)
173
193
find_program (LSB_RELEASE lsb_release)
174
194
175
- execute_process (COMMAND uname -m OUTPUT_VARIABLE MACHINE_ARCH OUTPUT_STRIP_TRAILING_WHITESPACE)
195
+ if (UNAME)
196
+ execute_process (COMMAND uname -m OUTPUT_VARIABLE MACHINE_ARCH OUTPUT_STRIP_TRAILING_WHITESPACE)
197
+ else ()
198
+ string (TOLOWER ${CMAKE_SYSTEM_NAME} MACHINE_ARCH)
199
+ endif ()
176
200
177
201
if (LSB_RELEASE)
178
202
execute_process (COMMAND lsb_release -si OUTPUT_VARIABLE LINUX_DISTRO OUTPUT_STRIP_TRAILING_WHITESPACE)
0 commit comments