-
Notifications
You must be signed in to change notification settings - Fork 17
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
305 lines (270 loc) · 9.43 KB
/
CMakeLists.txt
File metadata and controls
305 lines (270 loc) · 9.43 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
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
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
cmake_minimum_required(VERSION 3.0...4.0)
set(MAJOR_VERSION 4)
set(MINOR_VERSION 0)
set(MICRO_VERSION 0)
project(Maelstrom
LANGUAGES C CXX
VERSION "${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}"
)
if(APPLE)
enable_language(OBJC)
endif()
# set the output directory for built objects.
# This makes sure that the dynamic library goes into the build directory automatically.
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/$<CONFIGURATION>")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/$<CONFIGURATION>")
# on Web targets, we need CMake to generate a HTML webpage.
if(EMSCRIPTEN)
set(CMAKE_EXECUTABLE_SUFFIX_CXX ".html" CACHE INTERNAL "")
# Enable persistent storage
set(SDL_EMSCRIPTEN_PERSISTENT_PATH /storage)
endif()
add_subdirectory(maclib)
set(PHYSFS_BUILD_SHARED OFF)
set(PHYSFS_BUILD_TEST OFF)
add_subdirectory(external/physfs EXCLUDE_FROM_ALL)
add_subdirectory(external/SDL EXCLUDE_FROM_ALL)
# SDL_net's ABI has not yet been finalized
set(original_BUILD_SHARED_LIBS "${BUILD_SHARED_LIBS}")
set(BUILD_SHARED_LIBS OFF)
add_subdirectory(external/SDL_net SDL_net EXCLUDE_FROM_ALL)
set(BUILD_SHARED_LIBS "${original_BUILD_SHARED_LIBS}")
SDL_DetectTargetCPUArchitectures(SDL_CPU_NAMES)
SDL_DetectCMakePlatform()
set(MAELSTROM_SOURCES
game/about.cpp
game/about.h
game/colortable.h
game/continue.cpp
game/continue.h
game/controls.cpp
game/controls.h
game/fastrand.cpp
game/fastrand.h
game/game.cpp
game/game.h
game/gameinfo.cpp
game/gameinfo.h
game/gameover.cpp
game/gameover.h
game/init.cpp
game/init.h
game/load.cpp
game/load.h
game/lobby.cpp
game/lobby.h
game/Localization.h
game/MacDialog.cpp
game/MacDialog.h
game/Maelstrom_Globals.h
game/Maelstrom.h
game/MaelstromUI.cpp
game/MaelstromUI.h
game/main.cpp
game/main.h
game/make.cpp
game/make.h
game/mods.cpp
game/mods.h
game/myerror.cpp
game/myerror.h
game/netplay.cpp
game/netplay.h
game/object.cpp
game/object.h
game/objects.cpp
game/objects.h
game/packet.h
game/player.cpp
game/player.h
game/protocol.h
game/rect.cpp
game/rect.h
game/replay.cpp
game/replay.h
game/scores.cpp
game/scores.h
game/shenobi.h
game/steam.cpp
game/steam.h
screenlib/SDL_FrameBuf.cpp
screenlib/SDL_FrameBuf.h
screenlib/UIArea.cpp
screenlib/UIArea.h
screenlib/UIBaseElement.cpp
screenlib/UIBaseElement.h
screenlib/UIContainer.cpp
screenlib/UIContainer.h
screenlib/UIDialogButton.cpp
screenlib/UIDialogButton.h
screenlib/UIDialog.cpp
screenlib/UIDialog.h
screenlib/UIDrawEngine.cpp
screenlib/UIDrawEngine.h
screenlib/UIElementButton.cpp
screenlib/UIElementButton.h
screenlib/UIElementCheckbox.cpp
screenlib/UIElementCheckbox.h
screenlib/UIElement.cpp
screenlib/UIElementDropdown.cpp
screenlib/UIElementDropdown.h
screenlib/UIElementEditbox.cpp
screenlib/UIElementEditbox.h
screenlib/UIElement.h
screenlib/UIElementRadio.cpp
screenlib/UIElementRadio.h
screenlib/UIElementThumbstick.cpp
screenlib/UIElementThumbstick.h
screenlib/UIFontInterface.h
screenlib/UIImageInterface.h
screenlib/UIManager.cpp
screenlib/UIManager.h
screenlib/UIPanel.cpp
screenlib/UIPanel.h
screenlib/UISoundInterface.h
screenlib/UITemplates.cpp
screenlib/UITemplates.h
screenlib/UITexture.cpp
screenlib/UITexture.h
utils/array.h
utils/ErrorBase.h
utils/files.c
utils/files.h
utils/hashtable.c
utils/hashtable.h
utils/loadxml.cpp
utils/loadxml.h
utils/prefs.cpp
utils/prefs.h
utils/rapidxml.h
utils/rapidxml.hpp
external/physfs/extras/physfssdl3.c
miniz/miniz.c
Maelstrom.rc
)
if(ANDROID)
set(TARGET_NAME main)
add_library(${TARGET_NAME} MODULE ${MAELSTROM_SOURCES})
else()
set(TARGET_NAME Maelstrom)
add_executable(${TARGET_NAME} WIN32 ${MAELSTROM_SOURCES})
endif()
if(MSVC)
target_compile_options(${TARGET_NAME} PRIVATE -W3)
else()
target_compile_options(${TARGET_NAME} PRIVATE -Wall)
target_compile_options(${TARGET_NAME} PRIVATE -Wextra)
target_compile_options(${TARGET_NAME} PRIVATE -Wno-cast-function-type)
target_compile_options(${TARGET_NAME} PRIVATE -Wno-sign-compare)
target_compile_options(${TARGET_NAME} PRIVATE -Wno-unused-function)
target_compile_options(${TARGET_NAME} PRIVATE -Wno-unused-parameter)
endif()
if(NOT WIN32)
check_c_source_compiles("
#include <ifaddrs.h>
int main() {
struct ifaddrs* ifap;
getifaddrs(&ifap);
return 0;
}
" HAVE_GETIFADDRS)
if(HAVE_GETIFADDRS)
target_compile_definitions(${TARGET_NAME} PRIVATE HAVE_GETIFADDRS)
endif()
endif()
dep_option(STEAM "Build with Steam support" ON "WIN32 OR LINUX OR MACOS" OFF)
if(STEAM)
target_compile_definitions(${TARGET_NAME} PRIVATE ENABLE_STEAM)
add_library(SteamworksSDK::steam_api SHARED IMPORTED)
set_property(TARGET SteamworksSDK::steam_api PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${PROJECT_SOURCE_DIR}/external/SteamworksSDK/public")
if(WIN32)
set_property(TARGET SteamworksSDK::steam_api PROPERTY IMPORTED_LOCATION "${PROJECT_SOURCE_DIR}/external/SteamworksSDK/redistributable_bin/win64/steam_api64.dll")
set_property(TARGET SteamworksSDK::steam_api PROPERTY IMPORTED_IMPLIB "${PROJECT_SOURCE_DIR}/external/SteamworksSDK/redistributable_bin/win64/steam_api64.lib")
elseif(LINUX)
if(CMAKE_SIZEOF_VOID_P EQUAL 4)
set_property(TARGET SteamworksSDK::steam_api PROPERTY IMPORTED_LOCATION "${PROJECT_SOURCE_DIR}/external/SteamworksSDK/redistributable_bin/linux32/libsteam_api.so")
else()
set_property(TARGET SteamworksSDK::steam_api PROPERTY IMPORTED_LOCATION "${PROJECT_SOURCE_DIR}/external/SteamworksSDK/redistributable_bin/linux64/libsteam_api.so")
endif()
elseif(MACOS)
set_property(TARGET SteamworksSDK::steam_api PROPERTY IMPORTED_LOCATION "${PROJECT_SOURCE_DIR}/external/SteamworksSDK/redistributable_bin/osx/libsteam_api.dylib")
endif()
target_link_libraries(${TARGET_NAME} PRIVATE SteamworksSDK::steam_api)
endif()
target_link_libraries(${TARGET_NAME} PRIVATE SDLmac)
target_link_libraries(${TARGET_NAME} PRIVATE physfs-static)
target_link_libraries(${TARGET_NAME} PRIVATE SDL3_net::SDL3_net)
target_link_libraries(${TARGET_NAME} PRIVATE SDL3::SDL3)
if(EMSCRIPTEN)
# Increase the default stack size
target_link_options(${TARGET_NAME} PRIVATE -sALLOW_MEMORY_GROWTH=1 -sSTACK_SIZE=1048576)
# Create a source map for debugging
target_link_options(${TARGET_NAME} PRIVATE -gsource-map)
# on the web, we have to put the files inside of the webassembly
# somewhat unintuitively, this is done via a linker argument.
target_link_libraries(${TARGET_NAME} PRIVATE
"--preload-file \"${CMAKE_CURRENT_LIST_DIR}/Data@Data/\""
"--preload-file \"${CMAKE_CURRENT_LIST_DIR}/mods@mods/\""
)
else()
option(STANDALONE_INSTALL "Build Maelstrom installed into a single directory" TRUE)
if(STANDALONE_INSTALL)
set(CMAKE_INSTALL_BINDIR ".")
set(CMAKE_INSTALL_LIBDIR ".")
set(CMAKE_INSTALL_DOCDIR "Docs")
set(GAME_INSTALL_DATADIR ".")
if(APPLE)
set_property(TARGET ${TARGET_NAME} SDL3-shared PROPERTY INSTALL_RPATH "@executable_path")
else()
set_property(TARGET ${TARGET_NAME} SDL3-shared PROPERTY INSTALL_RPATH "$ORIGIN")
endif()
else()
include(GNUInstallDirs)
set(GAME_INSTALL_DATADIR "${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}")
target_compile_definitions(${TARGET_NAME} PRIVATE MAELSTROM_DATA=\"${CMAKE_INSTALL_PREFIX}/${GAME_INSTALL_DATADIR}/Data/\")
endif()
install(TARGETS ${TARGET_NAME} SDL3-shared LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" NAMELINK_SKIP RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
if(STEAM)
install(IMPORTED_RUNTIME_ARTIFACTS SteamworksSDK::steam_api)
endif()
install(DIRECTORY Data DESTINATION "${GAME_INSTALL_DATADIR}")
install(DIRECTORY mods DESTINATION "${GAME_INSTALL_DATADIR}")
file(GLOB docs "Docs/*.txt" "README*")
install(FILES ${docs} "COPYING" TYPE DOC)
#
# Uninstall
#
configure_file(cmake/cmake_uninstall.cmake.in cmake_uninstall.cmake IMMEDIATE @ONLY)
add_custom_target(uninstall
COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
#
# Source package
#
find_package(Git QUIET)
if(GIT_FOUND)
add_custom_target(package_sources
COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/dist
COMMAND ${GIT_EXECUTABLE} archive HEAD -o "${PROJECT_BINARY_DIR}/dist/${PROJECT_NAME}-${PROJECT_VERSION}.zip" --prefix "${PROJECT_NAME}-${PROJECT_VERSION}/"
COMMAND ${GIT_EXECUTABLE} archive HEAD -o "${PROJECT_BINARY_DIR}/dist/${PROJECT_NAME}-${PROJECT_VERSION}.tar.gz" --prefix "${PROJECT_NAME}-${PROJECT_VERSION}/"
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "Creating source archive..."
VERBATIM
)
else()
message(WARNING "Git not found, 'package_sources' target will not be available.")
endif()
#
# Binary package
#
if(MSVC)
set(CPACK_GENERATOR "ZIP")
else()
set(CPACK_GENERATOR "TGZ")
endif()
configure_file(cmake/CPackProjectConfig.cmake.in CPackProjectConfig.cmake @ONLY)
set(CPACK_PROJECT_CONFIG_FILE "${PROJECT_BINARY_DIR}/CPackProjectConfig.cmake")
# CPACK_SOURCE_PACKAGE_FILE_NAME must end with "-src" (so we can block creating a source archive)
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}-src")
set(CPACK_PACKAGE_DIRECTORY "${CMAKE_BINARY_DIR}/dist")
include(CPack)
endif()