Skip to content

Commit 282ccc0

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

File tree

3 files changed

+176
-175
lines changed

3 files changed

+176
-175
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_VM_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(VM_INHERITED_OPTIONS "${DEFAULT_VM_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(VM_INHERITED_OPTIONS)
214215

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

cmake/DaemonFlags.cmake

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -337,13 +337,19 @@ else()
337337
try_c_cxx_flag(WSTACK_PROTECTOR "-Wstack-protector")
338338

339339
if (NOT NACL OR (NACL AND GAME_PIE))
340-
try_c_cxx_flag(FPIE "-fPIE")
341-
if (NOT APPLE)
342-
try_linker_flag(LINKER_PIE "-pie")
340+
if (FORK EQUAL 2 AND BUILD_GAME_NATIVE_DLL)
341+
try_c_cxx_flag(FPIC "-fPIC")
342+
try_linker_flag(LINKER_PIC "-pic")
343+
else()
344+
try_c_cxx_flag(FPIE "-fPIE")
345+
346+
if (NOT APPLE)
347+
try_linker_flag(LINKER_PIE "-pie")
348+
endif()
343349
endif()
344350
endif()
345351

346-
if ("${FLAG_LINKER_PIE}" AND MINGW)
352+
if ("${FLAG_shared_LINKER_PIE}" AND MINGW)
347353
# https://github.com/msys2/MINGW-packages/issues/4100
348354
if (ARCH STREQUAL "i686")
349355
set_linker_flag("-Wl,-e,_mainCRTStartup")

cmake/DaemonGame.cmake

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

0 commit comments

Comments
 (0)