Tôi đang trong quá trình viết lại thiết lập CMake cũ để sử dụng các tính năng hiện đại như lan truyền phụ thuộc tự động. (tức là sử dụng những thứ như target_include_directories(<target> PUBLIC <dir>)
thay vì include_directories(<dir>)
.) Hiện tại, chúng tôi xử lý thủ công tất cả thông tin phụ thuộc dự án bằng cách đặt một loạt các thuộc tính thư mục toàn cầu.
Trong thử nghiệm của mình, tôi đã tìm thấy một vài ví dụ trong đó mục tiêu trong bản dựng mới sẽ liên kết đến một thư viện mà bản dựng cũ không có. Tôi không liên kết với nó một cách rõ ràng, vì vậy tôi biết điều này xuất phát từ sự phụ thuộc của mục tiêu, nhưng để tìm ra cái nào tôi phải xem xét đệ quy tất cả các dự án CMakeLists.txt
, theo dõi hệ thống phân cấp phụ thuộc cho đến khi tôi tìm thấy một trong đó kéo trong thư viện trong câu hỏi. Chúng tôi có hàng tá thư viện nên đây không phải là một quá trình tầm thường.
CMake có cung cấp bất kỳ cách nào để xem, đối với từng mục tiêu, phần phụ thuộc nào của nó đã được thêm một cách rõ ràng và mục tiêu nào được truyền qua phụ thuộc bắc cầu không?
Có vẻ như --graphviz
đầu ra không thể hiện sự khác biệt này, vì vậy rõ ràng CMake biết bối cảnh bên trong. Tuy nhiên, tôi muốn viết một tree
tập lệnh giống như để hiển thị thông tin phụ thuộc trên dòng lệnh và phân tích các tệp Graphviz nghe có vẻ như là một cơn ác mộng và một vụ hack.
Theo như tôi có thể nói, cmake-file-api
không không bao gồm thông tin này. Tôi nghĩ rằng codemodel/target/dependencies
lĩnh vực này có thể hoạt động, nhưng nó liệt kê cả phụ thuộc cục bộ và phụ thuộc lẫn nhau. Và backtrace
trường của mỗi phụ thuộc chỉ liên kết trở lại add_executable
/ add_library
gọi cho mục tiêu hiện tại.
--graphiz
tùy chọn không trả lời câu hỏi của bạn? Tại sao phân tích cú pháp tệp cảm thấy như một cơn ác mộng? Các tệp chấm là cách đơn giản nhất, phổ biến và linh hoạt để con người có thể đọc được đại diện cho các điểm được kết nối. Vớigvpr
tiện ích, bạn có thể làm bất cứ điều gì với chúng theo kiểu awk-ish và bạn có thể nhập chúng bằng các ngôn ngữ khác. Tại sao là một tệp chấm, nghĩa đen là một cấu trúc phụ thuộc giống như cây giữa các mục tiêu, không phải là "cách nhìn" mà bạn yêu cầu?