| # -*-perl-*- | |
| $description = "Test jobserver."; | |
| $details = "These tests are ones that specifically are different when the | |
| jobserver feature is available. Most -j tests are the same whether or not | |
| jobserver is available, and those appear in the 'parallelism' test suite."; | |
| exists $FEATURES{'jobserver'} or return -1; | |
| if (!$parallel_jobs) { | |
| return -1; | |
| } | |
| # Shorthand | |
| my $np = '--no-print-directory'; | |
| # Simple test of MAKEFLAGS settings | |
| run_make_test(q! | |
| SHOW = $(patsubst --jobserver-auth=%,--jobserver-auth=<auth>,$(MAKEFLAGS)) | |
| recurse: ; @echo $@: "/$(SHOW)/"; $(MAKE) -f #MAKEFILE# all | |
| all:;@echo $@: "/$(SHOW)/" | |
| !, | |
| "-j2 $np", "recurse: /-j2 --jobserver-auth=<auth> $np/\nall: /-j2 --jobserver-auth=<auth> $np/\n"); | |
| # Setting parallelism with the environment | |
| # Command line should take precedence over the environment | |
| $ENV{MAKEFLAGS} = "-j2 $np"; | |
| run_make_test(q! | |
| SHOW = $(patsubst --jobserver-auth=%,--jobserver-auth=<auth>,$(MAKEFLAGS)) | |
| recurse: ; @echo $@: "/$(SHOW)/"; $(MAKE) -f #MAKEFILE# all | |
| all:;@echo $@: "/$(SHOW)/" | |
| !, | |
| '', "recurse: /-j2 --jobserver-auth=<auth> $np/\nall: /-j2 --jobserver-auth=<auth> $np/\n"); | |
| # Test override of -jN | |
| $ENV{MAKEFLAGS} = "-j9 $np"; | |
| run_make_test(q! | |
| SHOW = $(patsubst --jobserver-auth=%,--jobserver-auth=<auth>,$(MAKEFLAGS)) | |
| recurse: ; @echo $@: "/$(SHOW)/"; $(MAKE) -j3 -f #MAKEFILE# recurse2 | |
| recurse2: ; @echo $@: "/$(SHOW)/"; $(MAKE) -f #MAKEFILE# all | |
| all:;@echo $@: "/$(SHOW)/" | |
| !, | |
| "-j2 $np", "recurse: /-j2 --jobserver-auth=<auth> $np/\n#MAKE#[1]: warning: -j3 forced in submake: resetting jobserver mode.\nrecurse2: /-j3 --jobserver-auth=<auth> $np/\nall: /-j3 --jobserver-auth=<auth> $np/\n"); | |
| # Test override of -jN with -j | |
| run_make_test(q! | |
| SHOW = $(patsubst --jobserver-auth=%,--jobserver-auth=<auth>,$(MAKEFLAGS)) | |
| recurse: ; @echo $@: "/$(SHOW)/"; $(MAKE) -j -f #MAKEFILE# recurse2 | |
| recurse2: ; @echo $@: "/$(SHOW)/"; $(MAKE) -f #MAKEFILE# all | |
| all:;@echo $@: "/$(SHOW)/" | |
| !, | |
| "-j2 $np", "recurse: /-j2 --jobserver-auth=<auth> $np/\n#MAKE#[1]: warning: -j0 forced in submake: resetting jobserver mode.\nrecurse2: /-j $np/\nall: /-j $np/\n"); | |
| # Don't put --jobserver-auth into a re-exec'd MAKEFLAGS. | |
| # We can't test this directly because there's no way a makefile can | |
| # show the value of MAKEFLAGS we were re-exec'd with. We can intuit it | |
| # by looking for "disabling jobserver mode" warnings; we should only | |
| # get one from the original invocation and none from the re-exec. | |
| # See Savannah bug #18124 | |
| unlink('inc.mk'); | |
| run_make_test(q! | |
| .RECIPEPREFIX = > | |
| -include inc.mk | |
| recur: | |
| #> @echo 'MAKEFLAGS = $(MAKEFLAGS)' | |
| > @rm -f inc.mk | |
| > @$(MAKE) -j2 -f #MAKEFILE# all | |
| all: | |
| #> @echo 'MAKEFLAGS = $(MAKEFLAGS)' | |
| > @echo $@ | |
| inc.mk: | |
| #> @echo 'MAKEFLAGS = $(MAKEFLAGS)' | |
| > @echo 'FOO = bar' > $@ | |
| !, | |
| "$np -j2", "#MAKE#[1]: warning: -j2 forced in submake: resetting jobserver mode.\nall\n"); | |
| unlink('inc.mk'); | |
| # Test recursion which is hidden from make. | |
| # See Savannah bug #39934 | |
| # Or Red Hat bug https://bugzilla.redhat.com/show_bug.cgi?id=885474 | |
| # Environments that don't use a pipe won't close access, so this won't happen. | |
| if ($port_type ne 'W32') { | |
| create_file('Makefile2', "vpath %.c ../\n", "foo:\n"); | |
| run_make_test(q! | |
| default: ; @ #MAKEPATH# -f Makefile2 | |
| !, | |
| "--jobserver-style=pipe -j2 $np", | |
| "#MAKE#[1]: warning: jobserver unavailable: using -j1. Add '+' to parent make rule. | |
| #MAKE#[1]: Nothing to be done for 'foo'."); | |
| rmfiles('Makefile2'); | |
| } | |
| # For Windows and named pipes, we don't need to worry about recursion | |
| if ($port_type eq 'W32' || exists $FEATURES{'jobserver-fifo'}) { | |
| create_file('Makefile2', "vpath %.c ../\n", "foo:\n"); | |
| run_make_test(q! | |
| default: ; @ #MAKEPATH# -f Makefile2 | |
| !, | |
| "-j2 $np", | |
| "#MAKE#[1]: Nothing to be done for 'foo'."); | |
| rmfiles('Makefile2'); | |
| } | |
| # Ensure enter/leave directory messages appear before jobserver warnings | |
| run_make_test(q! | |
| all: ; @$(MAKE) -C . -f #MAKEFILE# recurse -j1 | |
| recurse: ; @echo hi | |
| !, | |
| '-w -j2', "#MAKE#: Entering directory '#PWD#' | |
| #MAKE#[1]: Entering directory '#PWD#' | |
| #MAKE#[1]: warning: -j1 forced in submake: resetting jobserver mode. | |
| hi | |
| #MAKE#[1]: Leaving directory '#PWD#' | |
| #MAKE#: Leaving directory '#PWD#'\n"); | |
| # Check for invalid jobserver-style options | |
| run_make_test(q! | |
| all: a | |
| all a: ; @echo $@ | |
| !, | |
| '--jobserver-style=foo -j8', | |
| "#MAKE#: *** Unknown jobserver auth style 'foo'. Stop.", 512); | |
| # sv 62908. | |
| # Test that when mkfifo fails, make switches to pipe and succeeds. | |
| # Force mkfifo to fail by attempting to create a fifo in a non existent | |
| # directory. | |
| # run_make_test does not allow matching a multiline pattern, therefore run the | |
| # test twice. | |
| # First time look for /$ERR_no_such_file/ to ensure mkfifo failed. | |
| # Second time look for /Nothing to be done/ to ensure make succeeded. | |
| if (exists $FEATURES{'jobserver-fifo'}) { | |
| $ENV{TMPDIR} = "nosuchdir"; | |
| run_make_test("all:\n", '-j2', "/$ERR_no_such_file/"); | |
| $ENV{TMPDIR} = "nosuchdir"; | |
| run_make_test(undef, '-j2', "/Nothing to be done/"); | |
| } | |
| 1; |