summaryrefslogtreecommitdiff
path: root/tests/scripts/features/statipattrules
diff options
context:
space:
mode:
Diffstat (limited to 'tests/scripts/features/statipattrules')
-rw-r--r--tests/scripts/features/statipattrules208
1 files changed, 204 insertions, 4 deletions
diff --git a/tests/scripts/features/statipattrules b/tests/scripts/features/statipattrules
index 3f363de..e4e118e 100644
--- a/tests/scripts/features/statipattrules
+++ b/tests/scripts/features/statipattrules
@@ -72,13 +72,15 @@ foo.baz: ;@:
# perprerequisite's stem (Savannah bug #16053).
#
run_make_test('
+.RECIPEPREFIX := >
+
all.foo.bar: %.foo.bar: %.one
all.foo.bar: %.bar: %.two
all.foo.bar:
- @echo $*
- @echo $^
+> @echo $*
+> @echo $^
.DEFAULT:;@:
',
@@ -92,6 +94,7 @@ all.one all.foo.two');
# (Savannah bug #16053).
#
run_make_test('
+.RECIPEPREFIX := >
.SECONDEXPANSION:
all.foo.bar: %.foo.bar: %.one $$*-one
@@ -99,8 +102,8 @@ all.foo.bar: %.foo.bar: %.one $$*-one
all.foo.bar: %.bar: %.two $$*-two
all.foo.bar:
- @echo $*
- @echo $^
+> @echo $*
+> @echo $^
.DEFAULT:;@:
',
@@ -108,4 +111,201 @@ all.foo.bar:
'all.foo
all.one all-one all.foo.two all.foo-two');
+# Test #8:
+# sv 60188.
+# Static pattern rules are considered explicit rules: no prerequisite of
+# a static pattern rule can ever be considered intermediate.
+
+touch('hello.z');
+
+# subtest 1
+run_make_test(q!
+hello.z: %.z: %.x ; @echo $@
+%.x: ;
+!, '', "hello.z\n");
+
+# subtest 2
+run_make_test(q!
+hello.z: %.z: %.x test.x ; @echo $@
+%.x: ;
+!, '', "hello.z\n");
+
+# subtest 3
+# 'hello.x' is mentioned explicitly on an unrelated rule.
+run_make_test(q!
+hello.z: %.z: %.x ; @echo $@
+%.x: ;
+unrelated: hello.x
+!, '', "hello.z\n");
+
+unlink('hello.z');
+
+# sv 17374 Ensure double-colon static pattern rules work
+
+touch(qw(a.src b.src));
+
+run_make_test(q!
+all: a.tgt b.tgt
+a.tgt b.tgt:: %.tgt : %.src ; cp $< $@
+!,
+ '', "cp a.src a.tgt\ncp b.src b.tgt\n");
+
+unlink(qw(a.src b.src a.tgt b.tgt));
+
+my @dir = ('', 'lib/'); # With and without last slash.
+my @secondexpansion = ('', '.SECONDEXPANSION:');
+
+# The following combinations are generated with and without second expansion.
+# 1.
+# all: bye.x
+# bye.x: %.x: ...
+#
+# 2.
+# all: lib/bye.x
+# lib/bye.x: %.x: ...
+#
+# 3.
+# all: lib/bye.x
+# lib/bye.x: lib/%.x: ...
+#
+# The following combination is not generated, because there is no rule to
+# build bye.x, no stem substitution takes place, not of interest of this test.
+# 4.
+# all: bye.x
+# bye.x: lib/%.x: ...
+#
+
+for my $se (@secondexpansion) {
+for my $d (@dir) { # The directory of the prerequisite of 'all'.
+for my $r (@dir) { # The directory of the prerequisite in the rule definition.
+(!$d && $r) && next; # Combination 4.
+my $dollar = $se ? '$' : '';
+
+# The prerequisite should only have directory if the prerequisite of 'all' has
+# it and if the prequisite pattern in the rule definition does not have it.
+# That is combination 2.
+my $pdir = $d && !$r ? $d : '';
+
+
+# One func, one %.
+my $prereqs = "${pdir}bye.1";
+run_make_test("
+$se
+.PHONY: $prereqs
+all: ${d}bye.x
+${d}bye.x: $r%.x: $dollar\$(firstword %.1); \$(info \$@ from \$^)
+", '', "${d}bye.x from $prereqs\n#MAKE#: Nothing to be done for 'all'.\n");
+
+
+# Multiple funcs, each has one %.
+$prereqs = "${pdir}bye.1 ${pdir}bye.2";
+run_make_test("
+$se
+.PHONY: $prereqs
+all: ${d}bye.x
+${d}bye.x: $r%.x: $dollar\$(firstword %.1) $dollar\$(firstword %.2); \$(info \$@ from \$^)
+", '', "${d}bye.x from $prereqs\n#MAKE#: Nothing to be done for 'all'.\n");
+
+
+# Multiple funcs, each has multiple %.
+$prereqs = "${pdir}bye.1 ${pdir}bye.2 ${pdir}bye.3 ${pdir}bye.4";
+run_make_test("
+$se
+.PHONY: $prereqs
+all: ${d}bye.x
+${d}bye.x: $r%.x: $dollar\$(wordlist 1, 99, %.1 %.2) $dollar\$(wordlist 1, 99, %.3 %.4); \$(info \$@ from \$^)
+", '', "${d}bye.x from $prereqs\n#MAKE#: Nothing to be done for 'all'.\n");
+
+
+# Multiple funcs, each has multiple %, each prerequisite has multiple %.
+$prereqs = "${pdir}bye_%_%.1 ${pdir}bye_%_%.2 ${pdir}bye_%_%.3 ${pdir}bye_%_%.4";
+run_make_test("
+$se
+.PHONY: $prereqs
+all: ${d}bye.x
+${d}bye.x: $r%.x: $dollar\$(wordlist 1, 99, %_%_%.1 %_%_%.2) $dollar\$(wordlist 1, 99, %_%_%.3 %_%_%.4); \$(info \$@ from \$^)
+", '', "${d}bye.x from $prereqs\n#MAKE#: Nothing to be done for 'all'.\n");
+
+
+# Nested functions.
+$prereqs = "${pdir}bye.1 ${pdir}bye.2 ${pdir}bye.3 ${pdir}bye.4";
+run_make_test("
+$se
+.PHONY: $prereqs
+all: ${d}bye.x
+${d}bye.x: $r%.x: $dollar\$(wordlist 1, 99, $dollar\$(wordlist 1, 99, %.1 %.2)) $dollar\$(wordlist 1, 99, $dollar\$(wordlist 1,99, %.3 %.4)); \$(info \$@ from \$^)
+", '', "${d}bye.x from $prereqs\n#MAKE#: Nothing to be done for 'all'.\n");
+
+
+# Multiple funcs, each has multiple words, each word has multiple %, sole %,
+# various corner cases.
+# Make should substitude the first % and only the first % in each word with the
+# stem.
+$prereqs = "${pdir}bye1%2% ${pdir}bye 3${pdir}bye4%5 6${pdir}bye ${pdir}bye7%8 ${pdir}bye9 ${pdir}bye10% 11${pdir}bye12 13";
+run_make_test("
+$se
+.PHONY: $prereqs
+all: ${d}bye.x
+${d}bye.x: $r%.x: $dollar\$(wordlist 1, 99, %1%2% % 3%4%5 6%) %7%8 %9 $dollar\$(wordlist 1, 99, %10% 11%12) 13; \$(info \$@ from \$^)
+", '', "${d}bye.x from $prereqs\n#MAKE#: Nothing to be done for 'all'.\n");
+
+
+if ($port_type eq 'UNIX') {
+# Test that make does not use some hardcoded array of a finite size on stack.
+# Long prerequisite name. This prerequisite name is over 66K long.
+my $prefix = 'abcdefgh' x 128 x 33; # 33K long.
+my $suffix = 'stuvwxyz' x 128 x 33; # 33K long.
+$prereqs = "${prefix}${pdir}bye${suffix}.1 ${prefix}${pdir}bye${suffix}.2";
+run_make_test("
+$se
+.PHONY: $prereqs
+all: ${d}bye.x
+${d}bye.x: $r%.x: $dollar\$(wordlist 1, 99, ${prefix}%${suffix}.1 ${prefix}%${suffix}.2); \$(info \$@ from \$^)
+", '', "${d}bye.x from $prereqs\n#MAKE#: Nothing to be done for 'all'.\n");
+}
+
+
+# Empty stem.
+$prereqs = "${pdir}.1";
+run_make_test("
+$se
+.PHONY: $prereqs
+all: ${d}bye.x
+${d}bye.x: $r%bye.x: $dollar\$(firstword %.1); \$(info \$@ from \$^)
+", '', "${d}bye.x from $prereqs\n#MAKE#: Nothing to be done for 'all'.\n");
+
+
+# A word expands to an empty prerequisite.
+run_make_test("
+$se
+all: ${d}bye.x
+${d}bye.x: $r%.x: $dollar\$(%); \$(info \$@ from \$^)
+", '', "${d}bye.x from \n#MAKE#: Nothing to be done for 'all'.\n");
+
+}
+}
+}
+
+# Escaped %.
+# The following combinations are generated without second expansion.
+# 1.
+# all: the%weird\\_hello_pattern\\.x
+# the\\%weird\\_hello_pattern\\.x: the\\%weird\\_%_pattern\\.x: ...
+#
+# 2.
+# all: lib/the%weird\\_hello_pattern\\.x
+# lib/the\\%weird\\_hello_pattern\\.x: lib/the\\%weird\\_%_pattern\\.x: ...
+#
+# Other combinations or second expansion are not tested, because escaped % is
+# not implemented for those.
+
+for my $d (@dir) {
+my $prereqs = "${d}the%weird\\\\_hello_pattern%\\\\.1 ${d}the%weird\\\\_hello_pattern%\\\\.2";
+run_make_test("
+.PHONY: $prereqs
+all: ${d}the%weird\\\\_hello_pattern\\\\.x
+${d}the\\%weird\\\\_hello_pattern\\\\.x: ${d}the\\%weird\\\\_%_pattern\\\\.x: \$(wordlist 1, 99, ${d}the\\%weird\\\\_%_pattern%\\\\.1 ${d}the\\%weird\\\\_%_pattern%\\\\.2); \$(info \$@ from \$^)
+", '', "${d}the%weird\\\\_hello_pattern\\\\.x from $prereqs\n#MAKE#: Nothing to be done for 'all'.\n");
+}
+
1;