Saya memiliki makefile yang cukup besar yang membuat sejumlah target dengan cepat dengan menghitung nama dari variabel. (mis. foo $ (VAR): $ (PREREQS)). Adakah cara agar gnu make dapat diyakinkan untuk mengeluarkan daftar target setelah variabel-variabel ini diperluas?
Saya ingin mendapatkan target untuk makefile yang sembarangan. Saya mencoba menulis fungsi penyelesaian untuk shell saya.
make -pn | sed -rn '/^[^# \t\.%].*:[^=]?/p'
make -pnr
. The-r
menghilangkan aturan implisit.Diambil dari penyelesaian make arg, yang berfungsi seperti pesona.
sumber
~/bin
daripada menggunakan alias. Bekerja dengan baik; Terima kasih!alias mkl="make -qp | awk -F':' '/^[a-zA-Z0-9][^\$#\/\t=]*:([^=]|\$)/ {split(\$1,A,/ /);for(i in A)print A[i]}' | sort"
yang akan menghemat waktu 2 menit mengutip permainan :-)| sort -u
terlihat lebih berguna :)Saya tidak yakin apakah ini hanya gnu make, tapi ini bekerja dengan baik:
make help
sumber
Beberapa responden telah menyarankan penggunaan
make -pn
, yang akan mencetak database aturan tetapi tidak mengeksekusi apa pun - lebih atau kurang. Masalah dengan pendekatan ini adalah bahwa-n
masih memanggil semua rekursif membuat, dan masih melakukan lebih banyak pekerjaan daripada yang diperlukan, karena mencetak setiap perintah yang akan dipanggil dalam build biasa. Solusi yang lebih efisien adalah membuat makefile sepele, dummy.mk, dengan konten berikut:Sekarang aktifkan make as
make -p -f Makefile -f dummy.mk __all_targets__
. Pada bangunan substansial apa pun, perbedaan dalam jumlah output yang dihasilkan oleh merek adalah signifikan. Sebagai contoh:Waktu eksekusi juga jauh lebih baik - 2.063 detik untuk versi pertama, 0.059 detik untuk versi kedua.
sumber
time make -pn | wc -l
":1338738 real 0m47.754s.
"time make -f Makefile -f dummy.mk -pn __all_targets__ | wc -l
":938621 real 0m40.219s
.make
tampaknya menyarankan sesuatu yang serupa tetapi bersahabat, yaitumake -p -f/dev/null
-f /dev/null
akan mencegahmake
penguraian makefile biasa, jadi Anda hanya akan mendapatkan cetakan dari aturan bawaan. Itulah mengapa solusi saya menentukan-f Makefile -f dummy.mk
. Tetapi itu juga tidak cukup, karena with-n
,make
akan melanjutkan dan benar-benar mulai menjalankan aturan di makefile juga. Sayangnya saya tidak mengetahui adanya modifikasi yang dapat menyederhanakan solusi seperti yang disajikan sebelumnya.-n
..."Lihat penyelesaian bash untuk make di GitHub.
sumber
Sunting: Untuk diketahui, repositori git penyelesaian bash debian dalam jawaban lain sekarang menggabungkan versi yang disempurnakan dari skrip ini yang disesuaikan dengan kasus penggunaan penyelesaian bash.
Ini adalah skrip yang jauh lebih lengkap daripada skrip penyelesaian bash debian karena ini memberikan hasil untuk aturan yang dihasilkan yang merupakan pertanyaan yang diminta dan jawaban pilihan teratas (skrip penyelesaian debian bash di server debian git) tidak cukup.
Ini bukan skrip asli yang saya tautkan, tetapi lebih sederhana dan lebih cepat.
sumber
Ini adalah kode untuk alias berdasarkan solusi Todd Hodes
sumber
Ini akan memberikan hasil yang bagus:
sumber
Ada solusi yang sangat bagus dengan beberapa sihir sed dan egrep di sini: https://gist.github.com/pvdb/777954
sumber
Sepertinya saya sedikit terlambat ke pesta ini, tetapi jika Anda mencari perintah khusus, Anda dapat mencoba
Ini sebagian besar berfungsi, meskipun mungkin masih menyertakan beberapa hal non-target seperti
vpath
arahan. Jika Anda tidak bergantung padamake
aturan bawaan, Anda dapat menggunakanmake -qpR
sebagai perintah pertama dalam pipeline.sumber
Solusi Ruby:
sumber
Saya sedang mengerjakan solaris 10 dan turbo C shell. Solusi yang diberikan tidak berfungsi untuk proyek makefile saya. bahkan setelah mengubah baris perintah di atas menjadi sintaks tcsh. Namun, saya menemukan Anda bisa mendapatkan solusi mudah menggunakan
versi remake:
adalah
dan beberapa data versi tidak penting lainnya
sumber
Saya mencari pertanyaan yang sama dan muncul dengan putaran ini:
Ini menghapus semua baris komentar, aturan pola (baris yang dimulai dengan tab), semua intrinsik (contoh
.c.o
dan%.o: %.c
pola).sumber
Menemukan solusi ini di utas lain:
Anda juga dapat menambahkannya ke
Makefile
:Dan jalankan
make list
.sumber
Tentu, tapi kapan Anda ingin dia meludahkannya?
Untuk melaporkan nama target saat menjalankan aturan, letakkan baris di aturan:
Untuk melontarkan semuanya sekaligus, Anda dapat membuat target PHONY terpisah:
Dan ini dapat dijadikan prasyarat dari target default Anda:
EDIT:
Anda menginginkan cara untuk menampilkan semua kemungkinan target dari makefile sewenang-wenang, yang menurut saya berarti tidak mengganggu. Baik...
Untuk melakukannya dengan tepat, dan dapat menangani makefile yang canggih, misalnya melibatkan aturan yang dibuat oleh
eval
pernyataan, Anda harus menulis sesuatu yang mirip dengan emulator Make. Tidak praktis.Untuk melihat target dari aturan sederhana, Anda dapat menulis makefile yang akan bertindak sebagai pemindai makefile, yang beroperasi pada makefile sewenang-wenang:
Ini akan menjadi karya yang mengesankan. Apakah Anda yakin tujuannya sepadan dengan usaha?
sumber
sumber
:=
).