From a21a4aa4056e379660f86570d939a75b4e6c5872 Mon Sep 17 00:00:00 2001 From: Steven Knight Date: Mon, 9 Feb 2009 21:09:43 +0000 Subject: 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"). --- src/CHANGES.txt | 3 +++ src/engine/SCons/Node/FS.py | 5 +++-- test/CPPPATH/absolute-path.py | 41 ++++++++++++++++++++++++++++------------- 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 57eb348..5198219 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 76852aa..5a2e1aa 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 5c60de1..1912f4f 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() -- cgit v0.12