Skip to content

Commit fb65d7b

Browse files
committed
CMake: Support using build_profile.json
Python: - Redirect stdout for get_file_list to prevent stdout pollution CMake: - add GODOT_BUILD_PROFILE cache option - Split file list generation into its own function - add status and debug messages Python Snippets in CMake: - re-format for better readability Build Profile: - Add missing VisualInstance3D class to build_profile.json
1 parent a282bff commit fb65d7b

File tree

3 files changed

+84
-9
lines changed

3 files changed

+84
-9
lines changed

binding_generator.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,14 @@ def get_file_list(api_filepath, output_dir, headers=False, sources=False, profil
268268

269269

270270
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)
271+
import io
272+
from contextlib import redirect_stdout
273+
274+
# suppress stdout messages from get_file_list
275+
with redirect_stdout(io.StringIO()):
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: 74 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,51 @@ 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 build_profile.json.
88+
89+
This happens for every configure.]]
90+
function( binding_generator_get_file_list OUT_VAR_NAME API_FILEPATH PROFILE_FILEPATH OUTPUT_DIR )
91+
# This code snippet will be squashed into a single line
92+
93+
# CMake lists are delimited by semicolons.
94+
set( PYTHON_SCRIPT
95+
"from binding_generator import print_file_list"
96+
"print_file_list( api_filepath='${API_FILEPATH}',
97+
output_dir='${OUTPUT_DIR}',
98+
headers=True,
99+
sources=True,
100+
profile_filepath='${PROFILE_FILEPATH}')")
101+
message( DEBUG "Python:\n${PYTHON_SCRIPT}" )
102+
103+
# Strip newlines and whitespace to make it a one-liner.
104+
string( REGEX REPLACE "\n *" " " PYTHON_SCRIPT "${PYTHON_SCRIPT}" )
105+
106+
execute_process( COMMAND "${Python3_EXECUTABLE}" "-c" "${PYTHON_SCRIPT}"
107+
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
108+
OUTPUT_VARIABLE GENERATED_FILES_LIST
109+
OUTPUT_STRIP_TRAILING_WHITESPACE
110+
)
111+
112+
# Debug output
113+
message( DEBUG "FileList-Begin" )
114+
foreach( PATH ${GENERATED_FILES_LIST} )
115+
message( DEBUG ${PATH} )
116+
endforeach()
117+
118+
# Error out if the file list generator returned no files.
119+
list( LENGTH GENERATED_FILES_LIST LIST_LENGTH )
120+
if( NOT LIST_LENGTH GREATER 0 )
121+
message( FATAL_ERROR "File List Generation Failed")
122+
endif()
123+
message( STATUS "There are ${LIST_LENGTH} Files to generate" )
124+
125+
set( ${OUT_VAR_NAME} ${GENERATED_FILES_LIST} PARENT_SCOPE )
126+
endfunction( )
127+
128+
84129
# Function to define all the options.
85130
function( godotcpp_options )
86131
#NOTE: platform is managed using toolchain files.
@@ -109,7 +154,9 @@ function( godotcpp_options )
109154
#TODO threads
110155
#TODO compiledb
111156
#TODO compiledb_file
112-
#TODO build_profile
157+
158+
set( GODOT_BUILD_PROFILE "" CACHE PATH
159+
"Path to a file containing a feature build profile" )
113160

114161
set(GODOT_USE_HOT_RELOAD "" CACHE BOOL
115162
"Enable the extra accounting required to support hot reload. (ON|OFF)")
@@ -205,6 +252,10 @@ function( godotcpp_generate )
205252
if (NOT "${GODOT_CUSTOM_API_FILE}" STREQUAL "") # User-defined override.
206253
set(GODOT_GDEXTENSION_API_FILE "${GODOT_CUSTOM_API_FILE}")
207254
endif()
255+
message( STATUS "GODOT_GDEXTENSION_API_FILE = '${GODOT_GDEXTENSION_API_FILE}'")
256+
if( GODOT_BUILD_PROFILE )
257+
message( STATUS "GODOT_BUILD_PROFILE = '${GODOT_BUILD_PROFILE}'")
258+
endif( )
208259

209260
# Code Generation option
210261
if(GODOT_GENERATE_TEMPLATE_GET_NODE)
@@ -213,14 +264,30 @@ function( godotcpp_generate )
213264
set(GENERATE_BINDING_PARAMETERS "False")
214265
endif()
215266

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-
)
267+
# generate the file list to use
268+
binding_generator_get_file_list( GENERATED_FILES_LIST
269+
"${GODOT_GDEXTENSION_API_FILE}"
270+
"${GODOT_BUILD_PROFILE}"
271+
"${CMAKE_CURRENT_BINARY_DIR}" )
272+
273+
#[[ Generate Bindings
274+
Using the generated file list, use the binding_generator.py to generate the
275+
godot-cpp bindings. This will run at build time only if there are files
276+
missing. ]]
277+
set( PYTHON_SCRIPT "from binding_generator import generate_bindings"
278+
"generate_bindings(
279+
api_filepath='${GODOT_GDEXTENSION_API_FILE}',
280+
use_template_get_node='${GENERATE_BINDING_PARAMETERS}',
281+
bits='${BITS}',
282+
precision='${GODOT_PRECISION}',
283+
output_dir='${CMAKE_CURRENT_BINARY_DIR}')")
284+
message( DEBUG "Python:\n${PYTHON_SCRIPT}" )
285+
286+
# Strip newlines and whitespace to make it a one-liner.
287+
string( REGEX REPLACE "\n *" " " PYTHON_SCRIPT "${PYTHON_SCRIPT}" )
221288

222289
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}')"
290+
COMMAND "${Python3_EXECUTABLE}" "-c" "${PYTHON_SCRIPT}"
224291
VERBATIM
225292
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
226293
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)