Skip to content

Commit 6072656

Browse files
committed
Merge pull request godotengine#105621 from Repiteo/scons/begin-decouple
SCons: Begin decoupling generation & build code
2 parents 041c69d + 5c9f93c commit 6072656

File tree

16 files changed

+489
-454
lines changed

16 files changed

+489
-454
lines changed

core/SCsub

Lines changed: 14 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
#!/usr/bin/env python
22
from misc.utility.scons_hints import *
33

4-
Import("env")
5-
64
import os
75

86
import core_builders
97

108
import methods
119

10+
Import("env")
11+
1212
env.core_sources = []
1313

1414
# Add required thirdparty code.
@@ -161,96 +161,34 @@ env.core_sources += thirdparty_obj
161161

162162

163163
# Godot source files
164-
165164
env.add_source_files(env.core_sources, "*.cpp")
166165

167-
168166
# Generate disabled classes
169-
def disabled_class_builder(target, source, env):
170-
with methods.generated_wrapper(str(target[0])) as file:
171-
for c in source[0].read():
172-
if cs := c.strip():
173-
file.write(f"#define ClassDB_Disable_{cs} 1\n")
174-
175-
176-
env.CommandNoCache("disabled_classes.gen.h", env.Value(env.disabled_classes), env.Run(disabled_class_builder))
177-
167+
env.CommandNoCache(
168+
"disabled_classes.gen.h", env.Value(env.disabled_classes), env.Run(core_builders.disabled_class_builder)
169+
)
178170

179171
# Generate version info
180-
def version_info_builder(target, source, env):
181-
with methods.generated_wrapper(str(target[0])) as file:
182-
file.write(
183-
"""\
184-
#define GODOT_VERSION_SHORT_NAME "{short_name}"
185-
#define GODOT_VERSION_NAME "{name}"
186-
#define GODOT_VERSION_MAJOR {major}
187-
#define GODOT_VERSION_MINOR {minor}
188-
#define GODOT_VERSION_PATCH {patch}
189-
#define GODOT_VERSION_STATUS "{status}"
190-
#define GODOT_VERSION_BUILD "{build}"
191-
#define GODOT_VERSION_MODULE_CONFIG "{module_config}"
192-
#define GODOT_VERSION_WEBSITE "{website}"
193-
#define GODOT_VERSION_DOCS_BRANCH "{docs_branch}"
194-
#define GODOT_VERSION_DOCS_URL "https://docs.godotengine.org/en/" GODOT_VERSION_DOCS_BRANCH
195-
""".format(**source[0].read())
196-
)
197-
198-
199172
env.CommandNoCache(
200173
"version_generated.gen.h",
201174
env.Value(methods.get_version_info(env.module_version_string)),
202-
env.Run(version_info_builder),
175+
env.Run(core_builders.version_info_builder),
203176
)
204177

205-
206178
# Generate version hash
207-
def version_hash_builder(target, source, env):
208-
with methods.generated_wrapper(str(target[0])) as file:
209-
file.write(
210-
"""\
211-
#include "core/version.h"
212-
213-
const char *const GODOT_VERSION_HASH = "{git_hash}";
214-
const uint64_t GODOT_VERSION_TIMESTAMP = {git_timestamp};
215-
""".format(**source[0].read())
216-
)
217-
218-
219-
gen_hash = env.CommandNoCache("version_hash.gen.cpp", env.Value(methods.get_git_info()), env.Run(version_hash_builder))
179+
gen_hash = env.CommandNoCache(
180+
"version_hash.gen.cpp", env.Value(methods.get_git_info()), env.Run(core_builders.version_hash_builder)
181+
)
220182
env.add_source_files(env.core_sources, gen_hash)
221183

