Menekan gema permintaan perintah di makefile?

147

Saya menulis sebuah program untuk tugas yang seharusnya mencetak hasilnya ke stdout. Spesifikasi tugas membutuhkan pembuatan Makefile yang ketika dipanggil make run > outputFileharus menjalankan program dan menulis output ke file, yang memiliki sidik jari SHA1 identik dengan yang diberikan dalam spesifikasi.

Masalah saya adalah makefile saya:

...
run:
     java myprogram

juga mencetak perintah yang menjalankan program saya (mis. java myprogram) ke file output, sehingga file saya menyertakan baris tambahan ini yang menyebabkan sidik jari salah.

Apakah ada cara untuk mengeksekusi perintah tanpa permintaan perintah yang bergema ke baris perintah?

noobler
sumber

Jawaban:

247

Tambahkan @ke awal perintah untuk memberi tahu gmake untuk tidak mencetak perintah yang sedang dieksekusi. Seperti ini:

run:
     @java myprogram

Seperti yang disarankan Oli, ini adalah fitur Make dan bukan dari Bash.

Di sisi lain, Bash tidak akan pernah mengulangi perintah yang dieksekusi kecuali Anda menyuruhnya melakukannya secara eksplisit (yaitu dengan -xopsi).


sumber
6
+1. Tetapi hanya untuk menjernihkan kebingungan OP, mungkin perlu diperjelas bahwa ini adalah fitur Make, bukan Bash.
Oliver Charlesworth
1
@ OliCharlesworth: masuk akal, menambahkan itu. Terima kasih.
Apakah ada cara untuk menonaktifkan semua gema? Atau mematikannya untuk bagian, dan kembali lagi nanti?
Benubird
2
@ Benubird make -smelakukan itu, dan IMHO adalah solusi yang jauh lebih baik di sini. Baru-baru ini diposting sebagai jawaban terpisah untuk pertanyaan ini.
tripleee
1
ini tidak bekerja untuk pernyataan if ... then :( ada ide?
user1623521
74

Lebih sederhana lagi, gunakan make -s(mode diam)!

pengguna3619296
sumber
3
Suara positif: Ini seharusnya jawaban yang diterima di sini. Memerciki Makefile Anda dengan @perintah membuatnya sulit untuk di-debug dan menambahkan banyak kekacauan.
tripleee
11
Saya setuju ini adalah cara untuk pergi - tetapi perhatikan, dalam deskripsi masalah asli, saya tidak akan menjadi merek yang memohon - instruktur saya akan menjadi. Jadi, saya tidak akan memiliki kontrol atas bendera yang dilewati. Saya perlu mengontrol output dari dalam makefile. Terpilih untuk solusi paling praktis di dunia nyata.
noobler
6
Anda dapat mengontrol ini sendiri, menggunakan .SILENT:target. Lihat make.mad-scientist.net/managing-recipe-echoing
MadScientist
Sebenarnya jika Anda memiliki peringatan seperti -Wallitu masih mencetaknya. Tentu saja mengapa Anda menggunakan -sjika Anda ingin melihat peringatan juga?
User81862311
33

Anda juga bisa menggunakan .SILENT

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

Dalam hal ini, make hiakan menampilkan perintah, tetapi make runtidak akan menampilkan.

Kien Pham
sumber
1

Efek mendahului perintah dengan @dapat diperluas ke bagian dengan memperluas perintah menggunakan trailing backslash pada baris. Jika suatu .PHONYperintah diinginkan untuk menekan keluaran, seseorang dapat memulai bagian dengan:

@printf "..."
Wiley
sumber