@@ -81,6 +81,53 @@ function( godot_arch_map ALIAS PROC )
81
81
endif ()
82
82
endfunction ()
83
83
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
+
84
131
# Function to define all the options.
85
132
function ( godotcpp_options )
86
133
#NOTE: platform is managed using toolchain files.
@@ -109,7 +156,9 @@ function( godotcpp_options )
109
156
#TODO threads
110
157
#TODO compiledb
111
158
#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" )
113
162
114
163
set (GODOT_USE_HOT_RELOAD "" CACHE BOOL
115
164
"Enable the extra accounting required to support hot reload. (ON|OFF)" )
@@ -205,6 +254,10 @@ function( godotcpp_generate )
205
254
if (NOT "${GODOT_CUSTOM_API_FILE} " STREQUAL "" ) # User-defined override.
206
255
set (GODOT_GDEXTENSION_API_FILE "${GODOT_CUSTOM_API_FILE} " )
207
256
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 ( )
208
261
209
262
# Code Generation option
210
263
if (GODOT_GENERATE_TEMPLATE_GET_NODE )
@@ -213,14 +266,33 @@ function( godotcpp_generate )
213
266
set (GENERATE_BINDING_PARAMETERS "False" )
214
267
endif ()
215
268
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} " )
221
293
222
294
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} "
224
296
VERBATIM
225
297
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
226
298
MAIN_DEPENDENCY ${GODOT_GDEXTENSION_API_FILE}
0 commit comments