mirror of
https://github.com/mirror/make.git
synced 2025-02-13 21:31:10 +08:00
I decided this feature was too impacting to make the permanent default behavior. This set of changes makes the default behavior of make the old behavior (no second expansion). If you want second expansion, you must define the .SECONDEXPANSION: special target before the first target that needs it. This set of changes ONLY fixes explicit and static pattern rules to work like this. Implicit rules still have second expansion enabled all the time: I'll work on that next. Note that there is still a backward-incompatibility: now to get the old SysV behavior using $$@ etc. in the prerequisites list you need to set .SECONDEXPANSION: as well.
58 lines
1.3 KiB
Perl
58 lines
1.3 KiB
Perl
# -*-perl-*-
|
|
|
|
$description = "\
|
|
This tests random features of make's algorithms, often somewhat obscure,
|
|
which have either broken at some point in the past or seem likely to
|
|
break.";
|
|
|
|
run_make_test('
|
|
# Make sure that subdirectories built as prerequisites are actually handled
|
|
# properly.
|
|
|
|
all: dir/subdir/file.a
|
|
|
|
dir/subdir: ; @echo mkdir -p dir/subdir
|
|
|
|
dir/subdir/file.b: dir/subdir ; @echo touch dir/subdir/file.b
|
|
|
|
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");
|
|
|
|
# Test implicit rules
|
|
|
|
&touch('foo.c');
|
|
run_make_test('foo: foo.o',
|
|
'CC="@echo cc" OUTPUT_OPTION=',
|
|
'cc -c foo.c
|
|
cc foo.o -o foo');
|
|
unlink('foo.c');
|
|
|
|
|
|
# Test other implicit rule searching
|
|
|
|
&touch('bar');
|
|
run_make_test('
|
|
test.foo:
|
|
%.foo : baz ; @echo done $<
|
|
%.foo : bar ; @echo done $<
|
|
fox: baz
|
|
',
|
|
'',
|
|
'done bar');
|
|
unlink('bar');
|
|
|
|
|
|
# Test implicit rules with '$' in the name (see se_implicit)
|
|
|
|
run_make_test(q!
|
|
%.foo : baz$$bar ; @echo 'done $<'
|
|
%.foo : bar$$baz ; @echo 'done $<'
|
|
test.foo:
|
|
fox: baz
|
|
.DEFAULT baz$$bar bar$$baz: ; @echo '$@'
|
|
!,
|
|
'',
|
|
'done bar');
|
|
|
|
1;
|