1# -*-perl-*- 2$description = "Test handling of double-colon rules."; 3 4$details = "\ 5We test these features: 6 7 - Multiple commands for the same (double-colon) target 8 - Different prerequisites for targets: only out-of-date 9 ones are rebuilt. 10 - Double-colon targets that aren't the goal target. 11 12Then we do the same thing for parallel builds: double-colon 13targets should always be built serially."; 14 15# The Contents of the MAKEFILE ... 16 17open(MAKEFILE,"> $makefile"); 18 19print MAKEFILE <<'EOF'; 20 21all: baz 22 23foo:: f1.h ; @echo foo FIRST 24foo:: f2.h ; @echo foo SECOND 25 26bar:: ; @echo aaa; sleep 1; echo aaa done 27bar:: ; @echo bbb 28 29baz:: ; @echo aaa 30baz:: ; @echo bbb 31 32biz:: ; @echo aaa 33biz:: two ; @echo bbb 34 35two: ; @echo two 36 37f1.h f2.h: ; @echo $@ 38 39d :: ; @echo ok 40d :: d ; @echo oops 41 42EOF 43 44close(MAKEFILE); 45 46# TEST 0: A simple double-colon rule that isn't the goal target. 47 48&run_make_with_options($makefile, "all", &get_logfile, 0); 49$answer = "aaa\nbbb\n"; 50&compare_output($answer, &get_logfile(1)); 51 52# TEST 1: As above, in parallel 53 54if ($parallel_jobs) { 55 &run_make_with_options($makefile, "-j10 all", &get_logfile, 0); 56 $answer = "aaa\nbbb\n"; 57 &compare_output($answer, &get_logfile(1)); 58} 59 60# TEST 2: A simple double-colon rule that is the goal target 61 62&run_make_with_options($makefile, "bar", &get_logfile, 0); 63$answer = "aaa\naaa done\nbbb\n"; 64&compare_output($answer, &get_logfile(1)); 65 66# TEST 3: As above, in parallel 67 68if ($parallel_jobs) { 69 &run_make_with_options($makefile, "-j10 bar", &get_logfile, 0); 70 $answer = "aaa\naaa done\nbbb\n"; 71 &compare_output($answer, &get_logfile(1)); 72} 73 74# TEST 4: Each double-colon rule is supposed to be run individually 75 76&utouch(-5, 'f2.h'); 77&touch('foo'); 78 79&run_make_with_options($makefile, "foo", &get_logfile, 0); 80$answer = "f1.h\nfoo FIRST\n"; 81&compare_output($answer, &get_logfile(1)); 82 83# TEST 5: Again, in parallel. 84 85if ($parallel_jobs) { 86 &run_make_with_options($makefile, "-j10 foo", &get_logfile, 0); 87 $answer = "f1.h\nfoo FIRST\n"; 88 &compare_output($answer, &get_logfile(1)); 89} 90 91# TEST 6: Each double-colon rule is supposed to be run individually 92 93&utouch(-5, 'f1.h'); 94unlink('f2.h'); 95&touch('foo'); 96 97&run_make_with_options($makefile, "foo", &get_logfile, 0); 98$answer = "f2.h\nfoo SECOND\n"; 99&compare_output($answer, &get_logfile(1)); 100 101# TEST 7: Again, in parallel. 102 103if ($parallel_jobs) { 104 &run_make_with_options($makefile, "-j10 foo", &get_logfile, 0); 105 $answer = "f2.h\nfoo SECOND\n"; 106 &compare_output($answer, &get_logfile(1)); 107} 108 109# TEST 8: Test circular dependency check; PR/1671 110 111&run_make_with_options($makefile, "d", &get_logfile, 0); 112$answer = "ok\n$make_name: Circular d <- d dependency dropped.\noops\n"; 113&compare_output($answer, &get_logfile(1)); 114 115# TEST 8: I don't grok why this is different than the above, but it is... 116# 117# Hmm... further testing indicates this might be timing-dependent? 118# 119#if ($parallel_jobs) { 120# &run_make_with_options($makefile, "-j10 biz", &get_logfile, 0); 121# $answer = "aaa\ntwo\nbbb\n"; 122# &compare_output($answer, &get_logfile(1)); 123#} 124 125unlink('foo','f1.h','f2.h'); 126 127 128# TEST 9: make sure all rules in s double colon family get executed 129# (Savannah bug #14334). 130# 131 132&touch('one'); 133&touch('two'); 134 135run_make_test(' 136.PHONY: all 137all: result 138 139result:: one 140 @echo $^ >>$@ 141 @echo $^ 142 143result:: two 144 @echo $^ >>$@ 145 @echo $^ 146 147', 148'', 149'one 150two'); 151 152unlink('result','one','two'); 153 154# This tells the test driver that the perl test script executed properly. 1551; 156