| # -*-perl-*- |
| |
| $description = "Test parallelism (-j) option."; |
| |
| |
| $details = "This test creates a makefile with two double-colon default |
| rules. The first rule has a series of sleep and echo commands |
| intended to run in series. The second and third have just an |
| echo statement. When make is called in this test, it is given |
| the -j option with a value of 4. This tells make that it may |
| start up to four jobs simultaneously. In this case, since the |
| first command is a sleep command, the output of the second |
| and third commands will appear before the first if indeed |
| make is running all of these commands in parallel."; |
| |
| if (!$parallel_jobs) { |
| return -1; |
| } |
| |
| if ($vos) { |
| $sleep_command = "sleep -seconds"; |
| } |
| else { |
| $sleep_command = "sleep"; |
| } |
| |
| |
| run_make_test(" |
| all : def_1 def_2 def_3 |
| def_1 : ; \@echo ONE; $sleep_command 3 ; echo TWO |
| def_2 : ; \@$sleep_command 2 ; echo THREE |
| def_3 : ; \@$sleep_command 1 ; echo FOUR", |
| '-j4', "ONE\nFOUR\nTHREE\nTWO"); |
| |
| # Test parallelism with included files. Here we sleep/echo while |
| # building the included files, to test that they are being built in |
| # parallel. |
| run_make_test(" |
| all: 1 2; \@echo success |
| -include 1.inc 2.inc |
| 1.inc: ; \@echo ONE.inc; $sleep_command 2; echo TWO.inc; echo '1: ; \@echo ONE; $sleep_command 2; echo TWO' > \$\@ |
| 2.inc: ; \@$sleep_command 1; echo THREE.inc; echo '2: ; \@$sleep_command 1; echo THREE' > \$\@", |
| "-j4", |
| "ONE.inc\nTHREE.inc\nTWO.inc\nONE\nTHREE\nTWO\nsuccess\n", 0, 7); |
| |
| rmfiles(qw(1.inc 2.inc)); |
| |
| |
| # Test parallelism with included files--this time recurse first and make |
| # sure the jobserver works. |
| run_make_test(" |
| recurse: ; \@\$(MAKE) --no-print-directory -f #MAKEFILE# INC=yes all |
| all: 1 2; \@echo success |
| |
| INC = no |
| ifeq (\$(INC),yes) |
| -include 1.inc 2.inc |
| endif |
| |
| 1.inc: ; \@echo ONE.inc; $sleep_command 2; echo TWO.inc; echo '1: ; \@echo ONE; $sleep_command 2; echo TWO' > \$\@ |
| 2.inc: ; \@$sleep_command 1; echo THREE.inc; echo '2: ; \@$sleep_command 1; echo THREE' > \$\@", |
| "-j4", |
| "ONE.inc\nTHREE.inc\nTWO.inc\nONE\nTHREE\nTWO\nsuccess\n", 0, 7); |
| |
| rmfiles(qw(1.inc 2.inc)); |
| |
| # Grant Taylor reports a problem where tokens can be lost (not written back |
| # to the pipe when they should be): this happened when there is a $(shell ...) |
| # function in an exported recursive variable. I added some code to check |
| # for this situation and print a message if it occurred. This test used |
| # to trigger this code when I added it but no longer does after the fix. |
| # We have to increase the timeout from the default (5s) on this test. |
| |
| run_make_test(" |
| export HI = \$(shell \$(\$\@.CMD)) |
| first.CMD = echo hi |
| second.CMD = $sleep_command 4; echo hi |
| |
| .PHONY: all first second |
| all: first second |
| |
| first second: ; \@echo \$\@; $sleep_command 1; echo \$\@", |
| '-j2', "first\nfirst\nsecond\nsecond", 0, 7); |
| |
| # Michael Matz <matz@suse.de> reported a bug where if make is running in |
| # parallel without -k and two jobs die in a row, but not too close to each |
| # other, then make will quit without waiting for the rest of the jobs to die. |
| |
| run_make_test(" |
| .PHONY: all fail.1 fail.2 fail.3 ok |
| all: fail.1 ok fail.2 fail.3 |
| |
| fail.1 fail.2 fail.3: |
| \@$sleep_command \$(patsubst fail.%,%,\$\@) |
| \@echo Fail |
| \@exit 1 |
| |
| ok: |
| \@$sleep_command 4 |
| \@echo Ok done", |
| '-rR -j5', "Fail |
| #MAKE#: *** [#MAKEFILE#:8: fail.1] Error 1 |
| #MAKE#: *** Waiting for unfinished jobs.... |
| Fail |
| #MAKE#: *** [#MAKEFILE#:8: fail.2] Error 1 |
| Fail |
| #MAKE#: *** [#MAKEFILE#:8: fail.3] Error 1 |
| Ok done", |
| 512); |
| |
| |
| # Test for Savannah bug #15641. |
| # |
| run_make_test(' |
| .PHONY: all |
| all:; @: |
| |
| -include foo.d |
| |
| foo.d: comp |
| @echo building $@ |
| |
| comp: mod_a.o mod_b.o; @: |
| |
| mod_a.o mod_b.o: |
| @exit 1 |
| ', '-j2', ''); |
| |
| |
| # TEST #9 -- Savannah bugs 3330 and 15919 |
| # In earlier versions of make this will either give the wrong answer, or hang. |
| |
| utouch(-10, 'target'); |
| run_make_test('target: intermed ; touch $@ |
| |
| .INTERMEDIATE: intermed |
| intermed: | phony ; touch $@ |
| |
| .PHONY: phony |
| phony: ; : phony', '-rR -j', ': phony'); |
| rmfiles('target'); |
| |
| # TEST #11: Make sure -jN from MAKEFLAGS is processed even when we re-exec |
| # See Savannah bug #33873 |
| |
| $extraENV{MAKEFLAGS} = '-j4'; |
| |
| run_make_test(q! |
| things = thing1 thing2 |
| all: $(things) |
| thing1:; @sleep 1; echo '$@ start'; sleep 2; echo '$@ end' |
| thing2:; @echo '$@ start'; sleep 2; echo '$@ end' |
| -include inc.mk |
| inc.mk: ; @touch $@ |
| !, |
| '', "thing2 start\nthing1 start\nthing2 end\nthing1 end\n"); |
| |
| delete $extraENV{MAKEFLAGS}; |
| rmfiles('inc.mk'); |
| |
| # Ensure intermediate/secondary files are not pruned incorrectly. |
| # See Savannah bug #30653 |
| |
| utouch(-15, 'file2'); |
| utouch(-10, 'file4'); |
| utouch(-5, 'file1'); |
| |
| run_make_test(q! |
| .INTERMEDIATE: file3 |
| file4: file3 ; @mv -f $< $@ |
| file3: file2 ; touch $@ |
| file2: file1 ; @touch $@ |
| !, |
| '--no-print-directory -j2', "touch file3"); |
| |
| rmfiles('file1', 'file2', 'file3', 'file4'); |
| |
| # Make sure that all jobserver FDs are closed if we need to re-exec the |
| # master copy. |
| # |
| # First, find the "default" file descriptors we normally use |
| # Then make sure they're still used. |
| # |
| # Right now we don't have a way to run a makefile and capture the output |
| # without checking it, so we can't really write this test. |
| |
| # run_make_test(' |
| # submake: ; @$(MAKE) --no-print-directory -f #MAKEFILE# fdprint 5>output |
| |
| # dependfile: ; @echo FOO=bar > $@ |
| |
| # INCL := true |
| |
| # FOO=foo |
| # ifeq ($(INCL),true) |
| # -include dependfile |
| # endif |
| |
| # fdprint: ; @echo $(filter --jobserver%,$(MAKEFLAGS)) |
| |
| # recurse: ; @$(MAKE) --no-print-directory -f #MAKEFILE# submake INCL=true', |
| # '-j2 INCL=false fdprint', |
| # 'bar'); |
| |
| # rmfiles(qw(dependfile output)); |
| |
| |
| # # Do it again, this time where the include is done by the non-master make. |
| # run_make_test(undef, '-j2 recurse INCL=false', 'bar'); |
| |
| # rmfiles(qw(dependfile output)); |
| |
| 1; |
| |
| ### Local Variables: |
| ### eval: (setq whitespace-action (delq 'auto-cleanup whitespace-action)) |
| ### End: |