-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathCMakeLists.txt
247 lines (192 loc) · 8.76 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
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
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
cmake_minimum_required(VERSION 3.21 FATAL_ERROR)
# project name
set(PROJECTNAME forest)
project(${PROJECTNAME} LANGUAGES CXX C)
# ----------------------------------------------------------------------------
# FUNCTIONS
# ----------------------------------------------------------------------------
function(check_exist path)
if(NOT EXISTS ${path})
message(FATAL_ERROR "${path} doesn't exist!")
endif()
endfunction()
function(build_program path prefix program_name)
set(PROGRAM_PATH "${path}/${program_name}")
message("BUILD PROGRAM ${PROGRAM_PATH}")
file(GLOB_RECURSE PROGRAM_SOURCES_CXX RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "${PROGRAM_PATH}/*.cpp")
file(GLOB_RECURSE PROGRAM_SOURCES_C RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "${PROGRAM_PATH}/*.c")
set(PROGRAM_SOURCES "${PROGRAM_SOURCES_CXX};${PROGRAM_SOURCES_C}")
include_directories("${PROGRAM_PATH}")
# get_filename_component(PROGRAM_NAME ${PROGRAM_PATH} NAME_WE) # NAME_WE = name with extension
set(PROGRAM_FINAL_NAME "${prefix}_${program_name}" )
add_executable( ${PROGRAM_FINAL_NAME} ${PROGRAM_SOURCES})
target_link_libraries( ${PROGRAM_FINAL_NAME} ${PROJECTNAME})
install(TARGETS ${PROGRAM_FINAL_NAME})
endfunction()
# ----------------------------------------------------------------------------
# CPP CONFIG
# ----------------------------------------------------------------------------
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# set(CMAKE_CXX_CLANG_TIDY
# clang-tidy;
# -header-filter=.;
# -checks=*;
# # -warnings-as-errors=*;
# )
if(ENABLE_LOGS)
set(PROJECT_COMMON_CXX_FLAGS "${PROJECT_COMMON_CXX_FLAGS} -D ENGINE_ENABLE_LOGS")
endif(ENABLE_LOGS)
if(ENABLE_GPU_DEBUG)
set(PROJECT_COMMON_CXX_FLAGS "${PROJECT_COMMON_CXX_FLAGS} -D ENGINE_ENABLE_GPU_DEBUG")
endif(ENABLE_GPU_DEBUG)
if(ENABLE_PROFILER)
set(PROJECT_COMMON_CXX_FLAGS "${PROJECT_COMMON_CXX_FLAGS} -D TRACY_ENABLE -D ENGINE_ENABLE_PROFILER")
endif(ENABLE_PROFILER)
if(UNIX)
set(PROJECT_COMMON_CXX_FLAGS "${PROJECT_COMMON_CXX_FLAGS} -mavx -Wall -Werror=return-type -Wcast-align -Wcast-qual -Wpointer-arith -Wfloat-equal") # -flto=auto
if(ENABLE_ADDRESS_SANITIZER)
set(PROJECT_COMMON_CXX_FLAGS "${PROJECT_COMMON_CXX_FLAGS} -fsanitize=address -static-libasan")
endif(ENABLE_ADDRESS_SANITIZER)
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${PROJECT_COMMON_CXX_FLAGS} -D ENGINE_DEBUG -ftree-vectorize")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${PROJECT_COMMON_CXX_FLAGS} -O3")
endif(UNIX)
if(WIN32)
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${PROJECT_COMMON_CXX_FLAGS} -D ENGINE_DEBUG /m /TP")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
endif(WIN32)
# find_program(CCACHE_PROGRAM ccache)
# if(CCACHE_PROGRAM)
# set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
# set(CMAKE_CUDA_COMPILER_LAUNCHER "${CCACHE_PROGRAM}") # CMake 3.9+
# message("Using CCACHE")
# else()
# message("Not Using CCACHE")
# endif()
message("Compiler: ${CMAKE_CXX_COMPILER}")
message("Release: ${CMAKE_CXX_FLAGS_RELEASE}")
message("Debug: ${CMAKE_CXX_FLAGS_DEBUG}")
message("Selected Build target: ${CMAKE_BUILD_TYPE}")
# ----------------------------------------------------------------------------
# OUTPUT DIRECTORIES
# ----------------------------------------------------------------------------
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/binaries/${CMAKE_BUILD_TYPE}")
# ----------------------------------------------------------------------------
# DEPENDENCIES
# ----------------------------------------------------------------------------
# third party libraries
set(DEPENDENCIES_DIR "dependencies")
include_directories("${DEPENDENCIES_DIR}")
# OpenGL
find_package(OpenGL REQUIRED)
include_directories(${OPENGL_INCLUDE_DIR})
# GLFW
set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE) # see : http://www.glfw.org/docs/latest/build_guide.html
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
check_exist("${CMAKE_SOURCE_DIR}/${DEPENDENCIES_DIR}/glfw-3.4")
add_subdirectory("${DEPENDENCIES_DIR}/glfw-3.4")
include_directories("${DEPENDENCIES_DIR}/glfw-3.4/include")
# glew
set(BUILD_UTILS OFF CACHE BOOL "" FORCE)
check_exist("${CMAKE_SOURCE_DIR}/${DEPENDENCIES_DIR}/glew-2.2.0")
add_subdirectory("${DEPENDENCIES_DIR}/glew-2.2.0/build/cmake")
include_directories("${DEPENDENCIES_DIR}/glew-2.2.0/include")
if(ENABLE_PROFILER)
# Tracy
set(TRACY_ENABLE ON CACHE BOOL "" FORCE)
set(LEGACY ON CACHE BOOL "" FORCE)
set(DOWNLOAD_GLFW OFF CACHE BOOL "" FORCE)
set(DOWNLOAD_CAPSTONE OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_X11 ON CACHE BOOL "" FORCE)
check_exist("${CMAKE_SOURCE_DIR}/${DEPENDENCIES_DIR}/tracy-0.11.0")
include_directories("${DEPENDENCIES_DIR}/tracy-0.11.0/public")
add_subdirectory("${DEPENDENCIES_DIR}/tracy-0.11.0")
endif(ENABLE_PROFILER)
# JSON
set(JSON_BuildTests OFF CACHE INTERNAL "")
check_exist("${CMAKE_SOURCE_DIR}/${DEPENDENCIES_DIR}/json-3.11.3")
include_directories("${DEPENDENCIES_DIR}/json-3.11.3/single_include/nlohmann")
add_subdirectory("${DEPENDENCIES_DIR}/json-3.11.3")
# stb
check_exist("${CMAKE_SOURCE_DIR}/${DEPENDENCIES_DIR}/stb-master")
include_directories("${DEPENDENCIES_DIR}/stb-master")
# freetype
check_exist("${CMAKE_SOURCE_DIR}/${DEPENDENCIES_DIR}/freetype-2.13.2")
include_directories("${DEPENDENCIES_DIR}/freetype-2.13.2/include")
# cgltf
check_exist("${CMAKE_SOURCE_DIR}/${DEPENDENCIES_DIR}/cgltf-1.14")
include_directories("${DEPENDENCIES_DIR}/cgltf-1.14")
# TBB
find_package(TBB REQUIRED)
# ----------------------------------------------------------------------------
# PROJECT PACKAGES
# ----------------------------------------------------------------------------
# include source code root
include_directories("code")
file(GLOB PACKAGES_PATHS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "code/*")
set(PACKAGES "")
set(OBJECTS "")
foreach(PACKAGE_PATH ${PACKAGES_PATHS})
message("PACKAGE " ${PACKAGE_PATH})
get_filename_component(PACKAGE ${PACKAGE_PATH} NAME_WE) # NAME_WE = name with extension
file(GLOB_RECURSE PACKAGE_SOURCES_LIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "code/${PACKAGE}/*.cpp")
foreach(PACKAGE_SOURCE ${PACKAGE_SOURCES_LIST})
get_filename_component(PACKAGE_SOURCE_WE ${PACKAGE_SOURCE} NAME_WE) # NAME_WE = name with extension
message("OBJECT " ${PACKAGE_SOURCE_WE})
endforeach()
add_library(${PACKAGE} OBJECT ${PACKAGE_SOURCES_LIST})
list(APPEND OBJECTS $<TARGET_OBJECTS:${PACKAGE}>)
endforeach()
# ----------------------------------------------------------------------------
# PROJECT LIBRARY
# ----------------------------------------------------------------------------
# single library
add_library(${PROJECTNAME} STATIC ${OBJECTS})
# ----------------------------------------------------------------------------
# LINK EXTERNAL LIBRARIES
# ----------------------------------------------------------------------------
# link libraries with forest library
target_link_libraries(${PROJECTNAME} ${OPENGL_gl_LIBRARY})
target_link_libraries(${PROJECTNAME} ${OPENGL_glu_LIBRARY})
target_link_libraries(${PROJECTNAME} glew)
target_link_libraries(${PROJECTNAME} glfw)
target_link_libraries(${PROJECTNAME} nlohmann_json)
target_link_libraries(${PROJECTNAME} libpng.so)
target_link_libraries(${PROJECTNAME} freetype)
# Link against the dependency of Intel TBB (for parallel C++17 algorithms)
target_link_libraries(${PROJECTNAME} TBB::tbb)
if(ENABLE_PROFILER)
target_link_libraries(${PROJECTNAME} Tracy::TracyClient)
endif(ENABLE_PROFILER)
# ----------------------------------------------------------------------------
# TESTS
# ----------------------------------------------------------------------------
if(BUILD_UNIT_TESTS)
set(TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}/test/unit)
file(GLOB TESTS RELATIVE ${TEST_DIR} ${TEST_DIR}/*)
FOREACH(TEST ${TESTS})
build_program("test/unit" "test_unit" ${TEST})
ENDFOREACH()
endif(BUILD_UNIT_TESTS)
if(BUILD_INTEGRATION_TESTS)
set(TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}/test/integration)
file(GLOB TESTS RELATIVE ${TEST_DIR} ${TEST_DIR}/*)
FOREACH(TEST ${TESTS})
build_program("test/integration" "test_integration" ${TEST})
ENDFOREACH()
endif(BUILD_INTEGRATION_TESTS)
# ----------------------------------------------------------------------------
# TOOLS
# ----------------------------------------------------------------------------
message("Tools to build: ${TOOLS_TO_BUILD}")
FOREACH(TOOL ${TOOLS_TO_BUILD})
build_program("tools" "tool" ${TOOL})
ENDFOREACH()
# ----------------------------------------------------------------------------
# GAMES
# ----------------------------------------------------------------------------
message("Apps to build: ${APPS_TO_BUILD}")
FOREACH(APP ${APPS_TO_BUILD})
build_program("apps" "app" ${APP})
ENDFOREACH()