Skip to content

Commit 96eded5

Browse files
committed
cmake: refactor game build configuration to reuse the same code in parent build or subproject build and mutualize code between vm type build
1 parent 6c2b388 commit 96eded5

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
@@ -153,7 +153,7 @@ endif()
153153

154154
# Game VM modules are built with a recursive invocation of CMake, by which all the configuration
155155
# options are lost, except ones we explicitly choose to pass.
156-
set(DEFAULT_NACL_VM_INHERITED_OPTIONS
156+
set(DEFAULT_VMS_INHERITED_OPTIONS
157157
BE_VERBOSE
158158
BUILD_CGAME
159159
BUILD_SGAME
@@ -164,15 +164,16 @@ set(DEFAULT_NACL_VM_INHERITED_OPTIONS
164164
USE_COMPILER_INTRINSICS
165165
USE_DEBUG_OPTIMIZE
166166
USE_HARDENING
167+
USE_LTO
167168
USE_PEDANTIC
168169
USE_PRECOMPILED_HEADER
169170
USE_RECOMMENDED_C_STANDARD
170171
USE_RECOMMENDED_CXX_STANDARD
171172
USE_WERROR
172173
)
173-
set(NACL_VM_INHERITED_OPTIONS "${DEFAULT_NACL_VM_INHERITED_OPTIONS}" CACHE STRING
174-
"Semicolon-separated list of options for which NaCl game VMs should use the same value as the other binaries")
175-
mark_as_advanced(NACL_VM_INHERITED_OPTIONS)
174+
set(VMS_INHERITED_OPTIONS "${DEFAULT_VMS_INHERITED_OPTIONS}" CACHE STRING
175+
"Semicolon-separated list of options for which game VMs should use the same value as the other binaries")
176+
mark_as_advanced(VMS_INHERITED_OPTIONS)
176177

177178
################################################################################
178179
# Directories

cmake/DaemonGame.cmake

Lines changed: 165 additions & 168 deletions
Original file line numberDiff line numberDiff line change
@@ -103,173 +103,170 @@ else()
103103
set(NACL_TARGETS "")
104104
endif()
105105

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

0 commit comments

Comments
 (0)