Skip to content

Commit 18aa34d

Browse files
author
Vano
committed
cmake version revert, single and multi-config support, default cmake configuration types, cmdline example fix, output path for multi-config fix, clean default CXX flags, public definitions fix
1 parent 1320634 commit 18aa34d

File tree

10 files changed

+161
-95
lines changed

10 files changed

+161
-95
lines changed

CMakeLists.txt

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,57 @@
1-
# cmake arguments
2-
# CMAKE_BUILD_TYPE: Compilation target (editor, template_debug, template_release)
1+
# Main cmake arguments
2+
#
3+
# CMAKE_BUILD_TYPE Compilation target (Debug, Release, RelWithDebInfo, MinSizeRel)
4+
#
5+
# CMAKE_CONFIGURATION_TYPES Set to "Debug;Release;RelWithDebInfo;MinSizeRel"
6+
# if not all needed configurations are created in multi-config generator
7+
# (Setting it in script causes crash on Ninja Multi-Config)
8+
#
9+
# TARGET Godot build target (EDITOR, TEMPLATE_DEBUG, TEMPLATE_RELEASE)
310
#
411
# PLATFORM: Platform type (LINUX, MACOS, WINDOWS, ANDROID, IOS, WEB)
512
# Auto-detected by default depending on current OS or chosen toolchain
613
#
714
# other global and chosen platform-specific options:
815
#
9-
# cmake -LH
16+
# cmake -LH <build_dir>
1017
#
11-
# Note: use -Bbuild_dir option to build in separate directories
18+
# Note: use `-B <build_dir>` option to build in separate directories
1219
# for different configurations
1320
#
14-
# cmake -Bbuild && cmake --build build
21+
# cmake -B build && cmake --build build
1522
#
1623
# Examples
1724
#
1825
# Builds default configuration:
19-
# cmake .
20-
# cmake --build .
26+
# cmake . -Bbuild
27+
# cmake --build build
2128
#
2229
# Builds template_release version
2330
#
24-
# cmake -DCMAKE_BUILD_TYPE=template_release .
25-
# cmake --build .
31+
# cmake -DTARGET=TEMPLATE_RELEASE -Bbuild
32+
# cmake --build build
2633
#
27-
# Creates multi-config setup and builds 2 library versions (example for Linux)
34+
# Creates multi-config setup and builds Release version (example for Linux)
2835
#
29-
# cmake -G "Ninja Multi-Config" .
30-
# cmake --build . --config editor
31-
# cmake --build . --config template_release
36+
# cmake -G "Ninja Multi-Config" -Bbuild
37+
# cmake --build build --config Release
3238
#
3339
# Builds web version, using Emscripten toolchain
3440
#
35-
# cmake --toolchain /usr/lib/emscripten/cmake/Modules/Platform/Emscripten.cmake .
36-
# cmake --build .
41+
# cmake --toolchain /usr/lib/emscripten/cmake/Modules/Platform/Emscripten.cmake -Bbuild
42+
# cmake --build build
3743
#
3844
#
3945
# Builds an android armeabi-v7a debug version:
4046
# cmake --toolchain $ANDROID_NDK/build/cmake/android.toolchain.cmake \
41-
# -DANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.9 -DANDROID_TOOLCHAIN=clang -DANDROID_PLATFORM=21 .
42-
# cmake --build .
47+
# -DANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.9 -DANDROID_TOOLCHAIN=clang -DANDROID_PLATFORM=21 -Bbuild
48+
# cmake --build build
4349
#
4450
#
45-
# Todo
46-
# Test build for Windows, Mac and mingw.
51+
# TODO:
52+
# Test builds for MacOS/IOS
4753

48-
cmake_minimum_required(VERSION 3.24)
54+
cmake_minimum_required(VERSION 3.12)
4955
project(godot-cpp LANGUAGES CXX)
5056

