Anda dapat mencetak variabel saat makefile dibaca (dengan asumsi GNU make seperti Anda menandai pertanyaan ini dengan tepat) menggunakan metode ini (dengan variabel bernama "var"):
$(info $$var is [${var}])
Anda bisa menambahkan konstruksi ini ke resep apa saja untuk melihat apa yang akan lolos ke shell:
.PHONY: all
all: ; $(info $$var is [${var}])echo Hello world
Sekarang, apa yang terjadi di sini adalah membuat menyimpan seluruh resep ( $(info $$var is [${var}])echo Hello world
) sebagai variabel tunggal yang diperluas secara rekursif. Ketika make memutuskan untuk menjalankan resep (misalnya ketika Anda memintanya untuk membangun all
), itu memperluas variabel, dan kemudian melewati setiap baris yang dihasilkan secara terpisah ke shell.
Jadi, dalam detail yang menyakitkan:
- Itu mengembang
$(info $$var is [${var}])echo Hello world
- Untuk melakukan ini pertama-tama mengembang
$(info $$var is [${var}])
$$
menjadi literal $
${var}
menjadi :-)
(katakanlah)
- Efek sampingnya adalah yang
$var is [:-)]
muncul pada standar out
- Perluasan
$(info...)
meskipun kosong
- Buat dibiarkan
echo Hello world
- Buat cetakan
echo Hello world
pada stdout terlebih dahulu untuk memberi tahu Anda apa yang harus dilakukan shell
- Shell mencetak
Hello world
pada stdout.
Sesuai manual GNU Make dan juga ditunjukkan oleh 'bobbogo' pada jawaban di bawah ini, Anda dapat menggunakan info / peringatan / kesalahan untuk menampilkan teks.
Untuk mencetak variabel,
'error' akan menghentikan eksekusi make , setelah menunjukkan string kesalahan
sumber
dari "Mr. Make post" https://www.cmcrossroads.com/article/printing-value-makefile-variable
Tambahkan aturan berikut ke Makefile Anda:
Kemudian, jika Anda ingin mengetahui nilai variabel makefile, cukup:
dan itu akan kembali:
sumber
Jika Anda hanya ingin beberapa keluaran, Anda ingin menggunakannya
$(info)
dengan sendirinya. Anda dapat melakukannya di mana saja di Makefile, dan itu akan ditampilkan ketika garis itu dievaluasi:Akan ditampilkan
VAR="<value of VAR>"
setiap kali membuat proses garis itu. Perilaku ini sangat bergantung pada posisi, jadi Anda harus memastikan bahwa$(info)
ekspansi terjadi SETELAH semua yang dapat memodifikasi$(VAR)
telah terjadi!Opsi yang lebih umum adalah membuat aturan khusus untuk mencetak nilai variabel. Secara umum, aturan dijalankan setelah variabel ditugaskan, jadi ini akan menunjukkan kepada Anda nilai yang sebenarnya sedang digunakan. (Meskipun, ada kemungkinan aturan mengubah variabel .) Pemformatan yang baik akan membantu memperjelas variabel apa yang diatur, dan
$(flavor)
fungsi akan memberi tahu Anda seperti apa variabel itu. Jadi dalam aturan ini:$*
memperluas ke batang yang cocok dengan%
pola dalam aturan.$($*)
memperluas ke nilai variabel yang namanya diberikan oleh$*
.[
dan]
secara jelas menggambarkan ekspansi variabel. Anda juga bisa menggunakan"
dan"
atau serupa.$(flavor $*)
memberi tahu Anda apa jenis variabelnya. CATATAN:$(flavor)
mengambil nama variabel , dan bukan ekspansi. Jadi jika Anda berkatamake print-LDFLAGS
, Anda dapatkan$(flavor LDFLAGS)
, itulah yang Anda inginkan.$(info text)
memberikan output. Jadikan cetakantext
pada stdout sebagai efek samping dari ekspansi. Perluasan$(info)
meskipun kosong. Anda bisa memikirkannya seperti itu@echo
, tetapi yang penting itu tidak menggunakan shell, jadi Anda tidak perlu khawatir tentang aturan mengutip shell.@true
apakah ada hanya untuk memberikan perintah untuk aturan. Tanpa itu, make juga akan di-outputprint-blah is up to date
. Saya merasa@true
membuatnya lebih jelas bahwa itu dimaksudkan sebagai larangan.Menjalankannya, Anda dapatkan
sumber
@echo $ (NDK_PROJECT_PATH) adalah cara yang baik untuk melakukannya. Saya tidak berpikir kesalahan itu berasal dari sana. Secara umum kesalahan ini muncul ketika Anda salah mengetik niat: Saya pikir Anda memiliki spasi di mana Anda harus memiliki tab.
sumber
Semua versi
make
mengharuskan baris perintah diindentasi dengan TAB (bukan spasi) sebagai karakter pertama dalam baris. Jika Anda menunjukkan kepada kami seluruh aturan alih-alih hanya dua baris yang dipermasalahkan, kami dapat memberikan jawaban yang lebih jelas, tetapi harus berupa:di mana karakter pertama di baris kedua harus TAB.
sumber
Jalankan
make -n
; ini menunjukkan kepada Anda nilai variabel ..Makefile ...
Perintah:
Keluaran:
sumber
--just-print
adalah sama di Alih-alih EksekusiIni
makefile
akan menghasilkan pesan kesalahan 'pemisah yang hilang':Ada tab sebelum
@echo "All done"
(meskipundone:
aturan dan tindakan sebagian besar berlebihan), tetapi tidak sebelum@echo PATH=$(PATH)
.Masalahnya adalah bahwa garis awal
all
harus memiliki titik dua:
atau sama dengan=
untuk menunjukkan bahwa itu adalah garis target atau garis makro, dan tidak memiliki keduanya, sehingga pemisah tidak ada.Tindakan yang menggemakan nilai variabel harus dikaitkan dengan target, mungkin target dummy atau PHONEY. Dan garis target itu harus memiliki titik dua di atasnya. Jika Anda menambahkan
:
setelahall
dalam contohmakefile
dan mengganti kosong di baris berikutnya dengan tab, itu akan berfungsi dengan baik.Anda mungkin memiliki masalah analog di dekat baris 102 dalam dokumen asli
makefile
. Jika Anda menunjukkan 5 baris non-kosong, non-komentar sebelum operasi gema yang gagal, mungkin akan mungkin untuk menyelesaikan diagnosis. Namun, sejak pertanyaan diajukan pada Mei 2013, kecil kemungkinan kerusakanmakefile
masih tersedia sekarang (Agustus 2014), jadi jawaban ini tidak dapat divalidasi secara resmi. Ini hanya dapat digunakan untuk menggambarkan cara yang masuk akal di mana masalah terjadi.sumber
Tidak perlu memodifikasi Makefile.
sumber
Masalahnya adalah bahwa gema hanya berfungsi di bawah blok eksekusi. yaitu apa saja setelah "xx:"
Jadi apapun di atas blok eksekusi pertama hanya inisialisasi sehingga tidak ada perintah eksekusi yang dapat digunakan.
Jadi buat blok eksekusi
sumber
Ini bisa dilakukan dengan cara yang umum dan bisa sangat berguna ketika men-debug makefile yang kompleks. Mengikuti teknik yang sama seperti yang dijelaskan dalam jawaban lain , Anda bisa memasukkan yang berikut ini ke makefile apa pun:
Kemudian Anda bisa melakukan "cetak" untuk membuang nilai variabel apa pun:
sumber
Anda bisa membuat aturan vars di file make Anda, seperti ini:
Ada beberapa cara yang lebih kuat untuk membuang semua variabel di sini: gnu make: daftar nilai-nilai semua variabel (atau "makro") dalam menjalankan tertentu .
sumber
Jika Anda tidak ingin memodifikasi Makefile itu sendiri, Anda dapat menggunakan
--eval
untuk menambahkan target baru, dan kemudian menjalankan target baru, misalnyamake --eval='print-tests: @echo TESTS $(TESTS) ' print-tests
Anda dapat memasukkan karakter TAB yang diperlukan di baris perintah menggunakan
CTRL-V, TAB
contoh Makefile dari atas:
sumber
make: *** missing separator. Stop.
make --eval='print-tests: ; @echo TESTS $(TESTS)' print-tests
jika Anda menggunakan android make (mka)
@echo $(NDK_PROJECT_PATH)
tidak akan berfungsi dan memberi Anda kesalahan,*** missing separator. Stop."
gunakan jawaban ini jika Anda mencoba mencetak variabel di android makeitu berhasil untuk saya
sumber
Saya biasanya echo dengan kesalahan jika saya ingin melihat nilai variabel. (Hanya jika Anda ingin melihat nilai. Ini akan menghentikan eksekusi.)
sumber