Masalah
Saya ingin melihat dependensi untuk satu atau lebih target makefile. Jadi saya mencari program yang dapat mem-parsing makefiles dan kemudian akan mewakili dependensi dalam beberapa format seperti pohon (indentasi, ascii-art, ...) atau sebagai grafik (titik, ...).
Serupa
Ada program yang melakukan ini untuk situasi lain:
- pactree atau debtree dapat menampilkan dependensi untuk paket perangkat lunak dalam format masing-masing dalam pohon seperti format ascii atau sebagai
dot
grafik, gcc -M source_file.c
menampilkan dependensi file sumber C sebagai aturan make,- pstree menampilkan representasi ascii dari pohon proses.
Kemajuan
Mencari di web saya menemukan sedikit bantuan . Itu membuat saya mencoba
make --always-make --silent --dry-run some_target | \
grep --extended-regexp 'Considering target file|Trying rule prerequisite'
tetapi sepertinya saya harus meretas beberapa kode parsing lebih dalam perl atau python untuk mewakili ini sebagai pohon / grafik yang bagus. Dan saya belum tahu apakah saya akan benar-benar mendapatkan grafik yang lengkap dan benar dengan cara ini.
Persyaratan
Akan lebih baik untuk membatasi grafik dalam beberapa cara (tidak ada aturan bawaan, hanya target yang diberikan, hanya beberapa kedalaman) tetapi untuk sebagian besar saya hanya mencari alat yang akan memberi saya dependensi dalam beberapa "masuk akal", manusia Format -viewable (seperti program di bawah "Mirip" lakukan).
Pertanyaan
- Apakah ada program yang bisa melakukan ini?
- Apakah saya akan mendapatkan informasi yang lengkap dan benar dari
make -dnq ...
? - Apakah ada cara yang lebih baik untuk mendapatkan info ini?
- Apakah skrip / upaya untuk menguraikan informasi ini sudah ada?
sumber
printf 'A\n B\n D\n C\n D\n'
. (Siapa bilang saya tidak bisa memasukkan baris baru dalam komentar? :)dot
grafik pesanan jelas baik-baik saja.) Saya akan memperbarui sedikit pertanyaan untuk membuatnya lebih jelas (saya harap).Jawaban:
Coba makefile2graph dari penulis yang sama ada alat serupa MakeGraphDependencies yang ditulis
java
alih-alihc
.Kemudian gunakan beberapa editor grafik vektor untuk menyorot koneksi yang Anda butuhkan.
sumber
Saya telah menemukan semacam peretasan untuk setidaknya menghasilkan informasi yang terstruktur dengan jelas tentang target yang bergantung pada prasyarat yang mana. Kelemahannya, itu cukup mengganggu. Dengan kata lain, Anda perlu mengubah makefile Anda untuk membungkus resep bangunan semua target Anda menjadi fungsi bersyarat kecil. Saya akan memposting contoh singkat:
Dalam contoh ini, saya menggunakan fungsi getRecipe linting tangan untuk membungkus masing-masing resep target individu dan kemudian memutuskan apakah akan benar-benar menjalankan resep itu atau hanya menampilkan target mana yang sedang dibangun dan prasyarat yang tergantung pada. Yang terakhir hanya terjadi jika variabel
DEPENDENCY_GRAPH
diatur (misalnya sebagai variabel lingkungan). Pada contoh, resep build tidak lebih dari sebuah gema yang mengatakan bahwa target sedang dibangun, tetapi Anda dapat dengan jelas menggantinya dengan perintah pilihan Anda.Dengan
DEPENDENCY_GRAPH
set ke 1, ini menghasilkan output:yang seharusnya cukup mudah untuk diuraikan dan kemudian dikonversi menjadi grafik-titik.
Dengan
DEPENDENCY_GRAPH
tidak disetel sama sekali atau set ke 0, outputnya adalah:atau, dengan kata lain, resep build normal digunakan sebagai gantinya. Saya belum menguji apakah ini bisa diandalkan dengan resep yang rumit. Satu masalah yang sudah saya temui adalah bahwa itu tidak bekerja sama sekali dengan resep multi-line.
Misalnya, dalam resep build target terakhir, jika selain mengatakan bahwa target sedang dibangun, saya sebenarnya ingin ke
touch
file:make
tampaknya berpikir bahwatouch $@
bagian itu hanyalah bagian dari gema di baris sebelumnya:Jika saya meninggalkan backslash tertinggal di baris sebelumnya,
make
mengeluh*** unterminated call to function
panggilan ': hilang)'. Stop.
Jika ada yang punya ide bagaimana bisamake
bermain bagus, saya semua telinga. :)EDIT: Masalah lain dengan pendekatan ini adalah bahwa ini hanya akan berfungsi jika tidak ada hasil build yang sudah ada, karena
make
jelas tidak menjalankan resep build dari target yang dianggap up-to-date.sumber
;
setelahtarget $@
perintah sentuh berfungsimake -B
opsi yang tanpa syarat membuat semua target.Saya menggunakan remake --profile (pengganti drop-in untuk
make
), itu menghasilkan pohon dependensi dalam format callgrind.Kemudian gprof2dot dapat menghasilkan gambar dari pohon target.
sumber
remake --profile
hanya menampilkan grafik ketergantungan untuk target yang dijalankannya? Atau bisakah itu entah bagaimana menampilkan grafik untuk semua target?remake --targets -r | grep -v %| grep -v '\t*\.'|xargs remake -n --profile -B
terlihat menjanjikan.