11cmake_minimum_required (VERSION 2.8)
22project (cmetrics C)
3+ set (CMAKE_POSITION_INDEPENDENT_CODE ON )
4+
5+ # Define macro to identify Windows system (without Cygwin)
6+ if (CMAKE_SYSTEM_NAME MATCHES "Windows" )
7+ set (CMT_SYSTEM_WINDOWS On )
8+ add_definitions (-DCMT_SYSTEM_WINDOWS)
9+ endif ()
310
411# CMetrics Version
512set (CMT_VERSION_MAJOR 0)
@@ -10,10 +17,12 @@ set(CMT_VERSION_STR "${CMT_VERSION_MAJOR}.${CMT_VERSION_MINOR}.${CMT_VERSION_PAT
1017# Include helpers
1118include (cmake/macros .cmake)
1219include (CheckCSourceCompiles)
20+ include (GNUInstallDirs)
1321
1422# Configuration options
15- option (CMT_DEV "Enable development mode" No )
16- option (CMT_TESTS "Enable unit testing" No )
23+ option (CMT_DEV "Enable development mode" No )
24+ option (CMT_TESTS "Enable unit testing" No )
25+ option (CMT_INSTALL_TARGETS "Enable subdirectory library installations" Yes )
1726
1827if (CMT_DEV)
1928 set (CMT_TESTS Yes )
@@ -37,6 +46,30 @@ if(CMT_HAVE_TIMESPEC_GET)
3746 CMT_DEFINITION(CMT_HAVE_TIMESPEC_GET)
3847endif ()
3948
49+ # gmtime_r() support
50+ check_c_source_compiles("
51+ #include <time.h>
52+ int main() {
53+ struct tm tm;
54+ struct timespec tms;
55+ return gmtime_r(&tms.tv_sec, &tm);
56+ }" CMT_HAVE_GMTIME_R)
57+ if (CMT_HAVE_GMTIME_R)
58+ CMT_DEFINITION(CMT_HAVE_GMTIME_R)
59+ endif ()
60+
61+ # gmtime_s() support
62+ check_c_source_compiles("
63+ #include <time.h>
64+ int main() {
65+ struct tm tm;
66+ struct timespec tms;
67+ return gmtime_s(&tm, &tms.tv_sec);
68+ }" CMT_HAVE_GMTIME_S)
69+ if (CMT_HAVE_GMTIME_S)
70+ CMT_DEFINITION(CMT_HAVE_GMTIME_S)
71+ endif ()
72+
4073# clock_get_time() support for macOS.
4174check_c_source_compiles("
4275 #include <mach/clock.h>
@@ -66,26 +99,141 @@ configure_file(
6699 "${PROJECT_SOURCE_DIR} /include/cmetrics/cmt_info.h"
67100 )
68101
102+ # Installation Directories
103+ # ========================
104+ if (${CMAKE_SYSTEM_NAME} MATCHES "Windows" )
105+ set (CMT_INSTALL_LIBDIR "lib" )
106+ set (CMT_INSTALL_INCLUDEDIR "include" )
107+ else ()
108+ set (CMT_INSTALL_LIBDIR "${CMAKE_INSTALL_PREFIX} /${CMAKE_INSTALL_LIBDIR} " )
109+ set (CMT_INSTALL_INCLUDEDIR "${CMAKE_INSTALL_PREFIX} /include" )
110+ endif ()
111+
69112# xxHash
70113if (NOT TARGET xxhash)
71114 # Do something when target found
72115 set (XXHASH_BUILD_ENABLE_INLINE_API OFF )
73116 set (XXHASH_BUILD_XXHSUM OFF )
74117 set (BUILD_SHARED_LIBS OFF )
75118 add_subdirectory (lib/xxHash-0.8.0/cmake_unofficial EXCLUDE_FROM_ALL )
119+
120+ if (CMT_INSTALL_TARGETS)
121+ install (TARGETS xxhash
122+ RUNTIME DESTINATION ${CMT_INSTALL_BINDIR}
123+ LIBRARY DESTINATION ${CMT_INSTALL_LIBDIR}
124+ ARCHIVE DESTINATION ${CMT_INSTALL_LIBDIR}
125+ COMPONENT library)
126+ endif ()
76127endif ()
77128
78129# mpack
79130if (NOT TARGET mpack-static )
80131 include_directories (lib/mpack/src/)
81132 add_subdirectory (lib/mpack EXCLUDE_FROM_ALL )
133+
134+ if (CMT_INSTALL_TARGETS)
135+ install (TARGETS mpack-static
136+ RUNTIME DESTINATION ${CMT_INSTALL_BINDIR}
137+ LIBRARY DESTINATION ${CMT_INSTALL_LIBDIR}
138+ ARCHIVE DESTINATION ${CMT_INSTALL_LIBDIR}
139+ COMPONENT library)
140+
141+ install (FILES lib/mpack/src/mpack/mpack.h
142+ DESTINATION ${CMT_INSTALL_INCLUDEDIR} /mpack
143+ COMPONENT headers
144+ PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)
145+ endif ()
82146endif ()
83147
84148# Source code
149+ add_subdirectory (include )
85150add_subdirectory (src)
151+ add_subdirectory (lib/monkey/include )
86152
87153# Tests
88154if (CMT_TESTS)
89155 enable_testing ()
90156 add_subdirectory (tests)
91157endif ()
158+
159+ # Installer Generation (Cpack)
160+ # ============================
161+
162+ set (CPACK_PACKAGE_VERSION ${CMT_VERSION_STR} )
163+ set (CPACK_PACKAGE_NAME "cmetrics" )
164+ set (CPACK_PACKAGE_RELEASE 1)
165+ set (CPACK_PACKAGE_CONTACT
"Eduardo Silva <[email protected] >" )
166+ set (CPACK_PACKAGE_VENDOR "Calyptia" )
167+ set (CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR} /LICENSE" )
168+ set (CPACK_PACKAGING_INSTALL_PREFIX "/" )
169+
170+ set (CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME} -${CPACK_PACKAGE_VERSION} -${CPACK_PACKAGE_RELEASE} .${CMAKE_SYSTEM_PROCESSOR} " )
171+
172+ if (CMT_SYSTEM_WINDOWS)
173+ set (CPACK_GENERATOR "ZIP" )
174+
175+ if (CMAKE_SIZEOF_VOID_P EQUAL 8)
176+ set (CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME} -${CPACK_PACKAGE_VERSION} -win64" )
177+ else ()
178+ set (CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME} -${CPACK_PACKAGE_VERSION} -win32" )
179+ endif ()
180+ endif ()
181+
182+
183+ # Enable components
184+ set (CPACK_DEB_COMPONENT_INSTALL ON )
185+ set (CPACK_RPM_COMPONENT_INSTALL ON )
186+ set (CPACK_COMPONENTS_ALL ${CPACK_COMPONENTS_ALL} binary library headers)
187+ set (CPACK_COMPONENTS_GROUPING "ONE_PER_GROUP" )
188+
189+ set (CPACK_COMPONENT_BINARY_GROUP "RUNTIME" )
190+ set (CPACK_COMPONENT_LIBRARY_GROUP "RUNTIME" )
191+
192+ # Debian package setup and name sanitizer
193+ set (CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON )
194+
195+ find_program (DPKG_PROGRAM dpkg DOC "dpkg program of Debian-based systems" )
196+ if (DPKG_PROGRAM)
197+ execute_process (
198+ COMMAND ${DPKG_PROGRAM} --print-architecture
199+ OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE
200+ OUTPUT_STRIP_TRAILING_WHITESPACE
201+ )
202+
203+ set (CPACK_DEBIAN_HEADERS_FILE_NAME "${CPACK_PACKAGE_NAME} _${CPACK_PACKAGE_VERSION} _${CPACK_DEBIAN_PACKAGE_ARCHITECTURE} -headers.deb" )
204+ set (CPACK_DEBIAN_RUNTIME_PACKAGE_NAME "${CPACK_PACKAGE_NAME} " )
205+ set (CPACK_DEBIAN_RUNTIME_FILE_NAME "${CPACK_PACKAGE_NAME} _${CPACK_PACKAGE_VERSION} _${CPACK_DEBIAN_PACKAGE_ARCHITECTURE} .deb" )
206+ set (CPACK_DEBIAN_RUNTIME_PACKAGE_CONTROL_EXTRA
207+ ${CMAKE_CURRENT_SOURCE_DIR} /debian/conffiles
208+ )
209+ endif ()
210+
211+ # RPM Generation information
212+ set (CPACK_RPM_PACKAGE_GROUP "System Environment/Daemons" )
213+ set (CPACK_RPM_PACKAGE_LICENSE "Apache v2.0" )
214+ set (CPACK_RPM_PACKAGE_RELEASE ${CPACK_PACKAGE_RELEASE} )
215+ set (CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR} /cpack/description" )
216+ set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "Fast data collector for Linux" )
217+ set (CPACK_RPM_SPEC_MORE_DEFINE "%define ignore \# " )
218+ set (CPACK_RPM_USER_FILELIST
219+ "%ignore /lib"
220+ "%ignore /lib64"
221+ "%ignore /lib64/pkgconfig"
222+ "%ignore /usr/local"
223+ "%ignore /usr/local/bin" )
224+
225+ set (CPACK_RPM_PACKAGE_AUTOREQ ON )
226+ set (CPACK_RPM_RUNTIME_PACKAGE_NAME "${CPACK_PACKAGE_NAME} " )
227+ set (CPACK_RPM_HEADERS_FILE_NAME "${CPACK_PACKAGE_NAME} -${CPACK_PACKAGE_VERSION} -${CPACK_PACKAGE_RELEASE} .${CMAKE_SYSTEM_PROCESSOR} -headers.rpm" )
228+ set (CPACK_RPM_RUNTIME_FILE_NAME "${CPACK_PACKAGE_NAME} -${CPACK_PACKAGE_VERSION} -${CPACK_PACKAGE_RELEASE} .${CMAKE_SYSTEM_PROCESSOR} .rpm" )
229+
230+ # CPack: DEB
231+ set (CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON )
232+
233+ # CPack: Windows System
234+ if (CPACK_GENERATOR MATCHES "ZIP" )
235+ set (CPACK_MONOLITHIC_INSTALL 1)
236+ set (CPACK_PACKAGE_INSTALL_DIRECTORY "cmetrics" )
237+ endif ()
238+
239+ include (CPack)
0 commit comments