diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | implicit.c | 78 | ||||
-rw-r--r-- | read.c | 6 | ||||
-rw-r--r-- | tests/ChangeLog | 6 | ||||
-rw-r--r-- | tests/scripts/features/se_implicit | 8 | ||||
-rw-r--r-- | tests/scripts/misc/general4 | 27 |
6 files changed, 103 insertions, 29 deletions
@@ -1,3 +1,10 @@ +2005-12-11 Paul D. Smith <psmith@gnu.org> + + * implicit.c (pattern_search): If 2nd expansion is not set for + this implicit rule, replace the pattern with the stem directly, + and don't re-expand the variable list. Along with the other + .SECONDEXPANSION changes below, fixes bug #13781. + 2005-12-09 Boris Kolpackov <boris@kolpackov.net> * implicit.c (pattern_search): Mark other files that this rule @@ -502,41 +502,71 @@ pattern_search (struct file *file, int archive, if (p == 0) break; /* No more words */ - /* If the dependency name has %, substitute the stem. - Watch out, we are going to do something tricky here. If - we just replace % with the stem value, later, when we do - the second expansion, we will re-expand this stem value - once again. This is not good especially if you have - certain characters in your stem (like $). - - Instead, we will replace % with $* and allow the second - expansion to take care of it for us. This way (since $* - is a simple variable) there won't be additional - re-expansion of the stem. */ + /* Is there a pattern in this prerequisite? */ for (p2 = p; p2 < p + len && *p2 != '%'; ++p2) ; - if (p2 < p + len) + if (dep->need_2nd_expansion) { - register unsigned int i = p2 - p; - bcopy (p, depname, i); - bcopy ("$*", depname + i, 2); - bcopy (p2 + 1, depname + i + 2, len - i - 1); - depname[len + 2 - 1] = '\0'; + /* If the dependency name has %, substitute the stem. - if (check_lastslash) - add_dir = 1; + Watch out, we are going to do something tricky + here. If we just replace % with the stem value, + later, when we do the second expansion, we will + re-expand this stem value once again. This is not + good especially if you have certain characters in + your stem (like $). - had_stem = 1; + Instead, we will replace % with $* and allow the + second expansion to take care of it for us. This way + (since $* is a simple variable) there won't be + additional re-expansion of the stem. */ + + if (p2 < p + len) + { + register unsigned int i = p2 - p; + bcopy (p, depname, i); + bcopy ("$*", depname + i, 2); + bcopy (p2 + 1, depname + i + 2, len - i - 1); + depname[len + 2 - 1] = '\0'; + + if (check_lastslash) + add_dir = 1; + + had_stem = 1; + } + else + { + bcopy (p, depname, len); + depname[len] = '\0'; + } + + p2 = variable_expand_for_file (depname, file); } else { - bcopy (p, depname, len); - depname[len] = '\0'; - } + if (p2 < p + len) + { + register unsigned int i = p2 - p; + bcopy (p, depname, i); + bcopy (stem_str, depname + i, stemlen); + bcopy (p2 + 1, depname + i + stemlen, len - i - 1); + depname[len + stemlen - 1] = '\0'; + + if (check_lastslash) + add_dir = 1; + + had_stem = 1; + } + else + { + bcopy (p, depname, len); + depname[len] = '\0'; + } - p2 = variable_expand_for_file (depname, file); + p2 = depname; + } /* Parse the dependencies. */ @@ -2131,11 +2131,7 @@ record_files (struct nameseq *filenames, char *pattern, char *pattern_percent, targets[target_idx] = 0; target_percents[target_idx] = 0; if (deps) - { - deps->need_2nd_expansion = second_expansion; - /* We set this to indicate the prereq string hasn't been parsed. */ - deps->staticpattern = 1; - } + deps->need_2nd_expansion = second_expansion; create_pattern_rule (targets, target_percents, two_colon, deps, cmds, 1); free ((char *) target_percents); } diff --git a/tests/ChangeLog b/tests/ChangeLog index e222ef1..9320597 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,9 @@ +2005-12-11 Paul D. Smith <psmith@gnu.org> + + * scripts/misc/general4: Test implicit rules with '$' in the + prereq list & prereq patterns. + * scripts/features/se_implicit: Add in .SECONDEXPANSION settings. + 2005-12-09 Boris Kolpackov <boris@kolpackov.net> * scripts/features/patternrules: Add a test for bug #13022. diff --git a/tests/scripts/features/se_implicit b/tests/scripts/features/se_implicit index 0c38c17..c2ae648 100644 --- a/tests/scripts/features/se_implicit +++ b/tests/scripts/features/se_implicit @@ -12,6 +12,7 @@ $dir =~ s,.*/([^/]+)$,../$1,; # Test #1: automatic variables. # run_make_test(' +.SECONDEXPANSION: .DEFAULT: ; @echo $@ foo.a: bar baz @@ -60,6 +61,7 @@ buz # Test #2: target/pattern -specific variables. # run_make_test(' +.SECONDEXPANSION: foo.x: foo.%: $$(%_a) $$(%_b) bar @@ -81,6 +83,7 @@ baz # Test #3: order of prerequisites. # run_make_test(' +.SECONDEXPANSION: .DEFAULT: ; @echo $@ all: foo bar baz @@ -132,6 +135,7 @@ baz.2 # Test #4: stem splitting logic. # run_make_test(' +.SECONDEXPANSION: $(dir)/tmp/bar.o: $(dir)/tmp/foo/bar.c: ; @echo $@ @@ -153,6 +157,7 @@ $dir/tmp/bar.o: {$dir/tmp/foo/bar.c} $dir/tmp/foo/bar.c $dir/tmp/bar/bar.c foo.h # Test #5: stem splitting logic and order-only prerequisites. # run_make_test(' +.SECONDEXPANSION: $(dir)/tmp/foo.o: $(dir)/tmp/foo.c $(dir)/tmp/foo.c: ; @echo $@ bar.h: ; @echo $@ @@ -171,6 +176,7 @@ $dir/tmp/foo.o: {$dir/tmp/foo.c} {bar.h} $dir/tmp/foo.c # Test #6: lack of implicit prerequisites. # run_make_test(' +.SECONDEXPANSION: foo.o: foo.c foo.c: ; @echo $@ @@ -186,6 +192,7 @@ foo.o: {foo.c} foo.c # Test #7: Test stem from the middle of the name. # run_make_test(' +.SECONDEXPANSION: foobarbaz: foo%baz: % $$*.1 @@ -204,6 +211,7 @@ bar # Test #8: Make sure stem triple-expansion does not happen. # run_make_test(' +.SECONDEXPANSION: foo$$bar: f%r: % $$*.1 diff --git a/tests/scripts/misc/general4 b/tests/scripts/misc/general4 index bce4a30..ccccf88 100644 --- a/tests/scripts/misc/general4 +++ b/tests/scripts/misc/general4 @@ -53,4 +53,31 @@ baz$$bar bar$$baz: ; @echo '$@' '', "baz\$bar\ndone baz\$bar"); + +# Test implicit rules with '$' in the name (see se_implicit) +# Use the '$' in the pattern. + +run_make_test(q! +%.foo : %$$bar ; @echo 'done $<' +test.foo: +test$$bar: ; @echo '$@' +!, + '', + "test\$bar\ndone test\$bar"); + +# Make sure that subdirectories built as prerequisites are actually handled +# properly... this time with '$' + +run_make_test(q! + +all: dir/subdir/file.$$a + +dir/subdir: ; @echo mkdir -p '$@' + +dir/subdir/file.$$b: dir/subdir ; @echo touch '$@' + +dir/subdir/%.$$a: dir/subdir/%.$$b ; @echo 'cp $< $@' +!, + '', "mkdir -p dir/subdir\ntouch dir/subdir/file.\$b\ncp dir/subdir/file.\$b dir/subdir/file.\$a\n"); + 1; |