222-
223184
# Generate AES256 script encryption key
224-
def encryption_key_builder(target, source, env):
225-
with methods.generated_wrapper(str(target[0])) as file:
226-
file.write(
227-
f"""\
228-
#include "core/config/project_settings.h"
229-
230-
uint8_t script_encryption_key[32] = {{
231-
{source[0]}
232-
}};"""
233-
)
234-
235-
236-
gdkey = os.environ.get("SCRIPT_AES256_ENCRYPTION_KEY", "0" * 64)
237-
ec_valid = len(gdkey) == 64
238-
if ec_valid:
239-
try:
240-
gdkey = ", ".join([str(int(f"{a}{b}", 16)) for a, b in zip(gdkey[0::2], gdkey[1::2])])
241-
except Exception:
242-
ec_valid = False
243-
if not ec_valid:
244-
methods.print_error(
245-
f'Invalid AES256 encryption key, not 64 hexadecimal characters: "{gdkey}".\n'
246-
"Unset `SCRIPT_AES256_ENCRYPTION_KEY` in your environment "
247-
"or make sure that it contains exactly 64 hexadecimal characters."
248-
)
249-
Exit(255)
250-
gen_encrypt = env.CommandNoCache("script_encryption_key.gen.cpp", env.Value(gdkey), env.Run(encryption_key_builder))
185+
gen_encrypt = env.CommandNoCache(
186+
"script_encryption_key.gen.cpp",
187+
env.Value(os.environ.get("SCRIPT_AES256_ENCRYPTION_KEY")),
188+
env.Run(core_builders.encryption_key_builder),
189+
)
251190
env.add_source_files(env.core_sources, gen_encrypt)
252191

