| # -*-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; |