একটি মেকফাইলে .FONY এর উদ্দেশ্য কী?


1734

.PHONYএকটি Makefile মানে কি ? আমি মধ্য দিয়ে চলে গেছে এই , কিন্তু এটা খুব বেশি জটিল।

কেউ কি আমাকে সহজ কথায় এটি ব্যাখ্যা করতে পারেন?

উত্তর:


1944

ডিফল্টরূপে মেকফিল লক্ষ্যগুলি "ফাইল লক্ষ্য" - এগুলি অন্য ফাইল থেকে ফাইল তৈরি করতে ব্যবহৃত হয়। ধরে নিন তার টার্গেটটি একটি ফাইল, এবং এটি মেকফিলগুলি লিখতে তুলনামূলক সহজ করে তোলে:

foo: bar
  create_one_from_the_other foo bar

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

এই বিশেষ লক্ষ্যগুলিকে ফোনি বলা হয় এবং আপনি পরিষ্কারভাবে বলতে পারেন যে তারা ফাইলগুলির সাথে সম্পর্কিত নয়, যেমন:

.PHONY: clean
clean:
  rm -rf *.o

make cleanআপনার নামের মতো কোনও ফাইল না থাকলেও এখন আশানুরূপভাবে চলবে clean

মেকের ক্ষেত্রে, একটি স্বতন্ত্র লক্ষ্যটি হ'ল একটি লক্ষ্য যা সর্বদা পুরানো make <phony_target>। কিছু সাধারণ makeলক্ষ্যমাত্রা যে অপ্রকৃত হয়: all, install, clean, distclean, TAGS, info, check


49
@ ই এসকে: 'কেন তাকে' ফনি 'বলা হয়?' - কারণ এটি একটি আসল লক্ষ্য নয়। এটি হ'ল, টার্গেটের নাম কোনও ফাইল নয় যা সেই টার্গেটের কমান্ড দ্বারা উত্পাদিত হয়।
বার্নার্ড

96
@ লেজার: আপনি জানেন না যে আপনি স্থানীয় ইংরেজী স্পিকার। আমি নই. ফনি শব্দটির অর্থ এটির মতো কী তা বোঝায় না। en.wiktionary.org/wiki/phony বলেছেন: জালিয়াতি; নকল; একটি বিভ্রান্তিকর চেহারা।
বাহবার

57
এই উত্তরটি সম্পূর্ণ সম্পূর্ণ নয় - যদিও এটি লিঙ্কযুক্ত টিউটোরিয়ালে সম্বোধন করা যেতে পারে। .ফোনি আপনার লক্ষ্য যাই হ'ল টপোলজিকাল-সাজানোর অংশ হলে এটি একটি মেকফাইলে একটি লেবেল / ফাইল তৈরি করতে বাধ্য করে। এর অর্থ হ'ল, যদি আপনার কাছে 'ক্লিনআপ:' লেবেল থাকে যা ফনি সেট থাকে এবং আপনার ইনস্টল লেবেলটি পূর্বশর্ত হিসাবে ক্লিনআপ দিয়ে সংজ্ঞায়িত করা হয় - যেমন 'ইনস্টল: ক্লিনআপ', মেকফিল যখন নির্মাণের চেষ্টা করে তখন সর্বদা ক্লিনআপ চালানো হবে 'ইনস্টল'। আপনি যদি সফল হন তবে নির্বিশেষে আপনি যে পদক্ষেপ নিতে চান সেগুলির জন্য এটি কার্যকর - এটি টাইমস্ট্যাম্পগুলিকে উপেক্ষা করবে এবং কেবল এটি জোর করে।
সিনথেসাইজারপেটেল

9
মনে রাখবেন যে আপনার যতক্ষণ না টাস্কের মতো একই নামযুক্ত কোনও ফাইল না থাকে ততক্ষণ PHONY ব্যবহার করার দরকার নেই। টাস্কটি সর্বদা যাইহোক যাইহোক কার্যকর করা হবে এবং মেকফিল আরও পাঠযোগ্য হবে।
বার্নার্ড

15
"একটি কল্পিত লক্ষ্য হ'ল একটি লক্ষ্য যা সর্বদা পুরানো হয়" - দুর্দান্ত ব্যাখ্যা!
দানিজেল

729

আসুন ধরে নেওয়া যাক আপনার installলক্ষ্য রয়েছে যা মেকফিলগুলিতে খুব সাধারণ। আপনি যদি ব্যবহার না করেন.PHONY এবং নামের একটি ফাইল installমেকফিলের মতো একই ডিরেক্টরিতে উপস্থিত থাকে তবে কিছুইmake install করবে না । এটি কারণ "মাইক্রোসফট " নামটি তৈরির জন্য এই জাতীয় এবং তেমন রেসিপি কার্যকর করার নিয়মটি ব্যাখ্যা করে । যেহেতু ফাইলটি ইতিমধ্যে রয়েছে এবং এর নির্ভরতা পরিবর্তন হয়নি, কিছুই করা হবে না।install

