@@ -13,16 +13,124 @@ include(GNUInstallDirs)
13
13
include (CMakePackageConfigHelpers )
14
14
include (sources .cmake )
15
15
16
+ # The only direct cmake argument for now
17
+ option (BUILD_SHARED_LIBS "Build shared library and only the shared library if \" ON\" , default is static" OFF )
18
+
16
19
#-----------------------------------------------------------------------------
17
- # Options
20
+ # Compose CFLAGS
18
21
#-----------------------------------------------------------------------------
19
- option (BUILD_SHARED_LIBS "Build shared library" FALSE )
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
+ # Some information copied from makefile_include.mk
32
+
33
+ # Basic set
34
+ set (LTM_C_FLAGS "${LTM_C_FLAGS} -Wall -Wsign-compare -Wextra -Wshadow" )
35
+
36
+ # Do we run the sanitizer?
37
+ 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" )
44
+ endif ()
45
+
46
+ if (DEFINED ENV{CONV_WARNINGS} )
47
+ set (LTM_C_FLAGS "${LTM_C_FLAGS} -std=c89 -Wconversion -Wsign-conversion" )
48
+ if ($ENV{CONV_WARNINGS} EQUAL "strict" )
49
+ set (LTM_C_FLAGS "${LTM_C_FLAGS} -Wc++-compat" )
50
+ endif ()
51
+ else ()
52
+ set (LTM_C_FLAGS "${LTM_C_FLAGS} -Wsystem-headers" )
53
+ endif ()
54
+
55
+ if (DEFINED ENV{COMPILE_DEBUG} )
56
+ set (LTM_C_FLAGS "${LTM_C_FLAGS} -g3" )
57
+ endif ()
58
+
59
+ if (DEFINED ENV{COMPILE_SIZE} )
60
+ set (LTM_C_FLAGS "${LTM_C_FLAGS} -Os" )
61
+ else ()
62
+ if (NOT DEFINED ENV{IGNORE_SPEED} )
63
+ set (LTM_C_FLAGS "${LTM_C_FLAGS} -O3 -funroll-loops" )
64
+ #x86 optimizations [should be valid for any GCC install though]
65
+ set (LTM_C_FLAGS "${LTM_C_FLAGS} -fomit-frame-pointer" )
66
+ endif ()
67
+ # TODO:
68
+ # if(DEFINED ENV{COMPILE_LTO})
69
+ # set(LTM_C_FLAGS "${LTM_C_FLAGS} -flto")
70
+ # set(LTM_LD_FLAGS "${LTM_LD_FLAGS} -flto")
71
+ # #AR = $(subst clang,llvm-ar,$(subst gcc,gcc-ar,$(CC)))
72
+ # endif()
73
+ endif ()
74
+
75
+ # What compiler do we have and what are their...uhm... peculiarities
76
+ # TODO: is the check for a C++ compiler necessary?
77
+ 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" )
79
+ endif ()
80
+
81
+ if ( (CMAKE_C_COMPILER_ID MATCHES "mingw" ) OR (CMAKE_CXX_COMPILER_ID MATCHES "mingw" ))
82
+ set (LTM_C_FLAGS "${LTM_C_FLAGS} -Wno-shadow" )
83
+ endif ()
84
+
85
+ if (DEFINED ENV{PLATFORM} )
86
+ if ($ENV{PLATFORM} MATCHES "Darwin" )
87
+ set (LTM_C_FLAGS "${LTM_C_FLAGS} -Wno-nullability-completeness" )
88
+ endif ()
89
+ if ($ENV{PLATFORM} MATCHES "CYGWIN" )
90
+ set (LTM_C_FLAGS "${LTM_C_FLAGS} -no-undefined" )
91
+ endif ()
92
+ endif ()
93
+
94
+ # TODO: coverage (lgcov)
95
+
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" )
101
+ 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} " )
20
107
21
108
#-----------------------------------------------------------------------------
22
109
# library target
23
110
#-----------------------------------------------------------------------------
24
- add_library (${PROJECT_NAME}
25
- ${SOURCES}
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 )
130
+
131
+ target_include_directories (${PROJECT_NAME} PUBLIC
132
+ $< BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR} >
133
+ $< INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR} /${PROJECT_NAME} >
26
134
)
27
135
28
136
target_include_directories (${PROJECT_NAME} PUBLIC
@@ -36,6 +144,8 @@ set_target_properties(${PROJECT_NAME} PROPERTIES SOVERSION ${PROJECT_VERSION_MAJ
36
144
#-----------------------------------------------------------------------------
37
145
# demo target
38
146
#-----------------------------------------------------------------------------
147
+
148
+
39
149
add_executable (test -target EXCLUDE_FROM_ALL
40
150
${CMAKE_CURRENT_SOURCE_DIR} /demo/shared.c
41
151
${CMAKE_CURRENT_SOURCE_DIR} /demo/test.c
@@ -81,7 +191,6 @@ set(TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets")
81
191
82
192
install (TARGETS ${PROJECT_NAME}
83
193
EXPORT ${TARGETS_EXPORT_NAME}
84
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
85
194
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
86
195
)
87
196
0 commit comments