সিএমকে: ট্রানজিটিভ নির্ভরতা কোথা থেকে আসছে তা কীভাবে বলবেন?


10

স্বয়ংক্রিয়তা নির্ভরতা প্রচারের মতো আধুনিক বৈশিষ্ট্যগুলি ব্যবহার করার জন্য আমি কোনও উত্তরাধিকার সিএমকে সেটআপ পুনরায় লেখার প্রক্রিয়াধীন। (যেমন target_include_directories(<target> PUBLIC <dir>)পরিবর্তে জিনিস ব্যবহার করে include_directories(<dir>)।) বর্তমানে, আমরা বিশ্বব্যাপী ডিরেক্টরি বৈশিষ্ট্যগুলির গুচ্ছ সেট করে সমস্ত প্রকল্প নির্ভরতা তথ্য ম্যানুয়ালি পরিচালনা করি।

আমার পরীক্ষায় আমি কয়েকটি উদাহরণ পেয়েছি যেখানে নতুন বিল্ডের একটি লক্ষ্য একটি লাইব্রেরির সাথে লিঙ্ক করবে যা পুরানো বিল্ডটি নয়। আমি এটির সাথে সুস্পষ্টভাবে লিঙ্ক দিচ্ছি না, সুতরাং আমি জানি যে এটি লক্ষ্যটির নির্ভরতা থেকে আসছে, তবে CMakeLists.txtআমি খুঁজে না পাওয়া অবধি নির্ভরতা স্তরক্রম অনুসরণ করে কোনটি (গুলি) প্রজেক্টের সমস্তটি পুনরুক্তভাবে দেখতে হবে তা আবিষ্কার করার জন্য to এক যে প্রশ্নে লাইব্রেরি টান। আমাদের কয়েক ডজন গ্রন্থাগার রয়েছে সুতরাং এটি তুচ্ছ প্রক্রিয়া নয়।

সিএমকে কি প্রতিটি লক্ষ্যের জন্য দেখার কোনও উপায় সরবরাহ করে, এর কোন নির্ভরতা সুস্পষ্টভাবে যুক্ত হয়েছিল এবং কোনটি ট্রানজিটিভ নির্ভরতার মাধ্যমে প্রচারিত হয়েছিল?

দেখে মনে হচ্ছে --graphvizআউটপুট করে এই পার্থক্য দেন, তাই পরিষ্কারভাবে CMake অভ্যন্তরীণভাবে প্রসঙ্গ জানেন। তবে, আমি treeকমান্ড লাইনে নির্ভরতা সম্পর্কিত তথ্য প্রদর্শন করতে একটি অনুরূপ স্ক্রিপ্ট লিখতে চাইছি এবং গ্রাফভিজ ফাইলগুলি পার্স করে যাচ্ছি যা দুঃস্বপ্ন এবং হ্যাক উভয়ের মতোই লাগে।

আমি যতদূর বলতে পারি, এই তথ্যটি অন্তর্ভুক্ত cmake-file-apiকরে না । আমি ভেবেছিলাম codemodel/target/dependenciesক্ষেত্রটি কাজ করতে পারে তবে এটি স্থানীয় এবং ট্রানজিটিভ নির্ভরতা উভয়কেই মিশ্রিত করে। এবং backtraceপ্রতিটি নির্ভরতার ক্ষেত্রটি কেবল বর্তমান টার্গেটের জন্য add_executable/ add_libraryকলটির সাথে ফিরে আসে ।


1
কীভাবে --graphizবিকল্প আপনার প্রশ্নের উত্তর দেয় না ? কেন ডট ফাইলগুলি পার্সিং করা দুঃস্বপ্নের মতো মনে হয়? ডট ফাইলগুলি মানব-পঠনযোগ্য সংযুক্ত পয়েন্টগুলি উপস্থাপনের সহজতম, সাধারণ এবং নমনীয় উপায়। সঙ্গে gvprউপযোগ আপনি awk পর শৈলী তাদের সাথে কিছু করতে পারেন, এবং আপনি তাদের অন্যান্য ভাষায় আমদানি করতে পারেন। কেন ডট ফাইল, যা আক্ষরিক অর্থে লক্ষ্যগুলির মধ্যে গাছের মতো নির্ভরতার কাঠামোর প্রতিনিধিত্ব করে, আপনি যা চান তা "দেখার উপায়" নয়?
কামিলকুক

@ কামিলকুকের মেলা যথেষ্ট। আমি মনে করি যে আমি JSON এর মতো আরও মানসম্পন্ন বিন্যাসের জন্য আশা করছিলাম যা আমি অতিরিক্ত প্যাকেজ ইনস্টল না করে এবং নিজের পার্সার না লিখেই পড়তে পারি। আমি ধরে নিয়েছি যে নির্ভরতা গ্রাফ একাধিক ফর্ম্যাটে উপলভ্য হবে ( উদাহরণস্বরূপ, আমাকে সিএমকে সার্ভার এপিআই দিয়ে পরীক্ষা করা দরকার )। তবে যদি ডটফাইলগুলি সেই তথ্য পাওয়ার সহজতম (বা কেবল) উপায় হয় তবে তা ঠিক।
0x5453

1
আমি গ্রাফভিজে এগুলি আলাদাভাবে দেখিয়ে খুব বেশি বাজি ধরব না। কোডটি এটি আলাদা করে বলেছে এটি এখানে লিঙ্কযুক্ত , এটি খুব পরিশীলিত নয়।
ক্যারেট

উত্তর:


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 প্রকল্প খুঁজে পেতে পারেন


উদাহরণের জন্য ধন্যবাদ, আমি সন্ধান করতে হবে pydot
0x5453
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.