তবে আপনি যদি installফোনটি PHONY করেন তবে এটি মেক সরঞ্জামটিকে বলবে যে লক্ষ্যটি কাল্পনিক, এবং সেই মেকের দ্বারা আসল ফাইলটি তৈরি করা আশা করা উচিত নয়। সুতরাং এটি installফাইলটি বিদ্যমান কিনা তা খতিয়ে দেখাবে না , অর্থ: ক) ফাইলটি উপস্থিত না থাকলে এর আচরণটি পরিবর্তন করা হবে না এবং খ) অতিরিক্ত stat()বলা হবে না।

আপনার মেকফিলের সাধারণত সমস্ত টার্গেট যা লক্ষ্য নাম হিসাবে একই নামের সাথে একটি আউটপুট ফাইল তৈরি করে না তার PHONY হওয়া উচিত। এটি বিশেষভাবে অন্তর্ভুক্ত all, install, clean, distclean, ইত্যাদি।


6
@ আনারসউন্ডারসেসিয়া গ্রহণযোগ্য উত্তরটি এর প্রাথমিক স্তরের অযোগ্যতার থেকে উল্লেখযোগ্যভাবে উন্নত হয়েছে, এবং এখন এটির মতোই দুর্দান্ত। আপনার মন্তব্যটি বুঝতে আমার এটির পুনর্বিবেচনার ইতিহাসটি দেখতে হয়েছিল।
মার্ক আমেরিকা

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

6
@ জেসনতু এটি অগত্যা সত্য নয়। বাশ স্ক্রিপ্টিং কনভেনশনগুলি আপনাকে "প্রোগ্রামগুলির" .shবা তাদের .bashসম্প্রসারণ বাদ দিতে বলে যা তাদের প্রধান ফাংশন যেমন চালায় এবং আপনার অন্তর্ভুক্ত লাইব্রেরিগুলির জন্য একটি এক্সটেনশন যোগ করে ( source mylib.sh)। আসলে, আমি এই এসও প্রশ্নে পেয়েছি কারণ আমার মেকফিল নামে পরিচিত একই ডিরেক্টরিতে আমার একটি স্ক্রিপ্ট ছিলinstall
কাইল

10
@ কাইল হ্যাঁ, আমি নিশ্চিত নই যে আমার অতীত স্ব কী বোঝায়। আজকাল আমি .PHONYসমস্ত সময় ব্যবহার করি ...
পরমাণু

2
@ জেসনটু এখানে সমাধানটি সহজ: একটি টাইম মেশিন তৈরি করুন এবং আপনার অতীতকে "প্রতিস্থাপন করুন"। আমি আপনার সাথে একটি বেলচা নেওয়ার পরামর্শ দিচ্ছি যাতে কেউই বুঝতে পারবেন না যে আপনি .PHONYসংস্করণ।
মতিন উলহাক

120

দ্রষ্টব্য : মেক টুলটি মেকফিলটি পড়ে এবং একটি নিয়মে ':' চিহ্নের উভয় পাশে ফাইলগুলির সংশোধন সময়-স্ট্যাম্পগুলি পরীক্ষা করে।

উদাহরণ

একটি ডিরেক্টরিতে 'পরীক্ষায়' নিম্নলিখিত ফাইলগুলি উপস্থিত থাকে:

prerit@vvdn105:~/test$ ls
hello  hello.c  makefile

মেকফাইলে একটি বিধি নিম্নলিখিত হিসাবে সংজ্ঞায়িত করা হয়:

hello:hello.c
    cc hello.c -o hello

এখন ধরে নিন যে ফাইল 'হ্যালো' একটি পাঠ্য ফাইল যা কিছু ডেটা যুক্ত করে যা 'হ্যালো.সি' ফাইলের পরে তৈরি হয়েছিল। সুতরাং 'হ্যালো' -র সংশোধন (বা সৃষ্টি) সময়-স্ট্যাম্প 'হ্যালো.কে' এর চেয়ে নতুন হবে। সুতরাং আমরা যখন কমান্ড লাইন থেকে 'মেক হ্যালো' করব, এটি প্রিন্ট হবে:

