CMake: Làm thế nào để biết nơi phụ thuộc quá độ đến từ đâu?


10

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 treetậ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-apikhông không bao gồm thông tin này. Tôi nghĩ rằng codemodel/target/dependencieslĩ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à backtracetrường của mỗi phụ thuộc chỉ liên kết trở lại add_executable/ add_librarygọi cho mục tiêu hiện tại.


1
Làm thế nào không --graphiztù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ới gvprtiệ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?
KamilCuk

@KamilCuk Đủ công bằng. Tôi nghĩ rằng tôi đã hy vọng một định dạng chuẩn hơn như JSON mà tôi có thể đọc mà không cần cài đặt các gói bổ sung và không cần viết trình phân tích cú pháp của riêng tôi. Tôi giả định rằng biểu đồ phụ thuộc sẽ có sẵn ở nhiều định dạng ( ví dụ: tôi vẫn cần thử nghiệm với API máy chủ CMake ). Nhưng nếu dotfiles là cách dễ nhất (hoặc duy nhất) để có được thông tin đó, thì tốt thôi.
0x5453

1
Tôi sẽ không đặt cược quá nhiều cược vào Graphviz cho thấy những điều này khác nhau. Mã phân biệt nó được liên kết ở đây , nó không phức tạp lắm.
kert

Câu trả lời:


4

Bạn có thể phân tích dottệp được tạo bởi graphvizvà trích xuất chi tiết mà bạn muốn. Dưới đây là kịch bản mẫu python để làm điều đó.

import pydot
import sys

graph = pydot.graph_from_dot_file(sys.argv[1])
result = {}

for g in graph:
    # print(g)
    for node in g.get_node_list():
        if node.get("label") != None:
            result[node.get("label")] = []

    for edge in g.get_edges():
        result[g.get_node(edge.get_source())[0].get("label")].append(g.get_node(edge.get_destination())[0].get("label"))

for r in result:
    print(r+":"+",".join(result[r]))

Bạn cũng có thể thêm tập lệnh này để chạy từ cmake làm mục tiêu tùy chỉnh, vì vậy bạn có thể gọi nó từ hệ thống xây dựng của mình. Bạn có thể tìm thấy dự án cmake mẫu ở đây


Cảm ơn ví dụ, tôi sẽ phải xem xét pydot.
0x5453
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.