Skip to content

Commit d76ea58

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 1c4c96a commit d76ea58

File tree

1 file changed

+165
-168
lines changed

1 file changed

+165
-168
lines changed

cmake/DaemonGame.cmake

Lines changed: 165 additions & 168 deletions
Original file line numberDiff line numberDiff line change
@@ -106,173 +106,170 @@ endif()
106106

107107
daemon_write_buildinfo("Game")
108108

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

0 commit comments

Comments
 (0)