make: `hello' is up to date.

এখন 'হ্যালো.সি' ফাইলটি অ্যাক্সেস করুন এবং এতে কিছু সাদা স্পেস রেখে দিন যা কোড সিনট্যাক্স বা যুক্তিকে প্রভাবিত করে না এবং সেভ করে ছাড়ুন। এখন হ্যালো.কের পরিবর্তনের সময়-স্ট্যাম্প 'হ্যালো' এর চেয়ে নতুন। এখন আপনি যদি 'হ্যালো মেক করুন' এর অনুরোধ করেন তবে এটি আদেশগুলি এইভাবে কার্যকর করবে:

cc hello.c -o hello

এবং 'হ্যালো' (পাঠ্য ফাইল) ফাইলটি একটি নতুন বাইনারি ফাইল 'হ্যালো' (উপরের সংকলন কমান্ডের ফলাফল) দিয়ে ওভাররাইট করা হবে।

আমরা যদি মেকফাইলে নিম্নলিখিতভাবে PHPY ব্যবহার করি:

.PHONY:hello

hello:hello.c
    cc hello.c -o hello

এবং তারপরে 'মেক হ্যালো' করার অনুরোধ জানানো হবে, এটি পিডব্লিউডি 'পরীক্ষায়' উপস্থিত যে কোনও ফাইলকে উপেক্ষা করবে এবং প্রতিবার কমান্ডটি কার্যকর করবে।

এখন ধরা যাক, 'হ্যালো' টার্গেটটির কোনও নির্ভরতা ঘোষণা করা নেই:

hello:
    cc hello.c -o hello

এবং 'হ্যালো' ফাইলটি পিডব্লিউডি 'পরীক্ষায়' ইতিমধ্যে উপস্থিত রয়েছে, তারপরে 'হ্যালো মেক করুন' সর্বদা এটি প্রদর্শিত হবে:

make: `hello' is up to date.

3
এটি কেবলমাত্র যে কমান্ডগুলি আমি চালিত করি সেগুলিই বোধগম্য হয় না, শেষ পর্যন্ত makeএটি সামগ্রিকভাবে অর্থবোধ করে তোলে , এটি সমস্ত ফাইলগুলির সম্পর্কে! এই উত্তরের জন্য আপনাকে ধন্যবাদ।
কেজকাই

80
.PHONY: install
  • "ইনস্টল" শব্দটির অর্থ এই মেকফিলটিতে কোনও ফাইলের নাম উপস্থাপন করা হয় না;
  • মানে একই ডিরেক্টরিতে "ইনস্টল" নামক কোনও ফাইলের সাথে মেকফিলের কোনও সম্পর্ক নেই।

45

এটি একটি বিল্ড টার্গেট যা কোনও ফাইলের নাম নয়।


33

সেরা ব্যাখ্যা হ'ল জিএনইউ নিজেই ম্যানুয়াল তৈরি করুন: 4.6 ফোনি টার্গেটস বিভাগ

.PHONYকরতে এর অন্যতম স্পেশাল বিল্ট-ইন উদ্দিষ্ট নাম । আপনার আগ্রহী হতে পারে এমন অন্যান্য টার্গেট রয়েছে, সুতরাং এই উল্লেখগুলির মাধ্যমে এটি স্কিমিংয়ের পক্ষে মূল্যবান।

যখন কোনও .PHONY লক্ষ্য বিবেচনা করার সময় হয়ে যায়, সেই নামের কোনও ফাইল বিদ্যমান কিনা বা তার শেষ-সংশোধন সময়টি কী তা নির্বিশেষে, মেকটি নিঃশর্তভাবে তার রেসিপিটি চালাবে।

আপনি তৈরির স্ট্যান্ডার্ড লক্ষ্যগুলি যেমন allএবং তে আগ্রহীও হতে পারেন clean


11

".FONY" - এর একটি গুরুত্বপূর্ণ কৌশলও আছে - যখন কোনও শারীরিক লক্ষ্য ফোনি টার্গেটের উপর নির্ভর করে যা অন্য শারীরিক টার্গেটের উপর নির্ভর করে:

TARGET1 -> PHONY_FORWARDER1 -> PHONY_FORWARDER2 -> টার্গেট 2

আপনি কেবল প্রত্যাশা করবেন যে আপনি যদি TARGET2 আপডেট করেন তবে TARGET1 টি TARGET1 এর বিপরীতে বাসি হিসাবে বিবেচনা করা উচিত, সুতরাং টারগেট 1 পুনর্নির্মাণ করা উচিত। এবং এটি সত্যিই এইভাবে কাজ করে

জটিল অংশটি হল যখন TARGET2 TARGET1 এর বিরুদ্ধে বাসি না হয় - এক্ষেত্রে আপনার প্রত্যাশা করা উচিত যে TARGET1 পুনর্নির্মাণ করা উচিত নয়।

এটি আশ্চর্যজনকভাবে কাজ করে না কারণ: ফোনি টার্গেট যাইহোক চালানো হয়েছিল (ফোনি টার্গেটগুলি সাধারণত হয়) , যার অর্থ ফোনি টার্গেটটি আপডেট হিসাবে বিবেচিত হয়েছিল । এবং যে কারণে TARGET1 কলঙ্কিত লক্ষ্য বিরুদ্ধে বাসি বিবেচনা করা হয়

