33import json
44import re
55import shutil
6+ import os
7+ from compat_generator import map_header_files
8+ from header_matcher import match_headers
69from pathlib import Path
710
811
@@ -207,6 +210,7 @@ def get_file_list(api_filepath, output_dir, headers=False, sources=False, profil
207210
208211 core_gen_folder = Path (output_dir ) / "gen" / "include" / "godot_cpp" / "core"
209212 include_gen_folder = Path (output_dir ) / "gen" / "include" / "godot_cpp"
213+ include_gen_compat_folder = Path (output_dir ) / "gen" / "include" / "godot_compat"
210214 source_gen_folder = Path (output_dir ) / "gen" / "src"
211215
212216 files .append (str ((core_gen_folder / "ext_wrappers.gen.inc" ).as_posix ()))
@@ -220,9 +224,11 @@ def get_file_list(api_filepath, output_dir, headers=False, sources=False, profil
220224 continue
221225
222226 header_filename = include_gen_folder / "variant" / (camel_to_snake (builtin_class ["name" ]) + ".hpp" )
227+ header_compat_filename = include_gen_compat_folder / "variant" / (camel_to_snake (builtin_class ["name" ]) + ".hpp" )
223228 source_filename = source_gen_folder / "variant" / (camel_to_snake (builtin_class ["name" ]) + ".cpp" )
224229 if headers :
225230 files .append (str (header_filename .as_posix ()))
231+ files .append (str (header_compat_filename .as_posix ()))
226232 if sources :
227233 files .append (str (source_filename .as_posix ()))
228234
@@ -232,9 +238,11 @@ def get_file_list(api_filepath, output_dir, headers=False, sources=False, profil
232238 engine_class ["name" ] = "ClassDBSingleton"
233239 engine_class ["alias_for" ] = "ClassDB"
234240 header_filename = include_gen_folder / "classes" / (camel_to_snake (engine_class ["name" ]) + ".hpp" )
241+ header_compat_filename = include_gen_compat_folder / "classes" / (camel_to_snake (engine_class ["name" ]) + ".hpp" )
235242 source_filename = source_gen_folder / "classes" / (camel_to_snake (engine_class ["name" ]) + ".cpp" )
236243 if headers :
237244 files .append (str (header_filename .as_posix ()))
245+ files .append (str (header_compat_filename .as_posix ()))
238246 if sources and is_class_included (engine_class ["name" ], build_profile ):
239247 files .append (str (source_filename .as_posix ()))
240248
@@ -245,8 +253,10 @@ def get_file_list(api_filepath, output_dir, headers=False, sources=False, profil
245253 snake_struct_name = camel_to_snake (struct_name )
246254
247255 header_filename = include_gen_folder / "classes" / (snake_struct_name + ".hpp" )
256+ header_compat_filename = include_gen_compat_folder / "classes" / (snake_struct_name + ".hpp" )
248257 if headers :
249258 files .append (str (header_filename .as_posix ()))
259+ files .append (str (header_compat_filename .as_posix ()))
250260
251261 if headers :
252262 for path in [
@@ -402,6 +412,7 @@ def generate_bindings(api_filepath, use_template_get_node, bits="64", precision=
402412 generate_builtin_bindings (api , target_dir , real_t + "_" + bits )
403413 generate_engine_classes_bindings (api , target_dir , use_template_get_node )
404414 generate_utility_functions (api , target_dir )
415+ generate_compat_includes (Path (output_dir ), target_dir )
405416
406417
407418CLASS_ALIASES = {
@@ -1545,6 +1556,47 @@ def generate_engine_classes_bindings(api, output_dir, use_template_get_node):
15451556 header_file .write ("\n " .join (result ))
15461557
15471558
1559+ def generate_compat_includes (output_dir : Path , target_dir : Path ):
1560+ file_types_mapping_godot_cpp_gen = map_header_files (target_dir / "include" )
1561+ file_types_mapping_godot_cpp = map_header_files (output_dir / "include" ) | file_types_mapping_godot_cpp_gen
1562+ godot_compat = Path ("output_header_mapping_godot.json" )
1563+ levels_to_look_back = 3
1564+ while not godot_compat .exists ():
1565+ godot_compat = ".." / godot_compat
1566+ levels_to_look_back -= 1
1567+ if levels_to_look_back == 0 :
1568+ print ("Skipping godot_compat" )
1569+ return
1570+ with godot_compat .open () as file :
1571+ mapping2 = json .load (file )
1572+ # Match the headers
1573+ file_types_mapping = match_headers (file_types_mapping_godot_cpp , mapping2 )
1574+
1575+ include_gen_folder = Path (target_dir ) / "include"
1576+ for file_godot_cpp_name , file_godot_names in file_types_mapping .items ():
1577+ header_filename = file_godot_cpp_name .replace ("godot_cpp" , "godot_compat" )
1578+ header_filepath = include_gen_folder / header_filename
1579+ Path (os .path .dirname (header_filepath )).mkdir (parents = True , exist_ok = True )
1580+ result = []
1581+ snake_header_name = camel_to_snake (header_filename )
1582+ add_header (f"{ snake_header_name } .hpp" , result )
1583+
1584+ header_guard = f"GODOT_COMPAT_{ os .path .splitext (os .path .basename (header_filepath ).upper ())[0 ]} _HPP"
1585+ result .append (f"#ifndef { header_guard } " )
1586+ result .append (f"#define { header_guard } " )
1587+ result .append ("" )
1588+ result .append (f"#ifdef GODOT_MODULE_COMPAT" )
1589+ for file_godot_name in file_godot_names :
1590+ result .append (f"#include <{ file_godot_name } >" )
1591+ result .append (f"#else" )
1592+ result .append (f"#include <{ file_godot_cpp_name } >" )
1593+ result .append (f"#endif" )
1594+ result .append ("" )
1595+ result .append (f"#endif // ! { header_guard } " )
1596+ with header_filepath .open ("w+" , encoding = "utf-8" ) as header_file :
1597+ header_file .write ("\n " .join (result ))
1598+
1599+
15481600def generate_engine_class_header (class_api , used_classes , fully_used_classes , use_template_get_node ):
15491601 global singletons
15501602 result = []
@@ -1771,12 +1823,7 @@ def generate_engine_class_header(class_api, used_classes, fully_used_classes, us
17711823 if "is_static" in method and method ["is_static" ]:
17721824 continue
17731825
1774- vararg = "is_vararg" in method and method ["is_vararg" ]
1775- if vararg :
1776- method_signature = "\t template <typename... Args> static "
1777- else :
1778- method_signature = "\t static "
1779-
1826+ method_signature = "\t static "
17801827 return_type = None
17811828 if "return_type" in method :
17821829 return_type = correct_type (method ["return_type" ].replace ("ClassDBSingleton" , "ClassDB" ), None , False )
@@ -1787,9 +1834,7 @@ def generate_engine_class_header(class_api, used_classes, fully_used_classes, us
17871834 False ,
17881835 )
17891836 if return_type is not None :
1790- method_signature += return_type
1791- if not method_signature .endswith ("*" ):
1792- method_signature += " "
1837+ method_signature += return_type + " "
17931838 else :
17941839 method_signature += "void "
17951840
0 commit comments