]> git.lizzy.rs Git - dragonblocks_alpha.git/blob - src/CMakeLists.txt
Improve diagnostics when invoked from incorrect path
[dragonblocks_alpha.git] / src / CMakeLists.txt
1 cmake_minimum_required(VERSION 3.14)
2 project(Dragonblocks)
3
4 # Variables
5
6 set(DEPS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../deps")
7
8 if(NOT CMAKE_BUILD_TYPE)
9         set(CMAKE_BUILD_TYPE Debug)
10 endif()
11
12 if(NOT ASSET_PATH)
13         set(ASSET_PATH "../assets/")
14 endif()
15
16 # Dependencies
17
18 set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
19
20 set(SKIP_INSTALL_ALL ON)
21 set(BUILD_SHARED_LIBS OFF)
22
23 set(ZLIB_LIBRARY zlibstatic)
24 set(ZLIB_INCLUDE_DIR "${DEPS_DIR}/zlib")
25
26 set(FT_DISABLE_ZLIB OFF)
27 set(FT_DISABLE_BZIP2 ON)
28 set(FT_DISABLE_PNG ON)
29 set(FT_DISABLE_HARFBUZZ ON)
30 set(FT_DISABLE_BROTLI ON)
31
32 foreach(DEP glfw glew-cmake sqlite3-cmake perlin asprintf dragonnet dragonstd getline stpcpy linenoise zlib freetype)
33         if(EXISTS "${DEPS_DIR}/${DEP}/CMakeLists.txt")
34                 add_subdirectory("${DEPS_DIR}/${DEP}" EXCLUDE_FROM_ALL "${CMAKE_CURRENT_BINARY_DIR}/${DEP}")
35         else()
36                 message(FATAL_ERROR "Submodule ${DEPS_DIR}/${DEP} does not contain CMakeLists.txt. This is most likely due to submodules not being updated. Use this command to fix the issue:\n\tgit submodule update --init --recursive\nAfter that, run CMake again.")
37         endif()
38 endforeach()
39
40 # Options
41
42 if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
43         add_compile_definitions("ENABLE_GL_DEBUG")
44 endif()
45
46 add_compile_definitions("USE_DRAGONNET")
47 add_compile_definitions("GLEW_STATIC")
48 add_compile_definitions("ASSET_PATH=\"${ASSET_PATH}\"")
49 add_compile_definitions("__USE_MINGW_ANSI_STDIO")
50
51 add_compile_options(
52         -Wall
53         -Wextra
54         -Werror
55         -Wno-address-of-packed-member
56         -fmax-errors=4
57 )
58
59 # System specific options
60
61 if("${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD" OR "${CMAKE_SYSTEM_NAME}" STREQUAL "OpenBSD")
62         link_directories("/usr/local/lib")
63         include_directories("/usr/local/include")
64 endif()
65
66 if("${CMAKE_SYSTEM_NAME}" STREQUAL "OpenBSD")
67         link_directories("/usr/X11R6/lib")
68         include_directories("/usr/X11R6/include")
69 endif()
70
71 # Common sources
72
73 add_library(dragonblocks
74         "${CMAKE_CURRENT_BINARY_DIR}/types.c"
75         common/color.c
76         common/config.c
77         common/day.c
78         common/environment.c
79         common/facedir.c
80         common/init.c
81         common/interrupt.c
82         common/item.c
83         common/node.c
84         common/perlin.c
85         common/physics.c
86         common/terrain.c
87 )
88
89 target_include_directories(dragonblocks
90         PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
91         PUBLIC ${CMAKE_CURRENT_BINARY_DIR}
92         PUBLIC "${DEPS_DIR}/linmath.h"
93         PUBLIC "${DEPS_DIR}/endian.h"
94         PUBLIC "${DEPS_DIR}/stb"
95 )
96
97 target_link_libraries(dragonblocks
98         PUBLIC pthread
99         PUBLIC m
100         PUBLIC ${CMAKE_DL_LIBS}
101         PUBLIC perlin
102         PUBLIC dragonnet
103         PUBLIC dragonstd
104         PUBLIC getline
105         PUBLIC zlibstatic
106         PUBLIC stpcpy
107 )
108
109 # Client
110
111 add_executable(dragonblocks_client
112         client/camera.c
113         client/client.c
114         client/client_auth.c
115         client/client_config.c
116         client/client_entity.c
117         client/client_inventory.c
118         client/client_item.c
119         client/client_node.c
120         client/client_player.c
121         client/client_terrain.c
122         client/cube.c
123         client/debug_menu.c
124         client/facecache.c
125         client/font.c
126         client/frustum.c
127         client/game.c
128         client/gui.c
129         client/input.c
130         client/interact.c
131         client/light.c
132         client/mesh.c
133         client/model.c
134         client/opengl.c
135         client/raycast.c
136         client/screenshot.c
137         client/shader.c
138         client/sky.c
139         client/terrain_gfx.c
140         client/texture.c
141         client/window.c
142 )
143
144 target_link_libraries(dragonblocks_client
145         PUBLIC dragonblocks
146         PUBLIC libglew_static
147         PUBLIC glfw
148         PUBLIC asprintf
149         PUBLIC linenoise
150         PUBLIC freetype
151 )
152
153 # Server
154
155 add_executable(dragonblocks_server
156         server/biomes.c
157         server/database.c
158         server/schematic.c
159         server/server.c
160         server/server_config.c
161         server/server_item.c
162         server/server_node.c
163         server/server_player.c
164         server/server_terrain.c
165         server/terrain_gen.c
166         server/tree.c
167         server/tree_physics.c
168         server/voxel_depth_search.c
169         server/voxel_procedural.c
170 )
171
172 target_link_libraries(dragonblocks_server
173         PUBLIC dragonblocks
174         PUBLIC sqlite3
175 )
176
177 # Version
178
179 add_custom_target(version
180         COMMAND ${CMAKE_COMMAND} -DBINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/version.cmake
181         WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
182 )
183
184 add_dependencies(dragonblocks version)
185
186 # Types
187
188 add_custom_command(
189         OUTPUT types.c types.h
190         MAIN_DEPENDENCY types.def
191         DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/../deps/protogen/protogen.lua"
192         COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/mktypes.sh" "${CMAKE_CURRENT_SOURCE_DIR}"
193         WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
194 )
195
196 add_custom_target(types
197         DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/types.c" "${CMAKE_CURRENT_BINARY_DIR}/types.h"
198 )
199
200 add_dependencies(dragonblocks types)