Skip to content

Commit fddcb8d

Browse files
committed
CMake: Support using build_profile.json
Build Profile: - Add missing VisualInstance3D class to build_profile.json Python: - Fix binding_generator.py print_file_list function so that random print statements don't pollute the list. CMake: - add GODOT_BUILD_PROFILE cache option - Split file list generation into a function with args - add status and debug messages - re-arrange python commands to make reading them simpler
1 parent a282bff commit fddcb8d

File tree

3 files changed

+89
-9
lines changed

3 files changed

+89
-9
lines changed

binding_generator.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
#!/usr/bin/env python
22

3+
import io
34
import json
45
import re
56
import shutil
7+
from contextlib import redirect_stdout
68
from pathlib import Path
79

810

@@ -268,7 +270,12 @@ def get_file_list(api_filepath, output_dir, headers=False, sources=False, profil
268270

269271

270272
def print_file_list(api_filepath, output_dir, headers=False, sources=False, profile_filepath=""):
271-
print(*get_file_list(api_filepath, output_dir, headers, sources, profile_filepath), sep=";", end=None)
273+
trap = io.StringIO()
274+
# suppress stdout messages from get_file_list
275+
with redirect_stdout(trap):
276+
file_list = get_file_list(api_filepath, output_dir, headers, sources, profile_filepath)
277+
278+
print(*file_list, sep=";", end=None)
272279

273280

274281
def parse_build_profile(profile_filepath, api):

cmake/godotcpp.cmake

Lines changed: 79 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,53 @@ function( godot_arch_map ALIAS PROC )
8181
endif ()
8282
endfunction()
8383

84+
85+
#[[ Generate File List
86+
Use the binding_generator.py Python script to determine the list of files that
87+
will be passed to the code generator using extension_api.json and
88+
build_profile.json.
89+
90+
This happens for every configure.]]
91+
function( generate_file_list OUT_VAR API_FILEPATH PROFILE_FILEPATH OUTPUT_DIR )
92+
# This code snippet will be squashed into a single line
93+
set( PRINT_FILE_LIST_PY [[
94+
import binding_generator;
95+
binding_generator.print_file_list(
96+
api_filepath='${API_FILEPATH}',
97+
profile_filepath='${PROFILE_FILEPATH}',
98+
output_dir='${OUTPUT_DIR}',
99+
headers=True,sources=True)
100+
]])
101+
102+
# Reformat code to a single line, to make build tools happy.
103+
string( CONFIGURE "${PRINT_FILE_LIST_PY}" PYTHON_SCRIPT )
104+
message( DEBUG "Python:\n${PYTHON_SCRIPT}" )
105+
string( REGEX REPLACE "\n *" " " PYTHON_SCRIPT "${PYTHON_SCRIPT}" )
106+
107+
execute_process( COMMAND "${Python3_EXECUTABLE}" "-c" "${PYTHON_SCRIPT}"
108+
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
109+
OUTPUT_VARIABLE GENERATED_FILES_LIST
110+
OUTPUT_STRIP_TRAILING_WHITESPACE
111+
)
112+
113+
# Debug output
114+
message( DEBUG "FileList-Begin" )
115+
foreach( PATH ${GENERATED_FILES_LIST} )
116+
message( DEBUG ${PATH} )
117+
endforeach( )
118+
message( DEBUG "FileList-End" )
119+
120+
# Error out if the file list generator returned no files.
121+
list( LENGTH GENERATED_FILES_LIST LIST_LENGTH )
122+
if( NOT LIST_LENGTH GREATER 0 )
123+
message( FATAL_ERROR "File List Generation Failed")
124+
endif()
125+
message( STATUS "There are ${LIST_LENGTH} Files to generate" )
126+
127+
set( ${OUT_VAR} ${GENERATED_FILES_LIST} PARENT_SCOPE )
128+
endfunction( )
129+
130+
84131
# Function to define all the options.
85132
function( godotcpp_options )
86133
#NOTE: platform is managed using toolchain files.
@@ -109,7 +156,9 @@ function( godotcpp_options )
109156
#TODO threads
110157
#TODO compiledb
111158
#TODO compiledb_file
112-
#TODO build_profile
159+
160+
set( GODOT_BUILD_PROFILE "" CACHE PATH
161+
"Path to a file containing a feature build profile" )
113162

