Skip to content

Commit bd81ee8

Browse files
committed
cmake: refactor game build configuration
1 parent 34a3597 commit bd81ee8

File tree

2 files changed

+170
-171
lines changed

2 files changed

+170
-171
lines changed

CMakeLists.txt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ option(USE_STATIC_LIBS "Tries to use static libs where possible. Only works for
191191

192192
# Game VM modules are built with a recursive invocation of CMake, by which all the configuration
193193
# options are lost, except ones we explicitly choose to pass.
194-
set(DEFAULT_NACL_VM_INHERITED_OPTIONS
194+
set(DEFAULT_VMS_INHERITED_OPTIONS
195195
BE_VERBOSE
196196
BUILD_CGAME
197197
BUILD_SGAME
@@ -202,15 +202,16 @@ set(DEFAULT_NACL_VM_INHERITED_OPTIONS
202202
USE_COMPILER_INTRINSICS
203203
USE_DEBUG_OPTIMIZE
204204
USE_HARDENING
205+
USE_LTO
205206
USE_PEDANTIC
206207
USE_PRECOMPILED_HEADER
207208
USE_RECOMMENDED_C_STANDARD
208209
USE_RECOMMENDED_CXX_STANDARD
209210
USE_WERROR
210211
)
211-
set(NACL_VM_INHERITED_OPTIONS "${DEFAULT_NACL_VM_INHERITED_OPTIONS}" CACHE STRING
212-
"Semicolon-separated list of options for which NaCl game VMs should use the same value as the other binaries")
213-
mark_as_advanced(NACL_VM_INHERITED_OPTIONS)
212+
set(VMS_INHERITED_OPTIONS "${DEFAULT_VMS_INHERITED_OPTIONS}" CACHE STRING
213+
"Semicolon-separated list of options for which game VMs should use the same value as the other binaries")
214+
mark_as_advanced(VMS_INHERITED_OPTIONS)
214215

215216
################################################################################
216217
# Directories

cmake/DaemonGame.cmake

Lines changed: 165 additions & 167 deletions
Original file line numberDiff line numberDiff line change
@@ -32,172 +32,170 @@ include(DaemonFlags)
3232
# Function to setup all the Sgame/Cgame libraries
3333
include(CMakeParseArguments)
3434

35+
function(buildGameModule module_slug)
36+
set(module_target "${GAMEMODULE_NAME}-${module_slug}")
37+
38+
set(module_target_args "${module_target}" ${PCH_FILE} ${GAMEMODULE_FILES} ${SHAREDLIST_${GAMEMODULE_NAME}} ${SHAREDLIST} ${COMMONLIST})
39+
40+
if (module_slug STREQUAL "native-dll")
41+
add_library(${module_target_args})
42+
set_target_properties(${module_target} PROPERTIES
43+
PREFIX ""
44+
COMPILE_DEFINITIONS "BUILD_VM_IN_PROCESS")
45+
else()
46+
add_executable(${module_target_args})
47+
endif()
48+
49+
set_target_properties(${module_target} PROPERTIES
50+
COMPILE_DEFINITIONS "VM_NAME=${GAMEMODULE_NAME};${GAMEMODULE_DEFINITIONS};BUILD_VM"
51+
COMPILE_OPTIONS "${GAMEMODULE_FLAGS}"
52+
FOLDER ${GAMEMODULE_NAME}
53+
)
54+
55+
if (module_slug STREQUAL "nacl")
56+
set_target_properties(${module_target} PROPERTIES
57+
OUTPUT_NAME "${GAMEMODULE_NAME}"
58+
SUFFIX "${PLATFORM_EXE_SUFFIX}")
59+
endif()
60+
61+
target_link_libraries(${module_target} ${GAMEMODULE_LIBS} ${LIBS_BASE})
62+
63+
ADD_PRECOMPILED_HEADER(${module_target})
64+
endfunction()
65+
66+
function(gameSubProject)
67+
ExternalProject_Add(${VMS_PROJECT}
68+
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
69+
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${VMS_PROJECT}
70+
CMAKE_GENERATOR ${VM_GENERATOR}
71+
CMAKE_ARGS
72+
-DFORK=2
73+
-DDAEMON_DIR=${Daemon_SOURCE_DIR}
74+
-DDEPS_DIR=${DEPS_DIR}
75+
-DBUILD_CLIENT=OFF
76+
-DBUILD_TTY_CLIENT=OFF
77+
-DBUILD_SERVER=OFF
78+
${ARGV}
79+
${INHERITED_OPTION_ARGS}
80+
INSTALL_COMMAND ""
81+
)
82+
83+
# Force the rescan and rebuild of the subproject.
84+
ExternalProject_Add_Step(${VMS_PROJECT} forcebuild
85+
COMMAND ${CMAKE_COMMAND} -E remove
86+
${CMAKE_CURRENT_BINARY_DIR}/${VMS_PROJECT}-prefix/src/${VMS_PROJECT}-stamp/${VMS_PROJECT}-configure
87+
COMMENT "Forcing build step for '${VMS_PROJECT}'"
88+
DEPENDEES build
89+
ALWAYS 1
90+
)
91+
endfunction()
92+
3593
function(GAMEMODULE)
36-
# ParseArguments setup
37-
set(oneValueArgs NAME)
38-
set(multiValueArgs DEFINITIONS FLAGS FILES LIBS)
39-
cmake_parse_arguments(GAMEMODULE "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
40-
if (NOT NACL)
41-
if (BUILD_GAME_NATIVE_DLL)
42-
add_library(${GAMEMODULE_NAME}-native-dll MODULE ${PCH_FILE} ${GAMEMODULE_FILES} ${SHAREDLIST_${GAMEMODULE_NAME}} ${SHAREDLIST} ${COMMONLIST})
43-
target_link_libraries(${GAMEMODULE_NAME}-native-dll ${GAMEMODULE_LIBS} ${LIBS_BASE})
44-
set_target_properties(${GAMEMODULE_NAME}-native-dll PROPERTIES
45-
PREFIX ""
46-
COMPILE_DEFINITIONS "VM_NAME=${GAMEMODULE_NAME};${GAMEMODULE_DEFINITIONS};BUILD_VM;BUILD_VM_IN_PROCESS"
47-
COMPILE_OPTIONS "${GAMEMODULE_FLAGS}"
48-
FOLDER ${GAMEMODULE_NAME}
49-
)
50-
ADD_PRECOMPILED_HEADER(${GAMEMODULE_NAME}-native-dll)
51-
endif()
52-
53-
if (BUILD_GAME_NATIVE_EXE)
54-
add_executable(${GAMEMODULE_NAME}-native-exe ${PCH_FILE} ${GAMEMODULE_FILES} ${SHAREDLIST_${GAMEMODULE_NAME}} ${SHAREDLIST} ${COMMONLIST})
55-
target_link_libraries(${GAMEMODULE_NAME}-native-exe ${GAMEMODULE_LIBS} ${LIBS_BASE})
56-
set_target_properties(${GAMEMODULE_NAME}-native-exe PROPERTIES
57-
COMPILE_DEFINITIONS "VM_NAME=${GAMEMODULE_NAME};${GAMEMODULE_DEFINITIONS};BUILD_VM"
58-
COMPILE_OPTIONS "${GAMEMODULE_FLAGS}"
59-
FOLDER ${GAMEMODULE_NAME}
60-
)
61-
ADD_PRECOMPILED_HEADER(${GAMEMODULE_NAME}-native-exe)
62-
endif()
63-
64-
if (NOT FORK AND BUILD_GAME_NACL)
65-
if (CMAKE_GENERATOR MATCHES "Visual Studio")
66-
set(VM_GENERATOR "NMake Makefiles")
67-
else()
68-
set(VM_GENERATOR ${CMAKE_GENERATOR})
69-
endif()
70-
71-
set(FORK 1 PARENT_SCOPE)
72-
include(ExternalProject)
73-
set(inherited_option_args)
74-
75-
foreach(inherited_option ${NACL_VM_INHERITED_OPTIONS})
76-
set(inherited_option_args ${inherited_option_args}
77-
"-D${inherited_option}=${${inherited_option}}")
78-
endforeach(inherited_option)
79-
80-
if (USE_NACL_SAIGO)
81-
add_custom_target(nacl-vms ALL)
82-
unset(NACL_VMS_PROJECTS)
83-
84-
foreach(NACL_TARGET ${NACL_TARGETS})
85-
if (NACL_TARGET STREQUAL "i686")
86-
set(SAIGO_ARCH "i686")
87-
elseif (NACL_TARGET STREQUAL "amd64")
88-
set(SAIGO_ARCH "x86_64")
89-
elseif (NACL_TARGET STREQUAL "armhf")
90-
set(SAIGO_ARCH "arm")
91-
else()
92-
message(FATAL_ERROR "Unknown NaCl architecture ${NACL_TARGET}")
93-
endif()
94-
95-
set(NACL_VMS_PROJECT nacl-vms-${NACL_TARGET})
96-
list(APPEND NACL_VMS_PROJECTS ${NACL_VMS_PROJECT})
97-
add_dependencies(nacl-vms ${NACL_VMS_PROJECT})
98-
99-
ExternalProject_Add(${NACL_VMS_PROJECT}
100-
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
101-
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NACL_VMS_PROJECT}
102-
CMAKE_GENERATOR ${VM_GENERATOR}
103-
CMAKE_ARGS
104-
-DFORK=2
105-
-DCMAKE_TOOLCHAIN_FILE=${Daemon_SOURCE_DIR}/cmake/toolchain-saigo.cmake
106-
-DDAEMON_DIR=${Daemon_SOURCE_DIR}
107-
-DDEPS_DIR=${DEPS_DIR}
108-
-DBUILD_GAME_NACL=ON
109-
-DUSE_NACL_SAIGO=ON
110-
-DNACL_TARGET=${NACL_TARGET}
111-
-DSAIGO_ARCH=${SAIGO_ARCH}
112-
-DBUILD_GAME_NATIVE_DLL=OFF
113-
-DBUILD_GAME_NATIVE_EXE=OFF
114-
-DBUILD_CLIENT=OFF
115-
-DBUILD_TTY_CLIENT=OFF
116-
-DBUILD_SERVER=OFF
117-
${inherited_option_args}
118-
INSTALL_COMMAND ""
119-
)
120-
121-
# Force the rescan and rebuild of the subproject.
122-
ExternalProject_Add_Step(${NACL_VMS_PROJECT} forcebuild
123-
COMMAND ${CMAKE_COMMAND} -E remove
124-
${CMAKE_CURRENT_BINARY_DIR}/${NACL_VMS_PROJECT}-prefix/src/${NACL_VMS_PROJECT}-stamp/${NACL_VMS_PROJECT}-configure
125-
COMMENT "Forcing build step for '${NACL_VMS_PROJECT}'"
126-
DEPENDEES build
127-
ALWAYS 1
128-
)
129-
endforeach()
130-
else()
131-
set(NACL_VMS_PROJECT nacl-vms)
132-
set(NACL_VMS_PROJECTS ${NACL_VMS_PROJECT})
133-
134-
# Workaround a bug where CMake ExternalProject lists-as-args are cut on first “;”
135-
string(REPLACE ";" "," NACL_TARGETS_STRING "${NACL_TARGETS}")
136-
137-
ExternalProject_Add(${NACL_VMS_PROJECT}
138-
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
139-
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NACL_VMS_PROJECT}
140-
CMAKE_GENERATOR ${VM_GENERATOR}
141-
CMAKE_ARGS
142-
-DFORK=2
143-
-DCMAKE_TOOLCHAIN_FILE=${Daemon_SOURCE_DIR}/cmake/toolchain-pnacl.cmake
144-
-DDAEMON_DIR=${Daemon_SOURCE_DIR}
145-
-DDEPS_DIR=${DEPS_DIR}
146-
-DBUILD_GAME_NACL=ON
147-
-DNACL_TARGETS_STRING=${NACL_TARGETS_STRING}
148-
-DBUILD_GAME_NATIVE_DLL=OFF
149-
-DBUILD_GAME_NATIVE_EXE=OFF
150-
-DBUILD_CLIENT=OFF
151-
-DBUILD_TTY_CLIENT=OFF
152-
-DBUILD_SERVER=OFF
153-
${inherited_option_args}
154-
INSTALL_COMMAND ""
155-
)
156-
157-
# Force the rescan and rebuild of the subproject.
158-
ExternalProject_Add_Step(${NACL_VMS_PROJECT} forcebuild
159-
COMMAND ${CMAKE_COMMAND} -E remove
160-
${CMAKE_CURRENT_BINARY_DIR}/${NACL_VMS_PROJECT}-prefix/src/${NACL_VMS_PROJECT}-stamp/${NACL_VMS_PROJECT}-configure
161-
COMMENT "Forcing build step for '${NACL_VMS_PROJECT}'"
162-
DEPENDEES build
163-
ALWAYS 1
164-
)
165-
endif()
166-
set(NACL_VMS_PROJECTS ${NACL_VMS_PROJECTS} PARENT_SCOPE)
167-
endif()
168-
else()
169-
if (FORK EQUAL 2)
170-
if(USE_NACL_SAIGO)
171-
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
172-
else()
173-
# Put the .nexe and .pexe files in the same directory as the engine
174-
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/..)
175-
endif()
176-
endif()
177-
178-
add_executable(${GAMEMODULE_NAME}-nacl ${PCH_FILE} ${GAMEMODULE_FILES} ${SHAREDLIST_${GAMEMODULE_NAME}} ${SHAREDLIST} ${COMMONLIST})
179-
target_link_libraries(${GAMEMODULE_NAME}-nacl ${GAMEMODULE_LIBS} ${LIBS_BASE})
180-
# PLATFORM_EXE_SUFFIX is .pexe when building with PNaCl
181-
# as translating to .nexe is a separate task.
182-
set_target_properties(${GAMEMODULE_NAME}-nacl PROPERTIES
183-
OUTPUT_NAME ${GAMEMODULE_NAME}${PLATFORM_EXE_SUFFIX}
184-
COMPILE_DEFINITIONS "VM_NAME=${GAMEMODULE_NAME};${GAMEMODULE_DEFINITIONS};BUILD_VM"
185-
COMPILE_OPTIONS "${GAMEMODULE_FLAGS}"
186-
FOLDER ${GAMEMODULE_NAME}
187-
)
188-
ADD_PRECOMPILED_HEADER(${GAMEMODULE_NAME}-nacl)
189-
190-
# Revert a workaround for a bug where CMake ExternalProject lists-as-args are cut on first “;”
191-
string(REPLACE "," ";" NACL_TARGETS "${NACL_TARGETS_STRING}")
192-
193-
if (USE_NACL_SAIGO)
194-
# Finalize NaCl executables for supported architectures.
195-
saigo_finalize(${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/.. ${GAMEMODULE_NAME} ${NACL_TARGET})
196-
else()
197-
# Generate NaCl executables for supported architectures.
198-
foreach(NACL_TARGET ${NACL_TARGETS})
199-
pnacl_finalize(${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${GAMEMODULE_NAME} ${NACL_TARGET})
200-
endforeach()
201-
endif()
202-
endif()
94+
# ParseArguments setup
95+
set(oneValueArgs NAME)
96+
set(multiValueArgs DEFINITIONS FLAGS FILES LIBS)
97+
cmake_parse_arguments(GAMEMODULE "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
98+
99+
if (NOT FORK)
100+
if (BUILD_GAME_NACL)
101+
set(FORK 1 PARENT_SCOPE)
102+
endif()
103+
104+
if (BUILD_GAME_NATIVE_DLL)
105+
buildGameModule("native-dll")
106+
endif()
107+
108+
if (BUILD_GAME_NATIVE_EXE)
109+
buildGameModule("native-exe")
110+
endif()
111+
endif()
112+
113+
if (FORK EQUAL 1)
114+
if (CMAKE_GENERATOR MATCHES "Visual Studio")
115+
set(VM_GENERATOR "NMake Makefiles")
116+
else()
117+
set(VM_GENERATOR ${CMAKE_GENERATOR})
118+
endif()
119+
120+
include(ExternalProject)
121+
set(INHERITED_OPTION_ARGS)
122+
123+
foreach(inherited_option ${VMS_INHERITED_OPTIONS})
124+
set(INHERITED_OPTION_ARGS ${INHERITED_OPTION_ARGS}
125+
"-D${inherited_option}=${${inherited_option}}")
126+
endforeach(inherited_option)
127+
128+
if (BUILD_GAME_NACL)
129+
if (USE_NACL_SAIGO)
130+
add_custom_target(nacl-vms ALL)
131+
unset(VMS_PROJECTS)
132+
133+
foreach(NACL_TARGET ${NACL_TARGETS})
134+
if (NACL_TARGET STREQUAL "i686")
135+
set(SAIGO_ARCH "i686")
136+
elseif (NACL_TARGET STREQUAL "amd64")
137+
set(SAIGO_ARCH "x86_64")
138+
elseif (NACL_TARGET STREQUAL "armhf")
139+
set(SAIGO_ARCH "arm")
140+
else()
141+
message(FATAL_ERROR "Unknown NaCl architecture ${NACL_TARGET}")
142+
endif()
143+
144+
set(VMS_PROJECT nacl-vms-${NACL_TARGET})
145+
list(APPEND VMS_PROJECTS ${VMS_PROJECT})
146+
add_dependencies(nacl-vms ${VMS_PROJECT})
147+
148+
gameSubProject(
149+
-DCMAKE_TOOLCHAIN_FILE=${Daemon_SOURCE_DIR}/cmake/toolchain-saigo.cmake
150+
-DBUILD_GAME_NACL=ON
151+
-DBUILD_GAME_NATIVE_DLL=OFF
152+
-DBUILD_GAME_NATIVE_EXE=OFF
153+
-DUSE_NACL_SAIGO=ON
154+
-DSAIGO_ARCH=${SAIGO_ARCH}
155+
-DNACL_TARGET=${NACL_TARGET}
156+
)
157+
endforeach()
158+
else()
159+
set(VMS_PROJECT nacl-vms)
160+
set(VMS_PROJECTS ${VMS_PROJECT})
161+
162+
# Workaround a bug where CMake ExternalProject lists-as-args are cut on first “;”
163+
string(REPLACE ";" "," NACL_TARGETS_STRING "${NACL_TARGETS}")
164+
165+
gameSubProject(
166+
-DCMAKE_TOOLCHAIN_FILE=${Daemon_SOURCE_DIR}/cmake/toolchain-pnacl.cmake
167+
-DBUILD_GAME_NACL=ON
168+
-DBUILD_GAME_NATIVE_DLL=OFF
169+
-DBUILD_GAME_NATIVE_EXE=OFF
170+
-DNACL_TARGETS_STRING=${NACL_TARGETS_STRING}
171+
)
172+
endif()
173+
endif()
174+
175+
set(VMS_PROJECTS ${VMS_PROJECTS} PARENT_SCOPE)
176+
elseif (FORK EQUAL 2)
177+
if (BUILD_GAME_NACL)
178+
if (USE_NACL_SAIGO)
179+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
180+
else()
181+
# Put the .nexe and .pexe files in the same directory as the engine.
182+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/..)
183+
endif()
184+
185+
buildGameModule("nacl")
186+
187+
if (USE_NACL_SAIGO)
188+
# Finalize NaCl executables for supported architectures.
189+
saigo_finalize(${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/.. ${GAMEMODULE_NAME} ${NACL_TARGET})
190+
else()
191+
# Revert a workaround for a bug where CMake ExternalProject lists-as-args are cut on first “;”
192+
string(REPLACE "," ";" NACL_TARGETS "${NACL_TARGETS_STRING}")
193+
194+
# Generate NaCl executables for supported architectures.
195+
foreach(NACL_TARGET ${NACL_TARGETS})
196+
pnacl_finalize(${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${GAMEMODULE_NAME} ${NACL_TARGET})
197+
endforeach()
198+
endif()
199+
endif()
200+
endif()
203201
endfunction()

0 commit comments

Comments
 (0)