From a5093d64acfd53259ec4f71b44eac0d5113206f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Verschelde?= Date: Fri, 15 Oct 2021 21:59:11 +0200 Subject: [PATCH] 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. (cherry picked from commit c13348053129d4a356a0df1ada208809997799fe) --- core/SCsub | 1 + editor/SCsub | 1 + main/SCsub | 11 ++++------- methods.py | 13 ++++++++----- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/core/SCsub b/core/SCsub index 445249a5c0..de2ff26f93 100644 --- a/core/SCsub +++ b/core/SCsub @@ -151,6 +151,7 @@ env.core_sources += thirdparty_obj # Godot source files env.add_source_files(env.core_sources, "*.cpp") +env.add_source_files(env.core_sources, "script_encryption_key.gen.cpp") # Certificates env.Depends( diff --git a/editor/SCsub b/editor/SCsub index 8ac411dd4e..9c99f6fa44 100644 --- a/editor/SCsub +++ b/editor/SCsub @@ -91,6 +91,7 @@ if env["tools"]: env.CommandNoCache("#editor/builtin_fonts.gen.h", flist, run_in_subprocess(editor_builders.make_fonts_header)) env.add_source_files(env.editor_sources, "*.cpp") + env.add_source_files(env.editor_sources, "register_exporters.gen.cpp") SConscript("collada/SCsub") SConscript("doc/SCsub") diff --git a/main/SCsub b/main/SCsub index dd1b30eca9..473c157467 100644 --- a/main/SCsub +++ b/main/SCsub @@ -10,18 +10,15 @@ env.main_sources = [] env.add_source_files(env.main_sources, "*.cpp") # Order matters here. Higher index controller database files write on top of lower index database files. -controller_databases = ["#main/gamecontrollerdb.txt", "#main/godotcontrollerdb.txt"] +controller_databases = ["gamecontrollerdb.txt", "godotcontrollerdb.txt"] -env.Depends("#main/default_controller_mappings.gen.cpp", controller_databases) -env.CommandNoCache( - "#main/default_controller_mappings.gen.cpp", +gensource = env.CommandNoCache( + "default_controller_mappings.gen.cpp", controller_databases, run_in_subprocess(main_builders.make_default_controller_mappings), ) -# 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.main_sources, "#main/default_controller_mappings.gen.cpp", warn_duplicates=False) +env.add_source_files(env.main_sources, gensource) env.Depends("#main/splash.gen.h", "#main/splash.png") env.CommandNoCache("#main/splash.gen.h", "#main/splash.png", run_in_subprocess(main_builders.make_splash)) diff --git a/methods.py b/methods.py index 047892d813..9b8cb38c0c 100644 --- a/methods.py +++ b/methods.py @@ -11,7 +11,7 @@ from SCons.Script import Glob from SCons.Variables.BoolVariable import _text2bool -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) if isbasestring(files): # Keep SCons project-absolute path as they are (no wildcard support) @@ -21,17 +21,20 @@ def add_source_files(self, sources, files, warn_duplicates=True): return files = [files] 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 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 for path in files: obj = self.Object(path) if obj in sources: - if warn_duplicates: - print('WARNING: Object "{}" already included in environment sources.'.format(obj)) - else: - continue + print('WARNING: Object "{}" already included in environment sources.'.format(obj)) + continue sources.append(obj)