makepp_rules - ক্লাউডে অনলাইন

এটি হল makepp_rules কমান্ড যা আমাদের একাধিক বিনামূল্যের অনলাইন ওয়ার্কস্টেশন যেমন উবুন্টু অনলাইন, ফেডোরা অনলাইন, উইন্ডোজ অনলাইন এমুলেটর বা MAC OS অনলাইন এমুলেটর ব্যবহার করে OnWorks ফ্রি হোস্টিং প্রদানকারীতে চালানো যেতে পারে।

কার্যক্রম:

NAME এর


makepp_rules -- কিভাবে makepp কে কিছু বানাতে বলবেন

বর্ণনাঃ


?: &,
-,
@, B: :build_cache,
:build_check, D: : প্রেরণ, E: :env, I: "উপেক্ষা_ত্রুটি",
: অন্তর্ভুক্ত, L: :শেষ সুযোগ, M: মেকপারল, N: "নোইকো", P: :পার্সার,
"পার্ল", S: : স্বাক্ষর

একটি নিয়ম হল যা makepp কে বলে যে কিভাবে একটি ফাইল বা ফাইলের একটি ক্লাস তৈরি করতে হয়। Makepp সমর্থন করে
মেক এর অন্যান্য বাস্তবায়নের মত একই নিয়ম সিনট্যাক্স, এবং এর নিজস্ব কিছু সংযোজন।

একটি নিয়মের সাধারণ বিন্যাস রয়েছে

টার্গেট_এক্সপ্রেশন : নির্ভরতা_প্রকাশ [ : ঐচ্ছিক আর্গুমেন্ট]
স্টক

লক্ষ্য তালিকায় কোনো স্বয়ংক্রিয় ভেরিয়েবল থাকতে পারে না ("$(foreach)" ছাড়া)। দ্য
নির্ভরতা তালিকায় লক্ষ্য উল্লেখ করে শুধুমাত্র স্বয়ংক্রিয় ভেরিয়েবল থাকতে পারে (যেমন,
"$(আউটপুট)", "$(আউটপুট)", বা তাদের প্রতিশব্দ)। কর্ম কোনো স্বয়ংক্রিয় থাকতে পারে
ভেরিয়েবল।

যদি makepp সিদ্ধান্ত নেয় যে নিয়মটি কার্যকর করা দরকার, নিয়মের প্রতিটি লাইন কার্যকর করা হয়
ক্রমানুসারে, এবং যদি কেউ একটি অ-শূন্য স্থিতি প্রদান করে, অবশিষ্টগুলি কার্যকর করা হয় না (এবং
আপনি কমান্ড লাইনে "-k" বিকল্পটি নির্দিষ্ট না করলে makepp একটি ত্রুটির সাথে বাতিল করে।)
প্রতিটি কর্ম শুধুমাত্র একটি লাইন হতে হবে. যদি একটি ক্রিয়া খুব দীর্ঘ হয় তাহলে a এ সুবিধামত লিখতে হবে
একক লাইন, আপনি এটিকে কয়েকটি লাইনে বিভক্ত করতে পারেন এবং নির্দেশ করতে একটি ব্যাকস্ল্যাশ রাখতে পারেন
একাধিক লাইন একত্রিত করা উচিত।

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

· প্রথম অ্যাকশন লাইনটি লক্ষ্যযুক্ত লাইনের চেয়ে বেশি ইন্ডেন্ট করতে হবে।

যদি একটি লাইন একটি ট্যাব অক্ষর বা 8টি স্পেস বা তার বেশি দ্বারা ইন্ডেন্ট করা হয়, তবে এটি বিবেচনা করা হয়
একটি কর্ম লাইন।

· ডান মার্জিনে "#" অক্ষর সহ একটি ফাঁকা লাইন বা একটি মন্তব্য লাইন শেষ হয়
নিয়ম, যদি না পরবর্তী অ-ফাঁকা লাইনটি 8টির বেশি স্পেস (বা একাধিক) ইন্ডেন্ট করা না হয়
ট্যাব)।

· যদি একটি লাইন প্রথম অ্যাকশন লাইনের চেয়ে অনেক বেশি বা বেশি ইন্ডেন্ট করা হয়, তাহলে তা হয়
একটি অতিরিক্ত কর্ম লাইন হিসাবে বিবেচনা করা হয়।

কিছু বিশেষ কর্ম আইটেম আছে:

& এই চিহ্নটি একটি কমান্ডের নাম এবং যেকোনো সংখ্যক আর্গুমেন্ট দ্বারা অনুসরণ করা হবে। শেল
সিনট্যাক্স এখানে সম্পূর্ণরূপে বোঝা যায় না, শুধুমাত্র একক এবং দ্বিগুণ উদ্ধৃতি এবং ব্যাকস্ল্যাশড
মধ্যে অক্ষর, makepp জুড়ে হিসাবে. কমান্ডের নাম হয় একটি ফাংশনের দিকে নিয়ে যায়
"গ_নাম" আর্গুমেন্ট হিসাবে অবশিষ্ট স্ট্রিং সঙ্গে বলা হবে. যদি এমন ফাংশন করা যায়
খুঁজে পাওয়া যাচ্ছে না, এটি একটি "পার্ল" ব্লক থেকে "রান" কল করার অনুরূপ।

এটি দক্ষতার সাথে একটি অন্তর্নির্মিত, মেকফাইল-প্রদত্ত বা বহিরাগত কমান্ড কল করার অনুমতি দেয়।
উপসর্গ "&" বেছে নেওয়া হয়েছে কারণ এটি পার্লের ফাংশন ইনভোকার, এবং কারণ
শুরুতে এটি শেলে অবৈধ।

$(ROOT)/include/%.h: %.h
&ln $(ইনপুট) $(আউটপুট)

noecho
@ সাধারণত, প্রতিটি শেল কমান্ড প্রিন্ট করা হয় যেভাবে এটি কার্যকর করা হয়। তবে প্রথম কথা হলে
কর্মটির হল "নোইকো" (বা যদি এটি "@" অক্ষর দিয়ে শুরু হয়), তারপর কমান্ড
মুদ্রিত হয় না। উদাহরণ স্বরূপ,

%.o: %.cxx
noecho $(LIBTOOL) --mode=কম্পাইল $(CC)-c $(ইনপুট)

