aboutsummaryrefslogtreecommitdiff
path: root/CMakeLists.txt
blob: abecdf36a23b4ce97d695a535ccc1a2431b98d9f (plain)
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
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
cmake_minimum_required(VERSION 3.10)

# Project and C standard configuration
project(bhlib LANGUAGES C)
set(CMAKE_C_STANDARD 90)
set(CMAKE_C_STANDARD_REQUIRED ON)

# Asan profile
get_property(isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)

if(isMultiConfig)
    if(NOT "Asan" IN_LIST CMAKE_CONFIGURATION_TYPES)
        list(APPEND CMAKE_CONFIGURATION_TYPES Asan)
    endif()
else()
    set(allowedBuildTypes Asan Debug Release RelWithDebInfo MinSizeRel)
    set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "${allowedBuildTypes}")

    if(CMAKE_BUILD_TYPE AND NOT CMAKE_BUILD_TYPE IN_LIST allowedBuildTypes)
        message(FATAL_ERROR "Invalid build type: ${CMAKE_BUILD_TYPE}")
    endif()
endif()

set(CMAKE_C_FLAGS_ASAN
    "${CMAKE_C_FLAGS_DEBUG} -fsanitize=address,undefined -fno-omit-frame-pointer" CACHE STRING
    "Flags used by the C compiler for Asan build type or configuration." FORCE
)

set(CMAKE_CXX_FLAGS_ASAN
    "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=address,undefined -fno-omit-frame-pointer" CACHE STRING
    "Flags used by the C++ compiler for Asan build type or configuration." FORCE
)

set(CMAKE_EXE_LINKER_FLAGS_ASAN
    "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -fsanitize=address,undefined" CACHE STRING
    "Linker flags to be used to create executables for Asan build type." FORCE
)

set(CMAKE_SHARED_LINKER_FLAGS_ASAN
    "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} -fsanitize=address,undefined" CACHE STRING
    "Linker lags to be used to create shared libraries for Asan build type." FORCE
)

# Project includes
include(CheckIPOSupported)
include(CheckIncludeFile)
include(CheckSymbolExists)

# Unit testing and coverage configuration
set(ENABLE_TESTING ON CACHE BOOL "Enable unit-testing")
set(ENABLE_COVERAGE OFF CACHE BOOL "Enable coverage")
set(ENABLE_EXAMPLES ON CACHE BOOL "Enable building examples")
set(ENABLE_LTO ON CACHE BOOL "Enable LTO support")
set(ENABLE_MT ON CACHE BOOL "Enable multithreading support")

# Enable IPO/LTO
if(ENABLE_LTO)
    check_ipo_supported(RESULT LTO_SUPPORTED)
    if(LTO_SUPPORTED)
        message(STATUS "IPO/LTO enabled")
        set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
    endif()
endif()

# Enable testing
if(ENABLE_TESTING)
    include(CTest)
    enable_testing()
endif()

# Set library code
set(BH_SOURCE
    src/Algo.c
    src/Args.c
    src/Hashmap.c
    src/IO.c
    src/Math/Box2f.c
    src/Math/Box3f.c
    src/Math/Line.c
    src/Math/Mat3f.c
    src/Math/Mat4f.c
    src/Math/Misc.c
    src/Math/Plane.c
    src/Math/Quat4f.c
    src/Math/Ray2f.c
    src/Math/Ray3f.c
    src/Math/Vec2f.c
    src/Math/Vec2i.c
    src/Math/Vec3f.c
    src/Math/Vec3i.c
    src/Math/Vec4f.c
    src/Math/Vec4i.c
    src/Queue.c
    src/Util.c
    src/String/Int.c
    src/String/Float.c
)

set(BH_HEADER
    include/BH/Common.h
    include/BH/Algo.h
    include/BH/Args.h
    include/BH/Hashmap.h
    include/BH/IO.h
    include/BH/Math.h
    include/BH/Queue.h
    include/BH/Util.h
    include/BH/Thread.h
)

