]> icculus.org git repositories - taylor/freespace2.git/blob - CMakeLists.txt
first pass at emscripten support
[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   freespacedemo${CMAKE_EXECUTABLE_SUFFIX}
267   # FS1
268   fs${CMAKE_EXECUTABLE_SUFFIX}
269   freespace${CMAKE_EXECUTABLE_SUFFIX}
270   # FS2 demo
271   fs2demo${CMAKE_EXECUTABLE_SUFFIX}
272   freespace2demo${CMAKE_EXECUTABLE_SUFFIX}
273   # FS2
274   fs2${CMAKE_EXECUTABLE_SUFFIX}
275   freespace2${CMAKE_EXECUTABLE_SUFFIX}
276   # standalone GUI
277   fsstandalone${CMAKE_EXECUTABLE_SUFFIX}
278   fs2standalone${CMAKE_EXECUTABLE_SUFFIX}
279 )
280
281 #
282 # ##############################################################################
283
284 # ##############################################################################
285 #
286 # toolset: targets for creating/modifying game assets
287 #
288
289 # don't build toolset unless it's a full build
290 if(NOT DEMO)
291
292         #
293         # AC: anim converter
294         #
295
296         add_executable(ac
297           EXCLUDE_FROM_ALL
298           ${ac_SOURCE}
299           ${ac_HEADERS}
300         )
301
302         CreateSourceGroups(${ac_SOURCE})
303
304         target_link_libraries(
305           ac
306           code
307           ${SDL2_LIBRARY}
308           ${OPENGL_LIBRARIES}
309           ${OPENAL_LIBRARY}
310           ${LIBWEBSOCKETS_LIBRARIES}
311           ${PLATFORM_LIBRARIES}
312         )
313
314         #
315         # CFILEARCHIVER: to create VP file archives
316         #
317
318         add_executable(cfilearchiver
319           EXCLUDE_FROM_ALL
320           ${cfilearchiver_SOURCE}
321         )
322
323         CreateSourceGroups(${cfilearchiver_SOURCE})
324
325         #
326         # CRYPTSTRING: string encryption (for embedded cheat codes)
327         #
328
329         add_executable(cryptstring
330           EXCLUDE_FROM_ALL
331           ${cryptstring_SOURCE}
332         )
333
334         CreateSourceGroups(${cryptstring_SOURCE})
335
336         #
337         # NEBEDIT: FS1 style nebula editor/creator
338         #
339
340         add_executable(nebedit
341           EXCLUDE_FROM_ALL
342           WIN32
343           ${nebedit_SOURCE}
344         )
345
346         CreateSourceGroups(${nebedit_SOURCE})
347
348         target_link_libraries(
349           nebedit
350           code
351           ${SDL2_LIBRARY}
352           ${OPENGL_LIBRARIES}
353           ${OPENAL_LIBRARY}
354           ${wxWidgets_LIBRARIES}
355           ${LIBWEBSOCKETS_LIBRARIES}
356           ${PLATFORM_LIBRARIES}
357         )
358
359         # wxWidgets appears to need c++11 for one or more headers
360         if(NOT WIN32)
361           set_target_properties(nebedit PROPERTIES COMPILE_FLAGS -std=c++11)
362         endif()
363
364         #
365         # POFVIEW: model viewer
366         #
367
368         add_executable(pofview
369           EXCLUDE_FROM_ALL
370           WIN32
371           ${pofview_SOURCE}
372           ${pofview_HEADERS}
373         )
374
375         CreateSourceGroups(${pofview_SOURCE})
376
377         target_link_libraries(
378           pofview
379           code
380           ${SDL2_LIBRARY}
381           ${OPENGL_LIBRARIES}
382           ${OPENAL_LIBRARY}
383           ${wxWidgets_LIBRARIES}
384           ${LIBWEBSOCKETS_LIBRARIES}
385           ${PLATFORM_LIBRARIES}
386         )
387
388         # wxWidgets appears to need c++11 for one or more headers
389         if(NOT WIN32)
390           set_target_properties(pofview PROPERTIES COMPILE_FLAGS -std=c++11)
391         endif()
392
393         #
394         # SCRAMBLE: file-based encryption for TBLs
395         #
396
397         add_executable(scramble
398           EXCLUDE_FROM_ALL
399           ${scramble_SOURCE}
400           ${scramble_HEADERS}
401         )
402
403         CreateSourceGroups(${scramble_SOURCE})
404
405         #
406         # FONTTOOL: create font files / edit kerning data
407         #
408
409         add_executable(fonttool
410           EXCLUDE_FROM_ALL
411           ${fonttool_SOURCE}
412           ${fonttool_HEADERS}
413         )
414
415         CreateSourceGroups(${fonttool_SOURCE})
416
417         # background setup, to allow running from build location without installing
418         add_custom_command(TARGET fonttool
419           POST_BUILD
420           COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/src/fonttool"
421           COMMAND ${CMAKE_COMMAND} -E copy "${PROJECT_SOURCE_DIR}/src/fonttool/fonttool.pcx" "${CMAKE_CURRENT_BINARY_DIR}/src/fonttool"
422         )
423
424         target_link_libraries(
425           fonttool
426           code
427           ${SDL2_LIBRARY}
428           ${OPENGL_LIBRARIES}
429           ${OPENAL_LIBRARY}
430           ${LIBWEBSOCKETS_LIBRARIES}
431           ${PLATFORM_LIBRARIES}
432         )
433
434         #
435         # custom target to build all tools in one pass
436         #
437
438         add_custom_target(tools)
439
440         add_dependencies(tools
441           ac
442           cfilearchiver
443           cryptstring
444           nebedit
445           pofview
446           scramble
447           fonttool
448         )
449
450 endif(NOT DEMO)
451
452 #
453 # ##############################################################################
454
455 endif(NOT EMSCRIPTEN)
456 #
457 # optionally include any dev/user preferred build commands and/or options
458 #
459
460 #include(custom.cmake OPTIONAL)