114163
set(GODOT_USE_HOT_RELOAD "" CACHE BOOL
115164
"Enable the extra accounting required to support hot reload. (ON|OFF)")
@@ -205,6 +254,10 @@ function( godotcpp_generate )
205254
if (NOT "${GODOT_CUSTOM_API_FILE}" STREQUAL "") # User-defined override.
206255
set(GODOT_GDEXTENSION_API_FILE "${GODOT_CUSTOM_API_FILE}")
207256
endif()
257+
message( STATUS "GODOT_GDEXTENSION_API_FILE = '${GODOT_GDEXTENSION_API_FILE}'")
258+
if( GODOT_BUILD_PROFILE )
259+
message( STATUS "GODOT_BUILD_PROFILE = '${GODOT_BUILD_PROFILE}'")
260+
endif( )
208261

209262
# Code Generation option
210263
if(GODOT_GENERATE_TEMPLATE_GET_NODE)
@@ -213,14 +266,33 @@ function( godotcpp_generate )
213266
set(GENERATE_BINDING_PARAMETERS "False")
214267
endif()
215268

216-
execute_process(COMMAND "${Python3_EXECUTABLE}" "-c" "import binding_generator; binding_generator.print_file_list('${GODOT_GDEXTENSION_API_FILE}', '${CMAKE_CURRENT_BINARY_DIR}', headers=True, sources=True)"
217-
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
218-
OUTPUT_VARIABLE GENERATED_FILES_LIST
219-
OUTPUT_STRIP_TRAILING_WHITESPACE
220-
)
269+
# generate the file list to use
270+
generate_file_list( GENERATED_FILES_LIST
271+
"${GODOT_GDEXTENSION_API_FILE}"
272+
"${GODOT_BUILD_PROFILE}"
273+
"${CMAKE_CURRENT_BINARY_DIR}" )
274+
275+
#[[ Generate Bindings
276+
Using the generated file list, use the binding_generator.py to generate the
277+
godot-cpp bindings. This will run at build time only if there are files
278+
missing.
279+
]]
280+
set( GENERATE_BINDINGS_PY
281+
[[import binding_generator;
282+
binding_generator.generate_bindings(
283+
api_filepath='${GODOT_GDEXTENSION_API_FILE}',
284+
use_template_get_node='${GENERATE_BINDING_PARAMETERS}',
285+
bits='${BITS}',
286+
precision='${GODOT_PRECISION}',
287+
output_dir='${CMAKE_CURRENT_BINARY_DIR}')
288+
]])
289+
290+
string(CONFIGURE "${GENERATE_BINDINGS_PY}" PYTHON_SCRIPT )
291+
message( DEBUG "Python:\n${PYTHON_SCRIPT}" )
292+
string( REGEX REPLACE "\n *" " " PYTHON_SCRIPT "${PYTHON_SCRIPT}" )
221293

222294
add_custom_command(OUTPUT ${GENERATED_FILES_LIST}
223-
COMMAND "${Python3_EXECUTABLE}" "-c" "import binding_generator; binding_generator.generate_bindings('${GODOT_GDEXTENSION_API_FILE}', '${GENERATE_BINDING_PARAMETERS}', '${BITS}', '${GODOT_PRECISION}', '${CMAKE_CURRENT_BINARY_DIR}')"
295+
COMMAND "${Python3_EXECUTABLE}" "-c" "${PYTHON_SCRIPT}"
224296
VERBATIM
225297
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
226298
MAIN_DEPENDENCY ${GODOT_GDEXTENSION_API_FILE}

test/build_profile.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"Label",
55
"OS",
66
"TileMap",
7-
"InputEventKey"
7+
"InputEventKey",
8+
"VisualInstance3D"
89
]
910
}

0 commit comments

Comments
 (0)