3
3
import json
4
4
import re
5
5
import shutil
6
+ import os
7
+ from compat_generator import map_header_files
8
+ from header_matcher import match_headers
6
9
from pathlib import Path
7
10
8
11
@@ -207,6 +210,7 @@ def get_file_list(api_filepath, output_dir, headers=False, sources=False, profil
207
210
208
211
core_gen_folder = Path (output_dir ) / "gen" / "include" / "godot_cpp" / "core"
209
212
include_gen_folder = Path (output_dir ) / "gen" / "include" / "godot_cpp"
213
+ include_gen_compat_folder = Path (output_dir ) / "gen" / "include" / "godot_compat"
210
214
source_gen_folder = Path (output_dir ) / "gen" / "src"
211
215
212
216
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
220
224
continue
221
225
222
226
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" )
223
228
source_filename = source_gen_folder / "variant" / (camel_to_snake (builtin_class ["name" ]) + ".cpp" )
224
229
if headers :
225
230
files .append (str (header_filename .as_posix ()))
231
+ files .append (str (header_compat_filename .as_posix ()))
226
232
if sources :
227
233
files .append (str (source_filename .as_posix ()))
228
234
@@ -232,9 +238,11 @@ def get_file_list(api_filepath, output_dir, headers=False, sources=False, profil
232
238
engine_class ["name" ] = "ClassDBSingleton"
233
239
engine_class ["alias_for" ] = "ClassDB"
234
240
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" )
235
242
source_filename = source_gen_folder / "classes" / (camel_to_snake (engine_class ["name" ]) + ".cpp" )
236
243
if headers :
237
244
files .append (str (header_filename .as_posix ()))
245
+ files .append (str (header_compat_filename .as_posix ()))
238
246
if sources and is_class_included (engine_class ["name" ], build_profile ):
239
247
files .append (str (source_filename .as_posix ()))
240
248
@@ -245,8 +253,10 @@ def get_file_list(api_filepath, output_dir, headers=False, sources=False, profil
245
253
snake_struct_name = camel_to_snake (struct_name )
246
254
247
255
header_filename = include_gen_folder / "classes" / (snake_struct_name + ".hpp" )
256
+ header_compat_filename = include_gen_compat_folder / "classes" / (snake_struct_name + ".hpp" )
248
257
if headers :
249
258
files .append (str (header_filename .as_posix ()))
259
+ files .append (str (header_compat_filename .as_posix ()))
250
260
251
261
if headers :
252
262
for path in [
@@ -402,6 +412,7 @@ def generate_bindings(api_filepath, use_template_get_node, bits="64", precision=
402
412
generate_builtin_bindings (api , target_dir , real_t + "_" + bits )
403
413
generate_engine_classes_bindings (api , target_dir , use_template_get_node )
404
414
generate_utility_functions (api , target_dir )
415
+ generate_compat_includes (Path (output_dir ), target_dir )
405
416
406
417
407
418
CLASS_ALIASES = {
@@ -1545,6 +1556,47 @@ def generate_engine_classes_bindings(api, output_dir, use_template_get_node):
1545
1556
header_file .write ("\n " .join (result ))
1546
1557
1547
1558
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
+
1548
1600
def generate_engine_class_header (class_api , used_classes , fully_used_classes , use_template_get_node ):
1549
1601
global singletons
1550
1602
result = []
@@ -1771,12 +1823,7 @@ def generate_engine_class_header(class_api, used_classes, fully_used_classes, us
1771
1823
if "is_static" in method and method ["is_static" ]:
1772
1824
continue
1773
1825
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 "
1780
1827
return_type = None
1781
1828
if "return_type" in method :
1782
1829
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
1787
1834
False ,
1788
1835
)
1789
1836
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 + " "
1793
1838
else :
1794
1839
method_signature += "void "
1795
1840
0 commit comments