Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/editor/editor_builders.py
9821 views
1
"""Functions used to generate source files during build time"""
2
3
import os
4
import os.path
5
import subprocess
6
import tempfile
7
import uuid
8
9
import methods
10
11
12
def doc_data_class_path_builder(target, source, env):
13
paths = dict(sorted(source[0].read().items()))
14
data = "\n".join([f'\t{{"{key}", "{value}"}},' for key, value in paths.items()])
15
with methods.generated_wrapper(str(target[0])) as file:
16
file.write(
17
f"""\
18
struct _DocDataClassPath {{
19
const char *name;
20
const char *path;
21
}};
22
23
inline constexpr int _doc_data_class_path_count = {len(paths)};
24
inline constexpr _DocDataClassPath _doc_data_class_paths[{len(paths) + 1}] = {{
25
{data}
26
{{nullptr, nullptr}},
27
}};
28
"""
29
)
30
31
32
def register_exporters_builder(target, source, env):
33
platforms = source[0].read()
34
exp_inc = "\n".join([f'#include "platform/{p}/export/export.h"' for p in platforms])
35
exp_reg = "\n\t".join([f"register_{p}_exporter();" for p in platforms])
36
exp_type = "\n\t".join([f"register_{p}_exporter_types();" for p in platforms])
37
with methods.generated_wrapper(str(target[0])) as file:
38
file.write(
39
f"""\
40
#include "register_exporters.h"
41
42
{exp_inc}
43
44
void register_exporters() {{
45
{exp_reg}
46
}}
47
48
void register_exporter_types() {{
49
{exp_type}
50
}}
51
"""
52
)
53
54
55
def make_doc_header(target, source, env):
56
buffer = b"".join([methods.get_buffer(src) for src in map(str, source)])
57
decomp_size = len(buffer)
58
buffer = methods.compress_buffer(buffer)
59
60
with methods.generated_wrapper(str(target[0])) as file:
61
file.write(f"""\
62
inline constexpr const char *_doc_data_hash = "{hash(buffer)}";
63
inline constexpr int _doc_data_compressed_size = {len(buffer)};
64
inline constexpr int _doc_data_uncompressed_size = {decomp_size};
65
inline constexpr const unsigned char _doc_data_compressed[] = {{
66
{methods.format_buffer(buffer, 1)}
67
}};
68
""")
69
70
71
def make_translations_header(target, source, env):
72
category = os.path.basename(str(target[0])).split("_")[0]
73
sorted_paths = sorted([src.abspath for src in source], key=lambda path: os.path.splitext(os.path.basename(path))[0])
74
75
xl_names = []
76
msgfmt = env.Detect("msgfmt")
77
if not msgfmt:
78
methods.print_warning("msgfmt not found, using .po files instead of .mo")
79
80
with methods.generated_wrapper(str(target[0])) as file:
81
for path in sorted_paths:
82
name = os.path.splitext(os.path.basename(path))[0]
83
# msgfmt erases non-translated messages, so avoid using it if exporting the POT.
84
if msgfmt and name != category:
85
mo_path = os.path.join(tempfile.gettempdir(), uuid.uuid4().hex + ".mo")
86
cmd = f"{msgfmt} {path} --no-hash -o {mo_path}"
87
try:
88
subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE).communicate()
89
buffer = methods.get_buffer(mo_path)
90
except OSError as e:
91
methods.print_warning(
92
"msgfmt execution failed, using .po file instead of .mo: path=%r; [%s] %s"
93
% (path, e.__class__.__name__, e)
94
)
95
buffer = methods.get_buffer(path)
96
finally:
97
try:
98
if os.path.exists(mo_path):
99
os.remove(mo_path)
100
except OSError as e:
101
# Do not fail the entire build if it cannot delete a temporary file.
102
methods.print_warning(
103
"Could not delete temporary .mo file: path=%r; [%s] %s" % (mo_path, e.__class__.__name__, e)
104
)
105
else:
106
buffer = methods.get_buffer(path)
107
if name == category:
108
name = "source"
109
110
decomp_size = len(buffer)
111
buffer = methods.compress_buffer(buffer)
112
113
file.write(f"""\
114
inline constexpr const unsigned char _{category}_translation_{name}_compressed[] = {{
115
{methods.format_buffer(buffer, 1)}
116
}};
117
118
""")
119
120
xl_names.append([name, len(buffer), decomp_size])
121
122
file.write(f"""\
123
struct {category.capitalize()}TranslationList {{
124
const char* lang;
125
int comp_size;
126
int uncomp_size;
127
const unsigned char* data;
128
}};
129
130
inline constexpr {category.capitalize()}TranslationList _{category}_translations[] = {{
131
""")
132
133
for x in xl_names:
134
file.write(f'\t{{ "{x[0]}", {x[1]}, {x[2]}, _{category}_translation_{x[0]}_compressed }},\n')
135
136
file.write("""\
137
{ nullptr, 0, 0, nullptr },
138
};
139
""")
140
141