diff --git a/CHANGES.txt b/CHANGES.txt index 2d08036bf..4cc38f74c 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -20,6 +20,10 @@ RELEASE VERSION/DATE TO BE FILLED IN LATER From Mats Wichmann: - Introduce some unit tests for the file locking utility routines + - Reduce unneeded computation of overrides. The Mkdir builder used an + unknown argument ('explain') on creation, causing it to be considered + an override. Also, if override dict is empty, don't even call the + Override factory function. RELEASE 4.10.1 - Sun, 16 Nov 2025 10:51:57 -0700 diff --git a/RELEASE.txt b/RELEASE.txt index 4bebd5a4b..ac1441cde 100644 --- a/RELEASE.txt +++ b/RELEASE.txt @@ -41,6 +41,11 @@ IMPROVEMENTS documentation: performance improvements (describe the circumstances under which they would be observed), or major code cleanups +- Reduce unneeded computation of overrides. The Mkdir builder used an + unknown argument ('explain') on creation, causing it to be considered + an override. Also, if override dict is empty, don't even call the + Override factory function. + PACKAGING --------- diff --git a/SCons/Builder.py b/SCons/Builder.py index 0e8d33752..d4d693bb6 100644 --- a/SCons/Builder.py +++ b/SCons/Builder.py @@ -670,8 +670,8 @@ def prependDirIfRelative(f, srcdir=kw['srcdir']): else: env_kw = self.overrides - # TODO if env_kw: then the following line. there's no purpose in calling if no overrides. - env = env.Override(env_kw) + if env_kw: # there's no purpose in calling if no overrides. + env = env.Override(env_kw) return self._execute(env, target, source, OverrideWarner(kw), ekw) def adjust_suffix(self, suff): diff --git a/SCons/Environment.py b/SCons/Environment.py index c42189624..d6db175ac 100644 --- a/SCons/Environment.py +++ b/SCons/Environment.py @@ -859,9 +859,12 @@ def Override(self, overrides): A proxy environment of type :class:`OverrideEnvironment`. or the current environment if *overrides* is empty. """ - if not overrides: return self + # belt-and-suspenders - main callers should already have checked: + if not overrides: + return self o = copy_non_reserved_keywords(overrides) - if not o: return self + if not o: + return self overrides = {} merges = None for key, value in o.items(): diff --git a/SCons/Executor.py b/SCons/Executor.py index b97f8a7bd..f33a7aa8d 100644 --- a/SCons/Executor.py +++ b/SCons/Executor.py @@ -168,21 +168,18 @@ class Executor(metaclass=NoSlotsPyPy): '_do_execute', '_execute_str') - def __init__(self, action, env=None, overridelist=[{}], - targets=[], sources=[], builder_kw={}) -> None: + def __init__(self, action, env=None, overridelist=None, + targets=[], sources=[], builder_kw=None) -> None: if SCons.Debug.track_instances: logInstanceCreation(self, 'Executor.Executor') self.set_action_list(action) self.pre_actions = [] self.post_actions = [] self.env = env - self.overridelist = overridelist - if targets or sources: - self.batches = [Batch(targets[:], sources[:])] - else: - self.batches = [] - self.builder_kw = builder_kw - self._do_execute = 1 - self._execute_str = 1 + self.overridelist = [{}] if overridelist is None else overridelist + self.batches = [Batch(targets[:], sources[:])] if targets or sources else [] + self.builder_kw = {} if builder_kw is None else builder_kw + self._do_execute: int = 1 # map key + self._execute_str: int = 1 # map key self._memo = {} def get_lvars(self): @@ -358,7 +355,7 @@ def get_build_env(self): import SCons.Defaults env = self.env or SCons.Defaults.DefaultEnvironment() - build_env = env.Override(overrides) + build_env = env.Override(overrides) if overrides else env self._memo['get_build_env'] = build_env diff --git a/SCons/Node/FS.py b/SCons/Node/FS.py index 275a7be8e..8c1e6e582 100644 --- a/SCons/Node/FS.py +++ b/SCons/Node/FS.py @@ -381,7 +381,6 @@ def get_MkdirBuilder(): # calling SCons.Defaults.DefaultEnvironment() when necessary. MkdirBuilder = SCons.Builder.Builder(action = Mkdir, env = None, - explain = None, is_explicit = None, target_scanner = SCons.Defaults.DirEntryScanner, name = "MkdirBuilder")