একটি মেকফিলের ক্ষেত্রে গাছ হিসাবে দেওয়া নির্ভরতা কীভাবে প্রদর্শন করবেন?


18

সমস্যা

আমি একটি মেকফিলের এক বা একাধিক লক্ষ্যগুলির জন্য নির্ভরতা দেখতে চাই। সুতরাং আমি এমন একটি প্রোগ্রাম খুঁজছি যা মেকফিলগুলি পার্স করতে পারে এবং তারপরে কিছু গাছের মতো বিন্যাসে (ইনডেন্টেশন, এসকিআই-আর্ট, ...) বা গ্রাফ (বিন্দু, ...) হিসাবে নির্ভরতা উপস্থাপন করে।

অনুরূপ

এমন অন্যান্য প্রোগ্রাম রয়েছে যা অন্যান্য পরিস্থিতিতে এটি করে:

উন্নতি

ওয়েবে অনুসন্ধান করে আমি সামান্য সহায়তা পেয়েছি । যে আমাকে চেষ্টা করতে নেতৃত্ব

make --always-make --silent --dry-run some_target | \
  grep --extended-regexp 'Considering target file|Trying rule prerequisite'

তবে দেখে মনে হচ্ছে এটিকে একটি সুন্দর গাছ / গ্রাফ হিসাবে উপস্থাপন করার জন্য আমাকে পার্ল বা পাইথনে আরও কিছু পার্সিং কোড হ্যাক করতে হবে। এবং আমি এখনও জানি না যে আমি সত্যিই এইভাবে পুরো এবং সঠিক গ্রাফটি পাব কিনা।

আবশ্যকতা

গ্রাফটি কিছু উপায়ে সীমিত করা ভাল হবে (কোনও বিল্টিন রুল নয়, কেবলমাত্র একটি নির্দিষ্ট লক্ষ্য, কেবলমাত্র কিছু গভীরতা) তবে বেশিরভাগ অংশের জন্য আমি কেবল এমন একটি সরঞ্জাম খুঁজছি যা আমাকে কিছু "যুক্তিসঙ্গত", মানুষের মধ্যে নির্ভরতা দেয় -দর্শনযোগ্য বিন্যাস ("অনুরূপ" অধীনে প্রোগ্রামগুলির মতো)।

প্রশ্নাবলি

  • এমন কোন প্রোগ্রাম রয়েছে যা এটি করতে পারে?
  • আমি কি থেকে সম্পূর্ণ এবং সঠিক তথ্য পাবেন make -dnq ...?
  • এই তথ্য পেতে আরও ভাল উপায় আছে?
  • এই তথ্যটি বিশ্লেষণের জন্য স্ক্রিপ্ট / প্রচেষ্টা কি ইতিমধ্যে বিদ্যমান?

1
এখানে গুরুত্বপূর্ণ বিষয়টি বুঝতে হবে: নির্ভরতাগুলি গাছ তৈরি করে না। এগুলি একটি নির্দেশিত এবং (আশাবাদী!) অ্যাসাইক্লিক গ্রাফ গঠন করে - এটি একটি ডিএজি হিসাবে পরিচিত । নিম্নলিখিতগুলির জন্য নির্ভরতা গ্রাফটি আঁকতে চেষ্টা করুন এবং আপনি এটি দেখতে পাবেন: এ বি এর উপর নির্ভর করে; এ সি এর উপরও নির্ভর করে; বি ডি এর উপর নির্ভর করে; সি ডি এর উপর নির্ভর করে
ওয়াইল্ডকার্ড

@ ওয়াল্ডকার্ড আমি জানি তবে আমার উদ্দেশ্য হিসাবে গাছ হিসাবে নির্ভরতা উপস্থাপন করার পক্ষে এটি যথেষ্ট । এটিকে একটি গাছ তৈরি করার জন্য আমি অনুচ্ছেদে সদৃশ (এবং চেনাশোনাগুলিতে কাটা) ভাল করছি। সুস্পষ্ট না হওয়ার জন্য দুঃখিত। আপনার উদাহরণস্বরূপ আমি আউটপুট সঙ্গে ভাল হতে হবে printf 'A\n B\n D\n C\n D\n'। (কে বলেছে যে আমি মন্তব্যগুলিতে নতুন লাইনের কথা রাখতে পারি না? :)
লুকাস

