- Fix Savannah bug 17825
authorPaul Smith <psmith@gnu.org>
Sat, 13 Jun 2009 21:21:48 +0000 (21:21 +0000)
committerPaul Smith <psmith@gnu.org>
Sat, 13 Jun 2009 21:21:48 +0000 (21:21 +0000)
- Fix Savannah bug 21231

13 files changed:
ChangeLog
commands.c
default.c
dep.h
file.c
function.c
implicit.c
main.c
read.c
rule.c
tests/ChangeLog
tests/scripts/functions/wildcard
tests/scripts/options/dash-B

index 5d1765e..3e53a55 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,23 @@
+2009-06-13  Paul Smith  <psmith@gnu.org>
+
+       * function.c (string_glob): Rely on multi_glob() to determine
+       whether files exist or not.  Remove call to file_exists_p() which
+       is not always correct.  Fixes Savannah bug #21231.
+       * read.c (multi_glob): Add a new argument EXISTS_ONLY; if true
+       then only files that really exist will be returned.
+       * dep.h: Add new argument to multi_glob().
+       * rule.c (install_pattern_rule): Ditto.
+       * read.c (eval): Ditto.
+       * main.c (main): Ditto.
+       * implicit.c (pattern_search): Ditto.
+       * file.c (parse_prereqs): Ditto.
+       * default.c (set_default_suffixes): Ditto.
+
 2009-06-09  Paul Smith  <psmith@gnu.org>
 
+       * commands.c (set_file_variables): If always_make_flag is set,
+       always add the prereq to $?.  Fixes Savannah bug #17825.
+
        * remake.c (update_file_1): When rebuilding deps of FILE, also try
        to rebuild the deps of all the also_make targets for that file.
        Fixes Savannah bug #19108.
index ee6fc6e..7bd9531 100644 (file)
@@ -240,7 +240,7 @@ set_file_variables (struct file *file)
             memcpy (cp, c, len);
             cp += len;
             *cp++ = FILE_LIST_SEPARATOR;
-            if (d->changed)
+            if (d->changed || always_make_flag)
               {
                 memcpy (qp, c, len);
                 qp += len;
index 0f3cde5..170378e 100644 (file)
--- a/default.c
+++ b/default.c
@@ -544,7 +544,7 @@ set_default_suffixes (void)
       char *p = default_suffixes;
       suffix_file->deps = (struct dep *)
        multi_glob (parse_file_seq (&p, '\0', sizeof (struct dep), 1),
-                   sizeof (struct dep));
+                   sizeof (struct dep), 0);
       define_variable ("SUFFIXES", 8, default_suffixes, o_default, 0);
     }
 }
diff --git a/dep.h b/dep.h
index 08d0cb1..ec2420e 100644 (file)
--- a/dep.h
+++ b/dep.h
@@ -55,7 +55,7 @@ struct nameseq
   };
 
 
-struct nameseq *multi_glob (struct nameseq *chain, unsigned int size);
+struct nameseq *multi_glob (struct nameseq *chain, unsigned int size, int exists_only);
 #ifdef VMS
 struct nameseq *parse_file_seq ();
 #else
diff --git a/file.c b/file.c
index 95e3788..a618beb 100644 (file)
--- a/file.c
+++ b/file.c
@@ -416,7 +416,7 @@ parse_prereqs (char *p)
 {
   struct dep *new = (struct dep *)
     multi_glob (parse_file_seq (&p, '|', sizeof (struct dep), 1),
-                sizeof (struct dep));
+                sizeof (struct dep), 0);
 
   if (*p)
     {
@@ -427,7 +427,7 @@ parse_prereqs (char *p)
       ++p;
       ood = (struct dep *)
         multi_glob (parse_file_seq (&p, '\0', sizeof (struct dep), 1),
-                    sizeof (struct dep));
+                    sizeof (struct dep), 0);
 
       if (! new)
         new = ood;
index 2ea1ac4..8c4a45d 100644 (file)
@@ -361,7 +361,7 @@ string_glob (char *line)
                          That would break examples like:
                          $(patsubst ./%.c,obj/%.o,$(wildcard ./?*.c)).  */
                       0),
