Usunąć echo wywołania polecenia w makefile?

147

Napisałem program do przydziału, który ma wypisywać swoje wyjście na standardowe wyjście. Specyfikacja przypisania wymaga stworzenia pliku Makefile, który po wywołaniu make run > outputFilepowinien uruchomić program i zapisać dane wyjściowe do pliku, który ma odcisk palca SHA1 identyczny z podanym w specyfikacji.

Mój problem polega na tym, że mój plik makefile:

...
run:
     java myprogram

wypisuje również polecenie, które uruchamia mój program (np. java myprogram) do pliku wyjściowego, tak że mój plik zawiera tę dodatkową linię powodującą nieprawidłowy odcisk palca.

Czy istnieje sposób na wykonanie polecenia bez wywołania polecenia w wierszu poleceń?

noobler
źródło

Odpowiedzi:

247

Dodaj @na początku polecenia, aby gmake nie drukował wykonywanego polecenia. Lubię to:

run:
     @java myprogram

Jak zasugerował Oli, jest to funkcja Make, a nie Bash.

Z drugiej strony, Bash nigdy nie będzie powtarzał poleceń wykonywanych, chyba że powiesz mu to wprost (np. Z -xopcją).


źródło
6
+1. Ale żeby wyjaśnić zamieszanie w PO, być może warto wyjaśnić, że jest to funkcja Make, a nie Bash.
Oliver Charlesworth
1
@OliCharlesworth: ma sens, dodał. Dzięki.
Czy istnieje sposób na wyłączenie wszystkich ech? Albo o wyłączeniu go dla sekcji i ponownym włączeniu później?
Benubird
2
@Benubird to make -srobi, a IMHO i tak jest tutaj znacznie lepszym rozwiązaniem. Niedawno została opublikowana jako osobna odpowiedź na to pytanie.
tripleee
1
to nie działa w przypadku instrukcji if ... then :( jakieś pomysły?
user1623521
74

Jeszcze prostsze, użyj make -s(tryb cichy)!

user3619296
źródło
3
Głos za: To naprawdę powinna być tutaj akceptowana odpowiedź. Rozpryskiwanie pliku Makefile @poleceniami utrudnia debugowanie i dodaje wiele bałaganu.
tripleee
11
Zgadzam się, że to jest droga - ale zauważ, że w pierwotnym opisie problemu nie byłbym tym, który powołuje się na make - mój instruktor tak. W ten sposób nie miałbym żadnej kontroli nad przekazywanymi flagami. Musiałem kontrolować wyjście z pliku makefile. Głosuj za najbardziej praktycznym rozwiązaniem w prawdziwym świecie.
noobler
6
Możesz to kontrolować samodzielnie, używając .SILENT:celu. Zobacz make.mad-scientist.net/managing-recipe-echoing
MadScientist
Właściwie, jeśli masz ostrzeżenia -Wall, nadal je drukuje. Oczywiście, dlaczego miałbyś używać, -sjeśli chcesz również widzieć ostrzeżenia?
User81862311
33

Możesz także użyć .SILENT

.SILENT: run
hi:
     echo "Hola!"
run:
     java myprogram

W takim przypadku make hiwypisze polecenie, ale make runnie wyświetli.

Kien Pham
źródło
1

Efekt poprzedzenia polecenia @znakiem można rozszerzyć na sekcję, rozszerzając polecenie za pomocą końcowego ukośnika odwrotnego w wierszu. Jeśli .PHONYpożądane jest polecenie wstrzymania wyjścia, można rozpocząć sekcję od:

@printf "..."
Wiley
źródło