Extend .SECONDEXPANSION to implicit rules. Final fix for bug #13781.

This commit is contained in:
Paul Smith 2005-12-11 15:41:17 +00:00
parent 0e6c4f5b0e
commit 3bcb608bda
6 changed files with 103 additions and 29 deletions

View file

@ -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

View file

@ -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';
p2 = variable_expand_for_file (depname, file);
if (check_lastslash)
add_dir = 1;
had_stem = 1;
}
else
{
bcopy (p, depname, len);
depname[len] = '\0';
}
p2 = depname;
}
/* Parse the dependencies. */

6
read.c
View file

@ -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);
}

View file

@ -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.

View file

@ -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

View file

@ -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;