* src/makeint.h (HAVE_DRIVESPEC): Create a macro to check.
* src/main.c (.FEATURES): Add "dospaths" as a feature.
* src/read.c (eval_makefile) [DOS]: If the included makefile name
starts with a drivespec, don't search the include directories.
* doc/make.texi (Include): Document this behavior.
* tests/scripts/features/include: Add a test.
@findex /usr/gnu/include
@findex /usr/local/include
@findex /usr/include
-If the specified name does not start with a slash, and the file is not
-found in the current directory, several other directories are searched.
+If the specified name does not start with a slash (or a drive letter and colon
+when GNU Make is compiled with MS-DOS / MS-Windows path support), and the file
+is not found in the current directory, several other directories are searched.
First, any directories you have specified with the @samp{-I} or
-@samp{--include-dir} options are searched
-(@pxref{Options Summary, ,Summary of Options}).
-Then the following directories (if they exist)
-are searched, in this order:
-@file{@var{prefix}/include} (normally @file{/usr/local/include}
+@samp{--include-dir} options are searched (@pxref{Options Summary, ,Summary of
+Options}). Then the following directories (if they exist) are searched, in
+this order: @file{@var{prefix}/include} (normally @file{/usr/local/include}
@footnote{GNU Make compiled for MS-DOS and MS-Windows behaves as if
-@var{prefix} has been defined to be the root of the DJGPP tree
-hierarchy.})
-@file{/usr/gnu/include},
-@file{/usr/local/include}, @file{/usr/include}.
+@var{prefix} has been defined to be the root of the DJGPP tree hierarchy.})
+@file{/usr/gnu/include}, @file{/usr/local/include}, @file{/usr/include}.
The @code{.INCLUDE_DIRS} variable will contain the current list of
directories that make will search for included files. @xref{Special
#ifdef MAKE_LOAD
" load"
#endif
+#ifdef HAVE_DOS_PATHS
+ " dospaths"
+#endif
#ifdef MAKE_MAINTAINER_MODE
" maintainer"
#endif
#define NONE_SET(_v,_m) (! ANY_SET ((_v),(_m)))
#define ALL_SET(_v,_m) (((_v)&(_m)) == (_m))
+/* Bitmasks for the STOPCHAR array. */
#define MAP_NUL 0x0001
#define MAP_BLANK 0x0002 /* space, TAB */
#define MAP_NEWLINE 0x0004
# define MAP_PATHSEP MAP_SEMI
#elif PATH_SEPARATOR_CHAR == ','
# define MAP_PATHSEP MAP_COMMA
+
#else
# error "Unknown PATH_SEPARATOR_CHAR"
#endif
#define STOP_SET(_v,_m) ANY_SET(stopchar_map[(unsigned char)(_v)],(_m))
-/* True if C is a directory separator on the current system. */
-#define ISDIRSEP(c) STOP_SET((c),MAP_DIRSEP)
/* True if C is whitespace but not newline. */
#define ISBLANK(c) STOP_SET((c),MAP_BLANK)
/* True if C is whitespace including newlines. */
/* Move S past all whitespace (including newlines). */
#define NEXT_TOKEN(s) while (ISSPACE (*(s))) ++(s)
+/* True if C is a directory separator on the current system. */
+#define ISDIRSEP(c) STOP_SET((c),MAP_DIRSEP)
+
+/* True if S starts with a drive specifier. */
+#if defined(HAVE_DOS_PATHS)
+# define HAS_DRIVESPEC(_s) ((((_s)[0] >= 'a' && (_s)[0] <= 'z') \
+ || ((_s)[0] >= 'A' && (_s)[0] <= 'Z')) \
+ && (_s)[1] == ':')
+#else
+# define HAS_DRIVESPEC(_s) 0
+#endif
+
/* We can't run setrlimit when using posix_spawn. */
#if defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_GETRLIMIT) && defined(HAVE_SETRLIMIT) && !defined(USE_POSIX_SPAWN)
# define SET_STACK_SIZE
/* If the makefile wasn't found and it's either a makefile from the
'MAKEFILES' variable or an included makefile, search the included
makefile search path for this makefile. */
- if (ebuf.fp == NULL && deps->error == ENOENT && (flags & RM_INCLUDED)
- && *filename != '/' && include_directories)
+ if (ebuf.fp == NULL && deps->error == ENOENT && include_directories
+ && ANY_SET (flags, RM_INCLUDED)
+ && !HAS_DRIVESPEC (filename) && !ISDIRSEP (*filename))
{
const char **dir;
for (dir = include_directories; *dir != NULL; ++dir)
-# -*-mode: perl; rm-trailing-spaces: nil-*-
+# -*-mode: perl-*-
$description = "Test various forms of the GNU make 'include' command.";
$answer = "bizbaz\nbazbiz\nfoobar\nbarfoo\n$defaults\n#MAKE#: 'all' is up to date.\n";
&compare_output(subst_make_string($answer), &get_logfile(1));
+# SV 63516
+if (exists $FEATURES{'dospaths'}) {
+ run_make_test(q!
+include C:__foobar
+%bar: ; @echo $@
+all: ;
+!,
+ '', "C:__foobar\n#MAKE#: 'all' is up to date.");
+}
+
1;