|
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 |
|
@@ -205,6 +208,7 @@ def get_file_list(api_filepath, output_dir, headers=False, sources=False):
|
205 | 208 |
|
206 | 209 | core_gen_folder = Path(output_dir) / "gen" / "include" / "godot_cpp" / "core"
|
207 | 210 | include_gen_folder = Path(output_dir) / "gen" / "include" / "godot_cpp"
|
| 211 | + include_gen_compat_folder = Path(output_dir) / "gen" / "include" / "godot_compat" |
208 | 212 | source_gen_folder = Path(output_dir) / "gen" / "src"
|
209 | 213 |
|
210 | 214 | files.append(str((core_gen_folder / "ext_wrappers.gen.inc").as_posix()))
|
@@ -307,6 +311,7 @@ def generate_bindings(api_filepath, use_template_get_node, bits="64", precision=
|
307 | 311 | generate_builtin_bindings(api, target_dir, real_t + "_" + bits)
|
308 | 312 | generate_engine_classes_bindings(api, target_dir, use_template_get_node)
|
309 | 313 | generate_utility_functions(api, target_dir)
|
| 314 | + generate_compat_includes(Path(output_dir), target_dir) |
310 | 315 |
|
311 | 316 |
|
312 | 317 | builtin_classes = []
|
@@ -1440,6 +1445,47 @@ def generate_engine_classes_bindings(api, output_dir, use_template_get_node):
|
1440 | 1445 | header_file.write("\n".join(result))
|
1441 | 1446 |
|
1442 | 1447 |
|
| 1448 | +def generate_compat_includes(output_dir: Path, target_dir: Path): |
| 1449 | + file_types_mapping_godot_cpp_gen = map_header_files(target_dir / "include") |
| 1450 | + file_types_mapping_godot_cpp = map_header_files(output_dir / "include") | file_types_mapping_godot_cpp_gen |
| 1451 | + godot_compat = Path("output_header_mapping_godot.json") |
| 1452 | + levels_to_look_back = 3 |
| 1453 | + while not godot_compat.exists(): |
| 1454 | + godot_compat = ".." / godot_compat |
| 1455 | + levels_to_look_back -= 1 |
| 1456 | + if levels_to_look_back == 0: |
| 1457 | + print("Skipping godot_compat") |
| 1458 | + return |
| 1459 | + with godot_compat.open() as file: |
| 1460 | + mapping2 = json.load(file) |
| 1461 | + # Match the headers |
| 1462 | + file_types_mapping = match_headers(file_types_mapping_godot_cpp, mapping2) |
| 1463 | + |
| 1464 | + include_gen_folder = Path(target_dir) / "include" |
| 1465 | + for file_godot_cpp_name, file_godot_names in file_types_mapping.items(): |
| 1466 | + header_filename = file_godot_cpp_name.replace("godot_cpp", "godot_compat") |
| 1467 | + header_filepath = include_gen_folder / header_filename |
| 1468 | + Path(os.path.dirname(header_filepath)).mkdir(parents=True, exist_ok=True) |
| 1469 | + result = [] |
| 1470 | + snake_header_name = camel_to_snake(header_filename) |
| 1471 | + add_header(f"{snake_header_name}.hpp", result) |
| 1472 | + |
| 1473 | + header_guard = f"GODOT_COMPAT_{os.path.splitext(os.path.basename(header_filepath).upper())[0]}_HPP" |
| 1474 | + result.append(f"#ifndef {header_guard}") |
| 1475 | + result.append(f"#define {header_guard}") |
| 1476 | + result.append("") |
| 1477 | + result.append(f"#ifdef GODOT_MODULE_COMPAT") |
| 1478 | + for file_godot_name in file_godot_names: |
| 1479 | + result.append(f"#include <{file_godot_name}>") |
| 1480 | + result.append(f"#else") |
| 1481 | + result.append(f"#include <{file_godot_cpp_name}>") |
| 1482 | + result.append(f"#endif") |
| 1483 | + result.append("") |
| 1484 | + result.append(f"#endif // ! {header_guard}") |
| 1485 | + with header_filepath.open("w+", encoding="utf-8") as header_file: |
| 1486 | + header_file.write("\n".join(result)) |
| 1487 | + |
| 1488 | + |
1443 | 1489 | def generate_engine_class_header(class_api, used_classes, fully_used_classes, use_template_get_node):
|
1444 | 1490 | global singletons
|
1445 | 1491 | result = []
|
|
0 commit comments