linux - আপনি কিভাবে একটি লক্ষ্য পুনর্নির্মাণ একটি makefile বলুন না
(10)
আমি একটি makefile যে builds এবং তারপর অন্য makefile কল। যেহেতু এই makefile আরো makefiles কল যে কাজ করে না এটি সত্যিই পরিবর্তন না। সুতরাং এটি প্রকল্প তৈরি এবং আপ টু ডেট চিন্তা করে রাখে।
dnetdev11 ~ # make
make: `release' is up to date.
আমি কিভাবে টার্গেট পুনর্নির্মাণের জন্য makefile জোর করবেন না?
clean = $(MAKE) -f ~/xxx/xxx_compile.workspace.mak clean
build = svn up ~/xxx \
$(clean) \
~/cbp2mak/cbp2mak -C ~/xxx ~/xxx/xxx_compile.workspace \
$(MAKE) -f ~/xxx/xxx_compile.workspace.mak $(1) \
release:
$(build )
debug:
$(build DEBUG=1)
clean:
$(clean)
install:
cp ~/xxx/source/xxx_utility/release/xxx_util /usr/local/bin
cp ~/xxx/source/xxx_utility/release/xxxcore.so /usr/local/lib
নোট: নাম নির্দোষ রক্ষা সরানো
সম্পাদনা করুন: চূড়ান্ত স্থায়ী সংস্করণ:
clean = $(MAKE) -f xxx_compile.workspace.mak clean;
build = svn up; \
$(clean) \
./cbp2mak/cbp2mak -C . xxx_compile.workspace; \
$(MAKE) -f xxx_compile.workspace.mak $(1); \
.PHONY: release debug clean install
release:
$(call build,)
debug:
$(call build,DEBUG=1)
clean:
$(clean)
install:
cp ./source/xxx_utillity/release/xxx_util /usr/bin
cp ./dlls/Release/xxxcore.so /usr/lib
অন্য কেউ সুপারিশ। PHONY যা স্পষ্টভাবে সঠিক। কোনও নিয়ম অনুসারে PHONY ব্যবহার করা উচিত যার জন্য ইনপুট এবং আউটপুটের মধ্যে তারিখ তুলনা অবৈধ। যেহেতু আপনার ফর্ম output: input
কোন লক্ষ্য নেই output: input
আপনি ব্যবহার করা উচিত। তাদের সব জন্য PHONY!
যা বলেছিল, সম্ভবত আপনার ফাইলফেমের জন্য আপনার মেকফিলের শীর্ষে কিছু ভেরিয়েবল সংজ্ঞায়িত করা উচিত এবং ইনপুট এবং আউটপুট উভয় বিভাগের প্রকৃত নিয়মগুলি সংজ্ঞায়িত করা উচিত যাতে আপনি তৈরি করার সুবিধাগুলি ব্যবহার করতে পারেন, যেমন আপনি কেবলমাত্র কম্পাইল করব কপমাইল প্রয়োজন যে জিনিস!
সম্পাদনা: যোগ করা উদাহরণ। Untested, কিন্তু আপনি কিভাবে করবেন .ফোন
.PHONY: clean
clean:
$(clean)
আপনি আপনার লক্ষ্য এক বা একাধিক লক্ষ্য ঘোষণা করতে পারে।
একটি ফোনি লক্ষ্য এমন একটি যা প্রকৃতপক্ষে একটি ফাইলের নাম নয়; বরং আপনি যখন একটি স্পষ্ট অনুরোধ করেন তখন এটি রেসিপি করার জন্য কেবলমাত্র একটি নাম। একটি ফোনি লক্ষ্য ব্যবহার করার দুটি কারণ রয়েছে: একই নামের একটি ফাইলের সাথে সংঘর্ষ এড়াতে এবং কর্মক্ষমতা উন্নত করতে।
...
একটি ফোনি লক্ষ্য একটি বাস্তব লক্ষ্য ফাইল একটি পূর্বশর্ত হতে হবে না; যদি এটি হয়, প্রতি রেসিপি চালানো হবে যে ফাইল আপডেট করতে যায়। যতক্ষণ একটি ফোনি লক্ষ্যটি কোনও প্রকৃত লক্ষ্যের পূর্বশর্ত না হওয়া পর্যন্ত, ফোনি লক্ষ্যমাত্রা নির্দিষ্ট লক্ষ্যমাত্রা কেবল তখনই কার্যকর হবে।
আমার লিনাক্স সিস্টেমে (Centos 6.2), লক্ষ্য ঘোষণা করার মধ্যে একটি উল্লেখযোগ্য পার্থক্য রয়েছে .ফোনি এবং ফোর্সে একটি জাল নির্ভরতা তৈরি করার সময়, যখন প্রকৃতপক্ষে নিয়মটি লক্ষ্যযুক্ত একটি ফাইল তৈরি করে। যখন ফাইলটি প্রতিবার পুনরুত্থিত হবে, তখন ফাইলটিতে জাল নির্ভরতা FORCE এবং উভয় জাল নির্ভরতার জন্য এটি প্রয়োজন।
ভুল:
date > [email protected]
ডানে:
FORCE
date > [email protected]
FORCE:
.PHONY: FORCE
আমি এই চেষ্টা এবং এটা আমার জন্য কাজ
Makefile এই লাইন যোগ করুন
clean:
rm *.o output
new: clean
$(MAKE) #use variable $(MAKE) instead of make to get recursive make calls
সংরক্ষণ এবং এখন কল
make new
এবং এটি আবার সবকিছু পুনরায় কম্পাইল করা হবে
কি হলো?
1) 'নতুন' কল পরিষ্কার। 'clean' do 'rm' যা '.o' এর এক্সটেনশন থাকা সমস্ত বস্তু ফাইল সরিয়ে দেয়।
2) 'নতুন' কল 'মেক'। 'make' দেখুন সেখানে '.o' ফাইল নেই, তাই এটি আবার '.o' তৈরি করে। তারপর সংযোগকারী সব .o ফাইল int একটি এক্সিকিউটেবল আউটপুট লিঙ্ক
শুভ কামনা
এটা আসলে লক্ষ্য কি উপর নির্ভর করে। এটি একটি ফোনি লক্ষ্য (অর্থাত্ লক্ষ্যটি কোনও ফাইলের সাথে সম্পর্কিত নয়) তাহলে আপনাকে এটি হিসাবে ঘোষণা করা উচিত। PHONY।
তবে লক্ষ্যটি একটি ফোনি লক্ষ্য নয় তবে আপনি কিছু কারণে এটি পুনর্নির্মাণ করতে চান (উদাহরণস্বরূপ, যখন আপনি __TIME__ প্রপ্রোকাসিং ম্যাক্রো ব্যবহার করেন), আপনাকে এখানে উত্তরগুলিতে বর্ণিত FORCE প্রকল্পটি ব্যবহার করতে হবে।
এটি ইতিমধ্যে উল্লেখ করা হয়েছে, কিন্তু আমি touch
ব্যবহার যোগ করতে পারে
যদি আপনি সমস্ত উৎস ফাইলগুলি সংকলিত করতে touch
করেন তবে touch
কমান্ডটি টাইম কমান্ডটি কার্যকর হওয়ার সময় সিস্টেমের টাইমস্ট্যাম্পগুলিকে সিস্টেমে পরিবর্তিত করে।
সোর্স ফাইল টাইমস্ট্যাম্পটি কোনও ফাইল পরিবর্তিত হয়েছে তা "জানার" make
ব্যবহার করে এবং পুনরায় কম্পাইল করা প্রয়োজন
উদাহরণস্বরূপ: প্রকল্পটি যদি একটি সি ++ প্রকল্প হয়, তবে touch *.cpp
, তারপরে পুনরায় চালান, এবং পুরো প্রকল্পটিকে পুনরায় কম্পাইল করা উচিত।
মিলারের পুনর্মিলন অনুসারে হুমকি হিসাবে বিবেচিত হওয়া উচিত আপনাকে কলিং এড়াতে হবে $(MAKE)
তৈরি করুন $(MAKE)
! ক্ষেত্রে আপনি দেখান, এটি নির্দয়, কারণ এটি আসলে একটি মেকফিল নয়, কেবল একটি মোড়ক স্ক্রিপ্ট, যা শেলেও লেখা আছে। কিন্তু আপনি বলছেন যে আপনি গভীর পুনরাবৃত্তি মাত্রায় এভাবে চলতে থাকুন, তাই সম্ভবত আপনি সেই চোখের-খোলার প্রবন্ধে প্রদর্শিত সমস্যার সম্মুখীন হয়েছেন।
অবশ্যই জিএনইউ এর সাথে এড়ানো এড়ানো কঠিন। এবং যদিও তারা এই সমস্যা সম্পর্কে সচেতন, তবে এটি তাদের কাজ করার নথিভুক্ত উপায়।
makepp , makepp এই সমস্যার জন্য একটি সমাধান হিসাবে তৈরি করা হয়েছিল। আপনি প্রতি ডিরেক্টরি স্তরের উপর আপনার makefiles লিখতে পারেন, তবে তারা সবাই আপনার প্রকল্পের সম্পূর্ণ ভিউতে একত্রিত হয়।
কিন্তু legacy makefiles recursively লেখা হয়। সুতরাং একটি কার্যকারিতা আছে যেখানে $(MAKE)
কিছুই করে না কিন্তু মূল মেকপ প্রক্রিয়াতে ফেরত পাঠায়। কেবলমাত্র যদি আপনি আপনার জমা দেওয়ার মধ্যে অপ্রয়োজনীয় বা খারাপ, দ্বন্দ্বমূলক বিষয়গুলি করেন তবে আপনাকে অবশ্যই --traditional-recursive-make
(অবশ্যই অবশ্যই মেকপের এই সুবিধাটি ভাঙ্গায়) অনুরোধ করতে হবে। আমি আপনার অন্যান্য makefiles জানি না, কিন্তু যদি তারা পরিষ্কারভাবে লিখিত হয়, তবে মেকপের প্রয়োজনীয় পুনর্নির্মাণ স্বয়ংক্রিয়ভাবে ঘটতে হবে, অন্যের দ্বারা এখানে যেকোনো হ্যাকের প্রয়োজন ছাড়াই।
যদি আমি সঠিকভাবে স্মরণ করি, তাহলে লক্ষ্যটি আপ টু ডেট কিনা তা নির্ধারণ করতে 'মেক' টাইমস্ট্যাম্প (ফাইল সংশোধন সময়) ব্যবহার করে। পুনঃনির্মাণ কার্যকর করার একটি সাধারণ উপায় হল 'স্পর্শ' কমান্ড ব্যবহার করে সেই টাইমস্ট্যাম্পটি আপডেট করা। আপনি আপনার মেকফাইলে 'স্পর্শ' করার চেষ্টা করতে পারেন এমন লক্ষ্যগুলির একটি টাইমস্ট্যাম্প আপডেট করতে (সম্ভবত সেগুলি সাব-মেকফাইলগুলির মধ্যে একটি) আপডেট করতে, যা কমান্ডটি কার্যকর করতে বাধ্য হতে পারে।
-B
সুইচ করতে, যার দীর্ঘ ফর্ম --always-make
, টাইমস্ট্যাম্পগুলিকে উপেক্ষা করে নির্দিষ্ট লক্ষ্যগুলি তৈরি make
বলে। এটি তৈরি করার উদ্দেশ্যটি হারাতে পারে, তবে এটি আপনার প্রয়োজন হতে পারে।
make clean
সব ইতিমধ্যে কম্পাইল বস্তু ফাইল মুছে ফেলা।