1# -*-perl-*- 2 3$description = "Test parallelism (-j) option."; 4 5 6$details = "This test creates a makefile with two double-colon default 7rules. The first rule has a series of sleep and echo commands 8intended to run in series. The second and third have just an 9echo statement. When make is called in this test, it is given 10the -j option with a value of 4. This tells make that it may 11start up to four jobs simultaneously. In this case, since the 12first command is a sleep command, the output of the second 13and third commands will appear before the first if indeed 14make is running all of these commands in parallel."; 15 16if (!$parallel_jobs) { 17 return -1; 18} 19 20if ($vos) { 21 $sleep_command = "sleep -seconds"; 22} 23else { 24 $sleep_command = "sleep"; 25} 26 27 28run_make_test(" 29all : def_1 def_2 def_3 30def_1 : ; \@echo ONE; $sleep_command 3 ; echo TWO 31def_2 : ; \@$sleep_command 2 ; echo THREE 32def_3 : ; \@$sleep_command 1 ; echo FOUR", 33 '-j4', "ONE\nFOUR\nTHREE\nTWO"); 34 35# Test parallelism with included files. Here we sleep/echo while 36# building the included files, to test that they are being built in 37# parallel. 38run_make_test(" 39all: 1 2; \@echo success 40-include 1.inc 2.inc 411.inc: ; \@echo ONE.inc; $sleep_command 2; echo TWO.inc; echo '1: ; \@echo ONE; $sleep_command 2; echo TWO' > \$\@ 422.inc: ; \@$sleep_command 1; echo THREE.inc; echo '2: ; \@$sleep_command 1; echo THREE' > \$\@", 43 "-j4", 44 "ONE.inc\nTHREE.inc\nTWO.inc\nONE\nTHREE\nTWO\nsuccess\n"); 45 46unlink('1.inc', '2.inc'); 47 48 49# Test parallelism with included files--this time recurse first and make 50# sure the jobserver works. 51run_make_test(" 52recurse: ; \@\$(MAKE) --no-print-directory -f #MAKEFILE# INC=yes all 53all: 1 2; \@echo success 54 55INC = no 56ifeq (\$(INC),yes) 57-include 1.inc 2.inc 58endif 59 601.inc: ; \@echo ONE.inc; $sleep_command 2; echo TWO.inc; echo '1: ; \@echo ONE; $sleep_command 2; echo TWO' > \$\@ 612.inc: ; \@$sleep_command 1; echo THREE.inc; echo '2: ; \@$sleep_command 1; echo THREE' > \$\@", 62 "-j4", 63 "ONE.inc\nTHREE.inc\nTWO.inc\nONE\nTHREE\nTWO\nsuccess\n"); 64 65unlink('1.inc', '2.inc'); 66 67# Grant Taylor reports a problem where tokens can be lost (not written back 68# to the pipe when they should be): this happened when there is a $(shell ...) 69# function in an exported recursive variable. I added some code to check 70# for this situation and print a message if it occurred. This test used 71# to trigger this code when I added it but no longer does after the fix. 72 73run_make_test(" 74export HI = \$(shell \$(\$\@.CMD)) 75first.CMD = echo hi 76second.CMD = $sleep_command 4; echo hi 77 78.PHONY: all first second 79all: first second 80 81first second: ; \@echo \$\@; $sleep_command 1; echo \$\@", 82 '-j2', "first\nfirst\nsecond\nsecond"); 83 84# Michael Matz <matz@suse.de> reported a bug where if make is running in 85# parallel without -k and two jobs die in a row, but not too close to each 86# other, then make will quit without waiting for the rest of the jobs to die. 87 88run_make_test(" 89.PHONY: all fail.1 fail.2 fail.3 ok 90all: fail.1 ok fail.2 fail.3 91 92fail.1 fail.2 fail.3: 93 \@sleep \$(patsubst fail.%,%,\$\@) 94 \@echo Fail 95 \@exit 1 96 97ok: 98 \@sleep 4 99 \@echo Ok done", 100 '-rR -j5', 'Fail 101#MAKE#: *** [fail.1] Error 1 102#MAKE#: *** Waiting for unfinished jobs.... 103Fail 104#MAKE#: *** [fail.2] Error 1 105Fail 106#MAKE#: *** [fail.3] Error 1 107Ok done', 108 512); 109 110 111# Test for Savannah bug #15641. 112# 113run_make_test(' 114.PHONY: all 115all:; @: 116 117-include foo.d 118 119foo.d: comp 120 @echo building $@ 121 122comp: mod_a.o mod_b.o; @: 123 124mod_a.o mod_b.o: 125 @exit 1 126', '-j2', ''); 127 128 129# Make sure that all jobserver FDs are closed if we need to re-exec the 130# master copy. 131# 132# First, find the "default" file descriptors we normally use 133# Then make sure they're still used. 134# 135# Right now we don't have a way to run a makefile and capture the output 136# without checking it, so we can't really write this test. 137 138# run_make_test(' 139# submake: ; @$(MAKE) --no-print-directory -f #MAKEFILE# fdprint 5>output 140 141# dependfile: ; @echo FOO=bar > $@ 142 143# INCL := true 144 145# FOO=foo 146# ifeq ($(INCL),true) 147# -include dependfile 148# endif 149 150# fdprint: ; @echo $(filter --jobserver%,$(MAKEFLAGS)) 151 152# recurse: ; @$(MAKE) --no-print-directory -f #MAKEFILE# submake INCL=true', 153# '-j2 INCL=false fdprint', 154# 'bar'); 155 156# unlink('dependfile', 'output'); 157 158 159# # Do it again, this time where the include is done by the non-master make. 160# run_make_test(undef, '-j2 recurse INCL=false', 'bar'); 161 162# unlink('dependfile', 'output'); 163 1641; 165