# -*-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 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: 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"); # Test odd whitespace at the beginning of a line run_make_test(" all: \f \\ \f \\ \013 \\ all: ; \@echo hi ", '', "hi\n"); # SV-56834 Ensure setting PATH in the makefile works properly my $sname = "foobar$scriptsuffix"; mkdir('sd', 0775); create_file("sd/$sname", "exit 0\n"); chmod 0755, "sd/$sname"; run_make_test(qq! PATH := sd all: ; $sname >/dev/null !, '', "$sname >/dev/null\n"); # Don't use the general PATH if not found on the target path $ENV{PATH} = "$ENV{PATH}:sd"; run_make_test(qq! PATH := .. all: ; $sname !, '', "$sname\n#MAKE#: $sname: $ERR_no_such_file\n#MAKE#: *** [#MAKEFILE#:3: all] Error 127", 512); unlink("sd/$sname"); rmdir('sd'); # Ensure that local programs are not found if "." is not on the PATH create_file($sname, ''); chmod 0755, $sname; run_make_test(qq! PATH := .. all: ; $sname !, '', "$sname\n#MAKE#: $sname: $ERR_no_such_file\n#MAKE#: *** [#MAKEFILE#:3: all] Error 127", 512); unlink($sname); # SV 57674: ensure we use a system default PATH if one is not set delete $ENV{PATH}; run_make_test(q! a: ; @echo hi !, '', "hi\n"); 1;