এর মানে হল যখন libtool কমান্ডটি কার্যকর করা হয়, এটি মুদ্রিত হয় না। (লিবটুল
নিজেই সাধারণত পরিবর্তিত কমান্ড প্রিন্ট করে যা এটি কার্যকর করে, তাই এটি অপ্রয়োজনীয়
এটি দুবার মুদ্রণ করুন।)

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

$(ভুয়া বিতরণ):
ignore_error rm -r my_program-$(VERSION) # আগের আবর্জনা থেকে মুক্তি পান।
&mkdir my_program-$(VERSION)
&cp $(FILES) my_program-$(VERSION)
tar cf my_program-$(VERSION).tar my_program-$(VERSION)

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

Perl
makeperl
এটি মূলত পার্ল স্টেটমেন্টের মতই, কিন্তু এটি প্রতিবার সঞ্চালিত হয় যখন
নিয়ম চলছে, মেকফাইল পড়ার সময় নয়। প্রথম বৈকল্পিক হল প্লেইন পার্ল
কোড, যখন দ্বিতীয় ভেরিয়েন্টটি প্রথমে মেক-স্টাইল ভেরিয়েবলের মাধ্যমে বিবৃতিটি পাস করে
সম্প্রসারণ.

শরীরের ধনুর্বন্ধনী নির্বাণ দুটি সম্ভাবনার জন্য, এ ব্যাখ্যা দেখুন
makepp_statements-এ "perl_perlcode"। উল্লেখ্য যে তৃতীয় বৈকল্পিক সেখানে ব্যাখ্যা করা হয়েছে
এখানে কোন অর্থ নেই, কারণ সমস্ত কর্ম লাইন ইন্ডেন্ট করা আবশ্যক। আপনাকে অবশ্যই সংকেত দিতে হবে
পার্ল বিবৃতিতে ব্যর্থতা, "ডাই" কল করে।

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

$(ভুয়া সংস্করণ):
noecho perl {{ # $(target) & $(VERSION) পার্ল থেকে:
প্রিন্ট করুন "এটি ".f_target()।" $VERSION\n";
}}
echo আপনি শেল কমান্ডের সাথে এটি মিশ্রিত করতে পারেন
-makeperl { মুদ্রণ "এটি হল $(লক্ষ্য) $(VERSION)\n" }

বিভিন্ন ধরনের নিয়ম রয়েছে, প্রতিটিরই ভিন্ন ভিন্ন উদ্দেশ্য।

স্পষ্ট বিধি
টার্গেট1 টার্গেট2: নির্ভরতা1 নির্ভরতা2 ...
কর্ম সঞ্চালিত করা হবে

এই সিনট্যাক্স নির্দিষ্ট করে যে হয় করতে যাতে হয় লক্ষ্য1 or লক্ষ্য2, সমস্ত ফাইল
নির্ভরতা1, নির্ভরতা2ইত্যাদি, ইতিমধ্যে তৈরি করা আবশ্যক. তারপর প্রদত্ত কর্ম হয়
লক্ষ্যবস্তু করতে শেল দ্বারা মৃত্যুদন্ড কার্যকর করা হয়।

একটি ফাইলের প্রথম সুস্পষ্ট নিয়ম হল ডিফল্ট টার্গেট, এবং আপনি নির্দিষ্ট না করলে তৈরি করা হয়
কমান্ড লাইনে কোনো লক্ষ্য।

প্রথাগত মেক প্রোগ্রামের বিপরীতে, makepp সাধারণত অনুমান করে যে কর্মের একটি আহ্বান
সমস্ত লক্ষ্য তৈরি করে (যদি না কোন নির্ভরতা না থাকে)। উদাহরণস্বরূপ, একটি আহ্বান
of yacc এই নিয়মের জন্য উভয় আউটপুট ফাইল তৈরি করে:

y.tab.c y.tab.h : parser.y
$(YACC)-d parser.y

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

নিয়ম ক্রিয়া স্বয়ংক্রিয় পরিবর্তনশীল $@ উল্লেখ করে। (প্রতিশব্দ "$(আউটপুট)" বা
"$(টার্গেট)" এই আচরণকে ট্রিগার করবেন না।)

· নিয়ম ক্রিয়া স্বয়ংক্রিয় পরিবর্তনশীল "$(আউটপুট)" (বা এর প্রতিশব্দের উল্লেখ করে না
"$(লক্ষ্যগুলি)")।

· এটি একটি প্যাটার্ন নিয়ম নয়, এবং কোন পূর্ববর্তী ধারা নেই।

উদাহরণ স্বরূপ,

সমস্ত পরীক্ষা ইনস্টল:
$(SUBDIRS) এ subdir এর জন্য; সিডি করুন $$subdir && $(বানান) $@; সিডি ..; সম্পন্ন

মেকফাইলে একটি সাধারণ প্রবাদ, এবং makepp এটি সমর্থন করে। (মনে রাখবেন যে আপনি কখনই ব্যবহার করবেন না
আপনার লেখা যেকোন নতুন মেকফাইলে পুনরাবৃত্ত মেক--"লোড_মেকফাইল" স্টেটমেন্ট ব্যবহার করুন, অথবা
পরিবর্তে অন্তর্নিহিত মেকফাইল লোড হচ্ছে।)

আপনি যদি প্রতিটি টার্গেটের জন্য একবার একই নিয়ম কার্যকর করতে চান (যেমন, লক্ষ্যগুলি
অনুরূপ কমান্ড আছে), এটি একটি প্যাটার্ন নিয়ম (নীচে দেখুন) বা একটি ব্যবহার করা বাঞ্ছনীয়
"foreach" ধারা। উদাহরণস্বরূপ, যদি একটি ঐতিহ্যগত মেক প্রোগ্রামের সাথে আপনি লিখবেন:

এ বি সি ডি:
$@ > $@ নির্মাণের জন্য কিছু করুন

makepp এ, আপনি সম্ভবত এটি এই মত লিখতে চান:

$(foreach): : foreach abcd
do_something to build $(output) > $(output)

অপ্রকৃত লক্ষ্যমাত্রা

A অপ্রকৃত লক্ষ্য একটি টার্গেট যা আসলে ফাইল সিস্টেমে থাকবে না; এটা শুধু একটি
কিছু লক্ষ্য তৈরি করতে এবং সম্ভবত কিছু অতিরিক্ত কমান্ড চালানোর জন্য makepp পাওয়ার উপায়।

