SCons: List `.gen.cpp` sources explicitly to avoid globbing errors

Whenever we change the name (or remove) generated cpp files with the `.gen.cpp`
extension, users run into build issues when switching between branches (i.e.
switching before and after the name change/removal). This is because we glob
`*.cpp` so if a now-obsolete file from a previous build is present, we'll
include it too, potentially leading to bugs or compilation failure (due to
missing headers or invalid code).

So globbing patterns in `add_source_files` will now skip files ending with
`.gen.cpp`, which should instead be passed explicitly where they're used.
This commit is contained in:
Rémi Verschelde 2021-10-15 21:59:11 +02:00
parent 08d1ce718d
commit c133480531
No known key found for this signature in database
GPG Key ID: C3336907360768E1
4 changed files with 15 additions and 14 deletions

View File

@ -146,6 +146,7 @@ env.core_sources += thirdparty_obj
# Godot source files # Godot source files
env.add_source_files(env.core_sources, "*.cpp") env.add_source_files(env.core_sources, "*.cpp")
env.add_source_files(env.core_sources, "script_encryption_key.gen.cpp")
# Certificates # Certificates
env.Depends( env.Depends(

View File

@ -7,19 +7,15 @@ import input_builders
# Order matters here. Higher index controller database files write on top of lower index database files. # Order matters here. Higher index controller database files write on top of lower index database files.
controller_databases = [ controller_databases = [
"#core/input/gamecontrollerdb.txt", "gamecontrollerdb.txt",
"#core/input/godotcontrollerdb.txt", "godotcontrollerdb.txt",
] ]
env.Depends("#core/input/default_controller_mappings.gen.cpp", controller_databases) gensource = env.CommandNoCache(
env.CommandNoCache( "default_controller_mappings.gen.cpp",
"#core/input/default_controller_mappings.gen.cpp",
controller_databases, controller_databases,
env.Run(input_builders.make_default_controller_mappings, "Generating default controller mappings."), env.Run(input_builders.make_default_controller_mappings, "Generating default controller mappings."),
) )
env.add_source_files(env.core_sources, "*.cpp") env.add_source_files(env.core_sources, "*.cpp")
env.add_source_files(env.core_sources, gensource)
# Don't warn about duplicate entry here, we need it registered manually for first build,
# even if later builds will pick it up twice due to above *.cpp globbing.
env.add_source_files(env.core_sources, "#core/input/default_controller_mappings.gen.cpp", warn_duplicates=False)

View File

@ -101,6 +101,7 @@ if env["tools"]:
) )
env.add_source_files(env.editor_sources, "*.cpp") env.add_source_files(env.editor_sources, "*.cpp")
env.add_source_files(env.editor_sources, "register_exporters.gen.cpp")
SConscript("debugger/SCsub") SConscript("debugger/SCsub")
SConscript("fileserver/SCsub") SConscript("fileserver/SCsub")

View File

@ -14,7 +14,7 @@ from SCons.Variables.BoolVariable import _text2bool
from platform_methods import run_in_subprocess from platform_methods import run_in_subprocess
def add_source_files(self, sources, files, warn_duplicates=True): def add_source_files(self, sources, files):
# Convert string to list of absolute paths (including expanding wildcard) # Convert string to list of absolute paths (including expanding wildcard)
if isinstance(files, (str, bytes)): if isinstance(files, (str, bytes)):
# Keep SCons project-absolute path as they are (no wildcard support) # Keep SCons project-absolute path as they are (no wildcard support)
@ -24,16 +24,19 @@ def add_source_files(self, sources, files, warn_duplicates=True):
return return
files = [files] files = [files]
else: else:
# Exclude .gen.cpp files from globbing, to avoid including obsolete ones.
# They should instead be added manually.
skip_gen_cpp = "*" in files
dir_path = self.Dir(".").abspath dir_path = self.Dir(".").abspath
files = sorted(glob.glob(dir_path + "/" + files)) files = sorted(glob.glob(dir_path + "/" + files))
if skip_gen_cpp:
files = [f for f in files if not f.endswith(".gen.cpp")]
# Add each path as compiled Object following environment (self) configuration # Add each path as compiled Object following environment (self) configuration
for path in files: for path in files:
obj = self.Object(path) obj = self.Object(path)
if obj in sources: if obj in sources:
if warn_duplicates:
print('WARNING: Object "{}" already included in environment sources.'.format(obj)) print('WARNING: Object "{}" already included in environment sources.'.format(obj))
else:
continue continue
sources.append(obj) sources.append(obj)