-                     sizeof (struct nameseq));
+                     sizeof (struct nameseq), 1);
 
   if (result == 0)
     {
@@ -372,26 +372,20 @@ string_glob (char *line)
   idx = 0;
   while (chain != 0)
     {
-      const char *name = chain->name;
-      unsigned int len = strlen (name);
-
       struct nameseq *next = chain->next;
+      unsigned int len = strlen (chain->name);
+
+      if (idx + len + 1 > length)
+        {
+          length += (len + 1) * 2;
+          result = xrealloc (result, length);
+        }
+      memcpy (&result[idx], chain->name, len);
+      idx += len;
+      result[idx++] = ' ';
+
       free (chain);
       chain = next;
-
-      /* multi_glob will pass names without globbing metacharacters
-        through as is, but we want only files that actually exist.  */
-      if (file_exists_p (name))
-       {
-         if (idx + len + 1 > length)
-           {
-             length += (len + 1) * 2;
-             result = xrealloc (result, length);
-           }
-         memcpy (&result[idx], name, len);
-         idx += len;
-         result[idx++] = ' ';
-       }
     }
 
   /* Kill the last space and terminate the string.  */
index b536a58..ee88f97 100644 (file)
@@ -584,7 +584,7 @@ pattern_search (struct file *file, int archive,
                           parse_file_seq (&p2,
                                           order_only ? '\0' : '|',
                                           sizeof (struct idep),
-                                          1), sizeof (struct idep));
+                                          1), sizeof (struct idep), 0);
 
                       /* @@ It would be nice to teach parse_file_seq or
                          multi_glob to add prefix. This would save us some
diff --git a/main.c b/main.c
index 8261fef..1c30884 100644 (file)
--- a/main.c
+++ b/main.c
@@ -2193,7 +2193,7 @@ main (int argc, char **argv, char **envp)
               struct nameseq *ns;
 
               ns = multi_glob (parse_file_seq (&p, '\0', sizeof (struct nameseq), 1),
-                               sizeof (struct nameseq));
+                               sizeof (struct nameseq), 0);
               if (ns)
                 {
                   /* .DEFAULT_GOAL should contain one target. */
diff --git a/read.c b/read.c
index d77ed33..3071ae5 100644 (file)
--- a/read.c
+++ b/read.c
@@ -836,7 +836,7 @@ eval (struct ebuffer *ebuf, int set_default)
          files = multi_glob (parse_file_seq (&p2, '\0',
                                              sizeof (struct nameseq),
                                              1),
-                             sizeof (struct nameseq));
+                             sizeof (struct nameseq), 0);
          free (p);
 
          /* Save the state of conditionals and start
@@ -1021,7 +1021,7 @@ eval (struct ebuffer *ebuf, int set_default)
         filenames = multi_glob (parse_file_seq (&p2, '\0',
                                                 sizeof (struct nameseq),
                                                 1),
-                                sizeof (struct nameseq));
+                                sizeof (struct nameseq), 0);
         *p2 = ':';
 
         if (!filenames)
@@ -3069,10 +3069,12 @@ tilde_expand (const char *name)
 
    SIZE is how big to construct chain elements.
    This is useful if we want them actually to be other structures
-   that have room for additional info.  */
+   that have room for additional info.
+
+   If EXISTS_ONLY is true only return existing files.  */
 
 struct nameseq *
-multi_glob (struct nameseq *chain, unsigned int size)
+multi_glob (struct nameseq *chain, unsigned int size, int exists_only)
 {
   void dir_setup_glob (glob_t *);
   struct nameseq *new = 0;
@@ -3125,8 +3127,16 @@ multi_glob (struct nameseq *chain, unsigned int size)
           nlist = (const char **)gl.gl_pathv;
           break;
 
+        case GLOB_NOMATCH:
+          if (exists_only)
+            {
+              i = 0;
+              break;
+            }
+          /* FALLTHROUGH */
+
        default:
-          /* Not a match or another error; keep this name.  */
+          /* By default keep this name.  */
           i = 1;
           nlist = &gname;
          break;
diff --git a/rule.c b/rule.c
index ef0bf9b..652c7a2 100644 (file)
--- a/rule.c
+++ b/rule.c
@@ -378,7 +378,7 @@ install_pattern_rule (struct pspec *p, int terminal)
   ptr = p->dep;
   r->deps = (struct dep *) multi_glob (parse_file_seq (&ptr, '\0',
                                                        sizeof (struct dep), 1),
-                                      sizeof (struct dep));
+                                      sizeof (struct dep), 0);
 
   if (new_pattern_rule (r, 0))
     {
index 948d570..ddae67e 100644 (file)
@@ -1,5 +1,13 @@
+2009-06-13  Paul Smith  <psmith@gnu.org>
+
+       * scripts/functions/wildcard: Test that wildcards with
+       non-existent glob matchers return empty.
+
 2009-06-09  Paul Smith  <psmith@gnu.org>
 
+       * scripts/options/dash-B: Test the $? works correctly with -B.
+       Savannah bug #17825.
+
        * scripts/features/patternrules: Test that dependencies of
        "also_make" targets are created properly.  Savannah bug #19108.
 
index d61384e..2841f5d 100644 (file)
@@ -81,14 +81,11 @@ if ((-f "example.1")||(-f "example.two")||(-f "example.3")||(-f "example.for"))
 
 &compare_output($answer,&get_logfile(1));
 
+# TEST #4: Verify that failed wildcards don't return the pattern
 
-1;
-
-
-
-
-
-
-
-
+run_make_test(q!
+all: ; @echo $(wildcard xz--y*.7)
+!,
+              '', "\n");
 
+1;
index 864a01f..e36842e 100644 (file)
@@ -70,4 +70,16 @@ all');
 
 rmfiles('foo.x', 'blah.x');
 
+# Test that $? is set properly with -B; all prerequisites will be newer!
+
+utouch(-10, 'x.b');
+touch('x.a');
+
+run_make_test(q!
+x.a: x.b ; @echo $?
+!,
+              '-B', "x.b\n");
+
+unlink(qw(x.a x.b));
+
 1;