1*69606e3fSchristos#! -*-perl-*- 2*69606e3fSchristos 3*69606e3fSchristos$description = "Test the behaviour of the .SECONDARY target."; 4*69606e3fSchristos 5*69606e3fSchristos$details = "\ 6*69606e3fSchristosTest the behavior of the .SECONDARY special target. 7*69606e3fSchristosCreate a makefile where a file would not normally be considered 8*69606e3fSchristosintermediate, then specify it as .SECONDARY. Build and note that it's 9*69606e3fSchristosnot automatically deleted. Delete the file. Rebuild to ensure that 10*69606e3fSchristosit's not created if it doesn't exist but doesn't need to be built. 11*69606e3fSchristosChange the original and ensure that the secondary file and the ultimate 12*69606e3fSchristostarget are both rebuilt, and that the secondary file is not deleted. 13*69606e3fSchristos 14*69606e3fSchristosTry this with implicit rules and explicit rules: both should work.\n"; 15*69606e3fSchristos 16*69606e3fSchristosopen(MAKEFILE,"> $makefile"); 17*69606e3fSchristos 18*69606e3fSchristosprint MAKEFILE <<'EOF'; 19*69606e3fSchristos 20*69606e3fSchristos.SECONDARY: foo.e 21*69606e3fSchristos 22*69606e3fSchristos# Implicit rule test 23*69606e3fSchristos%.d : %.e ; cp $< $@ 24*69606e3fSchristos%.e : %.f ; cp $< $@ 25*69606e3fSchristos 26*69606e3fSchristosfoo.d: foo.e 27*69606e3fSchristos 28*69606e3fSchristos# Explicit rule test 29*69606e3fSchristosfoo.c: foo.e ; cp $< $@ 30*69606e3fSchristosEOF 31*69606e3fSchristos 32*69606e3fSchristosclose(MAKEFILE); 33*69606e3fSchristos 34*69606e3fSchristos# TEST #1 35*69606e3fSchristos 36*69606e3fSchristos&utouch(-20, 'foo.f'); 37*69606e3fSchristos 38*69606e3fSchristos&run_make_with_options($makefile,'foo.d',&get_logfile); 39*69606e3fSchristos$answer = "cp foo.f foo.e\ncp foo.e foo.d\n"; 40*69606e3fSchristos&compare_output($answer, &get_logfile(1)); 41*69606e3fSchristos 42*69606e3fSchristos# TEST #2 43*69606e3fSchristos 44*69606e3fSchristosunlink('foo.e'); 45*69606e3fSchristos 46*69606e3fSchristos&run_make_with_options($makefile,'foo.d',&get_logfile); 47*69606e3fSchristos$answer = "$make_name: `foo.d' is up to date.\n"; 48*69606e3fSchristos&compare_output($answer, &get_logfile(1)); 49*69606e3fSchristos 50*69606e3fSchristos# TEST #3 51*69606e3fSchristos 52*69606e3fSchristos&utouch(-10, 'foo.d'); 53*69606e3fSchristos&touch('foo.f'); 54*69606e3fSchristos 55*69606e3fSchristos&run_make_with_options($makefile,'foo.d',&get_logfile); 56*69606e3fSchristos$answer = "cp foo.f foo.e\ncp foo.e foo.d\n"; 57*69606e3fSchristos&compare_output($answer, &get_logfile(1)); 58*69606e3fSchristos 59*69606e3fSchristos# TEST #4 60*69606e3fSchristos 61*69606e3fSchristos&run_make_with_options($makefile,'foo.c',&get_logfile); 62*69606e3fSchristos$answer = "cp foo.e foo.c\n"; 63*69606e3fSchristos&compare_output($answer, &get_logfile(1)); 64*69606e3fSchristos 65*69606e3fSchristos# TEST #5 66*69606e3fSchristos 67*69606e3fSchristosunlink('foo.e'); 68*69606e3fSchristos 69*69606e3fSchristos&run_make_with_options($makefile,'foo.c',&get_logfile); 70*69606e3fSchristos$answer = "$make_name: `foo.c' is up to date.\n"; 71*69606e3fSchristos&compare_output($answer, &get_logfile(1)); 72*69606e3fSchristos 73*69606e3fSchristos# TEST #6 74*69606e3fSchristos 75*69606e3fSchristos&utouch(-10, 'foo.c'); 76*69606e3fSchristos&touch('foo.f'); 77*69606e3fSchristos 78*69606e3fSchristos&run_make_with_options($makefile,'foo.c',&get_logfile); 79*69606e3fSchristos$answer = "cp foo.f foo.e\ncp foo.e foo.c\n"; 80*69606e3fSchristos&compare_output($answer, &get_logfile(1)); 81*69606e3fSchristos 82*69606e3fSchristosunlink('foo.f', 'foo.e', 'foo.d', 'foo.c'); 83*69606e3fSchristos 84*69606e3fSchristos# TEST #7 -- test the "global" .SECONDARY, with no targets. 85*69606e3fSchristos 86*69606e3fSchristos$makefile2 = &get_tmpfile; 87*69606e3fSchristos 88*69606e3fSchristosopen(MAKEFILE, "> $makefile2"); 89*69606e3fSchristos 90*69606e3fSchristosprint MAKEFILE <<'EOF'; 91*69606e3fSchristos.SECONDARY: 92*69606e3fSchristos 93*69606e3fSchristosfinal: intermediate 94*69606e3fSchristosintermediate: source 95*69606e3fSchristos 96*69606e3fSchristosfinal intermediate source: 97*69606e3fSchristos echo $< > $@ 98*69606e3fSchristosEOF 99*69606e3fSchristos 100*69606e3fSchristosclose(MAKEFILE); 101*69606e3fSchristos 102*69606e3fSchristos&utouch(-10, 'source'); 103*69606e3fSchristostouch('final'); 104*69606e3fSchristos 105*69606e3fSchristos&run_make_with_options($makefile2, '', &get_logfile); 106*69606e3fSchristos$answer = "$make_name: `final' is up to date.\n"; 107*69606e3fSchristos&compare_output($answer, &get_logfile(1)); 108*69606e3fSchristos 109*69606e3fSchristosunlink('source', 'final', 'intermediate'); 110*69606e3fSchristos 111*69606e3fSchristos 112*69606e3fSchristos# TEST #8 -- test the "global" .SECONDARY, with .PHONY. 113*69606e3fSchristos 114*69606e3fSchristostouch('version2'); 115*69606e3fSchristosrun_make_test(' 116*69606e3fSchristos.PHONY: version 117*69606e3fSchristos.SECONDARY: 118*69606e3fSchristosversion2: version ; @echo GOOD 119*69606e3fSchristosall: version2', 120*69606e3fSchristos 'all', 'GOOD'); 121*69606e3fSchristos 122*69606e3fSchristosunlink('version2'); 123*69606e3fSchristos 124*69606e3fSchristos# This tells the test driver that the perl test script executed properly. 125*69606e3fSchristos1; 126