diff --git a/ChangeLog b/ChangeLog index 5d1765e1..3e53a552 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,23 @@ +2009-06-13 Paul Smith + + * 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 + * 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 ee6fc6e3..7bd9531b 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 0f3cde56..170378eb 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 08d0cb11..ec2420e1 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 95e37889..a618bebc 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 2ea1ac47..8c4a45d3 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 b536a582..ee88f97f 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 8261fefd..1c308846 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 d77ed333..3071ae56 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 ef0bf9b3..652c7a2e 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 948d570c..ddae67e3 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,5 +1,13 @@ +2009-06-13 Paul Smith + + * scripts/functions/wildcard: Test that wildcards with + non-existent glob matchers return empty. + 2009-06-09 Paul Smith + * 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 d61384e2..2841f5d5 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 + +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 864a01f2..e36842e3 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;