@@ -20,49 +20,38 @@ option(BUILD_SHARED_LIBS "Build shared library and only the shared library if \"
20
20
# Compose CFLAGS
21
21
#-----------------------------------------------------------------------------
22
22
23
- # check if there was one already set.
24
- if (DEFINED ENV{LTM_CFLAGS})
25
- set (LTM_C_FLAGS $ENV{LTM_CFLAGS} )
26
- endif ()
27
- if (DEFINED ENV{LTM_LDFLAGS})
28
- set (LTM_LD_FLAGS $ENV{LTM_LDFLAGS} )
29
- endif ()
30
-
31
23
# Some information copied from makefile_include.mk
32
24
33
25
# Basic set
34
- set (LTM_C_FLAGS "${LTM_C_FLAGS} -Wall -Wsign-compare -Wextra -Wshadow" )
26
+ set (LTM_C_FLAGS -Wall -Wsign-compare -Wextra -Wshadow)
27
+ set (LTM_C_FLAGS ${LTM_C_FLAGS} -Wdeclaration-after-statement -Wbad-function-cast -Wcast-align)
28
+ set (LTM_C_FLAGS ${LTM_C_FLAGS} -Wstrict-prototypes -Wpointer-arith)
35
29
36
30
# Do we run the sanitizer?
37
31
if (DEFINED ENV{SANITIZER})
38
- set (LTM_C_FLAGS "${LTM_C_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all -fno-sanitize=float-divide-by-zero" )
39
- endif ()
40
-
41
- if (NOT DEFINED ENV{NO_ADDTL_WARNINGS})
42
- set (LTM_C_FLAGS "${LTM_C_FLAGS} -Wdeclaration-after-statement -Wbad-function-cast -Wcast-align" )
43
- set (LTM_C_FLAGS "${LTM_C_FLAGS} -Wstrict-prototypes -Wpointer-arith" )
32
+ set (LTM_C_FLAGS ${LTM_C_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all -fno-sanitize=float-divide-by-zero)
44
33
endif ()
45
34
46
35
if (DEFINED ENV{CONV_WARNINGS})
47
- set (LTM_C_FLAGS " ${LTM_C_FLAGS} -std=c89 -Wconversion -Wsign-conversion" )
36
+ set (LTM_C_FLAGS ${LTM_C_FLAGS} -std=c89 -Wconversion -Wsign-conversion)
48
37
if ($ENV{CONV_WARNINGS} EQUAL "strict" )
49
- set (LTM_C_FLAGS " ${LTM_C_FLAGS} -Wc++-compat" )
38
+ set (LTM_C_FLAGS ${LTM_C_FLAGS} -Wc++-compat)
50
39
endif ()
51
40
else ()
52
- set (LTM_C_FLAGS " ${LTM_C_FLAGS} -Wsystem-headers" )
41
+ set (LTM_C_FLAGS ${LTM_C_FLAGS} -Wsystem-headers)
53
42
endif ()
54
43
55
44
if (DEFINED ENV{COMPILE_DEBUG})
56
- set (LTM_C_FLAGS " ${LTM_C_FLAGS} -g3" )
45
+ set (LTM_C_FLAGS ${LTM_C_FLAGS} -g3)
57
46
endif ()
58
47
59
48
if (DEFINED ENV{COMPILE_SIZE})
60
- set (LTM_C_FLAGS " ${LTM_C_FLAGS} -Os" )
49
+ set (LTM_C_FLAGS ${LTM_C_FLAGS} -Os)
61
50
else ()
62
51
if (NOT DEFINED ENV{IGNORE_SPEED})
63
- set (LTM_C_FLAGS " ${LTM_C_FLAGS} -O3 -funroll-loops" )
52
+ set (LTM_C_FLAGS ${LTM_C_FLAGS} -O3 -funroll-loops)
64
53
#x86 optimizations [should be valid for any GCC install though]
65
- set (LTM_C_FLAGS " ${LTM_C_FLAGS} -fomit-frame-pointer" )
54
+ set (LTM_C_FLAGS ${LTM_C_FLAGS} -fomit-frame-pointer)
66
55
endif ()
67
56
# TODO:
68
57
# if(DEFINED ENV{COMPILE_LTO})
@@ -72,70 +61,56 @@ else()
72
61
# endif()
73
62
endif ()
74
63
64
+ # TODO
65
+ # Are the coming three checks really the best way?
66
+
75
67
# What compiler do we have and what are their...uhm... peculiarities
76
68
# TODO: is the check for a C++ compiler necessary?
77
69
if ( (CMAKE_C_COMPILER_ID MATCHES "(C|c?)lang" ) OR (CMAKE_CXX_COMPILER_ID MATCHES "(C|c?)lang" ))
78
- set (LTM_C_FLAGS " ${LTM_C_FLAGS} -Wno-typedef-redefinition -Wno-tautological-compare -Wno-builtin-requires-header" )
70
+ set (LTM_C_FLAGS ${LTM_C_FLAGS} -Wno-typedef-redefinition -Wno-tautological-compare -Wno-builtin-requires-header)
79
71
endif ()
80
72
81
73
if ( (CMAKE_C_COMPILER_ID MATCHES "mingw" ) OR (CMAKE_CXX_COMPILER_ID MATCHES "mingw" ))
82
- set (LTM_C_FLAGS " ${LTM_C_FLAGS} -Wno-shadow" )
74
+ set (LTM_C_FLAGS ${LTM_C_FLAGS} -Wno-shadow)
83
75
endif ()
84
76
85
77
if (DEFINED ENV{PLATFORM})
86
78
if ($ENV{PLATFORM} MATCHES "Darwin" )
87
- set (LTM_C_FLAGS " ${LTM_C_FLAGS} -Wno-nullability-completeness" )
79
+ set (LTM_C_FLAGS ${LTM_C_FLAGS} -Wno-nullability-completeness)
88
80
endif ()
89
81
if ($ENV{PLATFORM} MATCHES "CYGWIN" )
90
- set (LTM_C_FLAGS " ${LTM_C_FLAGS} -no-undefined" )
82
+ set (LTM_C_FLAGS ${LTM_C_FLAGS} -no -undefined)
91
83
endif ()
92
84
endif ()
93
85
94
86
# TODO: coverage (lgcov)
95
87
96
- # We have several private functions in the library and the "demo/test" programm
97
- # needs a littkle note to be able to switch them off. Please use the static build
98
- # to get a full test.
99
- if (BUILD_SHARED_LIBS )
100
- set (LTM_C_FLAGS "${LTM_C_FLAGS} -DLTM_TEST_DYNAMIC" )
88
+ # If the user set the environment variables at generate-time, append them
89
+ # in order to allow overriding our defaults.
90
+ if (DEFINED ENV{LTM_CFLAGS})
91
+ set (LTM_C_FLAGS ${LTM_C_FLAGS} $ENV{LTM_CFLAGS} )
92
+ endif ()
93
+ if (DEFINED ENV{LTM_LDFLAGS})
94
+ set (LTM_LD_FLAGS ${LTM_LD_FLAGS} $ENV{LTM_LDFLAGS} )
101
95
endif ()
102
-
103
- # Bring it home
104
- set (CMAKE_C_FLAGS "${LTM_C_FLAGS} " )
105
- set (CMAKE_C_FLAGS_DEBUG "${LTM_C_FLAGS} " )
106
- set (CMAKE_C_FLAGS_RELEASE "${LTM_C_FLAGS} " )
107
96
108
97
#-----------------------------------------------------------------------------
109
98
# library target
110
99
#-----------------------------------------------------------------------------
111
-
112
- # TODO: There may be a way but I found none to build both at once without complication.
113
- # It is possible with e.g. Linux where the static library is named libtommath.a
114
- # and the dynamic library libtommath.so*, two different names.
115
- # That is not the case with e.g. Windows where both types have the same name.
116
- # See also:
117
- # https://stackoverflow.com/questions/2152077/is-it-possible-to-get-cmake-to-build-both-a-static-and-shared-library-at-the-sam
118
- if (BUILD_SHARED_LIBS )
119
- add_library (${PROJECT_NAME} SHARED
120
- ${SOURCES}
121
- )
122
- else ()
123
- add_library (${PROJECT_NAME} STATIC
124
- ${SOURCES}
125
- )
126
- endif ()
127
-
128
- # Clear cache manually
129
- unset (BUILD_SHARED_LIBS CACHE )
100
+ add_library (${PROJECT_NAME}
101
+ ${SOURCES}
102
+ )
130
103
131
104
target_include_directories (${PROJECT_NAME} PUBLIC
132
105
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR} >
133
106
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR} /${PROJECT_NAME} >
134
107
)
135
108
136
- target_include_directories (${PROJECT_NAME} PUBLIC
137
- $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR} >
138
- $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR} /${PROJECT_NAME} >
109
+ target_compile_options (${PROJECT_NAME} BEFORE PRIVATE
110
+ ${LTM_C_FLAGS}
111
+ )
112
+ target_link_options (${PROJECT_NAME} BEFORE PRIVATE
113
+ ${LTM_LD_FLAGS}
139
114
)
140
115
141
116
set_target_properties (${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION} )
@@ -159,17 +134,13 @@ target_link_libraries(test-target PRIVATE
159
134
${PROJECT_NAME}
160
135
)
161
136
162
- # for the SHARED_LIBRARY build we need some special flags enabled
163
- # We also allow our users to override our selection by defining their own
164
- # `CMAKE_C_FLAGS` on generation-phase. CMake itself doesn't allow a user
165
- # to override settings defined in the CMakeLists.txt so we append it manually
166
- # again even though CMake prepended it already.
167
137
target_compile_options (test -target BEFORE PRIVATE
168
138
$<$<STREQUAL :$<TARGET_PROPERTY:${PROJECT_NAME} ,TYPE >,SHARED_LIBRARY>:-O1 -DLTM_TEST_DYNAMIC>
169
- ${CMAKE_C_FLAGS }
139
+ ${LTM_C_FLAGS }
170
140
)
171
141
target_link_options (test -target BEFORE PRIVATE
172
142
$<$<STREQUAL :$<TARGET_PROPERTY:${PROJECT_NAME} ,TYPE >,SHARED_LIBRARY>:-O1>
143
+ ${LTM_LD_FLAGS}
173
144
)
174
145
175
146
#-----------------------------------------------------------------------------
@@ -191,6 +162,7 @@ set(TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets")
191
162
192
163
install (TARGETS ${PROJECT_NAME}
193
164
EXPORT ${TARGETS_EXPORT_NAME}
165
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
194
166
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
195
167
)
196
168
0 commit comments