diff --git a/make-3.82-stem_glob.patch b/make-3.82-stem_glob.patch new file mode 100644 index 0000000..df30e3c --- /dev/null +++ b/make-3.82-stem_glob.patch @@ -0,0 +1,194 @@ +diff -up make-3.82/default.c~ make-3.82/default.c +--- make-3.82/default.c~ 2010-07-13 03:20:39.000000000 +0200 ++++ make-3.82/default.c 2013-07-26 19:28:27.372056421 +0200 +@@ -542,9 +542,8 @@ set_default_suffixes (void) + else + { + char *p = default_suffixes; +- suffix_file->deps = enter_prereqs(PARSE_FILE_SEQ (&p, struct dep, '\0', +- NULL, 0), +- NULL); ++ suffix_file->deps = enter_prereqs (PARSE_SIMPLE_SEQ (&p, struct dep), ++ NULL); + define_variable_cname ("SUFFIXES", default_suffixes, o_default, 0); + } + } +diff -up make-3.82/dep.h~ make-3.82/dep.h +--- make-3.82/dep.h~ 2010-07-13 03:20:39.000000000 +0200 ++++ make-3.82/dep.h 2013-07-26 19:40:03.121285291 +0200 +@@ -65,6 +65,8 @@ struct nameseq + + #define PARSE_FILE_SEQ(_s,_t,_c,_p,_f) \ + (_t *)parse_file_seq ((_s),sizeof (_t),(_c),(_p),(_f)) ++#define PARSE_SIMPLE_SEQ(_s,_t) \ ++ (_t *)parse_file_seq ((_s),sizeof (_t),'\0',NULL,PARSEFS_NONE) + + #ifdef VMS + void *parse_file_seq (); +diff -up make-3.82/file.c~ make-3.82/file.c +--- make-3.82/file.c~ 2010-07-13 03:20:39.000000000 +0200 ++++ make-3.82/file.c 2013-07-26 19:40:47.067541216 +0200 +@@ -426,7 +426,7 @@ remove_intermediates (int sig) + struct dep * + split_prereqs (char *p) + { +- struct dep *new = PARSE_FILE_SEQ (&p, struct dep, '|', NULL, 0); ++ struct dep *new = PARSE_FILE_SEQ (&p, struct dep, '|', NULL, PARSEFS_NONE); + + if (*p) + { +@@ -435,7 +435,7 @@ split_prereqs (char *p) + struct dep *ood; + + ++p; +- ood = PARSE_FILE_SEQ (&p, struct dep, '\0', NULL, 0); ++ ood = PARSE_SIMPLE_SEQ (&p, struct dep); + + if (! new) + new = ood; +diff -up make-3.82/implicit.c~ make-3.82/implicit.c +--- make-3.82/implicit.c~ 2010-07-13 03:20:40.000000000 +0200 ++++ make-3.82/implicit.c 2013-07-26 19:42:33.650161869 +0200 +@@ -254,8 +254,6 @@ pattern_search (struct file *file, int a + that is not just `%'. */ + int specific_rule_matched = 0; + +- struct dep dep_simple; +- + unsigned int ri; /* uninit checks OK */ + struct rule *rule; + +@@ -530,11 +528,9 @@ pattern_search (struct file *file, int a + /* If we don't need a second expansion, just replace the %. */ + if (! dep->need_2nd_expansion) + { +- dep_simple = *dep; +- dep_simple.next = 0; + p = strchr (nptr, '%'); + if (p == 0) +- dep_simple.name = nptr; ++ strcpy (depname, nptr); + else + { + char *o = depname; +@@ -548,13 +544,19 @@ pattern_search (struct file *file, int a + memcpy (o, stem_str, stemlen); + o += stemlen; + strcpy (o, p + 1); +- dep_simple.name = strcache_add (depname); + } +- dl = &dep_simple; ++ ++ /* Parse the expanded string. It might have wildcards. */ ++ p = depname; ++ dl = PARSE_SIMPLE_SEQ (&p, struct dep); ++ for (d = dl; d != NULL; d = d->next) ++ { ++ ++deps_found; ++ d->ignore_mtime = dep->ignore_mtime; ++ } + + /* We've used up this dep, so next time get a new one. */ + nptr = 0; +- ++deps_found; + } + + /* We have to perform second expansion on this prereq. In an +@@ -633,7 +635,7 @@ pattern_search (struct file *file, int a + + /* Parse the expanded string. */ + dl = PARSE_FILE_SEQ (&p, struct dep, order_only ? '\0' : '|', +- add_dir ? dir : NULL, 0); ++ add_dir ? dir : NULL, PARSEFS_NONE); + + for (d = dl; d != NULL; d = d->next) + { +@@ -777,8 +779,7 @@ pattern_search (struct file *file, int a + } + + /* Free the ns chain. */ +- if (dl != &dep_simple) +- free_dep_chain (dl); ++ free_dep_chain (dl); + + if (failed) + break; +diff -up make-3.82/main.c~ make-3.82/main.c +--- make-3.82/main.c~ 2013-07-26 19:27:26.076702728 +0200 ++++ make-3.82/main.c 2013-07-26 19:42:57.476300585 +0200 +@@ -2276,7 +2276,7 @@ main (int argc, char **argv, char **envp + { + struct nameseq *ns; + +- ns = PARSE_FILE_SEQ (&p, struct nameseq, '\0', NULL, 0); ++ ns = PARSE_SIMPLE_SEQ (&p, struct nameseq); + if (ns) + { + /* .DEFAULT_GOAL should contain one target. */ +diff -up make-3.82/read.c~ make-3.82/read.c +--- make-3.82/read.c~ 2013-07-26 19:27:26.122702993 +0200 ++++ make-3.82/read.c 2013-07-26 19:43:42.004559875 +0200 +@@ -1033,7 +1033,7 @@ eval (struct ebuffer *ebuf, int set_defa + /* Make the colon the end-of-string so we know where to stop + looking for targets. */ + *colonp = '\0'; +- filenames = PARSE_FILE_SEQ (&p2, struct nameseq, '\0', NULL, 0); ++ filenames = PARSE_SIMPLE_SEQ (&p2, struct nameseq); + *p2 = ':'; + + if (!filenames) +diff -up make-3.82/rule.c~ make-3.82/rule.c +--- make-3.82/rule.c~ 2010-07-19 09:10:54.000000000 +0200 ++++ make-3.82/rule.c 2013-07-26 19:44:03.956687696 +0200 +@@ -377,7 +377,7 @@ install_pattern_rule (struct pspec *p, i + ++r->suffixes[0]; + + ptr = p->dep; +- r->deps = PARSE_FILE_SEQ (&ptr, struct dep, '\0', NULL, 0); ++ r->deps = PARSE_SIMPLE_SEQ (&ptr, struct dep); + + if (new_pattern_rule (r, 0)) + { +diff --git a/tests/scripts/features/rule_glob b/tests/scripts/features/rule_glob +new file mode 100644 +index 0000000..2d377e7 +--- /dev/null ++++ b/tests/scripts/features/rule_glob +@@ -0,0 +1,37 @@ ++# -*-perl-*- ++ ++$description = "Test globbing in targets and prerequisites."; ++ ++$details = ""; ++ ++touch(qw(a.one a.two a.three)); ++ ++# Test wildcards in regular targets and prerequisites ++run_make_test(q{ ++.PHONY: all a.one a.two a.three ++all: a.one* a.t[a-z0-9]o a.th[!q]ee ++a.o[Nn][Ee] a.t*: ; @echo $@ ++}, ++ '', "a.one\na.two\na.three"); ++ ++# Test wildcards in pattern targets and prerequisites ++run_make_test(q{ ++.PHONY: all ++all: a.four ++%.four : %.t* ; @echo $@: $(sort $^) ++}, ++ '', "a.four: a.three a.two"); ++ ++# Test wildcards in second expansion targets and prerequisites ++run_make_test(q{ ++.PHONY: all ++all: a.four ++.SECONDEXPANSION: ++%.four : $$(sort %.t*) ; @echo $@: $(sort $^) ++}, ++ '', "a.four: a.three a.two"); ++ ++unlink(qw(a.one a.two a.three)); ++ ++# This tells the test driver that the perl test script executed properly. ++1; diff --git a/make.spec b/make.spec index 8877907..36edb00 100644 --- a/make.spec +++ b/make.spec @@ -3,7 +3,7 @@ Summary: A GNU tool which simplifies the build process for users Name: make Epoch: 1 Version: 3.82 -Release: 14%{?dist} +Release: 15%{?dist} License: GPLv2+ Group: Development/Tools URL: http://www.gnu.org/software/make/ @@ -46,6 +46,11 @@ Patch16: make-3.82-dont-prune-intermediate.patch # Additional fix for https://savannah.gnu.org/bugs/?30612 Patch18: make-3.82-empty-members.patch +# Can't use a stem and a glob in the same dependency. +# https://savannah.gnu.org/bugs/?39310 +# https://bugzilla.redhat.com/show_bug.cgi?id=987672 +Patch19: make-3.82-stem_glob.patch + BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) Requires(post): /sbin/install-info Requires(preun): /sbin/install-info @@ -78,6 +83,7 @@ makefile. %patch15 -p0 %patch16 -p0 %patch18 -p1 +%patch19 -p1 rm -f tests/scripts/features/parallelism.orig %build @@ -121,6 +127,10 @@ fi %{_infodir}/*.info* %changelog +* Fri Jul 26 2013 Petr Machata - 1:3.82-15 +- Backport upstream patch that adds wildcard expansion to pattern + rules. (make-3.82-stem_glob.patch) + * Wed Jun 19 2013 Petr Machata - 1:3.82-14 - Add another fix for upstream bug 30612