bug-make
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Strange GNU make behavior with -include ?


From: Aymeric Vincent
Subject: Re: Strange GNU make behavior with -include ?
Date: 05 Dec 2002 00:37:26 +0100
User-agent: Gnus/5.0808 (Gnus v5.8.8) Emacs/20.7

        Hi,

Here is a patch (against GNU make 3.79.1, sorry) which fixes Gregoire's
problem. However, I'm not used to GNU make, so I certainly overlooked
something.

The idea is that every RM_DONTCARE file gets its dontcare flag set,
even if we already saw that file in some other rule.

Then, the condition for failing or not when a file can't be remade is to
look if the "top" file (oldest ancestor) in the chain currently being made
has its "dontcare" flag set, instead of looking at the current file.

I believe all the files which have the 'dontcare' flag set come from
"-include" directives, or MAKEFILES variable, and are thus such "top-level"
targets.

OTOH, files which have the "dontcare" bit set, but which appear in the
dependencies of a target that must be remade will trigger an error if
they can't be generated.

I think other solutions would be much more intrusive.

Regards,
 Aymeric

PS: please CC me if you answer; I'm not on this list.

diff -ur make-3.79.1/read.c make/read.c
--- make-3.79.1/read.c  Wed Jun 21 21:33:30 2000
+++ make/read.c Thu Dec  5 00:04:56 2002
@@ -386,11 +386,11 @@
   deps->name = 0;
   deps->file = lookup_file (filename);
   if (deps->file == 0)
-    {
       deps->file = enter_file (xstrdup (filename));
-      if (flags & RM_DONTCARE)
-       deps->file->dontcare = 1;
-    }
+
+  if (flags & RM_DONTCARE)
+    deps->file->dontcare = 1;
+
   if (filename != passed_filename)
     free (filename);
   filename = deps->file->name;
diff -ur make-3.79.1/remake.c make/remake.c
--- make-3.79.1/remake.c        Tue Jun 20 16:00:17 2000
+++ make/remake.c       Thu Dec  5 00:12:18 2002
@@ -977,9 +977,13 @@
             = _("%sNo rule to make target `%s'%s");
           const char *msg_parent
             = _("%sNo rule to make target `%s', needed by `%s'%s");
+         struct file *top_target = file;
+
+         while (top_target->parent != 0)
+           top_target = top_target->parent;
 
           /* This is a dependency file we cannot remake.  Fail.  */
-          if (!keep_going_flag && !file->dontcare)
+          if (!keep_going_flag && !top_target->dontcare)
             {
               if (file->parent == 0)
                 fatal (NILF, msg_noparent, "", file->name, "");
@@ -987,7 +991,7 @@
               fatal (NILF, msg_parent, "", file->name, file->parent->name, "");
             }
 
-          if (!file->dontcare)
+          if (!top_target->dontcare)
             {
               if (file->parent == 0)
                 error (NILF, msg_noparent, "*** ", file->name, ".");




reply via email to

[Prev in Thread] Current Thread [Next in Thread]