CMake: यह कैसे बताया जाए कि संक्रमणकारी निर्भरता कहाँ से आ रही है?


10

मैं स्वचालित निर्भरता प्रसार जैसी आधुनिक सुविधाओं का उपयोग करने के लिए एक विरासत सीमेक सेटअप को फिर से लिखने की प्रक्रिया में हूं। (यानी target_include_directories(<target> PUBLIC <dir>)इसके बजाय चीजों का उपयोग करना include_directories(<dir>)।) वर्तमान में, हम मैन्युअल रूप से वैश्विक निर्देशिका गुणों का एक समूह सेट करके सभी परियोजना निर्भरता जानकारी संभालते हैं।

अपने परीक्षण में, मुझे कुछ उदाहरण मिले हैं जहां नए निर्माण में एक लक्ष्य एक पुस्तकालय से जुड़ा होगा जो पुराने बिल्ड नहीं होगा। मैं इसे स्पष्ट रूप से लिंक नहीं कर रहा हूं, इसलिए मुझे पता है कि यह लक्ष्य की निर्भरता से आ रहा है, लेकिन यह पता लगाने के लिए कि मुझे कौन सी परियोजना के सभी के माध्यम से पुनरावर्ती रूप से देखना है CMakeLists.txt, जो मुझे मिल रही निर्भरता पदानुक्रम के बाद है एक जो पुस्तकालय में विचाराधीन है। हमारे पास दर्जनों पुस्तकालय हैं इसलिए यह एक तुच्छ प्रक्रिया नहीं है।

क्या सीएमके देखने के लिए कोई भी तरीका प्रदान करता है, प्रत्येक लक्ष्य के लिए, उसकी कौन सी निर्भरता स्पष्ट रूप से जोड़ी गई थी, और कौन-कौन से परिवर्तनशील निर्भरता के माध्यम से प्रचारित की गई थीं?

ऐसा लगता है कि --graphvizआउटपुट इस भेद को दर्शाता है, इसलिए स्पष्ट रूप से सीएमके संदर्भ को आंतरिक रूप से जानता है। हालाँकि, मैं treeकमांड लाइन पर निर्भरता की जानकारी दिखाने के लिए एक तरह की स्क्रिप्ट लिखना चाहता हूं , और ग्राफविज़ फ़ाइलों को पार्स करना एक बुरा सपना और हैक दोनों लगता है।

जहाँ तक मेरा बता सकते हैं, cmake-file-apiहै यह जानकारी शामिल। मैंने सोचा था कि codemodel/target/dependenciesक्षेत्र काम कर सकता है, लेकिन यह स्थानीय और सकर्मक निर्भरता दोनों को एक साथ मिलाता है। और backtraceप्रत्येक निर्भरता का क्षेत्र केवल वर्तमान लक्ष्य के लिए add_executable/ add_libraryकॉल पर वापस आता है ।


1
--graphizविकल्प आपके प्रश्न का उत्तर कैसे नहीं देता है? पार्सिंग डॉट फाइलें एक बुरे सपने की तरह क्यों महसूस होती हैं? डॉट फाइलें मानव-पठनीय प्रतिनिधित्व से जुड़े बिंदुओं का सबसे सरल, सामान्य और लचीला तरीका है। gvprउपयोगिता के साथ आप अजीब-ईश शैली में उनके साथ कुछ भी कर सकते हैं, और आप उन्हें अन्य भाषाओं में आयात कर सकते हैं। एक डॉट फाइल क्यों है, जो कि वस्तुतः लक्ष्यों के बीच निर्भरता की एक पेड़ जैसी संरचना का प्रतिनिधित्व करता है, न कि "देखने का तरीका" जो आप के लिए पूछते हैं?
कामिलुक

@KamilCuk मेला काफी मुझे लगता है कि मैं JSON जैसे अधिक मानकीकृत प्रारूप की उम्मीद कर रहा था जिसे मैं अतिरिक्त पैकेजों को स्थापित किए बिना और अपने स्वयं के पार्सर को लिखे बिना पढ़ सकता था। मैंने मान लिया कि निर्भरता ग्राफ कई प्रारूपों में उपलब्ध होगा ( उदाहरण के लिए, मुझे अभी भी CMake सर्वर API के साथ प्रयोग करने की आवश्यकता है )। लेकिन अगर डॉटफ़ाइल्स उस जानकारी को प्राप्त करने का सबसे आसान (या केवल) तरीका है, तो यह ठीक है।
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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.