Repository navigation
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
224 lines (195 loc) · 8.94 KB
/
Copy pathCMakeLists.txt
File metadata and controls
224 lines (195 loc) · 8.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
cmake_minimum_required(VERSION 3.21)
option(USE_PROFILER "Enable shared diagnostic Tracy profiling" OFF)
if (USE_PROFILER)
list(APPEND VCPKG_MANIFEST_FEATURES profiler)
list(REMOVE_DUPLICATES VCPKG_MANIFEST_FEATURES)
endif ()
# a clone made without Git LFS holds pointer files in place of the LFS objects, and BUILD_ALL would install them;
# checked ahead of project(), whose toolchain file runs the whole vcpkg install. One file per pattern of .gitattributes
string(HEX "version https://git-lfs" NEXTCLIENT_LFS_POINTER_HEAD)
foreach (NEXTCLIENT_LFS_FILE
"assets/platform/servers/geoip_country.mmdb"
"assets/platform/servers/icon_country_column.tga")
file(READ "${CMAKE_CURRENT_SOURCE_DIR}/${NEXTCLIENT_LFS_FILE}" NEXTCLIENT_LFS_FILE_HEAD LIMIT 23 HEX)
if (NEXTCLIENT_LFS_FILE_HEAD STREQUAL NEXTCLIENT_LFS_POINTER_HEAD)
message(FATAL_ERROR "${NEXTCLIENT_LFS_FILE} is a Git LFS pointer file: install Git LFS and run 'git lfs pull'")
endif ()
endforeach ()
project(NextClient VERSION 2.6.0)
set(NEXTCLIENT_ROOT ${CMAKE_CURRENT_SOURCE_DIR})
include(cmake/NextClientProfiling.cmake)
# TODO do fetch curl and zlib via vcpkg, make a custom port if necessary
set(CMAKE_MODULE_PATH
${NEXTCLIENT_ROOT}/cmake
${CMAKE_MODULE_PATH}
)
if (NEXTCLIENT_BUILD_TESTS OR USE_PROFILER OR UNIX)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/out/bin)
set(CMAKE_GTEST_DISCOVER_TESTS_DISCOVERY_MODE PRE_TEST CACHE STRING
"When Google Test executables are queried for test discovery")
enable_testing()
else ()
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/out/bin)
endif ()
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
set(CMAKE_PDB_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/out/pdb)
# CMAKE_MSVC_RUNTIME_LIBRARY and BUILD_SHARED_LIBS only affect external dependencies.
# NextClient subprojects are always built as shared libraries with mt runtime.
if (VCPKG_TARGET_TRIPLET STREQUAL "x86-windows-static")
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
else ()
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
endif ()
set(BUILD_SHARED_LIBS OFF)
# NitroApi options
set(NITRO_API_MSVC_RUNTIME_LIBRARY ${CMAKE_MSVC_RUNTIME_LIBRARY})
# cpr options
set(CPR_USE_SYSTEM_CURL ON)
set(CPR_USE_SYSTEM_GTEST OFF)
set(CPR_ENABLE_CURL_HTTP_ONLY OFF)
set(CPR_ENABLE_SSL ON)
# common compiler and linker options
if (MSVC)
add_compile_options($<$<COMPILE_LANGUAGE:C,CXX>:/MP>)
string(APPEND CMAKE_C_FLAGS_RELEASE
" /Zi" # enables PDB generation
" /O2" # enables maximize speed optimizations
" /GL" # enables whole program optimization
)
string(APPEND CMAKE_CXX_FLAGS_RELEASE
" /Zi" # enables PDB generation
" /O2" # enables maximize speed optimizations
" /GL" # enables whole program optimization
)
string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE
" /LTCG" # enables whole program optimization on link-time
" /INCREMENTAL:NO" # /INCREMENTAL is not compatible with /LTCG
" /DEBUG" # enables PDB generation
" /OPT:REF" # eliminates functions and data that are never referenced
" /OPT:ICF" # enables COMDAT folding
)
string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE
" /LTCG" # enables whole program optimization on link-time
" /INCREMENTAL:NO" # /INCREMENTAL is not compatible with /LTCG
" /DEBUG" # enables PDB generation
" /OPT:REF" # eliminates functions and data that are never referenced
" /OPT:ICF" # enables COMDAT folding
)
endif ()
# external dependencies (needed by engine_mini as well as the launcher)
add_subdirectory(dep/cpr)
add_subdirectory(dep/easyloggingpp)
add_subdirectory(dep/bzip2)
add_subdirectory(dep/glad)
add_subdirectory(dep/stb)
# Settings of the SDK fork, nitro_utils, funchook, goldsrc_abi and nitro_api. The standard is set
# here rather than at the top of the file, and unset again below the last of them, so that the
# directories added outside this span keep the standard they choose: cpr picks C++17 for itself
# whenever the parent leaves it unset, and data_encoding picks nothing at all. A cache entry from
# the command line outlives the unset and reaches all of them.
set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
set(CMAKE_CXX_STANDARD 23)
if (UNIX)
add_compile_options(-m32 -march=pentium4 -Wno-narrowing)
add_link_options(-m32 -static-libstdc++ -static-libgcc)
set(CMAKE_LIBRARY_ARCHITECTURE i386-linux-gnu)
endif ()
# funchook options. Its cmake_minimum_required is 3.11, which leaves CMP0077 unset, so the policy
# default above is what keeps its option() calls from overwriting these.
set(FUNCHOOK_BUILD_SHARED OFF)
set(FUNCHOOK_BUILD_TESTS OFF)
set(FUNCHOOK_INSTALL OFF)
set(FUNCHOOK_CPU "x86")
add_subdirectory(dep/ncl-hl1-source-sdk)
add_subdirectory(dep/nitro_utils)
add_subdirectory(dep/funchook) # while funchook is not in vcpkg, add it as add_subdirectory (PS do NOT make it a sub-module).
# NextClient sub-projects
add_subdirectory(nextclient/goldsrc_abi)
add_subdirectory(nextclient/nitro_api)
unset(CMAKE_CXX_STANDARD)
add_subdirectory(nextclient/packages)
add_subdirectory(nextclient/engine_mini)
add_subdirectory(nextclient/gameui)
add_subdirectory(nextclient/client_mini)
add_subdirectory(tools/matgen)
add_subdirectory(nextclient/steam_api_proxy)
add_subdirectory(nextclient/filesystem_proxy)
add_subdirectory(nextclient/launcher)
if (NEXTCLIENT_BUILD_TESTS AND WIN32)
set(NEXTCLIENT_TEST_RUNTIME_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
get_property(NEXTCLIENT_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if (NEXTCLIENT_MULTI_CONFIG)
string(APPEND NEXTCLIENT_TEST_RUNTIME_DIRECTORY "/$<CONFIG>")
endif ()
add_custom_target(nextclient-test-runtime
COMMAND ${CMAKE_COMMAND} -E make_directory "${NEXTCLIENT_TEST_RUNTIME_DIRECTORY}"
COMMAND ${CMAKE_COMMAND} -E copy_directory "${NEXTCLIENT_ROOT}/test_support/runtime"
"${NEXTCLIENT_TEST_RUNTIME_DIRECTORY}"
VERBATIM)
foreach (test_target IN ITEMS client_mini-tests radar-gl-tests performance-gl-tests
studio-capture-gl-tests scene-preview-gl-tests preview-model-tests material-lifecycle-tests)
add_dependencies(${test_target} nextclient-test-runtime)
endforeach ()
endif ()
# Windows 7 compatibility
if (MSVC)
set(YY_THUNKS_WIN7_OBJ "${NEXTCLIENT_ROOT}/dep/yy-thunks/x86/YY_Thunks_for_Win7.obj")
foreach (_tgt
next_launcher
engine_mini
filesystem_proxy
client_mini
gameui
steam_api_proxy
nitro_api
vgui2)
target_link_libraries(${_tgt} PRIVATE "${YY_THUNKS_WIN7_OBJ}")
endforeach ()
endif ()
# Install directory: cache variable with env fallback
if (DEFINED ENV{NEXTCLIENT_INSTALL_DIR} AND NOT NEXTCLIENT_INSTALL_DIR)
set(NEXTCLIENT_INSTALL_DIR "$ENV{NEXTCLIENT_INSTALL_DIR}" CACHE PATH "NextClient install directory")
else ()
set(NEXTCLIENT_INSTALL_DIR "" CACHE PATH "NextClient install directory")
endif ()
# custom build target
if (NOT NEXTCLIENT_BUILD_TESTS)
add_custom_target(BUILD_ALL ALL)
add_dependencies(BUILD_ALL
next_launcher
engine_mini
filesystem_proxy
client_mini
gameui
steam_api_proxy
nitro_api
vgui2
)
if (NEXTCLIENT_INSTALL_DIR AND (WIN32 OR UNIX))
if (WIN32)
set(NEXTCLIENT_INSTALL_PLATFORM Windows)
else ()
set(NEXTCLIENT_INSTALL_PLATFORM Linux)
endif ()
set(NEXTCLIENT_INSTALL_TRACY_SOURCE "")
if (USE_PROFILER)
set(NEXTCLIENT_INSTALL_TRACY_SOURCE "$<TARGET_FILE:Tracy::TracyClient>")
endif ()
configure_file(cmake/NextClientInstallManifest.cmake.in
"${CMAKE_CURRENT_BINARY_DIR}/install-nextclient-configured.cmake" @ONLY)
file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/install-nextclient-$<CONFIG>.cmake"
INPUT "${CMAKE_CURRENT_BINARY_DIR}/install-nextclient-configured.cmake")
add_custom_command(TARGET BUILD_ALL POST_BUILD
COMMENT "Installing libraries and assets to ${NEXTCLIENT_INSTALL_DIR}..."
COMMAND ${CMAKE_COMMAND}
"-DINSTALL_MANIFEST=${CMAKE_CURRENT_BINARY_DIR}/install-nextclient-$<CONFIG>.cmake"
-P "${NEXTCLIENT_ROOT}/cmake/InstallNextClient.cmake"
VERBATIM)
endif ()
endif ()
if (NEXTCLIENT_BUILD_TESTS)
add_test(NAME installation-preflight
COMMAND ${CMAKE_COMMAND} "-DTEST_BINARY_DIRECTORY=${CMAKE_BINARY_DIR}"
-P "${NEXTCLIENT_ROOT}/cmake/tests/InstallNextClientTests.cmake")
set_tests_properties(installation-preflight PROPERTIES LABELS installation RUN_SERIAL TRUE)
endif ()