Bug 729109 - -s does not always prevent -w
Summary: -s does not always prevent -w
Alias: None
Product: Fedora
Classification: Fedora
Component: make
Version: 14
Hardware: Unspecified
OS: Unspecified
Target Milestone: ---
Assignee: Petr Machata
QA Contact: Fedora Extras Quality Assurance
Depends On:
TreeView+ depends on / blocked
Reported: 2011-08-08 18:19 UTC by Stas Sergeev
Modified: 2015-05-05 01:36 UTC (History)
2 users (show)

Fixed In Version:
Doc Type: Bug Fix
Doc Text:
Clone Of:
Last Closed: 2011-08-09 14:57:16 UTC

Attachments (Terms of Use)
test case (298 bytes, application/x-gzip)
2011-08-08 18:19 UTC, Stas Sergeev
no flags Details

Description Stas Sergeev 2011-08-08 18:19:45 UTC
Created attachment 517271 [details]
test case

Description of problem:
I am grepping the make output in makefiles or scripts sometimes,
so I used -s to make it silent.
Sometimes that doesn't work, even though the manual says this:
`make' will not automatically turn on `-w'
if you also use `-s', which says to be silent, or if you use
`--no-print-directory' to explicitly disable it.
It turned out, using -s does not always disable -w.

Version-Release number of selected component (if applicable):

How reproducible:

Steps to Reproduce:
1. Unpack attached test-case
2. Run tst.sh
Actual results:
make: Entering directory `/home/stas/tests/make'
make[1]: Entering directory `/home/stas/tests/make/tst'
make[1]: Leaving directory `/home/stas/tests/make/tst'
make: Leaving directory `/home/stas/tests/make'

Expected results:
make: Entering directory `/home/stas/tests/make'
make: Leaving directory `/home/stas/tests/make'

Additional info:
The expected results are achieved when --no-print-directory is used,
so I now use it as a work-around (uncomment that line in the test-case
Makefile to ckeck).
The very interesting thing here is that if "-C ." is removed from
tst.sh, then -s _in the Makefile_ starts taking an effect! How can
those be related? The "-C ." is for toplevel make invocation here, and
-s if for another make process, yet somehow they correlate...

Comment 1 Petr Machata 2011-08-09 13:41:45 UTC
After a closer look, this doesn't seem like a bug to me.  I'm working with this makefile:

	@echo all $(MAKEFLAGS)
	$(MAKE) -C . second
	@echo second $(MAKEFLAGS)
	$(MAKE) -C . -s third
	@echo third $(MAKEFLAGS)
	$(MAKE) -C . fourth
	@echo fourth $(MAKEFLAGS)

Now if I run simple "make", the first level is executed as usual, then recursive make is run, and that gets "-w" because in recursive make, we want to let the user know where he is.  When I do "make -C .", it's the same, except one level sooner.  Passing -s further down thus doesn't help, because -w is already implied by -C.  Passing -s on top level _does_ work though, and has the intended consequences.

In your case, I believe, you want to pass --no-print-directory in addition to -s, to suppress the effect of top-level -C.  Then I get:
$ make
make -C . second
make[1]: Вход в каталог `/home/petr/tmp/make/2'
second w
make -C . -s --no-print-directory third
third --no-print-directory -s
fourth --no-print-directory -s
make[1]: Выход из каталога `/home/petr/tmp/make/2'

Comment 2 Stas Sergeev 2011-08-09 14:16:39 UTC
Ah, so it explicitly passes -w through the MAKEFLAGS,
what a nasty beast... :)
Then, there is an ambiguity in the info page: it says that
`make' will not automatically turn on `-w', but:
- It does indeed automatically turns it on for the sub-make, by the
use of MAKEFLAGS. It wasn't passed by me explicitly, I only passed -s,
so this pretty much stands for the automatic enabling.
- It does NOT automatically enable it for the entire make process,
since it was already enabled before.

Thanks for your analysis, I guess this can be closed. :)

Comment 3 Petr Machata 2011-08-09 14:57:16 UTC
In the info page, it says "`make' will not automatically turn on `-w' if you also use `-s'", and indeed that is the case.  When I pass -s to toplevel make, -w is not turned on, regardless of whether I used -C or not.  The problem is that in your case (and in my demo), the -w is turned on by toplevel make, and then diligently passed down.  -s is added to the command line later, and at that time -s is not enough to cancel out the -w.

Note You need to log in before you can comment on or make changes to this bug.