এটি "বি এর উপর নির্ভর করে; বি ডি এর উপর নির্ভর করে; ডি সি এর উপর নির্ভরশীল; এ ডি এর উপর নির্ভরশীল" এর থেকে কীভাবে পার্থক্যযোগ্য? আপনি যে কোনও ডিএজে মোট অর্ডারিং চাপিয়ে দিতে পারেন (যেহেতু যে কোনও ডিএজিও একটি আংশিক ক্রমকে প্রতিনিধিত্ব করে), তবে আপনি কোনও ডিএজি কোনও গাছে পরিণত করতে পারবেন না। এটি বেসিক গ্রাফ তত্ত্ব। আমি কোনও ডিএজি-র গাছের উপস্থাপনা তৈরি করার জন্য আপনার অ্যালগরিদমটি দেখতে আগ্রহী যা পরে প্রদর্শিত হতে পারে। এই ধরনের অন্তর্নিহিত অ্যালগরিদম ছাড়া গাছের মতো নির্ভরতা প্রদর্শনের চেষ্টা করা কোনও সরঞ্জাম চূড়ান্তভাবে হ্যাক এবং ত্রুটি-প্রবণ হবে।
ওয়াইল্ডকার্ড

হয়তো আমি আবার যথেষ্ট স্পষ্ট ছিল না কিন্তু আমি ভেবেছিলাম অনুরূপ অধীনে আমি যে উদাহরণগুলি দেই তা এটি পরিষ্কার হয়ে গেছে। আমি গ্রাফ তত্ত্বটিতে আগ্রহী নই (অন্তত এই প্রশ্নে)। আমি এটির জন্য যা যা চাই তা একটি দৃশ্যের প্রতিনিধিত্ব যা গাছের সাথে অনুরূপ (বিশেষত যদি এটি টার্মিনালে প্রদর্শিত হওয়া উচিত কারণ dotঅর্ডার গ্রাফগুলি স্পষ্টতই ভাল)) প্রশ্নটি আরও পরিষ্কার করার জন্য আমি কিছুটা আপডেট করব (আমি আশা করি)।
লুকাস

2
ভাড়া: আমি সত্যই কিছুটা হতাশ হয়েছি যা মেক-অফ-বক্স-এর মতো কিছু দেয় না। মেক বিশ্বের এক বিস্তৃত বিল্ড সিস্টেমগুলির মধ্যে একটি, এবং এই বৈশিষ্ট্যটি এতটাই কার্যকর হবে যে এটি বুঝতে অসুবিধা হয় যে Godশ্বর জানেন যে কত দশক ধরে তৈরি হয়েছে তা কেউ এ জাতীয় বৈশিষ্ট্য যোগ করেনি। পরিষ্কারভাবে সংজ্ঞায়িত পাঠ্য বিন্যাসে এই তথ্য আউটপুট করা পুরোপুরি যথেষ্ট। আমি বুঝতে পারি যে মেকটি ওপেন সোর্স এবং আমি নিজেই এই বৈশিষ্ট্যটি যুক্ত করতে পারি। এবং বিশ্বাস করুন, যদি মেকাপটি মূলত আমার কাছে একটি কালো বাক্স না হত তবে আমি করতাম! উপর গলাবাজি.
প্রেরিত

উত্তর:


10

চেষ্টা makefile2graph একই লেখক থেকে সেখানে এএ অনুরূপ টুল MakeGraphDependencies লেখা javaপরিবর্তে c

make -Bnd | make2graph | dot -Tsvg -o out.svg

তারপরে আপনার প্রয়োজনীয় সংযোগগুলি হাইলাইট করতে কিছু ভেক্টর গ্রাফিক্স সম্পাদক ব্যবহার করুন।


1
আমি সেই সরঞ্জামটি চেষ্টা করেছি। এমনকি কাজ করাও শুরু করে না (কমপক্ষে কোনও মেক অবতারের জন্য আমি এটি ব্যবহার করে দেখেছি না)। বেশিরভাগ সময় এটি কিছু স্মৃতি অ্যাক্সেস লঙ্ঘন করে just
antred

3

কোন লক্ষ্যটি পূর্বশর্তগুলির উপর নির্ভর করে কোন টার্গেট নির্ভর করে সে সম্পর্কে কমপক্ষে আউটপুট সম্পর্কে স্পষ্টভাবে কাঠামোগত তথ্যের জন্য আমি এক ধরণের হ্যাক পেয়েছি। নেতিবাচক দিকটি হ'ল এটি বেশ অনুপ্রবেশকারী। অন্য কথায়, আপনার সমস্ত টার্গেটের বিল্ড রেসিপিগুলিকে সামান্য শর্তযুক্ত ফাংশনে আবৃত করতে আপনাকে আপনার মেকফিল পরিবর্তন করতে হবে। আমি একটি সংক্ষিপ্ত উদাহরণ পোস্ট করব:

getRecipe = $(if $(DEPENDENCY_GRAPH),@echo Target $@ depends on prerequisites "$^",$(1))


VARIABLE_TARGET_NAME = foobar.txt

all : TopLevelTarget

TopLevelTarget : Target_A Target_D
    $(call getRecipe,\
        @echo Building target $@)