বিবেচনা:

all: fileall

fileall: file2 filefwd
    echo file2 file1 >fileall


file2: file2.src
    echo file2.src >file2

file1: file1.src
    echo file1.src >file1
    echo file1.src >>file1

.PHONY: filefwd
.PHONY: filefwd2

filefwd: filefwd2

filefwd2: file1
    @echo "Produced target file1"


prepare:
    echo "Some text 1" >> file1.src
    echo "Some text 2" >> file2.src

আপনি এটি দিয়ে খেলা করতে পারেন:

  • প্রথমে "উত্স ফাইল" প্রস্তুত করতে প্রস্তুত করুন '
  • নির্দিষ্ট আপডেট করার জন্য নির্দিষ্ট ফাইলগুলিতে স্পর্শ করে এটিকে ঘিরে খেলুন

আপনি দেখতে পাচ্ছেন যে ফাইলল ফাইলের উপরে পরোক্ষভাবে কোনও ফনি টার্গেটের মাধ্যমে নির্ভর করে - তবে এই নির্ভরতার কারণে এটি সর্বদা পুনর্নির্মাণ হয় gets আপনি নির্ভরতা পরিবর্তন করেন তাহলে fileallথেকে filefwdথেকে file, এখন fileallপ্রত্যেক সময় পুনর্নির্মিত পাবেন না, কিন্তু শুধুমাত্র নির্ভরশীল লক্ষ্যমাত্রা যখন কোন ফাইল হিসেবে এটি বিরুদ্ধে সতেজ নয়।


5

বিশেষ লক্ষ্যটি .PHONY:নকল লক্ষ্যগুলি ঘোষণার অনুমতি দেয়, যাতে এটি makeপ্রকৃত ফাইলের নাম হিসাবে এটি পরীক্ষা করে না: এ জাতীয় ফাইলগুলি বিদ্যমান থাকলেও এটি সর্বদা কাজ করবে।

আপনি বিভিন্ন লাগাতে পারেন .PHONY:আপনার Makefile:

.PHONY: all

all : prog1 prog2

...

.PHONY: clean distclean

clean :
    ...
distclean :
    ...

নকল লক্ষ্য ঘোষণার আরেকটি উপায় রয়েছে: কেবল '::'

all :: prog1 prog2

...

clean ::
    ...
distclean ::
    ...

'::' এর একটি বিশেষ অর্থ রয়েছে: লক্ষ্যগুলি ফনিযুক্ত হয় এবং তারা বেশ কয়েকবার প্রদর্শিত হতে পারে:

clean ::
    rm file1

...


clean ::
    rm file2

একের পর এক কমান্ড ব্লককে ডাকা হবে।


3

আমি প্রায়শই এগুলিকে ডিফল্ট লক্ষ্যগুলিতে আগুন না দেওয়ার জন্য বলি।

superclean: clean andsomethingelse

blah: superclean

clean:
   @echo clean

%:
   @echo catcher $@

.PHONY: superclean

অপ্রকৃত ছাড়া, make supercleanজ্বালান হবে clean, andsomethingelseএবং catcher superclean; কিন্তু PHONY সহ, make supercleanআগুন জ্বালাবে না catcher superclean

cleanলক্ষ্যটি PHONY করে দেওয়ার বিষয়ে আমাদের চিন্তা করার দরকার নেই, কারণ এটি সম্পূর্ণ কৌতুকপূর্ণ নয়। যদিও এটি কখনও পরিষ্কার ফাইলটি তৈরি করে না, এতে ফায়ার কমান্ড রয়েছে তাই এটি চূড়ান্ত লক্ষ্য হিসাবে ভাববে।

তবে supercleanলক্ষ্যটি সত্যই কৌতুকপূর্ণ, তাই এটির supercleanলক্ষ্য supercleanনির্ধারণের জন্য ডিপগুলি সরবরাহ করে এমন কোনও কিছু দিয়ে তা সজ্জিত করার চেষ্টা করবে - এর মধ্যে অন্যান্য লক্ষ্য এবং লক্ষ্য অন্তর্ভুক্ত রয়েছে %

মনে রাখবেন যে আমরা এ সম্পর্কে andsomethingelseবা কিছু বলি না blah, সুতরাং তারা স্পষ্টতই ক্যাচারের কাছে যায়।

আউটপুটটি এরকম কিছু দেখাচ্ছে:

$ make clean
clean

$ make superclean
clean
catcher andsomethingelse

$ make blah 
clean
catcher andsomethingelse
catcher blah
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.