একটি সাধারণ নকল লক্ষ্য হল "সমস্ত", যা সাধারণত হতে পারে এমন সবকিছু ঘটাতে ব্যবহৃত হয়
নির্মিত হতে নির্মিত, এই মত:

সব: prog1 prog2 subdir/prog3 subdir2/libmine.a
@&echo "সব হয়ে গেছে!"

আপনি যদি "makepp all" টাইপ করেন, অথবা আপনি যদি আপনার মেকফাইলে প্রথম স্পষ্ট লক্ষ্য হিসাবে সব রাখেন
(যা সাধারণত) এবং শুধু "makepp" টাইপ করুন, তাহলে এটি সমস্ত নির্ভরতা সৃষ্টি করবে
নির্মিত, তারপর এটি প্রিন্ট করবে "সব সম্পন্ন!"। এই মুহুর্তে, makepp ফাইলটি সন্ধান করবে ./সব
এবং আবিষ্কার করবে যে এটির অস্তিত্ব নেই। এটা জোরে অভিযোগ করবে.

ফাইল আশা করা থেকে makepp রাখা ./সব প্রস্থান করার জন্য, আপনাকে এটি বলতে হবে যে এটি একটি
নকল লক্ষ্য। আপনার মেকফাইলে নীচের মতো একটি লাইন রাখুন (এটি কোনও পার্থক্য করে না
কোথায়):

ফোনি: সব

একটি সমতুল্য বিকল্প যা কখনও কখনও আরও সুবিধাজনক হয় "$(phony )" ব্যবহার করা
ফাংশন, এই মত:

$(সকল মিথ্যা): prog1 prog2 subdir/prog3 subdir2/libmine.a

একটি মেকফাইলে নকল লক্ষ্যগুলি অন্য মেকফাইলে নকল লক্ষ্যগুলি উল্লেখ করতে পারে। এই
প্রায়ই "পরিষ্কার" লক্ষ্য দিয়ে করা হয়, যেমন:

# শীর্ষ স্তরের মেকফাইল:
# এখানে অনেক নিয়ম এবং জিনিস
#...
$(ফনি ক্লিন): subdir1/clean subdir2/clean
&rm -fm my_program

তারপরে সাবডিরেক্টরিতে, মেকফাইলগুলি এইরকম পড়তে পারে:

# একটি সাবডিরেক্টরিতে মেকফাইল
#...
$(ফনি ক্লিন):
&rm -fm $(ওয়াইল্ডকার্ড *.o *.a)

কিন্তু আজকাল আপনি একটি পরিষ্কার লক্ষ্যের পরিবর্তে "makeppclean" কমান্ড ব্যবহার করবেন।

ওয়াইল্ডকার্ড

নির্ভরতা তালিকায় ওয়াইল্ডকার্ড উল্লেখ করা নিরাপদ। ওয়াইল্ডকার্ড শুধুমাত্র ফাইল মেলে না
যেগুলি বিদ্যমান, তবে মেকফাইলের নিয়ম অনুসারে ফাইলগুলি তৈরি করা যেতে পারে। উদাহরণ স্বরূপ,
একটি ডিরেক্টরির সমস্ত .o ফাইল থেকে একটি লাইব্রেরি তৈরি করতে, আপনি এটি লিখতে পারেন:

libmine.a: *.o
&rm -f $(আউটপুট)
ar cr $(আউটপুট) $(ইনপুট)

এটি কাজ করবে এমনকি যদি ".o" ফাইলগুলির একটিও তৈরি করা না হয়, কারণ makepp এর
ওয়াইল্ডকার্ডগুলি এমন ফাইলগুলির সাথে মেলে যা এখনও বিদ্যমান নেই তবে তৈরি করা যেতে পারে৷ এই এমনকি কুড়ান হবে
ফাইল যার নিয়ম পরে আবিষ্কৃত হয় (একই মেকফাইলে, বা এখনও পড়া হয়নি)। এই
শেষ পয়েন্ট এটি "ওয়াইল্ডকার্ড" ফাংশন থেকে পৃথক, যা পরিচিত নিয়মের মধ্যে সীমাবদ্ধ,
যেহেতু এটি প্রসারিত হলে তার ফলাফল অবশ্যই ফিরিয়ে দিতে হবে।

Makepp সব সাধারণ শেল ওয়াইল্ডকার্ড ("*", "?", এবং "[]") সমর্থন করে। এটি একটি আছে
ওয়াইল্ডকার্ড "**" যা যেকোনো সংখ্যক হস্তক্ষেপকারী ডিরেক্টরির সাথে মেলে। (এই ধারণা চুরি করা হয়েছে
zsh থেকে।) উদাহরণস্বরূপ, "**/*.c" এর সাথে মেলে .c সমগ্র উৎস গাছে ফাইল।
"objects/**/*.o" এর সাথে মেলে .o সাবডিরেক্টরিতে যেকোন জায়গায় থাকা ফাইল বস্তু
বা এর যেকোনো সাবডিরেক্টরি বা তাদের যেকোনো সাবডিরেক্টরি। "**" ওয়াইল্ডকার্ড হবে না
যেকোনো স্তরে ডিরেক্টরির নরম লিঙ্কগুলি অনুসরণ করুন। এটি কখনও ভুয়া লক্ষ্যগুলি ফিরিয়ে দেবে না।

Makepp এর ওয়াইল্ডকার্ডগুলি এমন ফাইল বা ডিরেক্টরি উপেক্ষা করবে যা বিদ্যমান কিন্তু পড়া যাবে না। পরে
সব, এই ধরনের ফাইল যাইহোক বিল্ড প্রক্রিয়া ব্যবহার করা যাবে না. অপঠনযোগ্য ফাইল রাখা a
ডিরেক্টরিটি প্রাথমিকভাবে একটি থেকে প্রদত্ত ফাইলের স্বয়ংক্রিয় আমদানিকে বাধা দিতে কার্যকর
সংগ্রহস্থল।