Target_A : Target_B
    $(call getRecipe,\
        @echo Building target $@)

Target_D : Target_C
    $(call getRecipe,\
        @echo Building target $@)

Target_B : $(VARIABLE_TARGET_NAME)
    $(call getRecipe,\
        @echo Building target $@)

Target_C :
    $(call getRecipe,\
        @echo Building target $@)

$(VARIABLE_TARGET_NAME) :
    $(call getRecipe,\
        @echo Building target $@)

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

সঙ্গে DEPENDENCY_GRAPH1 সেট করতে চান, আউটপুটে এই ফলাফল:

Target foobar.txt depends on prerequisites ""
Target Target_B depends on prerequisites "foobar.txt"
Target Target_A depends on prerequisites "Target_B"
Target Target_C depends on prerequisites ""
Target Target_D depends on prerequisites "Target_C"
Target TopLevelTarget depends on prerequisites "Target_A Target_D"

যা পার্স করা এবং তারপরে বিন্দু-গ্রাফে রূপান্তর করার পক্ষে যথেষ্ট সহজ হওয়া উচিত।

সঙ্গে DEPENDENCY_GRAPHএ সব সেট না করা বা 0 সেট না থাকলে, আউটপুট হল:

Building target foobar.txt
Building target Target_B
Building target Target_A
Building target Target_C
Building target Target_D
Building target TopLevelTarget

বা, অন্য কথায়, এর পরিবর্তে সাধারণ বিল্ড রেসিপি ব্যবহৃত হয়। এটি জটিল রেসিপিগুলির সাথে নির্ভরযোগ্যভাবে কাজ করে কিনা তা আমি এখনও পরীক্ষা করে দেখিনি। একটি সমস্যা যা আমি ইতিমধ্যে চালিয়েছি তা হ'ল এটি মাল্টি-লাইন রেসিপিগুলির সাথে মোটেই কাজ করে না।

উদাহরণস্বরূপ, শেষ টার্গেটের বিল্ড রেসিপিতে, লক্ষ্যটি তৈরি করা হচ্ছে তা বলার সাথে সাথে আমি আসলে touchফাইলটি চেয়েছিলাম :

$(VARIABLE_TARGET_NAME) :
    $(call getRecipe,\
        @echo Building target $@\
        touch $@)

makeমনে হয় যে touch $@অংশটি পূর্ববর্তী লাইনের প্রতিধ্বনিগুলির একমাত্র অংশ:

Building target foobar.txt touch foobar.txt

যদি আমি পূর্ববর্তী লাইনে trailing ব্যাকস্ল্যাশ বন্ধ ত্যাগ করেন, তখন makeঅভিযোগ *** unterminated call to functionকল ': অনুপস্থিত )'. Stop.কারো কি কোন ধারণা কিভাবে পেতে থাকে makeচমৎকার প্লে করার আমি উত্কর্ণ। :)

সম্পাদনা: এই পদ্ধতির সাথে অন্য সমস্যাটি হ'ল এটি কেবল তখনই কাজ করবে যদি ইতিমধ্যে কোনও বিল্ড ফলাফল উপস্থিত makeনা থাকে, সম্ভবত এটি কোনও টার্গেটের বিল্ড রেসিপিটিকে আপ টু ডেট বলে মনে করে না।


কাজের জন্য টাচ কমান্ডের ;পরে যুক্ত করুনtarget $@
mug896

দ্বিতীয় সমস্যাটির জন্য, make -Bবিকল্পটি ব্যবহার করুন যা নিঃশর্ত সমস্ত লক্ষ্যবস্তু তৈরি করে।
mug896

2

আমি রিমেক - প্রোফাইল (এর জন্য একটি ড্রপ-ইন প্রতিস্থাপন make) ব্যবহার করেছি, এটি কলগ্রিন্ড ফর্ম্যাটে একটি নির্ভরতা গাছ উত্পন্ন করেছে।

তারপরে gprof2dot লক্ষ্য গাছের একটি চিত্র তৈরি করতে পারে।


আমি কি ডকুমেন্টেশনটি ভুল বুঝতে পারি বা remake --profileএটি নির্ধারিত টার্গেটের জন্য নির্ভরতা গ্রাফ আউটপুট করে? অথবা এটি কোনও লক্ষ্যে সমস্ত লক্ষ্যের জন্য গ্রাফ আউটপুট করতে পারে?
লুকাস

এটি কেবল যেটি চালায়, আমি ভয় করি। তবে আপনি তাদের সবাইকে ড্রাই-রান দিয়ে চালাতে পারেন
ভিক্টর সার্জিয়েনকো

ওহ হ্যাঁ, কিছু আশাজনক remake --targets -r | grep -v %| grep -v '\t*\.'|xargs remake -n --profile -Bমনে হচ্ছে।
লুকাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.