5157
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/")
@@ -108,16 +114,17 @@ target_compile_options(${PROJECT_NAME} PRIVATE
108114

109115
target_link_options(${PROJECT_NAME} PRIVATE ${GODOT_LINK_FLAGS})
110116

111-
target_compile_definitions(${PROJECT_NAME} PRIVATE ${GODOT_DEFINITIONS})
117+
target_compile_definitions(${PROJECT_NAME} PUBLIC ${GODOT_DEFINITIONS})
112118

113119
set_target_properties(${PROJECT_NAME}
114120
PROPERTIES
115121
CXX_EXTENSIONS OFF
116-
COMPILE_WARNING_AS_ERROR ${GODOT_CPP_WARNING_AS_ERROR}
117122
POSITION_INDEPENDENT_CODE ON
118123
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin"
119124
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin"
120125
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin"
121126
OUTPUT_NAME "${PROJECT_NAME}${LIBRARY_SUFFIX}"
122127
)
123-
128+
if(${GODOT_CPP_WARNING_AS_ERROR})
129+
set_warning_as_error(${PROJECT_NAME})
130+
endif()

cmake/GodotCompilerWarnings.cmake

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,20 @@ list(APPEND GODOT_COMPILE_WARNING_FLAGS
7676
-Wno-return-type
7777
>
7878
)
79+
80+
# Treat warnings as errors
81+
function(set_warning_as_error TARGET_NAME)
82+
message(STATUS "[${TARGET_NAME}] Treating warnings as errors")
83+
if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24")
84+
set_target_properties(${TARGET_NAME}
85+
PROPERTIES
86+
COMPILE_WARNING_AS_ERROR ON
87+
)
88+
else()
89+
target_compile_options(${TARGET_NAME}
90+
PRIVATE
91+
$<${compiler_is_msvc}:/WX>
92+
$<$<OR:${compiler_is_clang},${compiler_is_gnu}>:-Werror>
93+
)
94+
endif()
95+
endfunction()

cmake/android.cmake

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,5 +63,3 @@ list(APPEND GODOT_LINK_FLAGS
6363
>
6464
)
6565

66-
string(APPEND LIBRARY_SUFFIX ".${ARCH}")
67-

cmake/godotcpp.cmake

Lines changed: 97 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22

33
### Options
44

5-
set(CMAKE_CONFIGURATION_TYPES "template_debug;editor;template_release")
5+
set(CONFIGS_WITH_DEBUG "Debug;RelWithDebInfo" CACHE STRING "Configurations that should have debug symbols (Modify if support for custom configurations is needed)")
66

7+
# Default config
78
if("${CMAKE_BUILD_TYPE}" STREQUAL "")
8-
set(CMAKE_BUILD_TYPE template_debug)
9+
set(CMAKE_BUILD_TYPE "Debug")
910
endif()
1011

12+
set(TARGET "TEMPLATE_DEBUG" CACHE STRING "Target platform (EDITOR, TEMPLATE_DEBUG, TEMPLATE_RELEASE)")
1113
# Auto-detect platform
1214
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
1315
set(DEFAULT_PLATFORM "LINUX")
@@ -40,7 +42,7 @@ set(GODOT_CPP_LIBRARY_TYPE "STATIC" CACHE STRING "[Experimental] Library type (S
4042

4143
option(DEV_BUILD "Developer build with dev-only debugging code" OFF)
4244

43-
option(DEBUG_SYMBOLS "Build with debugging symbols" ON)
45+
option(DEBUG_SYMBOLS "Force build with debugging symbols" OFF)
4446

4547
option(USE_HOT_RELOAD "Enable the extra accounting required to support hot reload" ON)
4648

@@ -69,7 +71,8 @@ option(GENERATE_TEMPLATE_GET_NODE "Generate a template version of the Node class
6971
# Compiler warnings and compiler check generators
7072
include(GodotCompilerWarnings)
7173

72-
# Create the correct name (godot-cpp.platform.target.arch)
74+
# Create the correct name (godot-cpp.platform.target)
75+
# See more prefix appends in platform-specific configs
7376
if(${DEV_BUILD})
7477
string(APPEND LIBRARY_SUFFIX ".dev")
7578
endif()
@@ -81,13 +84,21 @@ endif()
8184
# Workaround of $<CONFIG> expanding to "" when default build set
8285
set(CONFIG "$<IF:$<STREQUAL:,$<CONFIG>>,${CMAKE_BUILD_TYPE},$<CONFIG>>")
8386

84-
string(TOLOWER ".${PLATFORM}" platform)
85-
string(PREPEND LIBRARY_SUFFIX "${platform}.${CONFIG}")
87+
string(TOLOWER ".${PLATFORM}.${TARGET}" platform_target)
88+
string(PREPEND LIBRARY_SUFFIX ${platform_target})
8689

8790
# Default optimization levels if OPTIMIZE=AUTO, for multi-config support
88-
set(DEFAULT_OPTIMIZATION_DEV "$<AND:$<STREQUAL:${OPTIMIZE},AUTO>,$<BOOL:${DEV_BUILD}>>")
89-
set(DEFAULT_OPTIMIZATION_DEBUG_FEATURES "$<AND:$<NOT:${DEFAULT_OPTIMIZATION_DEV}>,$<STREQUAL:${OPTIMIZE},AUTO>,$<OR:$<STREQUAL:${CONFIG},editor>,$<STREQUAL:${CONFIG},template_debug>>>")
90-
set(DEFAULT_OPTIMIZATION "$<$<AND:$<NOT:$<OR:${DEFAULT_OPTIMIZATION_DEV},${DEFAULT_OPTIMIZATION_DEBUG_FEATURES}>>,STREQUAL:${OPTIMIZE},AUTO>>")
91+
set(DEFAULT_OPTIMIZATION_DEBUG_FEATURES "$<OR:$<STREQUAL:${TARGET},EDITOR>,$<STREQUAL:${TARGET},TEMPLATE_DEBUG>>")
92+
set(DEFAULT_OPTIMIZATION "$<NOT:${DEFAULT_OPTIMIZATION_DEBUG_FEATURES}>")
93+
94+
set(DEBUG_SYMBOLS_ENABLED "$<OR:$<BOOL:${DEBUG_SYMBOLS}>,$<IN_LIST:${CONFIG},${CONFIGS_WITH_DEBUG}>>")
95+
96+
# Clean default options
97+
set(CMAKE_CXX_FLAGS "")
98+
set(CMAKE_CXX_FLAGS_DEBUG "")
99+
set(CMAKE_CXX_FLAGS_RELEASE "")
100+
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "")
101+
set(CMAKE_CXX_FLAGS_MINSIZEREL "")
91102

92103
list(APPEND GODOT_DEFINITIONS
93104
GDEXTENSION
@@ -101,10 +112,10 @@ list(APPEND GODOT_DEFINITIONS
101112
$<$<STREQUAL:${FLOAT_PRECISION},DOUBLE>:
102113
REAL_T_IS_DOUBLE
103114
>
104-
$<$<AND:$<NOT:$<STREQUAL:${CONFIG},template_release>>,$<BOOL:${USE_HOT_RELOAD}>>:
115+
$<$<AND:$<NOT:$<STREQUAL:${TARGET},TEMPLATE_RELEASE>>,$<BOOL:${USE_HOT_RELOAD}>>:
105116
HOT_RELOAD_ENABLE
106117
>
107-
$<$<STREQUAL:${CONFIG},editor>:
118+
$<$<STREQUAL:${TARGET},EDITOR>:
108119
TOOLS_ENABLED
109120
>
110121

@@ -115,36 +126,48 @@ list(APPEND GODOT_DEFINITIONS
115126
NDEBUG
116127
>
117128

118-
$<$<NOT:$<STREQUAL:${CONFIG},template_release>>:
129+
$<$<NOT:$<STREQUAL:${TARGET},TEMPLATE_RELEASE>>:
119130
DEBUG_ENABLED
120131
DEBUG_METHODS_ENABLED
121132
>
122133
)
123134

124135
list(APPEND GODOT_CC_FLAGS
125136
$<${compiler_is_msvc}:
126-
$<$<BOOL:${DEBUG_SYMBOLS}>:
137+
$<${DEBUG_SYMBOLS_ENABLED}:
127138
/Zi
128139
/FS
129140
>
130141

131-
$<$<OR:$<STREQUAL:${OPTIMIZE},SPEED>,${DEFAULT_OPTIMIZATION}>:
132-
/O2
133-
>
134-
$<$<OR:$<STREQUAL:${OPTIMIZE},SPEED_TRACE>,${DEFAULT_OPTIMIZATION_DEBUG_FEATURES}>:
135-
/O2
136-
>
137-
$<$<STREQUAL:${OPTIMIZE},SIZE>:
138-
/O1
142+
$<$<STREQUAL:${OPTIMIZE},AUTO>:
143+
$<$<CONFIG:Release,RelWithDebInfo>:
144+
$<${DEFAULT_OPTIMIZATION}:
145+
/O2
146+
>
147+
$<${DEFAULT_OPTIMIZATION_DEBUG_FEATURES}:
148+
/O2
149+
>
150+
>
151+
$<$<CONFIG:MinSizeRel>:
152+
/O1
153+
>
154+
$<$<CONFIG:Debug,>:
155+
/Od
156+
>
139157
>
140-
$<$<OR:$<STREQUAL:${OPTIMIZE},DEBUG>,$<STREQUAL:${OPTIMIZE},NONE>,${DEFAULT_OPTIMIZATION_DEV}>:
141-
/Od
158+
$<$<NOT:$<STREQUAL:${OPTIMIZE},AUTO>>:
159+
$<$<STREQUAL:${OPTIMIZE},SPEED>:/O2>
160+
$<$<STREQUAL:${OPTIMIZE},SPEED_TRACE>:/O2>
161+
$<$<STREQUAL:${OPTIMIZE},SIZE>:/O1>
162+
$<$<STREQUAL:${OPTIMIZE},DEBUG>:/Od>
163+
$<$<STREQUAL:${OPTIMIZE},NONE>:/Od>
142164
>
165+
143166
>
144167
$<$<NOT:${compiler_is_msvc}>:
145-
$<$<BOOL:${DEBUG_SYMBOLS}>:
168+
$<${DEBUG_SYMBOLS_ENABLED}:
146169
-gdwarf-4
147-
170+
148171
$<$<BOOL:${DEV_BUILD}>:
149172
-g3
150173
>
@@ -160,20 +183,28 @@ list(APPEND GODOT_CC_FLAGS
160183
-fvisibility=hidden
161184
>
162185

163-
$<$<OR:$<STREQUAL:${OPTIMIZE},SPEED>>:
164-
-O3
165-
>
166-
$<$<OR:$<STREQUAL:${OPTIMIZE},SPEED_TRACE>,${DEFAULT_OPTIMIZATION_DEBUG_FEATURES}>:
167-
-O2
168-
>
169-
$<$<STREQUAL:${OPTIMIZE},SIZE>:
170-
-Os
171-
>
172-
$<$<STREQUAL:${OPTIMIZE},DEBUG>:
173-
-Og
186+
$<$<STREQUAL:${OPTIMIZE},AUTO>:
187+
$<$<CONFIG:Release,RelWithDebInfo>:
188+
$<${DEFAULT_OPTIMIZATION}:
189+
-O3
190+
>
191+
$<${DEFAULT_OPTIMIZATION_DEBUG_FEATURES}:
192+
-O2
193+
>
194+
>
195+
$<$<CONFIG:MinSizeRel>:
196+
-Os
197+
>
198+
$<$<CONFIG:Debug,>:
199+
-Og
200+
>
174201
>
175-
$<$<OR:$<STREQUAL:${OPTIMIZE},NONE>,${DEFAULT_OPTIMIZATION_DEV}>:
176-
-O0
202+
$<$<NOT:$<STREQUAL:${OPTIMIZE},AUTO>>:
203+
$<$<STREQUAL:${OPTIMIZE},SPEED>:-O3>
204+
$<$<STREQUAL:${OPTIMIZE},SPEED_TRACE>:-O2>
205+
$<$<STREQUAL:${OPTIMIZE},SIZE>:-Os>
206+
$<$<STREQUAL:${OPTIMIZE},DEBUG>:-Og>
207+
$<$<STREQUAL:${OPTIMIZE},NONE>:-O0>
177208
>
178209
>
179210
)
@@ -186,26 +217,35 @@ list(APPEND GODOT_CXX_FLAGS
186217
>
187218
$<$<NOT:${compiler_is_msvc}>:
188219
$<$<BOOL:${GODOT_DISABLE_EXCEPTIONS}>:
189-
-fno-exceptions
220+
-fno-exceptions
190221
>
191222
>
192223
)
193224

194225
list(APPEND GODOT_LINK_FLAGS
195226
$<${compiler_is_msvc}:
196-
$<$<BOOL:${DEBUG_SYMBOLS}>:
227+
$<${DEBUG_SYMBOLS_ENABLED}:
197228
/DEBUG:FULL
198229
>
199230

200-
$<$<STREQUAL:${OPTIMIZE},SPEED>:
201-
/OPT:REF
202-
>
203-
$<$<OR:$<STREQUAL:${OPTIMIZE},SPEED_TRACE>,${DEFAULT_OPTIMIZATION_DEBUG_FEATURES}>:
204-
/OPT:REF
205-
/OPT:NOICF
231+
$<$<STREQUAL:${OPTIMIZE},AUTO>:
232+
$<$<CONFIG:Release,RelWithDebInfo>:
233+
$<${DEFAULT_OPTIMIZATION}:
234+
/OPT:REF
235+
>
236+
$<${DEFAULT_OPTIMIZATION_DEBUG_FEATURES}:
237+
/OPT:REF
238+
/OPT:NOICF
239+
>
240+
>
241+
$<$<CONFIG:MinSizeRel>:
242+
/OPT:REF
243+
>
206244
>
207-
$<$<STREQUAL:${OPTIMIZE},SIZE>:
208-
/OPT:REF
245+
$<$<NOT:$<STREQUAL:${OPTIMIZE},AUTO>>:
246+
$<$<STREQUAL:${OPTIMIZE},SPEED>:/OPT:REF>
247+
$<$<STREQUAL:${OPTIMIZE},SPEED_TRACE>:/OPT:REF /OPT:NOICF>
248+
$<$<STREQUAL:${OPTIMIZE},SIZE>:/OPT:REF>
209249
>
210250
>
211251
$<$<NOT:${compiler_is_msvc}>:
@@ -216,7 +256,7 @@ list(APPEND GODOT_LINK_FLAGS
216256
-fvisibility=hidden
217257
>
218258

219-
$<$<NOT:$<BOOL:${DEBUG_SYMBOLS}>>:
259+
$<$<NOT:${DEBUG_SYMBOLS_ENABLED}>:
220260
$<$<CXX_COMPILER_ID:AppleClang>: # SCons: not is_vanilla_clang(env)
221261
"-Wl,-S"
222262
"-Wl,-x"
@@ -246,9 +286,15 @@ else()
246286
message(FATAL_ERROR "Platform not supported: ${PLATFORM}")
247287
endif()
248288

289+
string(APPEND LIBRARY_SUFFIX ".${ARCH}")
290+
291+
if(${IOS_SIMULATOR})
292+
string(APPEND LIBRARY_SUFFIX ".simulator")
293+
endif()
294+
249295
# Write all flags to file for cmake configuration debug
250-
file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/flags.txt"
296+
file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/flags-${CONFIG}.txt"
251297
CONTENT
252-
"C_FLAGS '${GODOT_CC_FLAGS}'\nCXX_FLAGS '${GODOT_CXX_FLAGS}'\nLINK_FLAGS '${GODOT_LINK_FLAGS}'\nCOMPILE_WARNING_FLAGS '${GODOT_COMPILE_WARNING_FLAGS}'\n"
298+
"C_FLAGS '${GODOT_CC_FLAGS}'\nCXX_FLAGS '${GODOT_CXX_FLAGS}'\nLINK_FLAGS '${GODOT_LINK_FLAGS}'\nCOMPILE_WARNING_FLAGS '${GODOT_COMPILE_WARNING_FLAGS}'\nDEFINITIONS '${GODOT_DEFINITIONS}'"
253299
TARGET ${PROJECT_NAME}
254300
)

cmake/ios.cmake

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,3 @@ list(APPEND GODOT_LINK_FLAGS
6060
>
6161
)
6262

63-
string(APPEND LIBRARY_SUFFIX ".${ARCH}")
64-
65-
if(${IOS_SIMULATOR})
66-
string(APPEND LIBRARY_SUFFIX ".simulator")
67-
endif()
68-

0 commit comments

Comments
 (0)