diff options
-rw-r--r-- | ChangeLog | 18 | ||||
-rw-r--r-- | commands.c | 2 | ||||
-rw-r--r-- | default.c | 2 | ||||
-rw-r--r-- | dep.h | 2 | ||||
-rw-r--r-- | file.c | 4 | ||||
-rw-r--r-- | function.c | 30 | ||||
-rw-r--r-- | implicit.c | 2 | ||||
-rw-r--r-- | main.c | 2 | ||||
-rw-r--r-- | read.c | 20 | ||||
-rw-r--r-- | rule.c | 2 | ||||
-rw-r--r-- | tests/ChangeLog | 8 | ||||
-rw-r--r-- | tests/scripts/functions/wildcard | 15 | ||||
-rw-r--r-- | tests/scripts/options/dash-B | 12 |
13 files changed, 79 insertions, 40 deletions
@@ -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. @@ -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; @@ -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); } } @@ -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 @@ -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; @@ -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. */ @@ -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 @@ -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. */ @@ -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; @@ -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; |