set(BH_SOURCE_DUMMY
    src/Platform/Dummy/File.c
)

set(BH_SOURCE_WIN32
    src/Platform/Win32/File.c
)

set(BH_SOURCE_POSIX
    src/Platform/Posix/File.c
)

set(BH_SOURCE_WIN32_MT
    src/Platform/Win32/Condition.c
    src/Platform/Win32/Mutex.c
    src/Platform/Win32/Semaphore.c
    src/Platform/Win32/Thread.c
    src/Platform/Win32/Tss.c
    src/Platform/Spinlock.c
)

set(BH_HEADER_WIN32_MT
    src/Platform/Win32/Thread.h
)

set(BH_SOURCE_POSIX_MT
    src/Platform/Posix/Condition.c
    src/Platform/Posix/Mutex.c
    src/Platform/Posix/Semaphore.c
    src/Platform/Posix/Thread.c
    src/Platform/Posix/Tss.c
    src/Platform/Spinlock.c
)

set(BH_HEADER_POSIX_MT
    src/Platform/Posix/Thread.h
)

set(BH_SOURCE_DUMMY_MT
    src/Platform/Dummy/Condition.c
    src/Platform/Dummy/Mutex.c
    src/Platform/Dummy/Semaphore.c
    src/Platform/Dummy/Thread.c
    src/Platform/Dummy/Tss.c
)

set(BH_HEADER_DUMMY_MT
    src/Platform/Dummy/Thread.h
)

set(BH_INCLUDE_DIRS
    include
    ${PROJECT_BINARY_DIR}/include
)

# Determine platform
if(WIN32)
    message(STATUS "Platform - Win32")

    # Add platform dependent files
    list(APPEND BH_SOURCE ${BH_SOURCE_WIN32})

    # Add platform dependent multithreading support
    if(ENABLE_MT)
        list(APPEND BH_SOURCE ${BH_SOURCE_WIN32_MT})
        list(APPEND BH_HEADER ${BH_HEADER_WIN32_MT})
    else()
        list(APPEND BH_SOURCE ${BH_SOURCE_DUMMY_MT})
        list(APPEND BH_HEADER ${BH_HEADER_DUMMY_MT})
    endif()
elseif(UNIX)
    message(STATUS "Platform: Unix (Linux/BSD/MacOS X)")

    # Add platform dependent files
    list(APPEND BH_SOURCE ${BH_SOURCE_POSIX})

    # Add platform dependent multithreading support
    if(ENABLE_MT)
        list(APPEND BH_SOURCE ${BH_SOURCE_POSIX_MT})
        list(APPEND BH_HEADER ${BH_HEADER_POSIX_MT})
    else()
        list(APPEND BH_SOURCE ${BH_SOURCE_DUMMY_MT})
        list(APPEND BH_HEADER ${BH_HEADER_DUMMY_MT})
    endif()
else()
    message(STATUS "Platform: Unknown")

    # Add platform dependent files
    list(APPEND BH_SOURCE ${BH_SOURCE_DUMMY} ${BH_SOURCE_DUMMY_MT})
    list(APPEND BH_HEADER ${BH_HEADER_DUMMY_MT})
endif()

# Library
add_library(BHLib STATIC ${BH_SOURCE} ${BH_HEADER})
target_include_directories(BHLib PUBLIC ${BH_INCLUDE_DIRS})
target_link_libraries(BHLib PUBLIC m)

# Enable all compiler warnings
if(MSVC)
    target_compile_options(BHLib PRIVATE /W4 /WX)
else()
    target_compile_options(BHLib PRIVATE -Wall -Wextra -Wpedantic -Werror -fstrict-aliasing)
endif()

# Coverage
if(ENABLE_COVERAGE)
    target_compile_options(BHLib PRIVATE -coverage)
    target_link_options(BHLib PRIVATE -coverage)
endif()

# Tests
if(ENABLE_TESTING)
    add_subdirectory(unit)
    add_subdirectory(test)
endif()

if(ENABLE_EXAMPLES)
    add_subdirectory(doc/Examples)
endif()