| # -*-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'; | |
| my $j1err = "warning: jobserver unavailable: using -j1 (add '+' to parent make rule)"; | |
| # 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]: $j1err | |
| #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'); | |
| } | |
| # SV 63981: Don't generat warnings if the user specifically disabled -j | |
| 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#' | |
| hi | |
| #MAKE#[1]: Leaving directory '#PWD#' | |
| #MAKE#: Leaving directory '#PWD#'"); | |
| # Ensure enter/leave directory messages appear before jobserver warnings | |
| run_make_test(q! | |
| all: ; @$(MAKE) -C . -f #MAKEFILE# recurse -j10 | |
| recurse: ; @echo hi | |
| !, | |
| '-w -j2', "#MAKE#: Entering directory '#PWD#' | |
| #MAKE#[1]: Entering directory '#PWD#' | |
| #MAKE#[1]: warning: -j10 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); | |
| # Ensure the jobserver is not disabled even if only later commands are recursive | |
| run_make_test(q! | |
| .RECIPEPREFIX := > | |
| all: | |
| > @echo $@ 1 | |
| > @echo $@ 2 | |
| > @$(MAKE) -f #MAKEFILE# recurse | |
| recurse: ; @echo $@ | |
| !, | |
| "$np -j8", "all 1\nall 2\nrecurse"); | |
| if ($port_type ne 'W32') { | |
| run_make_test(undef, "$np --jobserver-style=pipe -j8", | |
| "all 1\nall 2\nrecurse"); | |
| } | |
| # And with + instead of $(MAKE) | |
| run_make_test(q! | |
| .RECIPEPREFIX := > | |
| all: | |
| > @echo $@ 1 | |
| > @echo $@ 2 | |
| > @+#MAKEPATH# -f #MAKEFILE# recurse | |
| recurse: ; @echo $@ | |
| !, | |
| "$np -j8", "all 1\nall 2\nrecurse"); | |
| if ($port_type ne 'W32') { | |
| run_make_test(undef, "$np --jobserver-style=pipe -j8", | |
| "all 1\nall 2\nrecurse"); | |
| } | |
| # We can't reset TMPDIR to something invalid when using valgrind | |
| if (exists $FEATURES{'jobserver-fifo'} && !$valgrind) { | |
| # 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. | |
| $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/"); | |
| # Verify that MAKE_TMPDIR is preferred if provided | |
| $ENV{MAKE_TMPDIR} = '.'; | |
| $ENV{TMPDIR} = 'nosuchdir'; | |
| run_make_test(q! | |
| recurse: ; @$(MAKE) -f #MAKEFILE# all | |
| all:;@echo "$$MAKEFLAGS" | |
| !, | |
| "-j2 --no-print-directory", "/--jobserver-auth=fifo:\\./"); | |
| # Verify we fall back to -j1 but continue, of the auth is bad. | |
| $ENV{MAKEFLAGS} = '-j2 --jobserver-auth=fifo:nosuchfile'; | |
| run_make_test(q!all:;@echo hi!, "", "#MAKE#: cannot open jobserver nosuchfile: $ERR_no_such_file\n#MAKE#: $j1err\nhi\n"); | |
| } | |
| if ($port_type eq 'UNIX') { | |
| # sv 66499. The specified number of jobs exceeds pipe capacity. | |
| run_make_test(q! | |
| all:; $(info hello, world) | |
| !, '-j688777', '/requested job count \(688777\) is larger than system limit/', 512); | |
| run_make_test(q! | |
| all:; $(info hello, world) | |
| !, '-j688777 --jobserver-style=pipe', '/requested job count \(688777\) is larger than system limit/', 512); | |
| } | |
| 1; |