@@ -81,6 +81,51 @@ function( godot_arch_map ALIAS PROC )
8181 endif  ()
8282endfunction ()
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. 
85130function ( 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} 
0 commit comments