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