summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog18
-rw-r--r--commands.c2
-rw-r--r--default.c2
-rw-r--r--dep.h2
-rw-r--r--file.c4
-rw-r--r--function.c30
-rw-r--r--implicit.c2
-rw-r--r--main.c2
-rw-r--r--read.c20
-rw-r--r--rule.c2
-rw-r--r--tests/ChangeLog8
-rw-r--r--tests/scripts/functions/wildcard15
-rw-r--r--tests/scripts/options/dash-B12
13 files changed, 79 insertions, 40 deletions
diff --git a/ChangeLog b/ChangeLog
index 5d1765e..3e53a55 100644
--- 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.
diff --git a/commands.c b/commands.c
index ee6fc6e..7bd9531 100644
--- a/commands.c
+++ b/commands.c
@@ -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;
diff --git a/default.c b/default.c
index 0f3cde5..170378e 100644
--- 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
--- 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
--- 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;
diff --git a/function.c b/function.c
index 2ea1ac4..8c4a45d 100644
--- a/function.c
+++ b/function.c
@@ -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. */
diff --git a/implicit.c b/implicit.c
index b536a58..ee88f97 100644
--- a/implicit.c
+++ b/implicit.c
@@ -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
--- 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
--- 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
--- 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))
{
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 948d570..ddae67e 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -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.
diff --git a/tests/scripts/functions/wildcard b/tests/scripts/functions/wildcard
index d61384e..2841f5d 100644
--- a/tests/scripts/functions/wildcard
+++ b/tests/scripts/functions/wildcard
@@ -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;
diff --git a/tests/scripts/options/dash-B b/tests/scripts/options/dash-B
index 864a01f..e36842e 100644
--- a/tests/scripts/options/dash-B
+++ b/tests/scripts/options/dash-B
@@ -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;