23

I am writing a short shell script which calls 'make all'. It's not critical, but is there a way I can suppress the message saying 'nothing to be done for all' if that is the case? I am hoping to find a flag for make which suppresses this (not sure there is one), but an additional line or 2 of code would work too.

FYI I'm using bash.

Edit: to be more clear, I only want to suppess messages that therer is nothing to be done. Otherwise, I want to display the output.

sas4740
  • 3,910
  • 8
  • 22
  • 23

4 Answers4

21

You can make "all" a PHONY target (if it isn't already) which has the real target as a prerequisite, and does something inconspicuous:

.PHONY: all

all: realTarget
    @echo > /dev/null
Beta
  • 92,251
  • 12
  • 140
  • 145
  • 12
    Rather than echo, you can probably just do @: for a no-op – William Pursell Aug 07 '10 at 15:58
  • @William Pursell: by golly, you're right. I never knew `:` was a shell no-op... or that I'd ever have a use for such a thing. – Beta Aug 07 '10 at 17:14
  • 1
    I like this sneaky approach. The warning goes away because `all` now has something to do, but what it does is nothing. Another option to `echo` is to make the action be `@true` which should print nothing and silently succeed. – RBerteig Aug 13 '10 at 09:25
  • This breaks "make -q" because make always thinks there's work to be done – Aron Griffis Feb 05 '14 at 19:16
  • this solution adds ~1 sec delay at least in MinGW – Sergey May 20 '18 at 12:30
11

I would like to improve on the previous solution, just to make it a little bit more efficient...:)

.PHONY: all
all: realTarget
        @:

@true would also work but is a little slower than @: (I've done some performance tests). In any case both are quite faster than "echo > /dev/null"...

Mark Veltzer
  • 1,254
  • 15
  • 19
2

The flag -s silences make: make -s all

EDIT: I originally answered that the flag -q silenced make. It works for me, although the manpage specifies -s, --silent, --quiet as the valid flags.

Ryan Tenney
  • 1,805
  • 2
  • 16
  • 29
  • W Tenney, for me this is `-s`, `--silent` or `--quiet` – Anders Aug 05 '10 at 17:38
  • 2
    I should have been more clear. I only want to suppress the case where the files are up to date. Otherwise I want to show the output. – sas4740 Aug 05 '10 at 17:39
  • I saw someone else answered and suggested `make all | grep -v "Nothing to be done for"` but it seems they deleted that answer. – Ryan Tenney Aug 05 '10 at 19:00
1

The grep solution:

{ make all 2>&1 1>&3 | grep -v 'No rule to make target `all' >&2; } 3>&1 

The construct 2>&1 1>&3 sends make's stdout to fd 3 and make's stderr to stdout. grep then reads from the previous command's stdout, removes the offending line and sends its stdout to stderr. Finally, fd 3 is returned to stdout.

glenn jackman
  • 223,850
  • 36
  • 205
  • 328
  • Is all that really necessary? What different from just doing the grep -v? – sas4740 Aug 05 '10 at 23:31
  • 2
    First of all, on my make anyway, that message goes to stderr, so at least you have to redirect stderr for grep to have any effect. Next, you wanted the rest of make's output untouched, so I didn't want to mix stderr with stdout. Lastly, it's a learning exercise for me too. – glenn jackman Aug 06 '10 at 15:38