Fungsi file di makefile mengambil args diawali dengan simbol '@'

10

Kutipan kode ini dari Bab 8.6 dari manual makefile GNU.

Apa artinya @ $ @. Untuk fungsi file arg dalam makefile? dan mengapa perintah shell seperti rm diawali oleh simbol '@'

program: $(OBJECTS)
     $(file >[email protected],$^)
     $(CMD) $(CMDFLAGS) @[email protected]
     @rm [email protected]

Sintaks fungsi file adalah

$(file op filename[,text])

sumber

Jawaban:

9

Ada tiga kegunaan yang tidak terkait di @sini.

Dalam $@, karakter @adalah nama variabel otomatis yang dapat digunakan dalam suatu aturan. Nilai variabel itu adalah target yang dibuat oleh aturan.

Ketika @digunakan di awal baris resep (perintah), tepat setelah karakter tab, itu menyebabkan perintah tidak akan dicetak saat akan dieksekusi.

Karakter di @tempat lain tidak istimewa.

Jadi, dalam contoh Anda, untuk membangun program:

  1. The filefungsi dipanggil. Itu menulis dependensi target ( $^variabel otomatis) ke file program.in.
  2. Perintah apa pun yang disimpan dalam variabel CMDdieksekusi, dengan parameter disimpan dalam variabel CMDFLAGS, ditambah parameter tambahan @program.in. Apa ini tergantung pada apa CMD.

  3. Perintah rm program.indijalankan, tanpa mencetaknya terlebih dahulu.

Beberapa perintah memperlakukan parameter yang dimulai dengan @sebagai menunjukkan file dari mana untuk membaca lebih banyak parameter. Ini adalah konvensi DOS yang muncul karena DOS memiliki batasan ketat pada panjang baris perintah dan tidak ada cara untuk menginterpolasi output dari suatu perintah ke dalam baris perintah. Ini tidak biasa di dunia Unix karena Unix tidak memiliki batasan ini. Dengan demikian, efek resep tersebut kemungkinan sama dengan

$(CMD) $(CMDFLAGS) $(OBJECTS)
Gilles 'SANGAT berhenti menjadi jahat'
sumber
2

@ awalan dalam garis menekan gema garis.

Secara default, makemencetak setiap baris Makefilesebelum dijalankan. Ketika garis dimulai dengan @, garis itu tidak akan dicetak.

Tanpa @:

$ cat > Makefile
hello:                                                                          
    echo hello world
$ make hello
echo hello world
hello world

Dengan @:

$ cat > Makefile
hello:                                                                          
    @echo hello world
$ make hello
hello world

Catatan bahwa hanya @pada awal baris menyebabkan penekanan bergema . >[email protected]atau @[email protected]hanya string normal, dan $@di dalamnya akan diperluas:

$ cat hello
hello:
    @echo @[email protected]
$make hello
@hello.in
cuonglm
sumber
jawaban ini tidak mengatakan, mengapa >[email protected]digunakan sebagai mode file ... tetapi ini berguna dengan caranya sendiri .. terima kasih cuonglm ...