প্রাথমিক দাবি ছিল যে এটি নিরাপদ। এই অর্থে যে এটি কাজ করে কিনা
ফাইলগুলি ইতিমধ্যেই বিদ্যমান, বা প্রথমে তৈরি করা দরকার৷ তবে অর্থে এটি অনিরাপদ
যে এটি এখনও মেকপ দ্বারা নির্মিত ফাইলগুলির সাথে মেলে তবে আর কোনও নিয়ম নেই (যেমন
আপনি সরান .c ফাইল, কিন্তু .o ফাইল এখনও আছে।) এটি প্রতিরোধ করতে, ব্যবহার করুন
"--rm-stale" বিকল্প।

প্যাটার্ন নিয়ম
একটি প্যাটার্ন নিয়ম হল একটি নিয়ম যা কিছু পাঠ্য প্যাটার্নের উপর ভিত্তি করে প্রয়োগ করা হয়। এই অভ্যস্ত হয়
পুরো শ্রেণীর ফাইলে একই নিয়ম প্রয়োগ করুন। সিনট্যাক্স GNU মেক এর মতই
প্যাটার্ন নিয়ম:

%.o: %.c
$(CC) -c $(ইনপুট) -o $(আউটপুট)

এটি বলে যে বর্তমান ডিরেক্টরির যেকোন ফাইল যা "*.c" এর সাথে মেলে তাতে রূপান্তর করা যেতে পারে
প্রদত্ত কমান্ড ব্যবহার করে সংশ্লিষ্ট .o ফাইল।

মনে রাখবেন যে বিভিন্ন প্যাটার্ন নির্ভরতা সরবরাহ করা যেতে পারে। উদাহরণস্বরূপ, যদি আপনার xyz.o ফাইল
সংশ্লিষ্ট উপর নির্ভর করে xyz.cpp ফাইল, এবং নামক একটি ফাইলে moc_xyz.cflags যে
কম্পাইলার বিকল্প রয়েছে, এটি এর সাথে প্রকাশ করা যেতে পারে:

%.o: %.cpp %.cflags
$(CXX) `বিড়াল $(স্টেম)।cflags` -c $(ইনপুট) -o $(আউটপুট)

আপনার বেশ কয়েকটি প্যাটার্ন লক্ষ্য থাকতে পারে। উদাহরণ স্বরূপ,

%.tab.h %.tab.c : %.y
yacc -d $(ইনপুট)
&mv y.tab.h $(stem).tab.h
&mv y.tab.c $(stem).tab.c

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

makepp_percent_subdirs := 1

আপনার মেকফাইলে প্রথম প্যাটার্ন নিয়মের আগে বা উদাহরণস্বরূপ কমান্ড লাইনে।

"%" এবং ওয়াইল্ডকার্ড "*" এর মধ্যে একটি স্পষ্ট পার্থক্য রয়েছে, যদিও উভয়ের সাথেই মিল রয়েছে৷
স্ট্রিং: ওয়াইল্ডকার্ডটি সেই সময়ে সম্পূর্ণরূপে ব্যবহৃত ফাইলগুলির একটি তালিকা প্রদান করে। তাই
এই সব উপর নির্ভর করে .o ফাইল এখানে নির্মাণযোগ্য:

প্রোগ্রাম: *.o
$(LD) $(LDFLAGS) $(ইনপুট) -o $(আউটপুট)

"*" কে "%" দিয়ে প্রতিস্থাপন করে এটি অর্জন করা যাবে না, কারণ পরবর্তীটি একে একে
ইনপুট থেকে আউটপুটের মিল, প্রতিটি মিলে যাওয়া স্টেমের জন্য অভ্যন্তরীণভাবে একটি নিয়ম তৈরি করে।

স্থির প্যাটার্ন নিয়ম
একটি স্ট্যাটিক প্যাটার্ন নিয়ম হল একটি প্যাটার্ন নিয়ম যা শুধুমাত্র ফাইলের একটি সীমিত সেটে প্রয়োগ করা হয়:

$(SPECIAL_MODULES).o : %.o : %.cpp
$(CXX)-c $(ইনপুট) -o $(আউটপুট)

এটি বলে যে প্যাটার্ন নিয়মটি শুধুমাত্র "$(SPECIAL_MODULES).o" ফাইলগুলিতে প্রযোজ্য।

এটি বেশিরভাগ GNU মেকের সাথে সামঞ্জস্যের জন্য; foreach নিয়ম (নীচে দেখুন) আরো একটি
একই জিনিস করার শক্তিশালী উপায়।

প্রতিটির জন্য, প্রত্যেকটির জন্য নিয়ম
উপরের প্যাটার্ন নিয়ম সিনট্যাক্স প্রায় সব বিল্ড সমর্থন করার জন্য যথেষ্ট শক্তিশালী, কিন্তু
মাঝে মাঝে আরও জটিল কিছু করতে হয়। Makepp একটি আরো প্রদান করে
শক্তিশালী সিনট্যাক্স: নিয়মের জন্য ":foreach" ধারা।

টার্গেট_এক্সপ্রেশন : নির্ভরতা_এক্সপ্রেশন : ফরেচ ফাইল-তালিকা
স্টক

সহজ ধরনের foreach নিয়ম হল একটি প্যাটার্ন নিয়ম যার প্রয়োগ সীমাবদ্ধ
ফাইলের একটি নির্দিষ্ট তালিকায়। উদাহরণস্বরূপ, ধরুন আপনার কাছে একটি প্যাটার্ন নিয়ম আছে যা বলে
makepp সব কম্পাইল কিভাবে .c নথি পত্র. যাইহোক, আপনি একটি তালিকা আছে .c ফাইল যার জন্য আপনি
ভিন্ন কিছু করতে চান. আপনি এই মত কিছু করতে পারেন:

# এখানে নিয়ম যা সবকিছুর জন্য প্রযোজ্য:
%.o : %.c
$(CC) $(CFLAGS)-c $(ইনপুট) -o $(আউটপুট)

%.o : %.c : foreach $(SPECIAL_MODULES)
$(CC) $(SPECIAL_CFLAGS)-c $(ইনপুট) -o $(আউটপুট)

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

এটি একটি অবাস্তব বাক্য গঠন কিন্তু এটি অত্যন্ত নমনীয়, কারণ "$(foreach)" পরিবর্তনশীল
অভিব্যক্তিতে যে কোনো উপায়ে প্রদর্শিত হতে পারে। প্রথমত, নোট করুন যে প্যাটার্ন নিয়ম আসলে a
foreach নিয়মের বিশেষ ক্ষেত্রে; প্যাটার্ন নিয়ম

