diff --git a/CHANGES.txt b/CHANGES.txt index 03d563dab5..0cba5bc458 100755 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -17,6 +17,10 @@ RELEASE VERSION/DATE TO BE FILLED IN LATER "Multiple ways to build the same target were specified for:". Now mingw will disable creating the symlinks (and adding version string to ) dlls. It sets SHLIBNOVERSIONSYMLINKS, IMPLIBNOVERSIONSYMLINKS and LDMODULENOVERSIONSYMLINKS to True. + - Fix Issue #2801 - Handle calling Clean('$XYZ','$ABC') when either env['XYZ'] or env['ABC'] + is undefined as that would yield either argument as '.'. This will lead to cleaning the wrong + (or all) files potentially when you request the wrong (or any target). + From Daniel Moody: - Update CacheDir to use uuid for tmpfile uniqueness instead of pid. diff --git a/SCons/Environment.py b/SCons/Environment.py index dc7b7a10ea..fa50809791 100644 --- a/SCons/Environment.py +++ b/SCons/Environment.py @@ -32,17 +32,15 @@ import copy import os -import sys import re import shlex +import sys from collections import UserDict import SCons.Action import SCons.Builder import SCons.Debug -from SCons.Debug import logInstanceCreation import SCons.Defaults -from SCons.Errors import UserError, BuildError import SCons.Memoize import SCons.Node import SCons.Node.Alias @@ -54,6 +52,8 @@ import SCons.Subst import SCons.Tool import SCons.Warnings +from SCons.Debug import logInstanceCreation +from SCons.Errors import UserError, BuildError from SCons.Util import ( AppendPath, CLVar, @@ -74,6 +74,7 @@ uniquer_hashables, ) + class _Null: pass @@ -2000,6 +2001,19 @@ def CacheDir(self, path): def Clean(self, targets, files): global CleanTargets + + # Check for anything which evaluates to empty string, which would yield cleaning '.' + targets_strings = [(t, self.subst(t)) for t in flatten(targets) if is_String(t) and ('$' in t or t == '')] + files_strings = [(t, self.subst(t)) for t in flatten(files) if is_String(t) and ('$' in t or t == '')] + if any([s == '' for t, s in targets_strings]): + raise UserError( + "Targets specified to Clean() include one which evaluates to an empty string: [%s]" % ",".join( + ["%s='%s'" % (str(t), s) for (t, s) in targets_strings])) + if any([s == '' for t, s in files_strings]): + raise UserError( + "Targets specified to Clean() include one which evaluates to an empty string: [%s]" % ",".join( + ["%s='%s'" % (str(t), s) for (t, s) in files_strings])) + tlist = self.arg2nodes(targets, self.fs.Entry) flist = self.arg2nodes(files, self.fs.Entry) for t in tlist: