-
Notifications
You must be signed in to change notification settings - Fork 0
/
CMakeLists.txt
182 lines (162 loc) · 5.85 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
CMAKE_MINIMUM_REQUIRED(VERSION 3.0)
PROJECT(schScheduler VERSION 0.1.3)
# build shared/dynamic library option
OPTION(BUILD_SHARED_LIBS "Build package with shared libraries." ON)
OPTION(BUILD_WITH_COVERAGE "Enable profiling and coverage report analysis." ON)
OPTION(BUILD_WITH_PROFILER "Enable profiling." ON)
IF(NOT BUILD_SHARED_LIBS)
SET(CMAKE_EXE_LINKER_FLAGS "-static")
SET(LINK_SEARCH_START_STATIC TRUE)
ELSE()
MESSAGE(STATUS "Shared libraries enabled")
ENDIF(NOT BUILD_SHARED_LIBS)
#############################################
# Extract git hash and branch information.
#############################################
OPTION(IGNORE_GIT_HASH "Use Git hash" OFF)
FIND_PACKAGE(Git QUIET)
IF(NOT IGNORE_GIT_HASH)
IF(GIT_FOUND)
# Get the current working branch
EXECUTE_PROCESS(
COMMAND git rev-parse --abbrev-ref HEAD
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE GIT_BRANCH
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
# Get the latest abbreviated commit hash of the working branch
EXECUTE_PROCESS(
COMMAND git rev-parse --short=8 HEAD
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE GIT_COMMIT_HASH
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
#Extract IF there is a tag associated with current commit
EXECUTE_PROCESS(
COMMAND git describe --exact-match --tags 2> /dev/null || git rev-parse --short HEAD
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE GIT_TAG
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
ELSE()
MESSAGE(FATAL_ERROR "Git must be install on the system in order to extract meta data from GIT version control" )
ENDIF()
ENDIF()
OPTION(TASKSCH_BUILD_WITH_TEST "Enable Testing." OFF)
IF(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
SET(SCH_STANDALONE ON CACHE BOOL "")
ELSE()
SET(SCH_STANDALONE OFF CACHE BOOL "")
ENDIF()
# Version setup.
SET(SCH_VERSION_MAJOR 0)
SET(SCH_VERSION_MINOR 1)
SET(SCH_VERSION_REVISION 3)
SET(SCH_VERSION_STATE a)
SET(SCH_VERSION ${SCH_VERSION_MAJOR}.${SCH_VERSION_MINOR}${SCH_VERSION_STATE}${SCH_VERSION_REVISION} )
ADD_DEFINITIONS(-DSCH_VERSION="${SCH_VERSION}")
##############################
# Target compiler flags.
#############################
IF((CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) AND NOT CMAKE_COMPILER_IS_MINGW)
ADD_DEFINITIONS(-Wall -w -Wfatal-errors)
IF (CMAKE_BUILD_TYPE STREQUAL "Release")
MESSAGE(STATUS "Compile for release.")
ADD_DEFINITIONS( -DNDEBUG )
ADD_DEFINITIONS( -O2 )
SET(CMAKE_RELEASE TRUE)
ELSE()
MESSAGE(STATUS "Compile for debug.")
ADD_DEFINITIONS( -D_DEBUG )
ADD_DEFINITIONS( -g3 -O0 )
SET(CMAKE_DEBUG TRUE)
ENDIF()
#
IF(BUILD_WITH_COVERAGE)
MESSAGE(STATUS "Building with coverage")
SET(GCC_COVERAGE_COMPILE_FLAGS "--coverage -fprofile-arcs -ftest-coverage")
SET(GCC_COVERAGE_LINK_FLAGS "-lgcov")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}")
ENDIF()
#
IF(BUILD_WITH_PROFILER)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg")
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pg")
ENDIF()
ELSEIF(MSVC AND WIN32)
# Use subset of Windows.h
ADD_DEFINITIONS( -DWIN32_LEAN_AND_MEAN )
# Enable multi-core compilation with MSVC
ADD_COMPILE_OPTIONS(/MP)
ELSEIF ( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" )
SET(CMAKE_CXX_FLAGS "-g -fvisibility=hidden -fno-strict-aliasing -Wall -Wno-long-long ${CMAKE_CXX_FLAGS}" )
SET(CMAKE_C_FLAGS "-fno-strict-aliasing ${CMAKE_C_FLAGS}")
ELSEIF( CMAKE_COMPILER_IS_MINGW )
SET(CMAKE_CXX_FLAGS "-fvisibility=hidden -fno-strict-aliasing -Wall -Wno-long-long -Wa,-mbig-obj ${CMAKE_CXX_FLAGS}")
SET(CMAKE_C_FLAGS "-fno-strict-aliasing ${CMAKE_C_FLAGS}")
ADD_DEFINITIONS( -U__STRICT_ANSI__ )
ENDIF()
IF(WIN32)
IF (CMAKE_SIZEOF_VOID_P EQUAL 8)
SET(BIN_DIR "${PROJECT_SOURCE_DIR}/bin64/")
SET(LIB_DIR "${PROJECT_SOURCE_DIR}/lib64/")
ELSE()
SET(BIN_DIR "${PROJECT_SOURCE_DIR}/bin32/")
SET(LIB_DIR "${PROJECT_SOURCE_DIR}/lib32/")
ENDIF()
ENDIF()
###########################
# Source files.
###########################
FILE(GLOB SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.c)
FILE(GLOB HEADER_PRIVATE_FILES include/internal/internal/*.h)
FILE(GLOB HEADER_PUBLIC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/taskSch.h)
IF( UNIX )
# Unix specific platform code (Linux,FreeBSD and other UNIX compatible)
FILE(GLOB PLATFORM_FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/unix/*.c)
ELSEIF(WIN32)
# Window specific platform code.
FILE(GLOB PLATFORM_FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/windows/*.c)
ENDIF()
################################
# TaskSch Library Target.
################################
ADD_LIBRARY(taskSch ${SOURCE_FILES} ${PLATFORM_FILES} ${HEADER_PRIVATE_FILES} ${HEADER_PUBLIC_FILES})
TARGET_INCLUDE_DIRECTORIES(taskSch PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>)
FIND_PACKAGE(Threads QUIET)
IF(Threads_FOUND)
MESSAGE(STATUS "Thread Found: ${CMAKE_THREAD_LIBS_INIT}")
ENDIF()
IF(UNIX)
TARGET_LINK_LIBRARIES(taskSch Threads::Threads)
ELSEIF(WIN32)
TARGET_LINK_LIBRARIES(taskSch Threads::Threads)
ENDIF()
IF (BUILD_SHARED_LIBS AND CMAKE_SIZEOF_VOID_P EQUAL 8) # -fPIC is only required
SET_PROPERTY(TARGET taskSch PROPERTY POSITION_INDEPENDENT_CODE ON)
ENDIF()
# Install the target.
INSTALL(TARGETS taskSch DESTINATION lib)
INSTALL(FILES ${HEADER_PUBLIC_FILES} DESTINATION include)
#############################
# Unit testing
#############################
IF(TASKSCH_BUILD_WITH_TEST)
ENABLE_TESTING()
ADD_SUBDIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/test)
ENDIF()
#################################
# Generate Docs
#################################
OPTION(TASKSCH_BUILD_WITH_DOCS "Generate Docs" OFF)
IF(TASKSCH_BUILD_WITH_DOCS)
ADD_SUBDIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/docs/)
ENDIF()