%.o : %.c
$(CC) $(CFLAGS)-c $(ইনপুট) -o $(আউটপুট)

ঠিক এর সমতুল্য:

$(patsubst %.c, %.o, $(foreach)): $(foreach): foreach *.c
$(CC) $(CFLAGS)-c $(ইনপুট) -o $(আউটপুট)

(আসলে, এটি প্রায় অভ্যন্তরীণভাবে রূপান্তরিত হয়েছে।)

একটি উদাহরণ হিসাবে আপনি কিভাবে একটি ": foreach" ধারা ব্যবহার করবেন যেখানে একটি প্যাটার্ন নিয়ম নেই
যথেষ্ট, ধরুন আপনার কিছু আছে .c ফাইল যা কিছু প্রিপ্রসেসর ব্যবহার করে নির্মিত হয়
যা a এর সাথে ইনপুট ফাইল হিসাবে নেয় .k এক্সটেনশন আপনি যারা কম্পাইল করতে চান .c একটি সঙ্গে ফাইল
স্বাভাবিকের চেয়ে ভিন্ন সংকলন বিকল্পের সেট .c ফাইল যা সাধারণ উৎস
নথি পত্র. আপনি এই মত কিছু করতে পারেন:

# সাধারণ .c ফাইলগুলির জন্য নিয়ম:
%.o : %.c
$(CC) $(CFLAGS)-c $(ইনপুট) -o $(আউটপুট)

# .k ফাইল থেকে .c ফাইল তৈরি করার নিয়ম:
%.c : %.k
$(প্রিপ্রসেসর) $(ইনপুট) > $(আউটপুট)

# .c ফাইলগুলির জন্য বিশেষ বিল্ড নিয়ম যা .k ফাইল থেকে তৈরি করা হয়:
$(foreach:%.k=%.o): $(foreach:%.c=%.k): foreach *.k
$(CC) $(SPECIAL_CFLAGS)-c $(ইনপুট) -o $(আউটপুট)

(এটি কল করার পরিবর্তে একটু বেশি সংক্ষিপ্ত প্রতিস্থাপন রেফারেন্স সিনট্যাক্স ব্যবহার করে
"patsubst" স্পষ্টভাবে।)

মনে রাখবেন যে আপনি যা করতে চান তা হল একটি ভেরিয়েবলের মান পরিবর্তন করা ("CFLAGS" এতে
ক্ষেত্রে) লক্ষ্য-নির্দিষ্ট ভেরিয়েবল ব্যবহার করা কখনও কখনও আরও সুবিধাজনক।

উত্তরাধিকার প্রত্যয় নিয়ম
পশ্চাদপদ সামঞ্জস্যের জন্য, makepp পুরানো-শৈলী প্রত্যয় নিয়ম সমর্থন করে।

.suffix1.suffix2:
স্টক

সমতুল্য

%.suffix2: %.suffix1
স্টক

কিন্তু মনে রাখা অনেক কঠিন। (কোন প্রত্যয় প্রথমে আসে?) সাধারণত, একটি নিয়ম প্রদর্শিত হবে
এই মত একটি উত্তরাধিকার makefile মধ্যে:

.co:
$(CC) $(CFLAGS)-c $*.c -o $*.o

যা ঠিক সমতুল্য

%.o : %.c
$(CC) $(CFLAGS)-c $(ইনপুট) -o $(আউটপুট)

দ্বন্দ্বমূলক নিয়ম
যখন একটি ফাইল তৈরি করার একাধিক উপায় থাকে, তখন makepp একটি সহজ পদ্ধতি ব্যবহার করে
কোন নিয়ম ব্যবহার করতে হবে তা নির্ধারণ করুন।

একটি ফাইল তৈরি করার জন্য বিরোধপূর্ণ স্পষ্ট নিয়ম থাকা একটি ত্রুটি।

· ওয়াইল্ডকার্ড সহ প্যাটার্ন নিয়ম এবং ফোরচ নিয়মগুলি কখনই সুস্পষ্ট নিয়মগুলিকে অগ্রাহ্য করে না। এইভাবে
প্যাটার্ন নিয়মের জন্য ব্যতিক্রম নির্দিষ্ট করতে স্পষ্ট নিয়ম ব্যবহার করা যেতে পারে। (সাধারণভাবে মনে রাখবেন
একটি ": foreach" ধারা ব্যবহার করে কিছু একটি প্যাটার্ন নিয়ম করে না। এটি একটি থাকতে হবে
ওয়াইল্ডকার্ড (যেমন "*" বা "?") ফাইল নামের অংশ হিসেবে ":foreach" ধারায়। যদি হয়
শুধুমাত্র ফাইলগুলির একটি সুস্পষ্ট তালিকা, এটি প্রতিটির জন্য একটি সুস্পষ্ট নিয়ম হিসাবে বিবেচিত হয়
নথি পত্র.)

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

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

