This repository was archived by the owner on Oct 18, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
201 lines (172 loc) · 6.53 KB
/
CMakeLists.txt
File metadata and controls
201 lines (172 loc) · 6.53 KB
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
cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
project(Diggler C CXX)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_LEGACY_CYGWIN_WIN32 0)
if("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${PROJECT_BINARY_DIR}")
# Forbid in-tree builds. With CMake, doing an in-tree build breaks out-of-tree ones
# when generating from .in files into the source directory, overriding the path of out-of-tree
# generated ones.
# TL;DR: in-tree build = BAD IDEA.
file(REMOVE_RECURSE CMakeFiles CMakeCache.txt)
message(FATAL_ERROR
"You are doing an in-tree build (i.e. the source and binary directories are the same).\
In-tree builds aren't supported and will *never* be.\
Make a \"build\" directory and run cmake here.
\
Don't forget to remove CMakeFiles and CMakeCache.txt.")
endif()
### Find path to build dir, relative if possible, to symlink resources directories
file(RELATIVE_PATH REL_BUILD_PATH ${CMAKE_CURRENT_SOURCE_DIR} ${PROJECT_BINARY_DIR})
string(FIND "${REL_BUILD_PATH}" ".." RBP_2DOTPOS)
# If we're going up, use absolute path
if(${RBP_2DOTPOS} EQUAL 0)
set(PATH_TO_TOPDIR ${CMAKE_CURRENT_SOURCE_DIR})
else()
file(RELATIVE_PATH PATH_TO_TOPDIR ${PROJECT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
endif()
message(">> Path to topdir: ${PATH_TO_TOPDIR}")
### Compiler & build options
if(MINGW)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -municode -mwindows")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -municode -mwindows")
add_definitions(-DHAS_INET_PTON=1) # Override ENet's CMakeFile broken pton/ntop detection
add_definitions(-DHAS_INET_NTOP=1)
endif()
# Disable narrow convert warnings and disable deprecated GLM degrees usage
add_definitions(-DGLM_FORCE_RADIANS)
add_definitions(-DGLM_ENABLE_EXPERIMENTAL)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-narrowing -ffast-math")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") # -Wextra")
if(NOT CMAKE_BUILD_TYPE) # Defaults to release
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type: Debug or Release" FORCE)
endif()
if("${CMAKE_SYSTEM_NAME}" MATCHES "Linux")
set(LINUX TRUE)
endif()
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU")
set(USE_GCC_LTO FALSE CACHE BOOL "Use GCC LTOs")
# Compile as Position Independent Code
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
if(LINUX AND CMAKE_CXX_COMPILER_ID MATCHES "GNU")
# On Linux GCC, make the whole executable position-independent
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pie")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pie")
endif()
endif()
message(">> Using ${CMAKE_BUILD_TYPE} build configuration")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -DDEBUG -g")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")
set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} -Os")
if(USE_GCC_LTO)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto")
endif()
### Packages
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/ext/enet")
set(ENET_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/ext/enet/include")
set(ENET_LIBRARIES enet)
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/ext/lzo")
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/ext/etc")
find_package(glm QUIET)
find_package(OpenAL REQUIRED)
find_package(PkgConfig REQUIRED)
find_package(meiose REQUIRED)
if(NOT MEIOSE_FOUND)
message(FATAL_ERROR "Bundled meiose not found. Have you checked out submodules?
git submodule update --init")
endif()
find_package(Optional REQUIRED)
pkg_search_module(GLFW REQUIRED glfw3)
pkg_search_module(SQLITE3 REQUIRED sqlite3)
pkg_search_module(LIBSODIUM REQUIRED libsodium)
include_directories(BEFORE
"${CMAKE_CURRENT_SOURCE_DIR}/include"
${ETC_INCLUDE_DIRS}
${MEIOSE_INCLUDE_DIR}
${LZO_INCLUDE_DIRS}
${ENET_INCLUDE_DIRS}
${GLFW_INCLUDE_DIRS}
${LIBSODIUM_INCLUDE_DIRS}
${SQLITE3_INCLUDE_DIRS}
${OPENAL_INCLUDE_DIR}
${OPTIONAL_INCLUDE_DIR}
)
### Allow subdirs to add params to the `diggler` target
# Sources
set_property(GLOBAL PROPERTY DIGGLER_SOURCE_FILES "")
function(diggler_add_sources)
get_property(SRCS GLOBAL PROPERTY DIGGLER_SOURCE_FILES)
list(APPEND SRCS ${ARGV})
set_property(GLOBAL PROPERTY DIGGLER_SOURCE_FILES "${SRCS}")
endfunction(diggler_add_sources)
# Definitions
set_property(GLOBAL PROPERTY DIGGLER_DEFINITIONS "")
function(diggler_add_definition)
get_property(DEFS GLOBAL PROPERTY DIGGLER_DEFINITIONS)
list(APPEND DEFS "${ARGV0}")
set_property(GLOBAL PROPERTY DIGGLER_DEFINITIONS "${DEFS}")
endfunction(diggler_add_definition)
# Include directories
set_property(GLOBAL PROPERTY DIGGLER_INCLUDE_DIRECTORIES "")
function(diggler_include_directories)
get_property(INCDIRS GLOBAL PROPERTY DIGGLER_INCLUDE_DIRECTORIES)
list(APPEND INCDIRS ${ARGV})
set_property(GLOBAL PROPERTY DIGGLER_INCLUDE_DIRECTORIES "${INCDIRS}")
endfunction(diggler_include_directories)
# Link libraries
set_property(GLOBAL PROPERTY DIGGLER_LINK_LIBRARIES "")
function(diggler_link_libraries)
get_property(LIBS GLOBAL PROPERTY DIGGLER_LINK_LIBRARIES)
list(APPEND LIBS ${ARGV})
set_property(GLOBAL PROPERTY DIGGLER_LINK_LIBRARIES "${LIBS}")
endfunction(diggler_link_libraries)
set(DIGGLER_USED_ROOT_CMAKELISTS TRUE)
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/src")
### Create target and apply parameters
# Include directories
get_property(INCDIRS GLOBAL PROPERTY DIGGLER_INCLUDE_DIRECTORIES)
include_directories(BEFORE ${INCDIRS})
# Sources
get_property(SRCS GLOBAL PROPERTY DIGGLER_SOURCE_FILES)
add_executable(diggler ${SRCS})
# Definitions
get_property(DEFS GLOBAL PROPERTY DIGGLER_DEFINITIONS)
target_compile_definitions(diggler PUBLIC ${DEFS})
# Link libraries
get_property(LIBS GLOBAL PROPERTY DIGGLER_LINK_LIBRARIES)
target_link_libraries(diggler
${LIBS}
${ETC_LIBRARIES}
${MEIOSE_LIBRARY}
${LZO_LIBRARIES}
${ENET_LIBRARIES}
${GLFW_LIBRARIES}
${LIBSODIUM_LIBRARIES}
${SQLITE3_LIBRARIES}
${OPENAL_LIBRARY}
pthread
)
if(MINGW)
target_link_libraries(diggler
stdc++
ws2_32
openal.dll
winmm
)
endif()
if(NOT WIN32 AND NOT MINGW)
add_custom_command(TARGET diggler PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E create_symlink "${PATH_TO_TOPDIR}/assets"
"${PROJECT_BINARY_DIR}/assets")
endif()
#install(TARGETS digglerz RUNTIME DESTINATION bin)
find_package(Doxygen)
if (DOXYGEN_FOUND)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/doc/Doxyfile @ONLY)
add_custom_target(doc
${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/doc/Doxyfile
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc
COMMENT "Generate code documentation with Doxygen" VERBATIM
)
endif()