+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.
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;
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);
}
}
};
-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
{
struct dep *new = (struct dep *)
multi_glob (parse_file_seq (&p, '|', sizeof (struct dep), 1),
- sizeof (struct dep));
+ sizeof (struct dep), 0);
if (*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;
That would break examples like:
$(patsubst ./%.c,obj/%.o,$(wildcard ./?*.c)). */
0),
- sizeof (struct nameseq));
+ sizeof (struct nameseq), 1);
if (result == 0)
{
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. */
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
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. */
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
filenames = multi_glob (parse_file_seq (&p2, '\0',
sizeof (struct nameseq),
1),
- sizeof (struct nameseq));
+ sizeof (struct nameseq), 0);
*p2 = ':';
if (!filenames)
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;
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;
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))
{
+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.
&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;
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;