1*69606e3fSchristos# -*-perl-*- 2*69606e3fSchristos 3*69606e3fSchristos$description = "Test automatic variable setting."; 4*69606e3fSchristos 5*69606e3fSchristos$details = ""; 6*69606e3fSchristos 7*69606e3fSchristosuse Cwd; 8*69606e3fSchristos 9*69606e3fSchristos$dir = cwd; 10*69606e3fSchristos$dir =~ s,.*/([^/]+)$,../$1,; 11*69606e3fSchristos 12*69606e3fSchristosopen(MAKEFILE, "> $makefile"); 13*69606e3fSchristosprint MAKEFILE "dir = $dir\n"; 14*69606e3fSchristosprint MAKEFILE <<'EOF'; 15*69606e3fSchristos.SUFFIXES: 16*69606e3fSchristos.SUFFIXES: .x .y .z 17*69606e3fSchristos$(dir)/foo.x : baz.z $(dir)/bar.y baz.z 18*69606e3fSchristos @echo '$$@ = $@, $$(@D) = $(@D), $$(@F) = $(@F)' 19*69606e3fSchristos @echo '$$* = $*, $$(*D) = $(*D), $$(*F) = $(*F)' 20*69606e3fSchristos @echo '$$< = $<, $$(<D) = $(<D), $$(<F) = $(<F)' 21*69606e3fSchristos @echo '$$^ = $^, $$(^D) = $(^D), $$(^F) = $(^F)' 22*69606e3fSchristos @echo '$$+ = $+, $$(+D) = $(+D), $$(+F) = $(+F)' 23*69606e3fSchristos @echo '$$? = $?, $$(?D) = $(?D), $$(?F) = $(?F)' 24*69606e3fSchristos touch $@ 25*69606e3fSchristos 26*69606e3fSchristos$(dir)/bar.y baz.z : ; touch $@ 27*69606e3fSchristosEOF 28*69606e3fSchristosclose(MAKEFILE); 29*69606e3fSchristos 30*69606e3fSchristos# TEST #0 -- simple test 31*69606e3fSchristos# ------- 32*69606e3fSchristos 33*69606e3fSchristos# Touch these into the past 34*69606e3fSchristos&utouch(-10, qw(foo.x baz.z)); 35*69606e3fSchristos 36*69606e3fSchristos&run_make_with_options($makefile, "", &get_logfile); 37*69606e3fSchristos$answer = "touch $dir/bar.y 38*69606e3fSchristos\$\@ = $dir/foo.x, \$(\@D) = $dir, \$(\@F) = foo.x 39*69606e3fSchristos\$* = $dir/foo, \$(*D) = $dir, \$(*F) = foo 40*69606e3fSchristos\$< = baz.z, \$(<D) = ., \$(<F) = baz.z 41*69606e3fSchristos\$^ = baz.z $dir/bar.y, \$(^D) = . $dir, \$(^F) = baz.z bar.y 42*69606e3fSchristos\$+ = baz.z $dir/bar.y baz.z, \$(+D) = . $dir ., \$(+F) = baz.z bar.y baz.z 43*69606e3fSchristos\$? = $dir/bar.y, \$(?D) = $dir, \$(?F) = bar.y 44*69606e3fSchristostouch $dir/foo.x\n"; 45*69606e3fSchristos&compare_output($answer, &get_logfile(1)); 46*69606e3fSchristos 47*69606e3fSchristosunlink(qw(foo.x bar.y baz.z)); 48*69606e3fSchristos 49*69606e3fSchristos# TEST #1 -- test the SysV emulation of $$@ etc. 50*69606e3fSchristos# ------- 51*69606e3fSchristos 52*69606e3fSchristos$makefile2 = &get_tmpfile; 53*69606e3fSchristos 54*69606e3fSchristosopen(MAKEFILE, "> $makefile2"); 55*69606e3fSchristosprint MAKEFILE "dir = $dir\n"; 56*69606e3fSchristosprint MAKEFILE <<'EOF'; 57*69606e3fSchristos.SECONDEXPANSION: 58*69606e3fSchristos.SUFFIXES: 59*69606e3fSchristos.DEFAULT: ; @echo '$@' 60*69606e3fSchristos 61*69606e3fSchristos$(dir)/foo $(dir)/bar: $@.x $$@.x $$$@.x $$$$@.x $$(@D).x $$(@F).x 62*69606e3fSchristos 63*69606e3fSchristos$(dir)/x.z $(dir)/y.z: $(dir)/%.z : $@.% $$@.% $$$@.% $$$$@.% $$(@D).% $$(@F).% 64*69606e3fSchristos 65*69606e3fSchristos$(dir)/biz: $$(@).x $${@}.x $${@D}.x $${@F}.x 66*69606e3fSchristosEOF 67*69606e3fSchristos 68*69606e3fSchristosclose(MAKEFILE); 69*69606e3fSchristos 70*69606e3fSchristos&run_make_with_options($makefile2, "$dir/foo $dir/bar", &get_logfile); 71*69606e3fSchristos$answer = ".x\n$dir/foo.x\nx\n\$@.x\n$dir.x\nfoo.x\n$dir/bar.x\nbar.x\n"; 72*69606e3fSchristos&compare_output($answer, &get_logfile(1)); 73*69606e3fSchristos 74*69606e3fSchristos&run_make_with_options($makefile2, "$dir/x.z $dir/y.z", &get_logfile); 75*69606e3fSchristos$answer = ".x\n$dir/x.z.x\nx\n\$@.x\n$dir.x\nx.z.x\n.y\n$dir/y.z.y\n\y\n\$@.y\n$dir.y\ny.z.y\n"; 76*69606e3fSchristos&compare_output($answer, &get_logfile(1)); 77*69606e3fSchristos 78*69606e3fSchristos&run_make_with_options($makefile2, "$dir/biz", &get_logfile); 79*69606e3fSchristos$answer = "$dir/biz.x\n$dir.x\nbiz.x\n"; 80*69606e3fSchristos&compare_output($answer, &get_logfile(1)); 81*69606e3fSchristos 82*69606e3fSchristos# TEST #2 -- test for Savannah bug #12320. 83*69606e3fSchristos# 84*69606e3fSchristosrun_make_test(' 85*69606e3fSchristos.SUFFIXES: .b .src 86*69606e3fSchristos 87*69606e3fSchristosmbr.b: mbr.src 88*69606e3fSchristos @echo $* 89*69606e3fSchristos 90*69606e3fSchristosmbr.src: ; @:', 91*69606e3fSchristos '', 92*69606e3fSchristos 'mbr'); 93*69606e3fSchristos 94*69606e3fSchristos# TEST #3 -- test for Savannah bug #8154 95*69606e3fSchristos# Make sure that nonexistent prerequisites are listed in $?, since they are 96*69606e3fSchristos# considered reasons for the target to be rebuilt. 97*69606e3fSchristos# 98*69606e3fSchristos# This was undone due to Savannah bug #16002. We'll re-do it in the next 99*69606e3fSchristos# release. See Savannah bug #16051. 100*69606e3fSchristos 101*69606e3fSchristos#touch('foo'); 102*69606e3fSchristos# 103*69606e3fSchristos#run_make_test(' 104*69606e3fSchristos#foo: bar ; @echo "\$$? = $?" 105*69606e3fSchristos#bar: ;', 106*69606e3fSchristos# '', 107*69606e3fSchristos# '$? = bar'); 108*69606e3fSchristos# 109*69606e3fSchristos#unlink('foo'); 110*69606e3fSchristos 111*69606e3fSchristos1; 112