CMake: จะบอกได้อย่างไรว่าการพึ่งพาสกรรมกริยามาจากไหน?


10

ฉันอยู่ในกระบวนการเขียนการตั้งค่า CMake ดั้งเดิมเพื่อใช้คุณสมบัติที่ทันสมัยเช่นการเผยแพร่อัตโนมัติ (เช่นการใช้สิ่งต่าง ๆtarget_include_directories(<target> PUBLIC <dir>)แทนinclude_directories(<dir>)) ปัจจุบันเราจัดการข้อมูลการอ้างอิงโครงการทั้งหมดด้วยตนเองโดยการตั้งค่าคุณสมบัติของไดเรกทอรีทั่วโลก

ในการทดสอบของฉันฉันได้พบตัวอย่างเล็ก ๆ น้อย ๆ ที่เป้าหมายในการสร้างใหม่จะเชื่อมโยงไปยังห้องสมุดที่การสร้างเก่าจะไม่ ฉันไม่ได้เชื่อมโยงกับมันอย่างชัดเจนดังนั้นฉันจึงรู้ว่าสิ่งนี้มาจากการอ้างอิงของเป้าหมาย แต่เพื่อที่จะค้นหาว่าฉันควรจะดูว่าโครงการใดที่ฉันต้องทำซ้ำเพื่อCMakeLists.txtติดตามลำดับการพึ่งพาจนกระทั่งฉันพบ อันที่ดึงเข้าไปในห้องสมุดที่มีปัญหา เรามีห้องสมุดหลายสิบแห่งดังนั้นนี่จึงไม่ใช่กระบวนการที่ไม่สำคัญ

CMake ให้วิธีการใด ๆ ในการมองเห็นสำหรับแต่ละเป้าหมายการเพิ่มการอ้างอิงของมันอย่างชัดเจนและการแพร่กระจายใดผ่านการพึ่งพาสกรรมกริยาหรือไม่

ดูเหมือนว่า--graphvizเอาต์พุตจะแสดงความแตกต่างนี้ดังนั้น CMake จึงรู้บริบทภายในอย่างชัดเจน อย่างไรก็ตามฉันต้องการเขียนtreeสคริปต์เหมือนเพื่อแสดงข้อมูลการพึ่งพาในบรรทัดคำสั่งและการแยกวิเคราะห์ไฟล์ Graphviz ดูเหมือนว่าทั้งฝันร้ายและแฮ็ค

เท่าที่ฉันสามารถบอกได้cmake-file-apiจะไม่รวมข้อมูลนี้ ฉันคิดว่าcodemodel/target/dependenciesสนามอาจใช้งานได้ แต่มันแสดงการพึ่งพาทั้งในระดับท้องถิ่นและสกรรมกริยารวมกัน และbacktraceเขตข้อมูลของการอ้างอิงแต่ละครั้งจะผูกกลับไปที่add_executable/ การadd_libraryเรียกสำหรับเป้าหมายปัจจุบันเท่านั้น


1
วิธีไม่ได้--graphizตัวเลือกที่ไม่ตอบคำถามของคุณหรือไม่ ทำไมการแยกไฟล์ dot ถึงรู้สึกเหมือนฝันร้าย? ไฟล์ Dot เป็นวิธีที่ง่ายที่สุดธรรมดาและยืดหยุ่นในการแสดงจุดเชื่อมต่อที่มนุษย์อ่านได้ ด้วยgvprยูทิลิตี้คุณสามารถทำอะไรกับมันในสไตล์ awk-ish และคุณสามารถนำเข้ามันในภาษาอื่น ๆ เพราะเหตุใดไฟล์ dot ที่แสดงถึงโครงสร้างการพึ่งพาระหว่างต้นไม้อย่างแท้จริงไม่ใช่ "วิธีดู" สิ่งที่คุณถาม
KamilCuk

@ KamilCuk ยุติธรรมเพียงพอ ฉันคิดว่าฉันหวังว่ารูปแบบที่เป็นมาตรฐานมากขึ้นเช่น JSON ที่ฉันสามารถอ่านได้โดยไม่ต้องติดตั้งแพคเกจเพิ่มเติมและไม่ต้องเขียนโปรแกรมแยกวิเคราะห์ของฉันเอง ฉันคิดว่ากราฟการพึ่งพาจะมีอยู่ในหลาย ๆ รูปแบบ (ฉันยังต้องทดลองกับCMake เซิร์ฟเวอร์ APIเป็นต้น) แต่ถ้า dotfiles เป็นวิธีที่ง่ายที่สุด (หรืออย่างเดียว) ในการรับข้อมูลนั่นก็โอเค
0x5453

1
ฉันจะไม่เดิมพันมากเกินไปกับกราฟวิซที่แสดงสิ่งเหล่านี้แตกต่างกัน รหัสที่บอกแยกจะเชื่อมโยงที่นี่มันไม่ซับซ้อนมาก
kert

คำตอบ:


4

คุณสามารถแยกวิเคราะห์dotไฟล์ที่สร้างโดยgraphvizและแยกรายละเอียดที่คุณต้องการ ด้านล่างนี้เป็นสคริปต์ไพ ธ อนตัวอย่างเพื่อทำเช่นนั้น

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]))

คุณยังสามารถเพิ่มสคริปต์นี้เพื่อเรียกใช้จาก cmake เป็นเป้าหมายที่กำหนดเองเพื่อให้คุณสามารถเรียกมันจากคุณสร้างระบบ คุณสามารถหาตัวอย่างโครงการ cmake ได้ที่นี่


pydotขอบคุณสำหรับตัวอย่างที่ผมจะต้องมองเข้าไปใน
0x5453
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.