diff --git a/doc/make.texi b/doc/make.texi index edceee76..18d4375e 100644 --- a/doc/make.texi +++ b/doc/make.texi @@ -1279,19 +1279,16 @@ makefile as has been traditionally done with other versions of @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 diff --git a/src/main.c b/src/main.c index 181fdc9e..a8fa6018 100644 --- a/src/main.c +++ b/src/main.c @@ -1455,6 +1455,9 @@ main (int argc, char **argv, char **envp) #ifdef MAKE_LOAD " load" #endif +#ifdef HAVE_DOS_PATHS + " dospaths" +#endif #ifdef MAKE_MAINTAINER_MODE " maintainer" #endif diff --git a/src/makeint.h b/src/makeint.h index fa56d3d2..906cb3b6 100644 --- a/src/makeint.h +++ b/src/makeint.h @@ -414,6 +414,7 @@ extern int unixy_shell; #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 @@ -463,14 +464,13 @@ extern int unixy_shell; # 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. */ @@ -480,6 +480,18 @@ extern int unixy_shell; /* 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 diff --git a/src/read.c b/src/read.c index 15f58ecf..b46b48fc 100644 --- a/src/read.c +++ b/src/read.c @@ -373,8 +373,9 @@ eval_makefile (const char *filename, unsigned short flags) /* 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) diff --git a/tests/scripts/features/include b/tests/scripts/features/include index 69d67181..7f216434 100644 --- a/tests/scripts/features/include +++ b/tests/scripts/features/include @@ -1,4 +1,4 @@ -# -*-mode: perl; rm-trailing-spaces: nil-*- +# -*-mode: perl-*- $description = "Test various forms of the GNU make 'include' command."; @@ -462,4 +462,14 @@ run_make_with_options(undef, ['-E', '%:;@echo $@', '-E', 'all:;', '-E', '-includ $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;