]> icculus.org git repositories - taylor/freespace2.git/blob - CMakeLists.txt
shutdown() not yet implemented in Emscripten
[taylor/freespace2.git] / CMakeLists.txt
1
2 project(freespace2)
3
4 cmake_minimum_required(VERSION 2.8)
5 cmake_policy(VERSION 2.8)
6
7 if(POLICY CMP0043)
8   cmake_policy(SET CMP0043 OLD)
9 endif()
10
11 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
12
13 include(CreateSourceGroups)
14
15
16 # ##############################################################################
17
18 option(FS1 "Build original FreeSpace" OFF)
19 option(DEMO "Create demo build" OFF)
20
21 if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
22   message(STATUS "Setting build type to 'RelWithDebInfo' as none was specified.")
23   set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build." FORCE)
24   # Set the possible values of build type for cmake-gui
25   set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "RelWithDebInfo")
26 endif()
27
28
29 if(FS1)
30   add_definitions(-DMAKE_FS1)
31
32   if(DEMO)
33         add_definitions(-DDEMO -DFS1_DEMO)
34   endif()
35 else()
36   if(DEMO)
37         add_definitions(-DFS2_DEMO)
38   endif()
39 endif()
40
41 if(EMSCRIPTEN)
42   add_definitions(-s USE_SDL=2)
43   add_definitions(-s FULL_ES2=1)
44   add_definitions(-s DISABLE_EXCEPTION_CATCHING=0)
45
46   set(CMAKE_EXECUTABLE_SUFFIX ".html")
47 endif()
48
49 if(NOT WIN32)
50   set(PLATFORM_LIBRARIES "")
51
52   add_definitions(-DPLAT_UNIX)
53
54   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
55   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wshadow")
56   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsigned-char")
57
58   set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -g -O2 -DRELEASE_REAL")
59   set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2 -DRELEASE_REAL")
60   set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g3")
61 else()
62   set(SDL2DIR "${CMAKE_SOURCE_DIR}/../Support/SDL2" CACHE PATH "Path to SDL2")
63   set(OPENALDIR "${CMAKE_SOURCE_DIR}/../Support/OpenAL" CACHE PATH "Path to OpenAL")
64   set(LWSDIR "${CMAKE_SOURCE_DIR}/../Support/libwebsockets" CACHE PATH "Path to libwebsockets")
65   set(WXWIDGETSDIR "${CMAKE_SOURCE_DIR}/../Support/wxWidgets" CACHE PATH "Path to wxWidgets")
66   set(ANGLEDIR "${CMAKE_SOURCE_DIR}/../Support/ANGLE" CACHE PATH "Path to ANGLE")
67
68   set(PLATFORM_LIBRARIES
69         ws2_32.lib
70         ${ANGLEDIR}/lib/libEGL.lib
71         ${ANGLEDIR}/lib/libGLESv2.lib
72   )
73
74   add_definitions(/D _CRT_SECURE_NO_WARNINGS)
75
76   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
77   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4100") # unreferenced parameter
78   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4127") # conditional expression is constant: do { } while (0)
79   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4996") # deprecated functions: fopen, fileno, ...
80
81   set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MT /D RELEASE_REAL")
82   set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT /D RELEASE_REAL")
83   set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
84 endif()
85
86 set(BIN_SUFFIX "")
87
88 if(NOT FS1)
89         set(BIN_SUFFIX "2")
90 endif()
91
92 if(DEMO)
93         set(BIN_SUFFIX "${BIN_SUFFIX}demo")
94 endif()
95
96 find_package(SDL2 "2.0.5" REQUIRED)
97 find_package(OpenGL REQUIRED)
98 find_package(OpenAL REQUIRED)
99
100 if(NOT EMSCRIPTEN)
101   find_package(LibWebSockets REQUIRED)
102
103   find_package(wxWidgets COMPONENTS core base gl net)
104   include(${wxWidgets_USE_FILE})
105 endif()
106
107 # ##############################################################################
108
109
110 include_directories(
111   ${PROJECT_SOURCE_DIR}/include
112   ${CMAKE_BINARY_DIR}/include
113   ${SDL2_INCLUDE_DIR}
114   ${OPENAL_INCLUDE_DIR}
115   ${LIBWEBSOCKETS_INCLUDE_DIR}
116   ${wxWidgets_INCLUDE_DIRS}
117 )
118
119
120 add_subdirectory(src)
121 add_subdirectory(include)
122
123
124 # ##############################################################################
125 #
126
127 #
128 # custom target for source tree version info
129 #
130
131 add_custom_target(buildver
132   COMMAND ${CMAKE_COMMAND}
133     -DSOURCE_DIR=${CMAKE_SOURCE_DIR}
134     -DBINARY_DIR=${CMAKE_BINARY_DIR}
135     -P ${CMAKE_SOURCE_DIR}/cmake/GitInfo.cmake
136   WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
137   SOURCES ${CMAKE_SOURCE_DIR}/cmake/GitInfo.cmake
138 )
139
140 #
141 # main code/game library
142 #
143
144 add_library(code
145   STATIC
146   ${code_SOURCE}
147   ${code_HEADERS}
148   ${platform_SOURCE}
149   ${platform_HEADERS}
150 )
151
152 CreateSourceGroups(${code_SOURCE} ${platform_SOURCE})
153
154 add_dependencies(code
155   buildver
156 )
157
158 #
159 # the game itself
160 #
161
162 set(FS_BINARY "fs${BIN_SUFFIX}")
163
164 add_executable(${FS_BINARY}
165   WIN32
166   ${freespace_SOURCE}
167   ${freespace_HEADERS}
168 )
169
170 CreateSourceGroups(${freespace_SOURCE})
171
172 target_link_libraries(
173   ${FS_BINARY}
174   code
175   ${SDL2_LIBRARY}
176   ${OPENGL_LIBRARIES}
177   ${OPENAL_LIBRARY}
178   ${LIBWEBSOCKETS_LIBRARIES}
179   ${PLATFORM_LIBRARIES}
180 )
181
182 if (EMSCRIPTEN)
183   set_target_properties(${FS_BINARY} PROPERTIES LINK_FLAGS "-s USE_SDL=2 -s FULL_ES2=1 -s TOTAL_MEMORY=268435456 -s DISABLE_EXCEPTION_CATCHING=0 --preload-file game@/")
184 endif()
185
186 if(FS1)
187   set_target_properties(${FS_BINARY} PROPERTIES PROJECT_LABEL "Freespace")
188 else()
189   set_target_properties(${FS_BINARY} PROPERTIES PROJECT_LABEL "Freespace2")
190 endif()
191
192 if(NOT EMSCRIPTEN)
193 #
194 # launcher
195 #
196
197 set(LAUNCHER_BINARY "freespace${BIN_SUFFIX}")
198
199 add_executable(${LAUNCHER_BINARY}
200   WIN32
201   ${launcher_SOURCE}
202   ${launcher_HEADERS}
203 )
204
205 CreateSourceGroups(${launcher_SOURCE})
206
207 target_link_libraries(
208   ${LAUNCHER_BINARY}
209   ${SDL2_LIBRARY}
210   ${OPENGL_LIBRARIES}
211   ${OPENAL_LIBRARY}
212   ${wxWidgets_LIBRARIES}
213   ${PLATFORM_LIBRARIES}
214 )
215
216 set_target_properties(${LAUNCHER_BINARY} PROPERTIES PROJECT_LABEL "Launcher")
217
218 # wxWidgets appears to need c++11 for one or more headers
219 if(NOT WIN32)
220   set_target_properties(${LAUNCHER_BINARY} PROPERTIES COMPILE_FLAGS -std=c++11)
221 endif()
222
223 #
224 # standalone server GUI
225 #
226
227 # Not for FS1 Demo
228 if(NOT FS1 OR NOT DEMO)
229         if(FS1)
230           set(STANDALONE_BINARY fsstandalone)
231         else()
232           set(STANDALONE_BINARY fs2standalone)
233         endif()
234
235         add_executable(${STANDALONE_BINARY}
236           WIN32
237           ${standalone_SOURCE}
238           ${standalone_HEADERS}
239         )
240
241         CreateSourceGroups(${standalone_SOURCE})
242
243         target_link_libraries(
244           ${STANDALONE_BINARY}
245           ${SDL2_LIBRARY}
246           ${wxWidgets_LIBRARIES}
247           ${LIBWEBSOCKETS_LIBRARIES}
248           ${PLATFORM_LIBRARIES}
249         )
250
251         set_target_properties(${STANDALONE_BINARY} PROPERTIES PROJECT_LABEL "Standalone")
252
253         # wxWidgets appears to need c++11 for one or more headers
254         if(NOT WIN32)
255           set_target_properties(${STANDALONE_BINARY} PROPERTIES COMPILE_FLAGS -std=c++11)
256         endif()
257 endif()
258
259 #
260 # extra rule to make sure we cleanup all exe variants
261 #
262
263 set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES
264   # FS1 demo
265   fsdemo${CMAKE_EXECUTABLE_SUFFIX}
266   fsdemo${CMAKE_EXECUTABLE_SUFFIX}.mem
267   fsdemo.js
268   fsdemo.data
269   freespacedemo${CMAKE_EXECUTABLE_SUFFIX}
270   # FS1
271   fs${CMAKE_EXECUTABLE_SUFFIX}
272   fs${CMAKE_EXECUTABLE_SUFFIX}.mem
273   fs.js
274   fs.data
275   freespace${CMAKE_EXECUTABLE_SUFFIX}
276   # FS2 demo
277   fs2demo${CMAKE_EXECUTABLE_SUFFIX}
278   fs2demo${CMAKE_EXECUTABLE_SUFFIX}.mem
279   fs2demo.js
280   fs2demo.data
281   freespace2demo${CMAKE_EXECUTABLE_SUFFIX}
282   # FS2
283   fs2${CMAKE_EXECUTABLE_SUFFIX}
284   fs2${CMAKE_EXECUTABLE_SUFFIX}.mem
285   fs2.js
286   fs2.data
287   freespace2${CMAKE_EXECUTABLE_SUFFIX}
288   # standalone GUI
289   fsstandalone${CMAKE_EXECUTABLE_SUFFIX}
290   fs2standalone${CMAKE_EXECUTABLE_SUFFIX}
291 )
292
293 #
294 # ##############################################################################
295
296 # ##############################################################################
297 #
298 # toolset: targets for creating/modifying game assets
299 #
300
301 # don't build toolset unless it's a full build
302 if(NOT DEMO)
303
304         #
305         # AC: anim converter
306         #
307
308         add_executable(ac
309           EXCLUDE_FROM_ALL
310           ${ac_SOURCE}
311           ${ac_HEADERS}
312         )
313
314         CreateSourceGroups(${ac_SOURCE})
315
316         target_link_libraries(
317           ac
318           code
319           ${SDL2_LIBRARY}
320           ${OPENGL_LIBRARIES}
321           ${OPENAL_LIBRARY}
322           ${LIBWEBSOCKETS_LIBRARIES}
323           ${PLATFORM_LIBRARIES}
324         )
325
326         #
327         # CFILEARCHIVER: to create VP file archives
328         #
329
330         add_executable(cfilearchiver
331           EXCLUDE_FROM_ALL
332           ${cfilearchiver_SOURCE}
333         )
334
335         CreateSourceGroups(${cfilearchiver_SOURCE})
336
337         #
338         # CRYPTSTRING: string encryption (for embedded cheat codes)
339         #
340
341         add_executable(cryptstring
342           EXCLUDE_FROM_ALL
343           ${cryptstring_SOURCE}
344         )
345
346         CreateSourceGroups(${cryptstring_SOURCE})
347
348         #
349         # NEBEDIT: FS1 style nebula editor/creator
350         #
351
352         add_executable(nebedit
353           EXCLUDE_FROM_ALL
354           WIN32
355           ${nebedit_SOURCE}
356         )
357
358         CreateSourceGroups(${nebedit_SOURCE})
359
360         target_link_libraries(
361           nebedit
362           code
363           ${SDL2_LIBRARY}
364           ${OPENGL_LIBRARIES}
365           ${OPENAL_LIBRARY}
366           ${wxWidgets_LIBRARIES}
367           ${LIBWEBSOCKETS_LIBRARIES}
368           ${PLATFORM_LIBRARIES}
369         )
370
371         # wxWidgets appears to need c++11 for one or more headers
372         if(NOT WIN32)
373           set_target_properties(nebedit PROPERTIES COMPILE_FLAGS -std=c++11)
374         endif()
375
376         #
377         # POFVIEW: model viewer
378         #
379
380         add_executable(pofview
381           EXCLUDE_FROM_ALL
382           WIN32
383           ${pofview_SOURCE}
384           ${pofview_HEADERS}
385         )
386
387         CreateSourceGroups(${pofview_SOURCE})
388
389         target_link_libraries(
390           pofview
391           code
392           ${SDL2_LIBRARY}
393           ${OPENGL_LIBRARIES}
394           ${OPENAL_LIBRARY}
395           ${wxWidgets_LIBRARIES}
396           ${LIBWEBSOCKETS_LIBRARIES}
397           ${PLATFORM_LIBRARIES}
398         )
399
400         # wxWidgets appears to need c++11 for one or more headers
401         if(NOT WIN32)
402           set_target_properties(pofview PROPERTIES COMPILE_FLAGS -std=c++11)
403         endif()
404
405         #
406         # SCRAMBLE: file-based encryption for TBLs
407         #
408
409         add_executable(scramble
410           EXCLUDE_FROM_ALL
411           ${scramble_SOURCE}
412           ${scramble_HEADERS}
413         )
414
415         CreateSourceGroups(${scramble_SOURCE})
416
417         #
418         # FONTTOOL: create font files / edit kerning data
419         #
420
421         add_executable(fonttool
422           EXCLUDE_FROM_ALL
423           ${fonttool_SOURCE}
424           ${fonttool_HEADERS}
425         )
426
427         CreateSourceGroups(${fonttool_SOURCE})
428
429         # background setup, to allow running from build location without installing
430         add_custom_command(TARGET fonttool
431           POST_BUILD
432           COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/src/fonttool"
433           COMMAND ${CMAKE_COMMAND} -E copy "${PROJECT_SOURCE_DIR}/src/fonttool/fonttool.pcx" "${CMAKE_CURRENT_BINARY_DIR}/src/fonttool"
434         )
435
436         target_link_libraries(
437           fonttool
438           code
439           ${SDL2_LIBRARY}
440           ${OPENGL_LIBRARIES}
441           ${OPENAL_LIBRARY}
442           ${LIBWEBSOCKETS_LIBRARIES}
443           ${PLATFORM_LIBRARIES}
444         )
445
446         #
447         # custom target to build all tools in one pass
448         #
449
450         add_custom_target(tools)
451
452         add_dependencies(tools
453           ac
454           cfilearchiver
455           cryptstring
456           nebedit
457           pofview
458           scramble
459           fonttool
460         )
461
462 endif(NOT DEMO)
463
464 #
465 # ##############################################################################
466
467 endif(NOT EMSCRIPTEN)
468 #
469 # optionally include any dev/user preferred build commands and/or options
470 #
471
472 #include(custom.cmake OPTIONAL)