From: stevenknight Date: Mon, 9 Feb 2009 21:09:43 +0000 (+0000) Subject: Handle finding implicit dependents defined with doubled path X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=473d30f85df7e1382fb1639d7acd03adf6ba3b3c;p=scons.git Handle finding implicit dependents defined with doubled path separators, as can happen on Windows systems when the backslashes in the path name are escaped (e.g. "C:\\some\\include.h"). git-svn-id: http://scons.tigris.org/svn/scons/trunk@3988 fdb21ef1-2011-0410-befe-b5e4ea1792b1 --- diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 57eb348f..51982190 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -22,6 +22,9 @@ RELEASE X.X.X - XXX - Fix interaction of $CHANGED_SOURCES with the --config=force option. + - Fix finding #include files when the string contains escaped + backslashes like "C:\\some\\include.h". + From Robert P. J. Day: - User's Guide updates. diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py index 76852aa4..5a2e1aa7 100644 --- a/src/engine/SCons/Node/FS.py +++ b/src/engine/SCons/Node/FS.py @@ -3005,8 +3005,9 @@ class FileFinder: fd = self.default_filedir dir, name = os.path.split(fd) drive, d = os.path.splitdrive(dir) - if d in ('/', os.sep): - return p.fs.get_root(drive).dir_on_disk(name) + if not name and d[:1] in ('/', os.sep): + #return p.fs.get_root(drive).dir_on_disk(name) + return p.fs.get_root(drive) if dir: p = self.filedir_lookup(p, dir) if not p: diff --git a/test/CPPPATH/absolute-path.py b/test/CPPPATH/absolute-path.py index 5c60de19..1912f4f6 100644 --- a/test/CPPPATH/absolute-path.py +++ b/test/CPPPATH/absolute-path.py @@ -29,22 +29,32 @@ Verify the ability to #include a file with an absolute path name. (Which is not strictly a test of using $CPPPATH, but it's in the ball park...) """ +import os +import string + import TestSCons test = TestSCons.TestSCons() test.subdir('include', 'work') -inc_h = test.workpath('include', 'inc.h') +inc1_h = test.workpath('include', 'inc1.h') +inc2_h = test.workpath('include', 'inc2.h') does_not_exist_h = test.workpath('include', 'does_not_exist.h') +# Verify that including an absolute path still works even if they +# double the separators in the input file. This can happen especially +# on Windows if they use \\ to represent an escaped backslash. +inc2_h = string.replace(inc2_h, os.sep, os.sep+os.sep) + test.write(['work', 'SConstruct'], """\ Program('prog.c') """) test.write(['work', 'prog.c'], """\ #include -#include "%(inc_h)s" +#include "%(inc1_h)s" +#include "%(inc2_h)s" #if 0 #include "%(does_not_exist_h)s" #endif @@ -53,29 +63,34 @@ int main(int argc, char *argv[]) { argv[argc++] = "--"; - printf("%%s\\n", STRING); + printf("%%s\\n", STRING1); + printf("%%s\\n", STRING2); return 0; } """ % locals()) -test.write(['include', 'inc.h'], """\ -#define STRING "include/inc.h 1\\n" +test.write(['include', 'inc1.h'], """\ +#define STRING1 "include/inc1.h A\\n" +""") + +test.write(['include', 'inc2.h'], """\ +#define STRING2 "include/inc2.h A\\n" """) test.run(chdir = 'work', arguments = '.') test.up_to_date(chdir = 'work', arguments = '.') -test.write(['include', 'inc.h'], """\ -#define STRING "include/inc.h 2\\n" +test.write(['include', 'inc1.h'], """\ +#define STRING1 "include/inc1.h B\\n" """) test.not_up_to_date(chdir = 'work', arguments = '.') -test.pass_test() +test.write(['include', 'inc2.h'], """\ +#define STRING2 "include/inc2.h B\\n" +""") + +test.not_up_to_date(chdir = 'work', arguments = '.') -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: +test.pass_test()