253-
254192
# Certificates
255193
env.CommandNoCache(
256194
"#core/io/certs_compressed.gen.h",

core/core_builders.py

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,80 @@
66
import methods
77

88

9+
# Generate disabled classes
10+
def disabled_class_builder(target, source, env):
11+
with methods.generated_wrapper(str(target[0])) as file:
12+
for c in source[0].read():
13+
if cs := c.strip():
14+
file.write(f"#define ClassDB_Disable_{cs} 1\n")
15+
16+
17+
# Generate version info
18+
def version_info_builder(target, source, env):
19+
with methods.generated_wrapper(str(target[0])) as file:
20+
file.write(
21+
"""\
22+
#define GODOT_VERSION_SHORT_NAME "{short_name}"
23+
#define GODOT_VERSION_NAME "{name}"
24+
#define GODOT_VERSION_MAJOR {major}
25+
#define GODOT_VERSION_MINOR {minor}
26+
#define GODOT_VERSION_PATCH {patch}
27+
#define GODOT_VERSION_STATUS "{status}"
28+
#define GODOT_VERSION_BUILD "{build}"
29+
#define GODOT_VERSION_MODULE_CONFIG "{module_config}"
30+
#define GODOT_VERSION_WEBSITE "{website}"
31+
#define GODOT_VERSION_DOCS_BRANCH "{docs_branch}"
32+
#define GODOT_VERSION_DOCS_URL "https://docs.godotengine.org/en/" GODOT_VERSION_DOCS_BRANCH
33+
""".format(**source[0].read())
34+
)
35+
36+
37+
def version_hash_builder(target, source, env):
38+
with methods.generated_wrapper(str(target[0])) as file:
39+
file.write(
40+
"""\
41+
#include "core/version.h"
42+
43+
const char *const GODOT_VERSION_HASH = "{git_hash}";
44+
const uint64_t GODOT_VERSION_TIMESTAMP = {git_timestamp};
45+
""".format(**source[0].read())
46+
)
47+
48+
49+
def encryption_key_builder(target, source, env):
50+
src = source[0].read() or "0" * 64
51+
try:
52+
buffer = bytes.fromhex(src)
53+
if len(buffer) != 32:
54+
raise ValueError
55+
except ValueError:
56+
methods.print_error(
57+
f'Invalid AES256 encryption key, not 64 hexadecimal characters: "{src}".\n'
58+
"Unset `SCRIPT_AES256_ENCRYPTION_KEY` in your environment "
59+
"or make sure that it contains exactly 64 hexadecimal characters."
60+
)
61+
raise
62+
63+
with methods.generated_wrapper(str(target[0])) as file:
64+
file.write(
65+
f"""\
66+
#include "core/config/project_settings.h"
67+
68+
uint8_t script_encryption_key[32] = {{
69+
{methods.format_buffer(buffer, 1)}
70+
}};"""
71+
)
72+
73+
974
def make_certs_header(target, source, env):
1075
buffer = methods.get_buffer(str(source[0]))
1176
decomp_size = len(buffer)
1277
buffer = methods.compress_buffer(buffer)
1378

1479
with methods.generated_wrapper(str(target[0])) as file:
1580
# System certs path. Editor will use them if defined. (for package maintainers)
16-
file.write('#define _SYSTEM_CERTS_PATH "{}"\n'.format(env["system_certs_path"]))
17-
if env["builtin_certs"]:
81+
file.write(f'#define _SYSTEM_CERTS_PATH "{source[2]}"\n')
82+
if source[1].read():
1883
# Defined here and not in env so changing it does not trigger a full rebuild.
1984
file.write(f"""\
2085
#define BUILTIN_CERTS_ENABLED

editor/SCsub

Lines changed: 9 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,25 @@
11
#!/usr/bin/env python
22
from misc.utility.scons_hints import *
33

4-
Import("env")
5-
6-
env.editor_sources = []
7-
84
import os
95

106
import editor_builders
117

12-
import methods
8+
Import("env")
9+
10+
env.editor_sources = []
1311

1412
if env.editor_build:
1513
# Generate doc data paths
16-
def doc_data_class_path_builder(target, source, env):
17-
paths = dict(sorted(source[0].read().items()))
18-
data = "\n".join([f'\t{{"{key}", "{value}"}},' for key, value in paths.items()])
19-
with methods.generated_wrapper(str(target[0])) as file:
20-
file.write(
21-
f"""\
22-
struct _DocDataClassPath {{
23-
const char *name;
24-
const char *path;
25-
}};
26-
27-
inline constexpr int _doc_data_class_path_count = {len(paths)};
28-
inline constexpr _DocDataClassPath _doc_data_class_paths[{len(env.doc_class_path) + 1}] = {{
29-
{data}
30-
{{nullptr, nullptr}},
31-
}};
32-
"""
33-
)
34-
35-
env.CommandNoCache("doc_data_class_path.gen.h", env.Value(env.doc_class_path), env.Run(doc_data_class_path_builder))
14+
env.CommandNoCache(
15+
"doc_data_class_path.gen.h", env.Value(env.doc_class_path), env.Run(editor_builders.doc_data_class_path_builder)
16+
)
3617

3718
# Register exporters
38-
def register_exporters_builder(target, source, env):
39-
platforms = source[0].read()
40-
exp_inc = "\n".join([f'#include "platform/{p}/export/export.h"' for p in platforms])
41-
exp_reg = "\n".join([f"\tregister_{p}_exporter();" for p in platforms])
42-
exp_type = "\n".join([f"\tregister_{p}_exporter_types();" for p in platforms])
43-
with methods.generated_wrapper(str(target[0])) as file:
44-
file.write(
45-
f"""\
46-
#include "register_exporters.h"
47-
48-
{exp_inc}
49-
50-
void register_exporters() {{
51-
{exp_reg}
52-
}}
53-
54-
void register_exporter_types() {{
55-
{exp_type}
56-
}}
57-
"""
58-
)
59-
6019
gen_exporters = env.CommandNoCache(
61-
"register_exporters.gen.cpp", env.Value(env.platform_exporters), env.Run(register_exporters_builder)
20+
"register_exporters.gen.cpp",
21+
env.Value(env.platform_exporters),
22+
env.Run(editor_builders.register_exporters_builder),
6223
)
6324
for e in env.platform_exporters:
6425
# Add all .cpp files in export folder

editor/editor_builders.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,49 @@
99
import methods
1010

1111

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+
1255
def make_doc_header(target, source, env):
1356
buffer = b"".join([methods.get_buffer(src) for src in map(str, source)])
1457
decomp_size = len(buffer)

0 commit comments

Comments
 (0)