Skip to content

Commit ffabb3f

Browse files
committed
cmake: refactor game build configuration
1 parent 45d6aa1 commit ffabb3f

File tree

2 files changed

+170
-172
lines changed

2 files changed

+170
-172
lines changed

CMakeLists.txt

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

150150
# Game VM modules are built with a recursive invocation of CMake, by which all the configuration
151151
# options are lost, except ones we explicitly choose to pass.
152-
set(DEFAULT_NACL_VM_INHERITED_OPTIONS
152+
set(DEFAULT_VMS_INHERITED_OPTIONS
153153
BE_VERBOSE
154154
BUILD_CGAME
155155
BUILD_SGAME
@@ -160,15 +160,16 @@ set(DEFAULT_NACL_VM_INHERITED_OPTIONS
160160
USE_COMPILER_INTRINSICS
161161
USE_DEBUG_OPTIMIZE
162162
USE_HARDENING
163+
USE_LTO
163164
USE_PEDANTIC
164165
USE_PRECOMPILED_HEADER
165166
USE_RECOMMENDED_C_STANDARD
166167
USE_RECOMMENDED_CXX_STANDARD
167168
USE_WERROR
168169
)
169-
set(NACL_VM_INHERITED_OPTIONS "${DEFAULT_NACL_VM_INHERITED_OPTIONS}" CACHE STRING
170-
"Semicolon-separated list of options for which NaCl game VMs should use the same value as the other binaries")
171-
mark_as_advanced(NACL_VM_INHERITED_OPTIONS)
170+
set(VMS_INHERITED_OPTIONS "${DEFAULT_VMS_INHERITED_OPTIONS}" CACHE STRING
171+
"Semicolon-separated list of options for which game VMs should use the same value as the other binaries")
172+
mark_as_advanced(VMS_INHERITED_OPTIONS)
172173

173174
################################################################################
174175
# Directories

cmake/DaemonGame.cmake

Lines changed: 165 additions & 168 deletions
Original file line numberDiff line numberDiff line change
@@ -87,173 +87,170 @@ else()
8787
set(NACL_TARGETS "")
8888
endif()
8989

90+
function(buildGameModule module_slug)
91+
set(module_target "${GAMEMODULE_NAME}-${module_slug}")
92+
93+
set(module_target_args "${module_target}" ${PCH_FILE} ${GAMEMODULE_FILES} ${SHAREDLIST_${GAMEMODULE_NAME}} ${SHAREDLIST} ${COMMONLIST})
94+
95+
if (module_slug STREQUAL "native-dll")
96+
add_library(${module_target_args})
97+
set_target_properties(${module_target} PROPERTIES
98+
PREFIX ""
99+
COMPILE_DEFINITIONS "BUILD_VM_IN_PROCESS")
100+
else()
101+
add_executable(${module_target_args})
102+
endif()
103+
104+
set_target_properties(${module_target} PROPERTIES
105+
COMPILE_DEFINITIONS "VM_NAME=${GAMEMODULE_NAME};${GAMEMODULE_DEFINITIONS};BUILD_VM"
106+
COMPILE_OPTIONS "${GAMEMODULE_FLAGS}"
107+
FOLDER ${GAMEMODULE_NAME}
108+
)
109+
110+
if (module_slug STREQUAL "nacl")
111+
set_target_properties(${module_target} PROPERTIES
112+
OUTPUT_NAME "${GAMEMODULE_NAME}"
113+
SUFFIX "${PLATFORM_EXE_SUFFIX}")
114+
endif()
115+
116+
target_link_libraries(${module_target} ${GAMEMODULE_LIBS} ${LIBS_BASE})
117+
118+
ADD_PRECOMPILED_HEADER(${module_target})
119+
endfunction()
120+
121+
function(gameSubProject)
122+
ExternalProject_Add(${VMS_PROJECT}
123+
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
124+
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${VMS_PROJECT}
125+
CMAKE_GENERATOR ${VM_GENERATOR}
126+
CMAKE_ARGS
127+
-DFORK=2
128+
-DDAEMON_DIR=${Daemon_SOURCE_DIR}
129+
-DDEPS_DIR=${DEPS_DIR}
130+
-DBUILD_CLIENT=OFF
131+
-DBUILD_TTY_CLIENT=OFF
132+
-DBUILD_SERVER=OFF
133+
${ARGV}
134+
${INHERITED_OPTION_ARGS}
135+
INSTALL_COMMAND ""
136+
)
137+
138+
# Force the rescan and rebuild of the subproject.
139+
ExternalProject_Add_Step(${VMS_PROJECT} forcebuild
140+
COMMAND ${CMAKE_COMMAND} -E remove
141+
${CMAKE_CURRENT_BINARY_DIR}/${VMS_PROJECT}-prefix/src/${VMS_PROJECT}-stamp/${VMS_PROJECT}-configure
142+
COMMENT "Forcing build step for '${VMS_PROJECT}'"
143+
DEPENDEES build
144+
ALWAYS 1
145+
)
146+
endfunction()
147+
90148
function(GAMEMODULE)
91-
# ParseArguments setup
92-
set(oneValueArgs NAME)
93-
set(multiValueArgs DEFINITIONS FLAGS FILES LIBS)
94-
cmake_parse_arguments(GAMEMODULE "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
95-
96-
if (NOT NACL)
97-
if (BUILD_GAME_NATIVE_DLL)
98-
add_library(${GAMEMODULE_NAME}-native-dll MODULE ${PCH_FILE} ${GAMEMODULE_FILES} ${SHAREDLIST_${GAMEMODULE_NAME}} ${SHAREDLIST} ${COMMONLIST})
99-
target_link_libraries(${GAMEMODULE_NAME}-native-dll ${GAMEMODULE_LIBS} ${LIBS_BASE})
100-
set_target_properties(${GAMEMODULE_NAME}-native-dll PROPERTIES
101-
PREFIX ""
102-
COMPILE_DEFINITIONS "VM_NAME=${GAMEMODULE_NAME};${GAMEMODULE_DEFINITIONS};BUILD_VM;BUILD_VM_IN_PROCESS"
103-
COMPILE_OPTIONS "${GAMEMODULE_FLAGS}"
104-
FOLDER ${GAMEMODULE_NAME}
105-
)
106-
ADD_PRECOMPILED_HEADER(${GAMEMODULE_NAME}-native-dll)
107-
endif()
108-
109-
if (BUILD_GAME_NATIVE_EXE)
110-
add_executable(${GAMEMODULE_NAME}-native-exe ${PCH_FILE} ${GAMEMODULE_FILES} ${SHAREDLIST_${GAMEMODULE_NAME}} ${SHAREDLIST} ${COMMONLIST})
111-
target_link_libraries(${GAMEMODULE_NAME}-native-exe ${GAMEMODULE_LIBS} ${LIBS_BASE})
112-
set_target_properties(${GAMEMODULE_NAME}-native-exe PROPERTIES
113-
COMPILE_DEFINITIONS "VM_NAME=${GAMEMODULE_NAME};${GAMEMODULE_DEFINITIONS};BUILD_VM"
114-
COMPILE_OPTIONS "${GAMEMODULE_FLAGS}"
115-
FOLDER ${GAMEMODULE_NAME}
116-
)
117-
ADD_PRECOMPILED_HEADER(${GAMEMODULE_NAME}-native-exe)
118-
endif()
119-
120-
if (NOT FORK AND BUILD_GAME_NACL)
121-
if (CMAKE_GENERATOR MATCHES "Visual Studio")
122-
set(VM_GENERATOR "NMake Makefiles")
123-
else()
124-
set(VM_GENERATOR ${CMAKE_GENERATOR})
125-
endif()
126-
127-
set(FORK 1 PARENT_SCOPE)
128-
include(ExternalProject)
129-
set(inherited_option_args)
130-
131-
foreach(inherited_option ${NACL_VM_INHERITED_OPTIONS})
132-
set(inherited_option_args ${inherited_option_args}
133-
"-D${inherited_option}=${${inherited_option}}")
134-
endforeach(inherited_option)
135-
136-
if (USE_NACL_SAIGO)
137-
add_custom_target(nacl-vms ALL)
138-
unset(NACL_VMS_PROJECTS)
139-
140-
foreach(NACL_TARGET ${NACL_TARGETS})
141-
if (NACL_TARGET STREQUAL "i686")
142-
set(SAIGO_ARCH "i686")
143-
elseif (NACL_TARGET STREQUAL "amd64")
144-
set(SAIGO_ARCH "x86_64")
145-
elseif (NACL_TARGET STREQUAL "armhf")
146-
set(SAIGO_ARCH "arm")
147-
else()
148-
message(FATAL_ERROR "Unknown NaCl architecture ${NACL_TARGET}")
149-
endif()
150-
151-
set(NACL_VMS_PROJECT nacl-vms-${NACL_TARGET})
152-
list(APPEND NACL_VMS_PROJECTS ${NACL_VMS_PROJECT})
153-
add_dependencies(nacl-vms ${NACL_VMS_PROJECT})
154-
155-
ExternalProject_Add(${NACL_VMS_PROJECT}
156-
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
157-
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NACL_VMS_PROJECT}
158-
CMAKE_GENERATOR ${VM_GENERATOR}
159-
CMAKE_ARGS
160-
-DFORK=2
161-
-DCMAKE_TOOLCHAIN_FILE=${Daemon_SOURCE_DIR}/cmake/toolchain-saigo.cmake
162-
-DDAEMON_DIR=${Daemon_SOURCE_DIR}
163-
-DDEPS_DIR=${DEPS_DIR}
164-
-DBUILD_GAME_NACL=ON
165-
-DUSE_NACL_SAIGO=ON
166-
-DNACL_TARGET=${NACL_TARGET}
167-
-DSAIGO_ARCH=${SAIGO_ARCH}
168-
-DBUILD_GAME_NATIVE_DLL=OFF
169-
-DBUILD_GAME_NATIVE_EXE=OFF
170-
-DBUILD_CLIENT=OFF
171-
-DBUILD_TTY_CLIENT=OFF
172-
-DBUILD_SERVER=OFF
173-
${inherited_option_args}
174-
INSTALL_COMMAND ""
175-
)
176-
177-
# Force the rescan and rebuild of the subproject.
178-
ExternalProject_Add_Step(${NACL_VMS_PROJECT} forcebuild
179-
COMMAND ${CMAKE_COMMAND} -E remove
180-
${CMAKE_CURRENT_BINARY_DIR}/${NACL_VMS_PROJECT}-prefix/src/${NACL_VMS_PROJECT}-stamp/${NACL_VMS_PROJECT}-configure
181-
COMMENT "Forcing build step for '${NACL_VMS_PROJECT}'"
182-
DEPENDEES build
183-
ALWAYS 1
184-
)
185-
endforeach()
186-
else()
187-
set(NACL_VMS_PROJECT nacl-vms)
188-
set(NACL_VMS_PROJECTS ${NACL_VMS_PROJECT})
189-
190-
# Workaround a bug where CMake ExternalProject lists-as-args are cut on first “;”
191-
string(REPLACE ";" "," NACL_TARGETS_STRING "${NACL_TARGETS}")
192-
193-
ExternalProject_Add(${NACL_VMS_PROJECT}
194-
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
195-
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NACL_VMS_PROJECT}
196-
CMAKE_GENERATOR ${VM_GENERATOR}
197-
CMAKE_ARGS
198-
-DFORK=2
199-
-DCMAKE_TOOLCHAIN_FILE=${Daemon_SOURCE_DIR}/cmake/toolchain-pnacl.cmake
200-
-DDAEMON_DIR=${Daemon_SOURCE_DIR}
201-
-DDEPS_DIR=${DEPS_DIR}
202-
-DBUILD_GAME_NACL=ON
203-
-DNACL_TARGETS_STRING=${NACL_TARGETS_STRING}
204-
-DBUILD_GAME_NATIVE_DLL=OFF
205-
-DBUILD_GAME_NATIVE_EXE=OFF
206-
-DBUILD_CLIENT=OFF
207-
-DBUILD_TTY_CLIENT=OFF
208-
-DBUILD_SERVER=OFF
209-
${inherited_option_args}
210-
INSTALL_COMMAND ""
211-
)
212-
213-
# Force the rescan and rebuild of the subproject.
214-
ExternalProject_Add_Step(${NACL_VMS_PROJECT} forcebuild
215-
COMMAND ${CMAKE_COMMAND} -E remove
216-
${CMAKE_CURRENT_BINARY_DIR}/${NACL_VMS_PROJECT}-prefix/src/${NACL_VMS_PROJECT}-stamp/${NACL_VMS_PROJECT}-configure
217-
COMMENT "Forcing build step for '${NACL_VMS_PROJECT}'"
218-
DEPENDEES build
219-
ALWAYS 1
220-
)
221-
endif()
222-
set(NACL_VMS_PROJECTS ${NACL_VMS_PROJECTS} PARENT_SCOPE)
223-
endif()
224-
else()
225-
if (FORK EQUAL 2)
226-
if(USE_NACL_SAIGO)
227-
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
228-
else()
229-
# Put the .nexe and .pexe files in the same directory as the engine
230-
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/..)
231-
endif()
232-
endif()
233-
234-
add_executable(${GAMEMODULE_NAME}-nacl ${PCH_FILE} ${GAMEMODULE_FILES} ${SHAREDLIST_${GAMEMODULE_NAME}} ${SHAREDLIST} ${COMMONLIST})
235-
target_link_libraries(${GAMEMODULE_NAME}-nacl ${GAMEMODULE_LIBS} ${LIBS_BASE})
236-
# PLATFORM_EXE_SUFFIX is .pexe when building with PNaCl
237-
# as translating to .nexe is a separate task.
238-
set_target_properties(${GAMEMODULE_NAME}-nacl PROPERTIES
239-
OUTPUT_NAME ${GAMEMODULE_NAME}${PLATFORM_EXE_SUFFIX}
240-
COMPILE_DEFINITIONS "VM_NAME=${GAMEMODULE_NAME};${GAMEMODULE_DEFINITIONS};BUILD_VM"
241-
COMPILE_OPTIONS "${GAMEMODULE_FLAGS}"
242-
FOLDER ${GAMEMODULE_NAME}
243-
)
244-
ADD_PRECOMPILED_HEADER(${GAMEMODULE_NAME}-nacl)
245-
246-
# Revert a workaround for a bug where CMake ExternalProject lists-as-args are cut on first “;”
247-
string(REPLACE "," ";" NACL_TARGETS "${NACL_TARGETS_STRING}")
248-
249-
if (USE_NACL_SAIGO)
250-
# Finalize NaCl executables for supported architectures.
251-
saigo_finalize(${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/.. ${GAMEMODULE_NAME} ${NACL_TARGET})
252-
else()
253-
# Generate NaCl executables for supported architectures.
254-
foreach(NACL_TARGET ${NACL_TARGETS})
255-
pnacl_finalize(${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${GAMEMODULE_NAME} ${NACL_TARGET})
256-
endforeach()
257-
endif()
258-
endif()
149+
# ParseArguments setup
150+
set(oneValueArgs NAME)
151+
set(multiValueArgs DEFINITIONS FLAGS FILES LIBS)
152+
cmake_parse_arguments(GAMEMODULE "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
153+
154+
if (NOT FORK)
155+
if (BUILD_GAME_NACL)
156+
set(FORK 1 PARENT_SCOPE)
157+
endif()
158+
159+
if (BUILD_GAME_NATIVE_DLL)
160+
buildGameModule("native-dll")
161+
endif()
162+
163+
if (BUILD_GAME_NATIVE_EXE)
164+
buildGameModule("native-exe")
165+
endif()
166+
endif()
167+
168+
if (FORK EQUAL 1)
169+
if (CMAKE_GENERATOR MATCHES "Visual Studio")
170+
set(VM_GENERATOR "NMake Makefiles")
171+
else()
172+
set(VM_GENERATOR ${CMAKE_GENERATOR})
173+
endif()
174+
175+
include(ExternalProject)
176+
set(INHERITED_OPTION_ARGS)
177+
178+
foreach(inherited_option ${VMS_INHERITED_OPTIONS})
179+
set(INHERITED_OPTION_ARGS ${INHERITED_OPTION_ARGS}
180+
"-D${inherited_option}=${${inherited_option}}")
181+
endforeach(inherited_option)
182+
183+
if (BUILD_GAME_NACL)
184+
if (USE_NACL_SAIGO)
185+
add_custom_target(nacl-vms ALL)
186+
unset(VMS_PROJECTS)
187+
188+
foreach(NACL_TARGET ${NACL_TARGETS})
189+
if (NACL_TARGET STREQUAL "i686")
190+
set(SAIGO_ARCH "i686")
191+
elseif (NACL_TARGET STREQUAL "amd64")
192+
set(SAIGO_ARCH "x86_64")
193+
elseif (NACL_TARGET STREQUAL "armhf")
194+
set(SAIGO_ARCH "arm")
195+
else()
196+
message(FATAL_ERROR "Unknown NaCl architecture ${NACL_TARGET}")
197+
endif()
198+
199+
set(VMS_PROJECT nacl-vms-${NACL_TARGET})
200+
list(APPEND VMS_PROJECTS ${VMS_PROJECT})
201+
add_dependencies(nacl-vms ${VMS_PROJECT})
202+
203+
gameSubProject(
204+
-DCMAKE_TOOLCHAIN_FILE=${Daemon_SOURCE_DIR}/cmake/toolchain-saigo.cmake
205+
-DBUILD_GAME_NACL=ON
206+
-DBUILD_GAME_NATIVE_DLL=OFF
207+
-DBUILD_GAME_NATIVE_EXE=OFF
208+
-DUSE_NACL_SAIGO=ON
209+
-DSAIGO_ARCH=${SAIGO_ARCH}
210+
-DNACL_TARGET=${NACL_TARGET}
211+
)
212+
endforeach()
213+
else()
214+
set(VMS_PROJECT nacl-vms)
215+
set(VMS_PROJECTS ${VMS_PROJECT})
216+
217+
# Workaround a bug where CMake ExternalProject lists-as-args are cut on first “;”
218+
string(REPLACE ";" "," NACL_TARGETS_STRING "${NACL_TARGETS}")
219+
220+
gameSubProject(
221+
-DCMAKE_TOOLCHAIN_FILE=${Daemon_SOURCE_DIR}/cmake/toolchain-pnacl.cmake
222+
-DBUILD_GAME_NACL=ON
223+
-DBUILD_GAME_NATIVE_DLL=OFF
224+
-DBUILD_GAME_NATIVE_EXE=OFF
225+
-DNACL_TARGETS_STRING=${NACL_TARGETS_STRING}
226+
)
227+
endif()
228+
endif()
229+
230+
set(VMS_PROJECTS ${VMS_PROJECTS} PARENT_SCOPE)
231+
elseif (FORK EQUAL 2)
232+
if (BUILD_GAME_NACL)
233+
if (USE_NACL_SAIGO)
234+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
235+
else()
236+
# Put the .nexe and .pexe files in the same directory as the engine.
237+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/..)
238+
endif()
239+
240+
buildGameModule("nacl")
241+
242+
if (USE_NACL_SAIGO)
243+
# Finalize NaCl executables for supported architectures.
244+
saigo_finalize(${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/.. ${GAMEMODULE_NAME} ${NACL_TARGET})
245+
else()
246+
# Revert a workaround for a bug where CMake ExternalProject lists-as-args are cut on first “;”
247+
string(REPLACE "," ";" NACL_TARGETS "${NACL_TARGETS_STRING}")
248+
249+
# Generate NaCl executables for supported architectures.
250+
foreach(NACL_TARGET ${NACL_TARGETS})
251+
pnacl_finalize(${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${GAMEMODULE_NAME} ${NACL_TARGET})
252+
endforeach()
253+
endif()
254+
endif()
255+
endif()
259256
endfunction()

0 commit comments

Comments
 (0)