Saya sedang dalam proses menulis ulang pengaturan CMake lama untuk menggunakan fitur-fitur modern seperti propagasi ketergantungan otomatis. (Yaitu menggunakan hal-hal seperti target_include_directories(<target> PUBLIC <dir>)
bukaninclude_directories(<dir>)
.) Saat ini, kami secara manual menangani semua informasi ketergantungan proyek dengan mengatur sekelompok properti direktori global.
Dalam pengujian saya, saya telah menemukan beberapa contoh di mana target dalam membangun baru akan menautkan ke perpustakaan yang tidak dibangun oleh yang lama. Saya tidak menghubungkannya secara eksplisit, jadi saya tahu ini berasal dari dependensi target, tetapi untuk menemukan yang mana saya harus secara rekursif melihat semua proyek.CMakeLists.txt
, menindaklanjuti hierarki dependensi sampai saya menemukan salah satu yang menarik di perpustakaan yang dimaksud. Kami memiliki lusinan perpustakaan sehingga ini bukan proses yang sepele.
Apakah CMake menyediakan cara untuk melihat, untuk setiap target, mana dari dependensinya yang ditambahkan secara eksplisit, dan mana yang diperbanyak melalui dependensi transitif?
Sepertinya --graphviz
output memang menunjukkan perbedaan ini, jadi jelas CMake tahu konteksnya secara internal. Namun, saya ingin menulis tree
skrip mirip untuk menampilkan informasi ketergantungan pada baris perintah, dan mem-parsing file Graphviz terdengar seperti mimpi buruk dan peretasan.
Sejauh yang saya tahu, cmake-file-api
tidak tidak termasuk informasi ini. Saya pikir codemodel/target/dependencies
bidang ini mungkin berfungsi, tetapi daftar dependensi lokal dan transitif dicampur bersama. Dan backtrace
bidang masing-masing ketergantungan hanya mengikat kembali ke add_executable
/ add_library
panggilan untuk target saat ini.
--graphiz
opsi tidak menjawab pertanyaan Anda? Mengapa parsing file dot terasa seperti mimpi buruk? File dot adalah cara paling sederhana, umum dan fleksibel untuk mewakili titik terhubung yang dapat dibaca manusia. Dengangvpr
utilitas Anda dapat melakukan apa saja dengan mereka dalam gaya awk-ish, dan Anda dapat mengimpornya dalam bahasa lain. Mengapa file titik, yang secara harfiah mewakili struktur dependensi mirip pohon di antara target, bukan "cara untuk melihat" yang Anda minta?Jawaban:
Anda dapat mem-parsing
dot
file yang dihasilkan olehgraphviz
dan mengekstrak detail yang Anda inginkan. Di bawah ini adalah contoh skrip python untuk melakukan itu.Anda juga dapat menambahkan skrip ini untuk dijalankan dari cmake sebagai target khusus, sehingga Anda dapat memanggilnya dari sistem build Anda. Anda dapat menemukan contoh proyek cmake di sini
sumber
pydot
.