%.o : %.c : foreach **/*.c
$(CC) $(CFLAGS)-c $(ইনপুট) -o $(আউটপুট)

এবং আপনার সাবডিরেক্টরিগুলির একটিতে একটি মেকফাইল থাকতে পারে যা বলে:

%.o : %.c
$(CC) $(SPECIAL_CFLAGS)-c $(ইনপুট) -o $(আউটপুট)

· প্যাটার্নের নিয়ম যেখানে অনুমানের একটি ছোট চেইন আছে অন্য প্যাটার্নের চেয়ে পছন্দ করা হয়
নিয়ম উদাহরণস্বরূপ, যদি আপনার নিম্নলিখিত নিয়মগুলি থাকে (এর থেকে একটি উদাহরণের উপর ভিত্তি করে
লিনাক্স কার্নেল):

%.s: %.c
$(CC)-s $(ইনপুট)-o $(আউটপুট)

%.o: %.s
$(এএস) $(ইনপুট)-ও $(আউটপুট)

%.o: %.c
$(CC) -c $(ইনপুট) -o $(আউটপুট)

যদি আমাদের "xyz.o" তৈরি করতে হয়, আমরা হয় মধ্যবর্তী ".s" ফাইল তৈরি করতে পারি এবং তারপরে
প্রথম দুটি নিয়ম ব্যবহার করে অ্যাসেম্বলারের মাধ্যমে চালান, অথবা আমরা সরাসরি একটিতে যেতে পারি
শেষ নিয়ম ব্যবহার করে ".o" ফাইল। শেষ নিয়মটি পছন্দনীয় কারণ সেখানে কম আছে
অনুমানের শৃঙ্খলে পদক্ষেপ (দুটির পরিবর্তে একটি)।

· প্যাটার্ন নিয়মগুলি পরে একটি মেকফাইলে ওভাররাইড প্যাটার্ন নিয়ম যা আগের। (এই
GNU make থেকে পিছনের দিকে।) এর মানে হল আপনার আরও সাধারণ নিয়মগুলি রাখা উচিত
আগে, এবং আপনার আরো নির্দিষ্ট নিয়ম পরে। উদাহরণ স্বরূপ,

%.o: %.c # সাধারণ সংকলন নিয়ম।
কর্ম

special_%.o: special_%.c # একটি সহ ফাইলের জন্য বিশেষ নিয়ম
ভিন্ন ক্রিয়া # "বিশেষ_" উপসর্গ।

নিয়ম অপশন
কখনও কখনও makepp কীভাবে সম্পাদন করে তা সংশোধন করতে অতিরিক্ত বিকল্প সরবরাহ করা প্রয়োজন
নিয়ম. এই বিকল্পগুলিকে ":optionname মান" হিসাবে নির্দিষ্ট করা হয়েছে, হয় যে লাইনে রয়েছে
নির্ভরতা, বা পরবর্তী লাইনে।

পৃথক লাইনে বিকল্পগুলি সরবরাহ করা আপনার পক্ষে একই ব্যবহার করা সম্ভব করে তুলতে পারে
makepp এবং একটি ঐতিহ্যগত মেক সঙ্গে makefile. উদাহরণ স্বরূপ,

লক্ষ্য: নির্ভরতা
: স্বাক্ষর লক্ষ্য_নতুন
স্টক

একটি ঐতিহ্যগত ইউনিক্স মেক এর সাথে সূক্ষ্ম কাজ করবে, কারণ এটি ": স্বাক্ষর" লাইনটিকে ব্যাখ্যা করে
একটি শেল কমান্ড হিসাবে, এবং একটি কোলন দিয়ে শুরু একটি কমান্ড কিছুই করে না।

:build_cache /path/to/build/cache
লক্ষ্য: নির্ভরতা
: build_cache /put/cache/files/over/there
স্টক

এই নিয়ম দ্বারা উত্পাদিত ফাইলগুলির জন্য ব্যবহার করার জন্য একটি বিল্ড ক্যাশের পথ নির্দিষ্ট করে। এই
"build_cache" বিবৃতি বা "--build-cache" কমান্ডের প্রভাব ওভাররাইড করে
লাইন বিকল্প, যদি থাকে, এই নিয়মের জন্য। বিল্ড সম্পর্কে বিস্তারিত জানার জন্য makepp_build_cache দেখুন
ক্যাশে

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

:build_check বিল্ড_চেক_পদ্ধতি
লক্ষ্য: নির্ভরতা
: বিল্ড_চেক টার্গেট_নতুন
স্টক

লক্ষ্যগুলি পুনর্নির্মাণ করা প্রয়োজন কিনা তা নির্ধারণ করতে এটি makepp কে কোন অ্যালগরিদম ব্যবহার করতে হবে তা বলে৷
আরও বিস্তারিত জানার জন্য makepp_build_check দেখুন। এটি এর প্রভাবকে ওভাররাইড করে
"build_check" বিবৃতি বা "--build-check-method" কমান্ড লাইন বিকল্প, যদি থাকে, এর জন্য
এই নিয়ম।

: env পরিবর্তনশীল ...
নামযুক্ত পরিবেশ ভেরিয়েবলের মানগুলির উপর নির্ভরতা যোগ করুন। যদি তাদের কেউ
পূর্ববর্তী বিল্ড থেকে ভিন্ন, তারপর লক্ষ্যগুলি পুরানো বলে বিবেচিত হয়, যদি
build_check পদ্ধতি তাই নির্দেশ করে। (ব্যতীত সমস্ত অন্তর্নির্মিত বিল্ড চেক পদ্ধতি
লক্ষ্য_নতুন এটিকে সম্মান করুন।)

VARIABLE ফর্ম হতে পারে "PATH_VARIABLE-এ ফাইলের নাম" (উদ্ধৃতিতে), যে ক্ষেত্রে
কোলন-ডিলিমিটেড থেকে প্রথম ডাইরেক্টরি হলে টার্গেটগুলি পুরানো বলে বিবেচিত হয়
PATH_VARIABLE এর মান যেখানে ফাইলের নাম বিদ্যমান তা শেষ বিল্ড থেকে আলাদা।
যখন PATH_VARIABLE একটিতে পরিবর্তন হয় তখন লক্ষ্যগুলি পুনর্নির্মাণ এড়াতে এটি ব্যবহার করা যেতে পারে
অপ্রাসঙ্গিক উপায়।

: প্রেরণ হুকুম ...
প্রতিটি শেল অ্যাকশন (কিন্তু পার্ল অ্যাকশন বা পার্ল কমান্ড নয়) একটি "sh -c '...'" এ আবদ্ধ করুন
এবং কমান্ডের সাথে এটি উপসর্গ করুন, কিন্তু অনুমান করুন যে লক্ষ্যটি কমান্ডের উপর নির্ভর করে না।
আপনি যদি একটি কাজের সারিবদ্ধ সিস্টেমে অ্যাকশন পাঠাতে চান তবে এটি কার্যকর, কিন্তু ফলাফল
সারিবদ্ধ প্যারামিটার থেকে স্বাধীন বলে ধরে নেওয়া হয়েছে, সেইসাথে সারিবদ্ধ কিনা
সিস্টেম সব ব্যবহার করা হয়.

: অন্তর্ভুক্ত ফাইল_বা_প্যাটার্ন
কম্পাইলারের উপর নির্ভর করে নিয়ম পরিবর্তিত হয়:

%.o : %.c
: %.d অন্তর্ভুক্ত করুন : সিগনেচার
gcc -MD -c...

%.o : %.c
: অন্তর্ভুক্ত %.u : স্বাক্ষর C # IBM একটি ভিন্ন প্রত্যয় ব্যবহার করে
xlc -M -c...

উপ-নির্ভরশীলতা {# মাইক্রোসফটের আড্ডাকে দরকারী ফর্ম্যাটে পরিণত করুন
s/\$/\$\$/g;
s/(দ্রষ্টব্য: ফাইল সহ: *)?(.+?)\r?\n/$1 ? "'$2' " : "'.f_output()।"': "/e;
}
%.o : %.c
: %.d অন্তর্ভুক্ত করুন : সিগনেচার
cl -show অন্তর্ভুক্ত -c... >$(স্টেম)
&sed &dependify -o +<$(stem).d

কিছু কম্পাইলার (উপরের জিসিসির মতো ইন্টেলের আইসিসি, বা আইবিএমের এক্সএলসি) নির্ভরতা তৈরি করতে পারে
উড়ন্ত ফাইল. অর্থাৎ, তারা কম্পাইল করার সময়, তারা একটি মেকফাইল লেখে যা makepp করতে পারে
অন্তর্ভুক্ত মেকপ এর স্ক্যানারের সুবিধা হল এটি 100% নিশ্চিত
সঠিক, যেখানে আমরা কেবল কাছাকাছি আসতে পারি।

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

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

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

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

আপনি যদি আপনার সংগ্রহস্থলে তৈরি করেন তবে makepp নির্ভরতা ফাইলটি থেকে তুলে নেবে
1ম সংগ্রহস্থল যা একটি ধারণ করে। এটি অন্যান্য ফাইলের মত নয়, যেখানে এটি 1ম লাগে
প্রত্যাশিত স্বাক্ষর সহ। এটি ক্যাশে নির্মাণের চেয়ে ভাল, যেখানে অভাবের জন্য
স্বাক্ষর, এটি এমনকি ফাইলটি খুঁজে পায় না।

:শেষ সুযোগ
একটি ওপেন-এন্ডেড নিয়ম সক্রিয় করুন, যেমন

%.foo foo%.bar: :last_chance
&ইকো $@ -o $@
&cp $(আউটপুট)

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

":last_chance" বিকল্পটি বিশেষ আচরণের প্রতি দৃষ্টি আকর্ষণ করার উদ্দেশ্যে
ওয়াইল্ডকার্ড মেলানো সংক্রান্ত নিয়ম।

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

%.o: %.abc
: পার্সার c_compilation
এখানে কর্ম

এর ফলে makepp একই পার্সিং এবং স্ক্যানিং করতে পারে যা এটি C/C++ এর জন্য করে
কমান্ড তৈরি করুন, এমনকি যদি এটি একটি C সংকলন হিসাবে ক্রিয়াটিকে স্বীকৃতি না দেয়।

ডিফল্ট পার্সার কমান্ডের উপর নির্ভর করে। যদি আপনি একটি ":পার্সার" বিকল্প নির্দিষ্ট না করেন,
তারপর প্রতিটি কমান্ডের প্রথম শব্দ পরীক্ষা করা হয়। উদাহরণস্বরূপ একটি কম্পাইল বা লিঙ্কের জন্য
কমান্ড, makepp "c_compilation" পার্সার ব্যবহার করবে; অথবা যদি কমান্ডের মত দেখায়
GNU ভেরিয়েন্ট, "gcc_compilation"। যদি কোন পার্সার পাওয়া না যায় তবে এটি "কোনটিই নয়" পার্সার ব্যবহার করে। জন্য
এই বিষয়ে আরও বিশদ বিবরণ, অথবা আপনি যদি নিজের পার্সার লিখতে চান বা makepp এর পরিবর্তন করতে চান
ডিফল্ট পার্সার, makepp_scanning দেখুন।

মনে রাখবেন যে এটি নিয়মের প্রতিটি কমান্ডের ক্ষেত্রে প্রযোজ্য, যা আপনি যা চান তা নাও হতে পারে:

%.o: %.c: পার্সার সি-সংকলন
@echo 'বিল্ডিং $(আউটপুট)'
@funny_cc...

এটি একটি কম্পাইলার হিসাবে "প্রতিধ্বনি" ব্যাখ্যা করবে এবং এর যুক্তি 'বিল্ডিং' বের করবে
mymodule.o' একটি অন্তর্নিহিত নির্ভরতা হিসাবে। এর ফলে এমন অভিযোগ উঠবে
এই ধরনের একটি ফাইল তৈরি করতে জানেন না। এই ক্ষেত্রে আপনি সঙ্গে বন্ধ ভাল হবে
"রেজিস্টার_পার্সার"। সেখানে আপনি কিভাবে একটি ব্যাখ্যা খুঁজে পার্সার একটি হিসাবে দেওয়া যেতে পারে
ক্লাসের নাম বা একটি ফাংশন নাম হিসাবে।

: স্বাক্ষর স্বাক্ষর_পদ্ধতি
লক্ষ্য: নির্ভরতা
: স্বাক্ষর md5
স্টক

নির্ভরতা পরিবর্তিত হয়েছে কিনা তা নির্ধারণ করতে এটি makepp কে কোন অ্যালগরিদম ব্যবহার করতে হবে তা বলে।
আরো বিস্তারিত জানার জন্য makepp_signatures দেখুন। স্বাক্ষর পদ্ধতি যা অন্তর্ভুক্ত করা হয়
makepp বিতরণ হল "প্লেইন", "md5", "C" বা "c_compilation_md5", এবং
"shared_object"। এটি "-m" বা এর সাথে নির্দিষ্ট করা যেকোনো স্বাক্ষর পদ্ধতিকে ওভাররাইড করে
"--স্বাক্ষর-পদ্ধতি" কমান্ড লাইন বিকল্প, বা "স্বাক্ষর" বিবৃতি সহ।

বিশেষ অক্ষর
Makepp ফাইলের নাম সমর্থন করতে পারে যেগুলির মধ্যে একটি কোলন বা স্থানের মতো বিশেষ অক্ষর রয়েছে।
ধরুন, উদাহরণস্বরূপ, আপনি "b:thing" ফাইল থেকে "a:thing" নামে একটি ফাইল তৈরি করতে চান।
আপনি এইভাবে নিয়ম লিখতে পারবেন না:

a:thing : b:thing # এটি একটি সিনট্যাক্স ত্রুটি
&cat $(ইনপুট) -o $(আউটপুট)

কারণ মেকপপ জানে না কোন কোলন নির্ভরতা থেকে লক্ষ্য আলাদা করে এবং কোনটি
ফাইলের নামের অংশ। পরিবর্তে, কেবলমাত্র উদ্ধৃতিগুলিতে নামটি আবদ্ধ করুন, যেমন:

"a:thing" : "b:thing"
&cat $(ইনপুট) -o $(আউটপুট)

এখন নিয়ম দ্ব্যর্থহীন।

Makepp এর উদ্ধৃতি সিনট্যাক্স শেলের সাথে বেশ মিল। আপনি, উদাহরণস্বরূপ, একক ব্যবহার করতে পারেন
দ্বিগুণ উদ্ধৃতির পরিবর্তে উদ্ধৃতি, অথবা আপনি ব্যাকস্ল্যাশ দিয়ে বিশেষ অক্ষর এড়িয়ে যেতে পারেন:

a\:thing : 'b:thing'
&cat $(ইনপুট) -o $(আউটপুট)

ধরুন, উদাহরণস্বরূপ, আপনার ফাইলের নাম হল "'"!;\$৷ এখন আপনি কেন এমন একটি ফাইলের নাম চান?
আমি জানি না, তবে এখানে বেশ কয়েকটি উপায় রয়েছে যা আপনি মেকপ (এবং শেল) এর জন্য নির্দিষ্ট করতে পারেন:

\""!;\$$'
"'\"!;\\$$"

কখন মেকপ স্ট্রিপ কোট করে এবং কখন শেল করে সেদিকে মনোযোগ দিন। মেকপ তাকায়
উদ্ধৃতি শুধুমাত্র নিম্নলিখিত ক্ষেত্রে:

· পরীক্ষার "ifeq" পরিবারে

· নিয়ম কোলন আগে এবং পরে

· একটি makepp বিল্টইন কমান্ডে

ফাইলের সাথে সম্পর্কিত একটি ফাংশনে

শেল থেকে ভিন্ন, মেকপপ একটি ভেরিয়েবলে বরাদ্দ করার সময় উদ্ধৃতিগুলিকে প্রসারিত করে না। এইভাবে
নিম্নলিখিত নিয়মগুলি অভিন্ন:

FILE = 'শূন্যস্থান সহ নাম'
x := $(প্রিন্ট $(FILE)) # শুধুমাত্র উদ্ধৃতিগুলি এখনও আছে কিনা তা পরীক্ষা করতে
$(ফাইল): makepp দ্বারা ছিনিয়ে নেওয়া একক ফাইলের চারপাশে #টি উদ্ধৃতি
&echo hello -o$(FILE) # মেকপিপ দ্বারা স্ট্রাইপ করা একক ফাইলের চারপাশে উদ্ধৃতি
সেখানে echo >>$(FILE) # উদ্ধৃতি একক ফাইলের চারপাশে শেল দ্বারা ছিনতাই করা হয়েছে
'শূন্যস্থান সহ নাম':
&echo hello -o'name with spaces'
সেখানে echo>>'$(output)' # উদ্ধৃতিগুলি উপরে ছিনিয়ে নেওয়া হয়েছে, সেগুলি আবার যোগ করুন

লক্ষ্য করুন যে (শেলের বিপরীতে) "$" দিয়ে শুরু হওয়া ভেরিয়েবলগুলি এমনকি একক ভিতরেও প্রসারিত হয়
উদ্ধৃতি ডলারের চিহ্ন উদ্ধৃতি বা ব্যাকস্ল্যাশ দ্বারা সুরক্ষিত করা যাবে না। একটি আক্ষরিক পেতে
ডলার চিহ্ন, একটি ডবল ডলার চিহ্ন ব্যবহার করুন, যেমন,

$(সব ভুয়া):
@&echo এটি একটি ডলার চিহ্ন: $$
@এবিসিডিতে ভ্যালের জন্য; প্রতিধ্বনি করুন $$val; সম্পন্ন

সাধারণত, আপনি এটি উদ্ধৃত করে কোন বিশেষ চরিত্রের সাথে মোকাবিলা করতে সক্ষম হওয়া উচিত
কোনভাবে. এর মধ্যে রয়েছে স্পেস, কন্ট্রোল ক্যারেক্টার ইত্যাদি। যাইহোক, এ বিষয়ে সচেতন থাকুন
বর্তমান, makepp-এর মন্তব্য স্ট্রিপিং কিছুটা সরল, এবং যেকোনো "#" অক্ষর
হোয়াইটস্পেস দ্বারা পূর্বে মন্তব্য হিসাবে ব্যাখ্যা করা হবে সেগুলি যেভাবেই উদ্ধৃত করা হোক না কেন।

যখন একটি লক্ষ্য বা নির্ভরতার নাম "$(আউটপুট)" এর মতো একটি স্বয়ংক্রিয় ভেরিয়েবলের মধ্যে রাখা হয়, তখন
উদ্ধৃতি এবং কোনো ব্যাকস্ল্যাশ ছিনতাই করা হয়. এর মানে হল যে আপনি যদি রেফারেন্স করতে চান
ক্রিয়াগুলিতে ফাইলের নাম, আপনাকে সম্ভবত এটি আবার উদ্ধৃত করতে হবে, যেমন:

"স্পেস সহ একটি ফাইলের নাম":
প্রতিধ্বনি "বিশেষ বিষয়বস্তু" > "$@"

আপনি যদি $@ এর কাছাকাছি উদ্ধৃতিগুলি না রাখেন, তাহলে শেল কমান্ডটি দেখতে পাবে

ইকো "বিশেষ বিষয়বস্তু" > স্পেস সহ একটি ফাইলের নাম

যা "স্পেস সহ বিশেষ বিষয়বস্তু ফাইলের নাম" নামক ফাইলটিতে স্ট্রিং লিখে a.
এই সম্ভবত আপনি কি চান না.

onworks.net পরিষেবা ব্যবহার করে makepp_rules অনলাইন ব্যবহার করুন



সর্বশেষ লিনাক্স এবং উইন্ডোজ অনলাইন প্রোগ্রাম