This survived a full bulk build.
Now I'm fishing for okays.

(and a seeing eye)


On Tue, May 10, 2016 at 04:42:25PM +0200, Marc Espie wrote:
> Both bmake and gmake support a list of files in include/sinclude 
> "systemV style".
> 
> Adding this to our make would make us slightly more compatible.
> 
> It also allows modern dependency patterns a la
> 
> .sinclude ${SRC:R:=.d}
> 
> Just went thru a full make build.
> could use a few eyes.
> 
> The change is straightforward, but the patch a bit long, because I have 
> to move the location of Var_Substs... keep it simple in the bsd make case (we
> don't want to create syntax by substituting variables). And so the handling
> of string intervals trickles down the chain of function.
> 
> I refrained from also supporting gmake's glob extension, where they can do
> .sinclude *.d
> 
> We have the match code in dir_expand.c, but this would be complicated to
> mesh with the include directory lookup in resolve_include_filename.
> 
> Comments and okays welcome.
> 
> Index: parse.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/make/parse.c,v
> retrieving revision 1.115
> diff -u -p -r1.115 parse.c
> --- parse.c   22 Dec 2015 21:50:54 -0000      1.115
> +++ parse.c   10 May 2016 14:35:26 -0000
> @@ -149,7 +149,7 @@ static bool handle_undef(const char *);
>  #define ParseReadLoopLine(linebuf) Parse_ReadUnparsedLine(linebuf, "for 
> loop")
>  static bool handle_bsd_command(Buffer, Buffer, const char *);
>  static char *strip_comments(Buffer, const char *);
> -static char *resolve_include_filename(const char *, bool);
> +static char *resolve_include_filename(const char *, const char *, bool);
>  static void handle_include_file(const char *, const char *, bool, bool);
>  static bool lookup_bsd_include(const char *);
>  static void lookup_sysv_style_include(const char *, const char *, bool);
> @@ -1081,13 +1081,13 @@ Parse_AddIncludeDir(const char        *dir)
>  }
>  
>  static char *
> -resolve_include_filename(const char *file, bool isSystem)
> +resolve_include_filename(const char *file, const char *efile, bool isSystem)
>  {
>       char *fullname;
>  
>       /* Look up system files on the system path first */
>       if (isSystem) {
> -             fullname = Dir_FindFileNoDot(file, systemIncludePath);
> +             fullname = Dir_FindFileNoDoti(file, efile, systemIncludePath);
>               if (fullname)
>                       return fullname;
>       }
> @@ -1107,8 +1107,7 @@ resolve_include_filename(const char *fil
>               if (slash != NULL) {
>                       char *newName;
>  
> -                     newName = Str_concati(fname, slash, file,
> -                         strchr(file, '\0'), '/');
> +                     newName = Str_concati(fname, slash, file, efile, '/');
>                       fullname = Dir_FindFile(newName, userIncludePath);
>                       if (fullname == NULL)
>                               fullname = Dir_FindFile(newName, defaultPath);
> @@ -1121,10 +1120,10 @@ resolve_include_filename(const char *fil
>       /* Now look first on the -I search path, then on the .PATH
>        * search path, if not found in a -I directory.
>        * XXX: Suffix specific?  */
> -     fullname = Dir_FindFile(file, userIncludePath);
> +     fullname = Dir_FindFilei(file, efile, userIncludePath);
>       if (fullname)
>               return fullname;
> -     fullname = Dir_FindFile(file, defaultPath);
> +     fullname = Dir_FindFilei(file, efile, defaultPath);
>       if (fullname)
>               return fullname;
>  
> @@ -1133,25 +1132,19 @@ resolve_include_filename(const char *fil
>       if (isSystem)
>               return NULL;
>       else
> -             return Dir_FindFile(file, systemIncludePath);
> +             return Dir_FindFilei(file, efile, systemIncludePath);
>  }
>  
>  static void
> -handle_include_file(const char *name, const char *ename, bool isSystem,
> +handle_include_file(const char *file, const char *efile, bool isSystem,
>      bool errIfNotFound)
>  {
> -     char *file;
>       char *fullname;
>  
> -     /* Substitute for any variables in the file name before trying to
> -      * find the thing. */
> -     file = Var_Substi(name, ename, NULL, false);
> -
> -     fullname = resolve_include_filename(file, isSystem);
> +     fullname = resolve_include_filename(file, efile, isSystem);
>       if (fullname == NULL && errIfNotFound)
> -             Parse_Error(PARSE_FATAL, "Could not find %s", file);
> -     free(file);
> -
> +             Parse_Error(PARSE_FATAL, "Could not find %s", 
> +                 Str_dupi(file, efile));
>  
>       if (fullname != NULL) {
>               FILE *f;
> @@ -1170,6 +1163,7 @@ lookup_bsd_include(const char *file)
>  {
>       char endc;
>       const char *efile;
> +     char *file2;
>       bool isSystem;
>  
>       /* find starting delimiter */
> @@ -1197,30 +1191,48 @@ lookup_bsd_include(const char *file)
>                       return false;
>               }
>       }
> -     handle_include_file(file, efile, isSystem, true);
> +     /* Substitute for any variables in the file name before trying to
> +      * find the thing. */
> +     file2 = Var_Substi(file, efile, NULL, false);
> +     handle_include_file(file2, strchr(file2, '\0'), isSystem, true);
> +     free(file2);
>       return true;
>  }
>  
>  
>  static void
> -lookup_sysv_style_include(const char *file, const char *directive,
> +lookup_sysv_style_include(const char *line, const char *directive,
>      bool errIfMissing)
>  {
> -     const char *efile;
> +     char *file;
> +     char *name;
> +     char *ename;
> +     bool okay = false;
>  
> -     /* find beginning of name */
> -     while (ISSPACE(*file))
> -             file++;
> -     if (*file == '\0') {
> -             Parse_Error(PARSE_FATAL, "Filename missing from \"%s\"",
> -                 directive);
> -             return;
> +     /* Substitute for any variables in the file name before trying to
> +      * find the thing. */
> +     file = Var_Subst(line, NULL, false);
> +
> +     /* sys5 allows for list of files separated by spaces */
> +     name = file;
> +     while (1) {
> +             /* find beginning of name */
> +             while (ISSPACE(*name))
> +                     name++;
> +             if (*name == '\0')
> +                     break;
> +             for (ename = name; *ename != '\0' && !ISSPACE(*ename);)
> +                     ename++;
> +             handle_include_file(name, ename, true, errIfMissing);
> +             okay = true;
> +             name = ename;
>       }
> -     /* sys5 delimits file up to next blank character or end of line */
> -     for (efile = file; *efile != '\0' && !ISSPACE(*efile);)
> -             efile++;
>  
> -     handle_include_file(file, efile, true, errIfMissing);
> +     free(file);
> +     if (!okay) {
> +             Parse_Error(PARSE_FATAL, "Filename missing from \"%s\"",
> +             directive);
> +     }
>  }
>  
>  

Reply via email to