Bagaimana cara mengirimkan argumen ke Makefile dari baris perintah?
Saya mengerti saya bisa melakukannya
$ make action VAR="value"
$ value
dengan Makefile
VAR = "default"
action:
@echo $(VAR)
Bagaimana cara mendapatkan perilaku berikut?
$ make action value
value
?
Bagaimana tentang
$make action value1 value2
value1 value2
command-line
parameters
makefile
arguments
Meng Lu
sumber
sumber
Jawaban:
Anda mungkin sebaiknya tidak melakukan ini; Anda melanggar pola dasar cara kerja Make. Tapi ini dia:
EDIT:
Untuk menjelaskan perintah pertama,
$(MAKECMDGOALS)
adalah daftar "target" yang disebutkan pada baris perintah, misalnya "nilai tindakan1 nilai2".$@
adalah variabel otomatis untuk nama target aturan, dalam hal ini "tindakan".filter-out
adalah fungsi yang menghapus beberapa elemen dari daftar. Jadi$(filter-out bar, foo bar baz)
pengembaliannyafoo baz
(bisa lebih halus, tapi kita tidak perlu kehalusan di sini).Gabungkan keduanya dan
$(filter-out $@,$(MAKECMDGOALS))
kembalikan daftar target yang ditentukan pada baris perintah selain "tindakan", yang mungkin berupa "nilai1 nilai2".sumber
$(shell echo $(MAKECMDGOALS) | sed 's!^.* $@ !!')
untuk menghilangkan semua target sebelumnya dan anggap saja yang berikut ini sebagai argumen:make target1 target2 action value1 value2
%:
dan@:
tidak dapat menemukan info tentang apa yang dilakukan "arahan" (atau apa pun namanya). Bisakah Anda menjelaskan?%:
dan@:
merupakan aturan . Nama target%
berarti bahwa itu adalah aturan yang cocok dengan apapun ; artinya, jika Make tidak dapat menemukan cara lain untuk membuat hal yang Anda perintahkan untuk dibuat, Make akan menjalankan aturan itu. Ini@:
adalah resepnya ; yang:
berarti melakukan apa-apa, dan@
cara melakukannya diam-diam.%:
itu sebenarnya% :
, nama target jenis wildcard. Saya tidak melihat apa pun di halaman manual itu mengenai@:
... itu menyarankan bahwa aturan "tidak melakukan apa-apa" hanya akan memiliki;
setelah spesifikasi target, jadi, bukankah lebih akurat untuk menulis% : ;
seperti "karakter pengganti -tidak ada aturan?filter-out
tidak berfungsi jika tindakannya adalah ketergantungan dari target yang ditentukan pada baris perintah, karena$@
akan disetel ke nama ketergantungan, bukan argumen asli yang dipanggil pada baris perintah. Sebagai gantinya, saya menetapkanMAKECMDGOALS
ke array shell dan kemudian menghapus elemen pertama:@ args=($(MAKECMDGOALS)); args=("$${args[@]:1}")
Berikut adalah solusi kerja umum berdasarkan @ Beta
Saya menggunakan GNU Make 4.1 dengan
SHELL=/bin/bash
di atas Makefile saya, jadi YMMV!Ini memungkinkan kita untuk menerima argumen tambahan (dengan tidak melakukan apa-apa saat kita mendapatkan pekerjaan yang tidak cocok, daripada membuat kesalahan).
Dan ini adalah makro yang memberikan argumen untuk kami:
Inilah pekerjaan yang mungkin disebut ini:
Hasilnya adalah:
Catatan! Anda mungkin lebih baik menggunakan "Taskfile", yang merupakan pola bash yang cara kerjanya mirip, hanya saja tanpa nuansa Maketools. Lihat https://github.com/adriancooney/Taskfile
sumber
tab
sebelumnya@echo
, bukanspace
.Pendekatan jauh lebih mudah. Pertimbangkan tugas:
Sekarang ketika saya ingin menyebutnya, saya hanya menjalankan sesuatu seperti:
AT="build assets" make provision
atau hanya:
make provision
dalam hal iniAT
adalah string kosongsumber
jangan mencoba melakukan ini
alih-alih buat skrip:
dan lakukan ini:
untuk penjelasan lebih lanjut mengapa melakukan ini dan peringatan peretasan makefile, baca jawaban saya untuk pertanyaan lain yang sangat mirip tetapi tampaknya bukan duplikat: Meneruskan argumen untuk "lari"
sumber