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

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

কার্যক্রম:

NAME এর


makepp_functions -- makepp-এ ফাংশন

বর্ণনাঃ


A: absolute_filename,
absolute_filename_nolink,
অবসপথ,
যোগ উপসর্গ,
যোগ প্রত্যয়,
এবং, B: মূল নাম, C: কল, D: হয়,
dir_noslash, E: ত্রুটি, F: ফাইলসাবস্ট,
ছাঁকনি,
আলাদা করা,
filter_out_dirs,
ফাইল টি খুজো,
খুঁজুন_প্রথম_উপরের দিকে,
খুঁজুন_প্রোগ্রাম,
ফাইন্ডস্ট্রিং,
খুঁজে_উপরের দিকে,
প্রথম_উপলব্ধ,
প্রথম শব্দ,
প্রতিটির জন্য, প্রত্যেকটির জন্য, I: যদি,
যদি সত্য,
infer_linker,
অনুমান_বস্তু,
তথ্য, J: যোগদান, M: তৈরি করা
মেকম্যাপ,
মেকপারল,
মানচিত্র,
"mktemp", N: নাদির, O: শুধুমাত্র_উত্পন্ন,
শুধুমাত্র_অলক্ষ্য,
শুধুমাত্র_ফনি_লক্ষ্য,
শুধুমাত্র_বাসি,
শুধুমাত্র_লক্ষ্য,
বা,
উৎপত্তি, P: patsubst,
পার্ল,
নকল
পূর্বনির্মাণ,
ছাপা, R: বাস্তবপথ,
আপেক্ষিক_ফাইলের নাম,
সম্পর্কিত, S: শেল,
সাজান,
ফালা,
উপাদান,
প্রত্যয়, T: অস্থায়ী, W: সতর্কতা,
ওয়াইল্ডকার্ড,
শব্দ,
শব্দ তালিকা,
শব্দ, X: xargs

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

ভেরিয়েবলের মতো আপনার কাছে "$(নাম ...)" বা "${নাম ...}" এর একটি পছন্দ আছে। যদি তুমি চাও
একই বন্ধনী এম্বেড করুন, এটি অবশ্যই জোড়া হতে হবে, অন্যটি কোন ব্যাপার না: "$(নাম
...(){..." বা "${নাম ...{}(...}"। (তবে মানচিত্র এবং পার্লের জন্য প্রথম বন্ধ বন্ধনী শেষ হয়
অভিব্যক্তি।) দ্বিগুণ করা আর্গুমেন্টগুলিকে বেশ কয়েকটি লাইন বিস্তৃত করতে দেয়। নতুন লাইনগুলো হলো
তারপর স্পেস হিসাবে বিবেচনা করা হয়, সম্ভবত "সংজ্ঞায়িত" ব্যতীত। এছাড়াও সিনট্যাক্স "$[নাম ...]" আছে
অথবা $[[নাম ...]], যা মেকফাইল পড়ার সময় মূল্যায়ন করা হয়, গ্রোকিং নিয়মের আগে
এবং অন্যান্য নির্মাণ।

Makepp এর অনেকগুলি বিল্টইন ফাংশন রয়েছে যা কার্যকর হতে পারে। এটা প্রায় সব সমর্থন করে
GNU make-এর টেক্সচুয়াল ফাংশন (বিস্তারিত জানার জন্য GNU make-এর ডকুমেন্টেশন দেখুন), এবং এর কিছু
নিজস্ব আপনি যা খুশি তা করতে পার্ল সাবরুটিন সংজ্ঞায়িত করতে পারেন। "সাব" বিবৃতি দেখুন
এবং আরও বিস্তারিত জানার জন্য makepp প্রসারিত করার বিভাগ।

শর্তাধীন কার্যাবলী
এবং শর্ত1[, শর্ত 2 [, শর্ত 3...]]
এবং ফাংশন একটি "শর্ট সার্কিটিং" এবং অপারেশন প্রদান করে। প্রতিটি যুক্তি হয়
প্রসারিত, ক্রমানুসারে। যদি একটি যুক্তি একটি খালি স্ট্রিং প্রসারিত হয় প্রক্রিয়াকরণ স্টপ এবং
সম্প্রসারণের ফলাফল হল খালি স্ট্রিং। যদি সমস্ত যুক্তি একটি অ-তে প্রসারিত হয়
খালি স্ট্রিং তাহলে প্রসারণের ফলাফল হল শেষ আর্গুমেন্টের প্রসারণ।

if স্ট্রিং ফলাফল-যদি-স্ট্রিং-না-খালি[, ফলাফল-যদি-স্ট্রিং-খালি]
যদি সত্য স্ট্রিং ফলাফল-যদি-স্ট্রিং-সত্য[, ফলাফল-যদি-স্ট্রিং-ফলস]
"ifeq" ইত্যাদির একটি বিকল্প বিবৃতি। যদি স্ট্রিং ফাঁকা না হয় (অর্থাৎ,
শর্ত সত্য), দ্বিতীয় যুক্তি ("তারপর" ধারা) ফেরত দেওয়া হয় (পরে
পরিবর্তনশীল সম্প্রসারণ); যদি স্ট্রিংটি ফাঁকা হয়, তৃতীয় আর্গুমেন্ট ("অন্য" ধারা)
ফিরে আসেন।

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

CFLAGS := $(যদি $(ফিল্টার gcc egcc, $(CC)), -g -ওয়াল, -g)

CFLAGS কে "-g -Wall" হিসাবে সংজ্ঞায়িত করে যদি ভেরিয়েবল CC হয় "gcc" বা "egcc", এবং "-g"
অন্যথায় (এটি ডিফল্ট বিল্ড নিয়মগুলি করে।)

"iftrue" "if" এর অনুরূপ, স্ট্রিং 0 কে ফাঁকা হিসাবে বিবেচনা করা হয়।

or শর্ত1[, শর্ত 2 [, শর্ত 3...]]
বা ফাংশন একটি "শর্ট সার্কিটিং" বা অপারেশন প্রদান করে। প্রতিটি যুক্তি প্রসারিত হয়,
ক্রমানুসারে. যদি একটি যুক্তি একটি অ-খালি স্ট্রিং প্রসারিত হয় প্রক্রিয়াকরণ স্টপ এবং
সম্প্রসারণের ফলাফল হল সেই স্ট্রিং। যদি, সমস্ত আর্গুমেন্ট প্রসারিত হয়, সব
সেগুলি মিথ্যা (খালি), তারপর সম্প্রসারণের ফলাফল হল খালি স্ট্রিং।

ফাইল এবং ফাইলের নাম কার্যাবলী
absolute_filename নথি পত্র
abspath নথি পত্র
আপেক্ষিক ফাইলের নামগুলিকে পরম ছাড়ায় রূপান্তর করে . or ..। উদাহরণ স্বরূপ,
"$(absolute_filename xyz.c)" ফিরতে পারে "/usr/src/our_project/subdir/xyz.c"।

absolute_filename_nolink নথি পত্র
বাস্তবপথ নথি পত্র
absolute_filename এর মতো, কিন্তু নিশ্চিত করে যে প্রতীকী লিঙ্কগুলি সমাধান করা হয়েছে।

বেসনাম ফাইলের নাম
বেসনেম হল সম্পূর্ণ ফাইলের নাম (ডিরেক্টরি সহ), এবং এর পরে টেক্সট বিয়োগ করুন
শেষ সময়কাল সহ। যেমন, "$(basename myfile/version-1.0-module.c)" হল
"myfile/version-1.0-মডিউল"

Dir ফাইলের নাম
ফাইলের নাম তালিকায় প্রতিটি ফাইলের ডিরেক্টরি অংশ বের করে, ট্রেলিং সহ
স্ল্যাশ ফাইলের নামে কোনো ডিরেক্টরি না থাকলে "./" রিটার্ন করে।

dir_noslash ফাইলের নাম
"$(dir )" এর মতই এটি ব্যতীত এটি ট্রেলিং স্ল্যাশ ফেরত দেয় না।

filesubst প্যাটার্ন, বিকল্প, শব্দ
ফাইলের নামগুলিতে একটি প্যাটার্ন প্রতিস্থাপন করুন। এই যে patsubst থেকে ভিন্ন
যখন ডিরেক্টরির জন্য বিকল্প নাম দেওয়া হয় তখন এটি সঠিকভাবে কাজ করবে (যতদিন
তারা শতাংশ চিহ্নের আগে)। উদাহরণ স্বরূপ,

$(filesubst ./src/%.c, %.o, $(ওয়াইল্ডকার্ড src/*.c))

filesubst এর সাথে কাজ করবে কিন্তু patsubst এর সাথে নয়।

filter_out_dirs ফাইলের নাম
ডিরেক্টরি উল্লেখ করে না এমন সমস্ত ফাইলের নাম ফেরত দেয়।

ফাইল টি খুজো ফাইলের নাম, পথ
নির্দিষ্ট পাথে একটি ফাইল খুঁজে পায়, অথবা পরিবেশ পরিবর্তনশীল PATH যদি কিছুই না থাকে
নির্দিষ্ট করা এটি বাইনারি খুঁজে পেতে বা ফাইল অন্তর্ভুক্ত করার জন্য দরকারী হতে পারে। উদাহরণ স্বরূপ,

TCL_INCLUDE := -I$(dir_noslash $(findfile tcl.h,
/usr/local/stow/tcl-8.4.5-nothread/include
/usr/include/tcl8.4 /usr/include/tcl
/net/na1/tcl8.4a3/include /net/na1/tcl8.4a3/include))

এটি ফাইলটি সনাক্ত করে tcl.h উপরের সমস্ত ডিরেক্টরি অনুসন্ধান করে। পরম
ফাইলের পাথ ফেরত দেওয়া হয়। তারপর "$(dir_noslash )" সেই ডিরেক্টরিটি বের করে এবং এটি
অন্তর্ভুক্ত পাথ মধ্যে রাখা হয়.

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

CC = $(find_program gcc egcc pgcc c89 cc) # এবং আরও অনেক কিছু, মেশিনের উপর নির্ভর করে
F77 = $(find_program f77 g77 fort77)
CXX = $(find_program g++ c++ pg++ cxx CC aCC)

যদি কোনো প্রোগ্রাম পাওয়া না যায়, "$(find_program )" খুঁজে পাওয়া যায়নি এমন স্ট্রিং ফেরত দেয়, এবং
কি পাওয়া যায়নি লগ. এটি সাধারণত একটি কার্যকরী মেকফাইলে পরিণত হবে না, তবে এটি
আরও ভাল ত্রুটি বার্তা তৈরির প্রবণতা থাকবে। উদাহরণস্বরূপ, আপনি যদি এমন কিছু করেন
এই:

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

এবং makepp উপরের তালিকায় একটি C কম্পাইলার খুঁজে পাচ্ছে না, এটি নট-ফাউন্ডের বিকল্প হবে।
অন্যথায় শেল সোর্স ফাইল এবং ফলস্বরূপ ত্রুটি চালানোর চেষ্টা করবে
বার্তা সত্যিই অদ্ভুত হতে পারে.

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

উদাহরণস্বরূপ, আপনার যদি অনেক স্তরের সাবডিরেক্টরি সহ একটি প্রকল্প থাকে তবে আপনি করতে পারেন
সমস্ত মেকফাইলে এই সাধারণ খণ্ডটি অন্তর্ভুক্ত করুন (যেমন, "অন্তর্ভুক্ত" ব্যবহার করে
বিবৃতি):

TOP_LEVEL_INCLUDE_DIR := $(find_upwards অন্তর্ভুক্ত)
# এমন একটি ডিরেক্টরির জন্য অনুসন্ধান করে যাতে রয়েছে
# সাবডিরেক্টরি অন্তর্ভুক্ত।

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

আরেকটি সমস্যা যা "find_upwards" সমাধান করতে সাহায্য করতে পারে তা হল শীর্ষ-স্তরের ডিরেক্টরির অবস্থান
একটি নির্মাণ প্রায়ই এটি এই মত একটি পরিবর্তনশীল সংজ্ঞায়িত করা দরকারী:

শীর্ষ:= ../../..

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

শীর্ষ := $(dir_noslash $(find_upwards LICENSE))

"$(find_upwards LICENSE)" লাইসেন্স ফাইলের সম্পূর্ণ পাথ ফেরত দেয়;
"$(dir_noslash ...)" ফাইলের নাম বন্ধ করে দেয়, শুধুমাত্র ডিরেক্টরি ফেরত দেয়।

(উল্লেখ্য যে "অন্তর্ভুক্ত" বিবৃতিটি স্বয়ংক্রিয়ভাবে ফাইলগুলির জন্য উপরের দিকে অনুসন্ধান করে, তাই সেখানে
এই মত কিছু করার প্রয়োজন নেই:

$(find_upwards top_level_rules.mk) অন্তর্ভুক্ত করুন

পরিবর্তে, আপনি শুধু করতে পারেন

top_level_rules.mk অন্তর্ভুক্ত করুন

এবং এটি ঠিক একইভাবে কাজ করবে।)

ফাইলটি খুঁজে না পাওয়া গেলে, "find_upwards" একটি ত্রুটি বার্তা সহ বিল্ডটি বাতিল করবে।

আপনি যদি একাধিক ফাইল উল্লেখ করেন, তাহলে find_upwards প্রথমটির জন্য অনুসন্ধান করবে
দ্বিতীয় এক, এবং তাই। অন্য কথায়,

$(find_upwards file1 file2)

সমতুল্য

$(find_upwards file1) $(find_upwards file2)

আপনি যদি যেকোনো একটি ফাইল খুঁজতে চান, তাহলে পরিবর্তে "find_first_upwards" ব্যবহার করুন।

খুঁজুন_প্রথম_উপরের দিকে file1 file2 ...
এই ফাংশনটি "ফাইন্ড_উপরের দিকে" এর মতো আচরণ করে তবে এটি যেকোনটির প্রথম ফাইলটি ফেরত দেয়
তালিকার ফাইল যা এটি খুঁজে পায়। বিশেষত, এটি বর্তমান ডিরেক্টরি পরীক্ষা করে
তালিকার যে কোনো ফাইল, এবং বিদ্যমান বা নির্মিত হতে পারে এমন প্রথম ফাইলটি ফেরত দেয়।
যদি কোনও ফাইলই বিদ্যমান না থাকে বা সেই ডিরেক্টরিতে তৈরি করা যায় তবে এটি পরীক্ষা করে .., তারপর
../ .., ইত্যাদি, যতক্ষণ না এটি হয় রুট ডিরেক্টরি বা একটি ডিরেক্টরিতে পৌঁছায়
একটি ভিন্ন ফাইল সিস্টেমে অবস্থিত।

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

TCL_LIB = $(first_available
/usr/local/stow/tcl-8.4.5-nothread/lib/libtcl8.4.so
/usr/lib/libtcl8.4.so /usr/lib/libtcl.so
/net/na1/tcl8.4a3/lib/libtcl8.4.a
/net/na1/tcl8.4a3/lib/libtcl8.4.sl)

এই লাইনটি উপরের সমস্ত জায়গায় Tcl লাইব্রেরির জন্য চেক করবে, এখানে থামবে
প্রথম যে এটি খুঁজে পায়. লিঙ্ক কমান্ড তারপর $(TCL_LIB) অন্তর্ভুক্ত তাই আমরা পেতে
উপযুক্ত Tcl লাইব্রেরি।

infer_linker file1 file2 ...
অবজেক্ট ফাইলগুলির একটি তালিকা দেওয়া হলে প্রথমে সেগুলি তৈরি করুন যদি তারা এখনও না থাকে। তারপর খুঁজুন
তারা একটি ফোর্টরান, C++ বা একটি C উৎসের উপর নির্ভর করে এবং সংশ্লিষ্ট ফেরত দেয়
কম্পাইলার (যা "ld" এর চেয়ে কীভাবে লিঙ্ক করতে হয় তা ভাল জানে)।

infer_objects file1 file2 ..., প্যাটার্ন
$(infer_objects object1.o object2.o, *.o)

আপনি যদি হেডার ফাইলের নাম সংক্রান্ত স্ট্যান্ডার্ড কনভেনশন ব্যবহার করেন, তাহলে makepp সক্ষম
কোন ".o" বা ".lo" ফাইলগুলিকে আপনার প্রোগ্রামের সাথে লিঙ্ক করতে হবে তা অনুমান করা। আমি এই ব্যবহার
একটি লাইব্রেরি ডিরেক্টরি থেকে ফাইলগুলি বাছাই করুন যাতে বিভিন্ন মডিউল ব্যবহার করা হয়
প্রোগ্রাম একটি লাইব্রেরি ".a" ফাইল তৈরি করার পরিবর্তে এবং লিঙ্কারটি বেছে নিন
প্রাসঙ্গিক মডিউল, makepp আপনার জন্য প্রাসঙ্গিক মডিউল বাছাই করতে পারে। এই ভাবে, শুধুমাত্র
প্রাসঙ্গিক মডিউল কম্পাইল করা হয়.

অবজেক্ট নির্ভরতা অনুমান করার জন্য Makepp এর অ্যালগরিদম কনভেনশনের উপর নির্ভর করে
একটি হেডার ফাইল "xyz.h" এ সংজ্ঞায়িত সমস্ত ক্লাস বা ফাংশন বাস্তবায়ন
"xyz.o" (বা "xyz.lo") নামে একটি অবজেক্ট ফাইলে কম্পাইল করা হয়েছে। তাই makepp এর অ্যালগরিদম জন্য
অবজেক্ট নির্ভরতা অনুমান করা এক বা কয়েকটি বস্তু দিয়ে শুরু হয় যা আমরা জানি যে হতে হবে
প্রোগ্রামের সাথে যুক্ত। "#include"-এর সাথে কোন ফাইলগুলি অন্তর্ভুক্ত করা হয়েছে তা দেখে
সেই উত্সগুলি, এবং প্রতিটি অন্তর্ভুক্তগুলির জন্য সংশ্লিষ্ট অবজেক্ট ফাইলগুলি খুঁজে বের করার চেষ্টা করে
ফাইল।

"$(infer_objects )" একটি প্রোগ্রামের নির্ভরতা তালিকায় উল্লেখ করা প্রয়োজন, যেমন
এই:

myprog: $(infer_objects main.o other_object.o,
**/*.o /other/library/dirs/**/*.o)
$(CXX) $(ইনপুট) -o $(আউটপুট) $(LIBS)

"$(infer_objects)" ফাংশন দুটি আর্গুমেন্ট নেয় (একটি কমা দ্বারা পৃথক করা হয়েছে, যেমন দেখানো হয়েছে)।
প্রথমটি হল এক বা কয়েকটি অবজেক্ট ফাইল যা প্রয়োজন বলে পরিচিত (ওয়াইল্ডকার্ড হল
এখানে অনুমোদিত)। দ্বিতীয়টি সম্ভাব্য বস্তুর একটি তালিকা (সাধারণত আপনি a
এখানে ওয়াইল্ডকার্ড) যা প্রয়োজনে লিঙ্ক করা যেতে পারে। এই থেকে রিটার্ন মান
ফাংশন হল একটি তালিকা যা প্রথম আর্গুমেন্টের সমস্ত অবজেক্ট ধারণ করে এবং
তারপর তাদের পরে, দ্বিতীয় আর্গুমেন্টে থাকা সমস্ত অতিরিক্ত বস্তু
যেটি প্রথম আর্গুমেন্টে বস্তুর দ্বারা প্রয়োজনীয়।

উদাহরণস্বরূপ, ধরুন "main.o" এসেছে "main.cpp" থেকে, যার মধ্যে রয়েছে "my_class.h"।
"$(infer_objects)" "my_class.o" নামের ফাইলের সন্ধান করে। যদি ঠিক তেমন একটা
ফাইল পাওয়া যায়, এটি তালিকায় যোগ করা হয়। (যদি দুটি অবজেক্ট ফাইল "my_class.o" পাওয়া যায়
বিভিন্ন ডিরেক্টরিতে, একটি সতর্কতা বার্তা মুদ্রিত হয়।) "infer_objects"ও
"my_class.cpp" পরীক্ষা করে দেখতে এটি কি অন্তর্ভুক্ত করে এবং অতিরিক্ত অবজেক্ট ফাইলগুলি কী
ঊহ্য.

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

আর্গুমেন্টের শেষে যে কোনো সংখ্যক বড় হাতের "X" গুলিকে অনেকগুলি দ্বারা প্রতিস্থাপিত করা হয়
এলোমেলো অক্ষর এবং সংখ্যা। যত বেশি আছে, এই সংঘর্ষের সম্ভাবনা তত কম
অন্যান্য প্রক্রিয়ার সাথে, তাই যদি আপনি একটি উপসর্গ দেন যেমন "/tmp/abc।", আপনার যথেষ্ট হওয়া উচিত
"X"s যদি একাধিক X থাকে, প্রথম অক্ষরটি প্রক্রিয়া আইডি থেকে আসে। যদি
কোনটি নেই, মনে হয় দশটি ছিল, যা অনুমিতভাবে যথেষ্ট (8.4e17)
সম্ভাবনা বা Windows এ 3.7e15)। কোন যুক্তি না থাকলে, উপসর্গটি ডিফল্ট হয়
"tmp"বর্তমান ডিরেক্টরিতে।

মনে রাখবেন যে আপনি নিয়ম লক্ষ্য এবং নির্ভরতা হিসাবে এই ধরনের একটি নাম দিতে চান না। দ্য
ফলাফল সঠিক হবে, কিন্তু আপনি যখনই মেকপ চালান তখন এটি পুনরায় তৈরি করা হবে।

এছাড়াও, যেহেতু এটি সর্বদা আলাদা, আপনি যদি ব্যবহার করেন তবেই এটিকে একটি নিয়ম কর্মে ব্যবহার করা উচিত
":build_check ignore_action":

TMPFILE ;= $(mktemp) # 1 কল; "=" মানে 3টি কল: 3টি ফাইল৷
A-count B-count: :build_check ignore_action
উত্পাদন-এবং-বিএস >$(TMPFILE)
&grep -c /A/ $(TMPFILE) -o A-গণনা
&grep -c /B/ $(TMPFILE) -o বি-গণনা

অথবা আপনার এটি রপ্তানি করা উচিত এবং শেলকে এটি মূল্যায়ন করা উচিত:

TMPFILE রপ্তানি করুন ;= $(mktemp)
A-গণনা B-গণনা:
produce-As-and-Bs >$$TMPFILE # makepp var মান দেখতে পায় না
fgrep -c A $$TMPFILE >A-গণনা
fgrep -c B $$TMPFILE >B-গণনা

শেষ ফর্মটি আগের রিটার্ন মানের পুনরাবৃত্তি করে, তাই আপনি এটি একটি প্যাটার্ন নিয়মে ব্যবহার করতে পারেন:

%.x: %.y
&grep foo $(ইনপুট) -o $(mktemp)
&sed বার $(mktemp /)-o $(আউটপুট) # &grep-এর আউটপুটে কাজ করে

notdir ফাইলের নাম
ফাইলের নাম(গুলি) এর নন-ডিরেক্টরি অংশ ফেরত দেয়, অর্থাৎ, শেষের পরে সবকিছু
একটি থাকলে স্ল্যাশ করুন, অথবা অন্যথায় পুরো ফাইলের নাম।

only_generated ফাইলের নাম
তালিকায় শুধুমাত্র সেই ফাইলের নামগুলি দেখায় যেগুলি makepp দ্বারা তৈরি করা হয়েছিল এবং তারপর থেকে নয়৷
বিল্ড ইনফো ফাইল অনুসারে পরিবর্তিত।

এই ফাংশনটি পরিষ্কার লক্ষ্য নিয়মে কার্যকর (যদিও অবশ্যই "makeppclean" হল
পছন্দের বৈকল্পিক):

$(ফনি ক্লিন):
&rm -f $(only_generated **/*)

only_nontargets ফাইলের নাম
তালিকায় শুধুমাত্র সেই ফাইলের নাম ফেরত দেয় যেগুলো কোনো নিয়মের লক্ষ্য নয় (হয়
স্পষ্ট বা প্যাটার্ন নিয়ম)। আপনি একটি ওয়াইল্ডকার্ড নির্দিষ্ট করতে পারেন ("$(ওয়াইল্ডকার্ড)" দেখুন
makepp এর ওয়াইল্ডকার্ড সম্পর্কে আরো বিস্তারিত জানার জন্য ফাংশন)। এটি একটি তৈরির জন্য ব্যবহার করা যেতে পারে
বিতরণ লক্ষ্য, উদাহরণস্বরূপ:

ফোনি: বিতরণ

বিতরণ:
&mkdir our_product-$(VERSION)
&cp $(filter-out %~, $(only_nontargets*)) our_product-$(VERSION)
tar cf - our_product-$(VERSION) | gzip -9c > our_product-$(VERSION).tar.gz

এই ক্ষেত্রে, "$(only_nontargets *)" বর্তমান ডিরেক্টরির প্রতিটি ফাইল ফেরত দেয়
যে কিছু নিয়ম একটি লক্ষ্য নয়. "$(filter_out %~, ...)" সম্পাদককে সরিয়ে দেয়
ব্যাকআপ।

"only_targets" এর অনুরূপ (উপরে দেখুন), "only_nontargets" শুধুমাত্র সেই লক্ষ্যগুলি সম্পর্কে জানে যা
ইতিমধ্যে সংজ্ঞায়িত করা হয়েছে। এটি শুধুমাত্র একটি সমস্যা যদি আপনি এটি ভেরিয়েবল সংজ্ঞায়িত করতে ব্যবহার করেন
":=" অ্যাসাইনমেন্টের সাথে; যদি আপনি এটি নির্ভরতা তালিকায় বা a এর বডিতে ব্যবহার করেন
নিয়ম, অন্য সব নিয়ম ইতিমধ্যে দেখা হবে.

শুধুমাত্র_বাসি ফাইলের নাম
তালিকায় শুধুমাত্র সেই ফাইলের নামগুলি দেখায় যেগুলি makepp দ্বারা তৈরি করা হয়েছিল এবং তারপর থেকে নয়৷
বিল্ড ইনফো ফাইল অনুসারে পরিবর্তিত, তবে আর কোন নিয়মের লক্ষ্য নয়।

এই ধরনের ফাইলগুলিতে কোন নির্ভরতা নেই তা নিশ্চিত করার জন্য এই ফাংশনটি কার্যকর,
সমস্ত লক্ষ্যগুলির একটি পরিষ্কার বিল্ড জোরপূর্বক না করে:

$(ফনি ফ্লাশ):
&rm -f $(only_stale**/*)

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

শুধুমাত্র_লক্ষ্য ফাইলের নাম
তালিকায় শুধুমাত্র সেই ফাইলের নাম ফেরত দেয় যেগুলো আসলে কিছু নিয়মের লক্ষ্য
(হয় স্পষ্ট বা প্যাটার্ন নিয়ম)। আপনি ওয়াইল্ডকার্ড নির্দিষ্ট করতে পারেন (মেকপপ সহ
বিশেষ ওয়াইল্ডকার্ড, "**") ফাইলের নামগুলিতে। (আরো জন্য "$(ওয়াইল্ডকার্ড )" ফাংশন দেখুন
বিস্তারিত এটি একটি পরিষ্কার লক্ষ্যের জন্য ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ:

ফোনি: পরিষ্কার

পরিষ্কার:
&rm -f $(only_targets*)

এখন আপনি যদি "makepp ক্লিন" টাইপ করেন, তবে এটি কীভাবে তৈরি করতে জানে তা সবকিছু মুছে ফেলবে। কিন্তু
একটি পরিষ্কার লক্ষ্য তৈরি করবেন না, পরিবর্তে "makeppclean" ব্যবহার করুন!

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

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

এবং তারপর আপনি কিছু উৎস ফাইল মুছে ফেলুন কিন্তু সংশ্লিষ্ট মুছে ফেলতে ভুলবেন না .o নথি পত্র,
দ্য .o ফাইল এখনও কাছাকাছি থাকবে। এর মানে তারা এখনও অন্তর্ভুক্ত করা হবে
লাইব্রেরি এই সত্য সত্ত্বেও যে তারা আর কোন দরকারী নয়. যদি আপনি আপনার পরিবর্তন
এই মত নিয়ম:

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

তাহলে এই সমস্যা হবে না।

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

ALL_TARGETS := $(only_targets*)

লক্ষ্য 1: নির্ভরতা1
স্টক

লক্ষ্য 2: নির্ভরতা2
স্টক

তাহলে "only_targets" পরবর্তী নিয়ম সম্পর্কে জানতে পারবে না।

একইভাবে, "only_targets" মেকফাইলগুলিতে উত্পাদিত লক্ষ্যগুলি সম্পর্কে জানে না
পুনরাবৃত্ত মেক সঙ্গে লোড. (কিন্তু আপনি যাইহোক পুনরাবৃত্তিমূলক মেক ব্যবহার করা উচিত নয়; ব্যবহার করুন
"load_makefile" বিবৃতি ব্যবহার করুন, অথবা এর পরিবর্তে অন্তর্নিহিত মেকফাইল লোডিং ব্যবহার করুন।)

আপেক্ষিক_ফাইলের নাম file1 file2 ফাইল৩[, স্ল্যাশ]
বর্তমান ডিরেক্টরির সাথে সম্পর্কিত সেই ফাইলগুলির নাম প্রদান করে (একটি
makefile আছে)। এটি থেকে অপ্রয়োজনীয় "./" এবং অন্যান্য আবর্জনা পরিষ্কার করতেও ব্যবহার করা যেতে পারে
পথ:

ডিআইআর:=।
সাবডির := ..
FNAME := $(DIR)/../otherdir/$(SUBDIR)/ফাইল
X := $(সম্পর্কিত_ফাইলের নাম $(FNAME))

If শোঁ শোঁ শব্দ করা সত্য (সাধারণত 1) প্রত্যাবর্তিত ফাইলের নামগুলি একটি স্ল্যাশ ধারণ করার গ্যারান্টিযুক্ত
যদি প্রয়োজন হয় "./" আগে থেকে, যাতে আপনি এটিকে এক্সিকিউটেবল নাম হিসাবে ব্যবহার করতে পারেন
নির্দেশিকা অবস্থান ওভাররাইডিং কমান্ড অনুসন্ধান পথ সম্পর্কে উদ্বেগ.

যদি পাথ রুট ডিরেক্টরি দ্বারা যায়, হয় আপনার হোম ডিরেক্টরির প্যারেন্ট বা
আপনার বিল্ড সিস্টেমের "$(রুট)", অথবা উইন্ডোজে একটি ড্রাইভের রুট (এর উপর নির্ভর করে
পরিবেশ, এটি জন্যও ঘটে /cygdrive/c or /c), একটি পরম পথ হবে
পরিবর্তে ফিরে.

সম্পর্কিত file1 file2 ফাইল৩[, ডিরেক্টরি]
নির্দিষ্ট ডিরেক্টরির সাথে সম্পর্কিত সেই ফাইলগুলির নাম প্রদান করে। এই
সাধারণত দরকারী যখন যাই হোক না কেন আপনি a থেকে একটি কমান্ড কার্যকর করতে হবে
ভিন্ন ডিরেক্টরি (ডিফল্ট বর্তমান ডিরেক্টরি):

source_backup.tar:
cd .. && tar cf $(relative_to $(output), ..) $(relative_to ., ..)

প্রত্যয় নাম...
নামের প্রতিটি ফাইলের নামের প্রত্যয় বের করে। যদি ফাইলের নামে একটি পিরিয়ড থাকে,
প্রত্যয় হল শেষ সময়ের সাথে শুরু হওয়া সবকিছু। অন্যথায়, প্রত্যয় হয়
খালি স্ট্রিং. এর প্রায়শই অর্থ হল নামগুলি না থাকলে ফলাফল খালি হবে,
এবং যদি নামগুলিতে একাধিক ফাইলের নাম থাকে, ফলাফলে কম ফাইলের নাম থাকতে পারে।

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

$(প্রত্যয় src/foo.c src-1.0/bar.c হ্যাকস)

ফলাফল ".c .c" উৎপন্ন করে।

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

ওয়াইল্ডকার্ড প্যাটার্ন
প্রদত্ত প্যাটার্নের সাথে মেলে এমন সমস্ত ফাইলের বাছাই করা নামগুলি প্রদান করে যা বিদ্যমান, বা সেগুলি
যে ফাইলগুলি এখনও বিদ্যমান নেই তবে মেকপপ জানে এমন নিয়মগুলির উপর ভিত্তি করে তৈরি করা যেতে পারে
বিন্দুতে যখন এটি অভিব্যক্তি মূল্যায়ন করে। এই শেষ বিন্দুতে এটা ভিন্ন
নিয়ম ইনপুট ওয়াইল্ডকার্ড থেকে, যা পরে পাওয়া নিয়ম দ্বারা তৈরি ফাইলগুলিতেও প্রযোজ্য।

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

স্ট্রিং কার্যাবলী
উপসর্গ যোগ করুন উপসর্গ, শব্দ
প্রতিটি শব্দের সাথে প্রিফিক্স স্ট্রিং প্রিপেন্ড করে। এটি বেশিরভাগই জিএনইউ তৈরির জন্য
সামঞ্জস্য rc-শৈলী সম্প্রসারণ ব্যবহার করে, এটি আরও পাঠযোগ্য ফ্যাশনে করা যেতে পারে
এটার মত:

মডিউল := abcd
X_OLD_STYLE := $(addprefix $(OBJDIR)/, $(addsuffix .o, $(MODULES)))
X_NEW_STYLE := $(OBJDIR)/$(MODULES).o # পড়া কি সহজ নয়?

যোগ প্রত্যয় প্রত্যয়, শব্দ
প্রতিটি শব্দের সাথে প্রত্যয় স্ট্রিং যুক্ত করে। এটি বেশিরভাগ GNU তৈরির জন্য
সামঞ্জস্য rc-শৈলী সম্প্রসারণ ব্যবহার করে, এটি আরও পাঠযোগ্য ফ্যাশনে করা যেতে পারে
এটার মত:

X_OLD_STYLE := $(অ্যাডসফিক্স .o, $(মডিউল))
X_NEW_STYLE := $(MODULES).o

কল পরিবর্তনশীল [, শব্দ]...
"কল" ফাংশনটি অনন্য যে এটি ব্যবহার করা যেতে পারে পরিবর্তনশীল হিসেবে
প্যারামিটারাইজড ফাংশন। আপনি একটি জটিল অভিব্যক্তি বরাদ্দ করতে পারেন পরিবর্তনশীল আর ব্যবহার করুন
"কল" এর বিষয়বস্তুকে প্যারামেট্রিকৃত বিভিন্ন মানগুলিতে প্রসারিত করতে শব্দ পরে. ভিতরে
অন্যান্য মেক সিস্টেম, একটি পরিবর্তনশীল যা প্রধানত এর মাধ্যমে প্রসারিত করার উদ্দেশ্যে ব্যবহৃত হয়
"কল", একটি বলা হয় ম্যাক্রো.

ম্যাক্রো সম্প্রসারণের সময়, অস্থায়ী ভেরিয়েবল $1, $2, "..." পড়ুন
তার আহ্বানের সময় "কল" কে দেওয়া আর্গুমেন্ট। পরিবর্তনশীল $0 পর্যন্ত প্রসারিত করা হবে
ম্যাক্রোর নাম (যেমন পরিবর্তনশীল) যে "কল" বর্তমানে প্রসারিত হচ্ছে৷

কোন সীমা নেই, একটি ম্যাক্রো কত আর্গুমেন্ট দিয়ে "কল" করা যেতে পারে বা কতগুলি
একটি ম্যাক্রো আশা করতে পারে প্যারামিটার। আপনি যদি ম্যাক্রো হিসাবে "কল" করতে আরও আর্গুমেন্ট পাস করেন
প্রয়োজন, সমস্ত অতিরিক্ত আর্গুমেন্ট বাতিল করা হবে। কম আর্গুমেন্ট পাস করলে ক
ম্যাক্রো আশা করে, সমস্ত অতিরিক্ত প্যারামিটারগুলি খালি স্ট্রিংয়ে ভেঙে যায়।

প্রথমে একটি সহজ উদাহরণ:

বাকি = $(শব্দ তালিকা 2, $(শব্দ $(1)),$(1))
তালিকা = ABCDE
কিন্তু প্রথম := $(কল বিশ্রাম,$(তালিকা))

এখানে, "$(butfirst)" ভেরিয়েবলে "BCDE" তালিকা থাকবে।

এবং এখন আরও জটিল উদাহরণের জন্য কী সম্ভব তা দেখানোর জন্য:

বাকি = $(শব্দ তালিকা 2,$(শব্দ $(1)),${1})
mymap = $(যদি $2,$($1 কল করুন,$(প্রথম শব্দ $2)) $(কল $0,$1,$(কল রেস্ট,$2)))
ডাউনকেস = ${makeperl lc("$1")}

UCWORDS = এই সমস্ত শব্দগুলি UPCASE
DCWORDS := $(কল mymap,downcase,$(UCWORDS))

এখন "$(DCWORDS)"-এ রয়েছে "এই সব শব্দ আপকেস"। উপায় দ্বারা: এটা তোলে না
পার্থক্য, আমরা মাধ্যমে আর্গুমেন্ট অ্যাক্সেস কিনা $1, "${1}" or "$(1)" একটি ম্যাক্রোর মধ্যে।

আপনি সরাসরি ভেরিয়েবল ব্যবহার করতে পারেন যেন এটি একটি ফাংশন ছিল, যদি না থাকে
যে নামের ফাংশন। এটি অভ্যন্তরীণভাবে "কল" এ রূপান্তরিত হয়, তাই এইগুলি
সমতুল্য:

আলোচনা = $0 $1 $2 এ পরিণত হয়েছে।
সরাসরি = $(আলোচনা একটি, যুক্তি)
বলা হয় = $(আলোচনা, একটি, যুক্তি)

"$[কল]" ম্যাক্রোর "$[]" প্রসারিত করা উচিত কিনা তা বিতর্কিত মনে হতে পারে
অভিব্যক্তি, বা একটি ফাংশন সবসময় একই জিনিস করা উচিত কিনা, তা যেভাবেই হোক না কেন
বলা হয়. পরেরটি বেছে নেওয়া হয়েছিল, কারণ স্বাভাবিক মেক সিনট্যাক্সের সাথে এটি হবে
"$[1], $[2]..." একটি ভেরিয়েবলে পাওয়া অসম্ভব (এগুলি কিছুই দ্বারা প্রতিস্থাপিত হবে না,
অ্যাসাইনমেন্ট এমনকি সঞ্চালিত হওয়ার আগে।) তাই, যদি আপনার কাছে একটি সংজ্ঞায়িত করার জন্য একটি ম্যাক্রো থাকে
নিয়ম, আপনি চান "$(আউটপুট)" এর মত এক্সপ্রেশন দেখা যাক যখন নিয়মটি পার্স করা হয়, তাই
আপনাকে অবশ্যই তাদের "কল" থেকে রক্ষা করতে হবে:

myrule সংজ্ঞায়িত করুন
$2: $1
mycommand $$(ইনপুট)-ও $$(আউটপুট)
endef
$[myrule myinput,myoutput]

ছাঁকনি নিদর্শন, শব্দ
প্যাটার্নের সাথে মেলে তালিকার সমস্ত শব্দ ফেরত দেয়। নিদর্শন সহজভাবে অন্য হতে পারে
শব্দ, বা ফাইলের নাম ওয়াইল্ডকার্ড (যেমন, "*", "?", এবং "[az]" স্বীকৃত), অথবা তারা হতে পারে
একটি "%" অক্ষর আছে, যার অর্থ সেই বিন্দুতে যে কোনো স্ট্রিং মেলে ("*" এর মতো)।

আলাদা করা নিদর্শন, শব্দ
তালিকার সমস্ত শব্দ ফেরত দেয় যা প্যাটার্নের সাথে মেলে না। নিদর্শন সহজভাবে হতে পারে
অন্যান্য শব্দ, বা ফাইলের নাম ওয়াইল্ডকার্ড (যেমন, "*", "?", এবং "[az]" স্বীকৃত), অথবা
তাদের একটি "%" অক্ষর থাকতে পারে, যার অর্থ সেই বিন্দুতে যেকোন স্ট্রিং মেলে (এর মতো
"*")।

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

libproduction.a: $(filter_out test__*, $(wildcard*.o))

সব করা হবে .o যে ফাইলগুলি বিদ্যমান বা নির্মিত হতে পারে, সেইগুলি ছাড়া যা দিয়ে শুরু হয়৷ পরীক্ষা_,
মধ্যে libproduction.a.

findstring অনুসন্ধান, in
প্রত্যাবর্তন আবিষ্কার, যদি এটি একটি সাবস্ট্রিং হয় in.

প্রথম শব্দ শব্দ
প্রথম শব্দটি ফেরত দাও।

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

শব্দগুলি $_-এ আছে এবং আপনি $_ undef না করলে ফেরত দেওয়া হবে। এই জন্য উদ্দেশ্যে করা হয়
পরিবর্তনগুলি "patsubst" দ্বারা সহজে পরিচালিত হয় না। শুধুমাত্র প্রথম কমা একটি বিভাজক,
অন্য কোন অংশ হিসাবে বিবেচিত হয় পার্লকোড.

# শব্দ পরিবর্তন করুন। ডবল প্যারেন, পারলকোডে প্যারেন্সের অনুমতি দিতে, অথবা ${} ব্যবহার করুন:
X = $((মানচিত্র $(VALUES), s/(.+)-(.+)/$2-$1/))
# আপনি মেক এক্সপ্রেশন ব্যবহার করতে পারেন, তবে আপনাকে অবশ্যই পার্ল $ এর জন্য $$ ব্যবহার করতে হবে:
Y = $(মেকম্যাপ $(VALUES), tr/$(OLDCHARS)/$(NEWCHARS)/ অথবা $$_ = 'ব্যর্থ')
# আপনি প্রার্থীদের বাদ দিতে পারেন:
Y = $(মানচিত্র $(VALUES), undef $_ if /no_good/)

যোগদানের শব্দ1, শব্দ2
প্রথম শব্দ এবং দ্বিতীয় শব্দের জোড়ায় জোড়ায় যোগ করুন।

patsubst প্যাটার্ন, বিকল্প, শব্দ
শব্দ তালিকার প্রতিটি শব্দে একটি প্রতিস্থাপন করে। একটি "%" অক্ষর যেকোনোটির সাথে মেলে
স্ট্রিং এটি একটি উদাহরণ দ্বারা সেরা চিত্রিত করা হয়:

OBJS = $(patsubst %.c, object_dir/%.o, $(C_SOURCES))

C_SOURCES-এ প্রতিটি ফাইল নেয় এবং object_dir-এ একটি অবজেক্ট ফাইলের নাম ফেরত দেয়।
কখনও কখনও এটি একটি প্রতিস্থাপন রেফারেন্স ব্যবহার করা আরো সংক্ষিপ্ত, যেমন, উপরের পারে
হিসাবে লেখা হয়েছে

OBJS = $(C_SOURCES:%.c=object_dir/%.o)

সাজান শব্দ1 শব্দ2 শব্দ3 ...
শব্দগুলিকে আভিধানিক ক্রমে সাজায় এবং সদৃশগুলি সরিয়ে দেয়।

ফালা স্ট্রিং
স্ট্রিং থেকে লিডিং এবং ট্রেইলিং হোয়াইটস্পেস সরিয়ে দেয় এবং প্রতিটি অভ্যন্তরীণ প্রতিস্থাপন করে
একটি একক স্থান সহ এক বা একাধিক হোয়াইটস্পেস অক্ষরের ক্রম। সুতরাং, "$(স্ট্রিপ ab
গ)" এর ফলাফল "abc"।

সাবস্ট থেকে, থেকে, পাঠ্য
টেক্সট টেক্সটে একটি টেক্সচুয়াল প্রতিস্থাপন সম্পাদন করে: from-এর প্রতিটি ঘটনা প্রতিস্থাপিত হয়
দ্বারা. ফলাফল ফাংশন কল জন্য প্রতিস্থাপিত হয়. উদাহরণ স্বরূপ,

$(subst ee,EE, রাস্তায় ফুট)

স্ট্রিংটি প্রতিস্থাপন করে "fEEt on the strEEt"।

শব্দ n, পাঠ্য
ফেরত দেয় nতম শব্দ পাঠ. এর বৈধ মান n শুরুতে 1 থেকে শুরু করুন
অথবা শেষে -1 থেকে পিছনের দিকে। যদি n এর মধ্যে শব্দের সংখ্যার চেয়ে বড় পাঠ, দ্য
মান খালি।

শব্দ তালিকা সূচক তালিকা, শব্দ
শব্দ তালিকা প্রথম সূচক, শেষ সূচক, শব্দ
প্রথম ফর্মে আপনি সূচকগুলির একটি তালিকা সরবরাহ করেন (শুরুতে 1 থেকে গণনা করা হয় বা
শেষে -1 থেকে পিছনে) আপনি চান শব্দ নির্বাচন করুন. দ্বিতীয় রূপে আপনি
আপনি যে শব্দগুলি ফেরত দিতে চান তার পরিসীমা নির্দিষ্ট করুন।

শব্দ পাঠ
এর মধ্যে শব্দের সংখ্যা প্রদান করে পাঠ.

বিবিধ কার্যাবলী
প্রতিটির জন্য var, তালিকা, পাঠ্য
প্রথম দুটি যুক্তি, Var এবং তালিকা, অন্য কিছু করার আগে প্রসারিত হয়; বিঃদ্রঃ
যে শেষ যুক্তি, পাঠ্য, একই সময়ে প্রসারিত হয় না। তারপর প্রতিটি শব্দের জন্য
তালিকার প্রসারিত মান, var এর প্রসারিত মান দ্বারা নামকরণ করা ভেরিয়েবল সেট করা হয়েছে
যে শব্দ, এবং পাঠ্য প্রসারিত হয়. সম্ভবত পাঠ্যটিতে সেই পরিবর্তনশীলটির উল্লেখ রয়েছে,
তাই এর সম্প্রসারণ প্রতিটি সময় ভিন্ন হবে।

এই সহজ উদাহরণটি পরিবর্তনশীল সেট করে নথি পত্র সমস্ত ফাইলের তালিকায়
তালিকায় ডিরেক্টরি dirs:

dirs:= abcd
ফাইল := $(foreach dir,$(dirs),$(wildcard $(dir)/*))

এখানে টেক্সট হল "$(wildcard $(dir)/*)"। প্রথম পুনরাবৃত্তি dir-এর জন্য "a" মান খুঁজে পায়,
তাই এটি "$(ওয়াইল্ডকার্ড a/*)" এর মতো একই ফলাফল তৈরি করে; দ্বিতীয় পুনরাবৃত্তি উত্পাদন
"$(ওয়াইল্ডকার্ড b/*)" এর ফলাফল; এবং তৃতীয়, "$(ওয়াইল্ডকার্ড c/*)" এর।

এই উদাহরণের একই ফলাফল রয়েছে ("dirs" সেট করা ছাড়া) নিম্নলিখিত উদাহরণ হিসাবে:

ফাইল := $(ওয়াইল্ডকার্ড a/* b/* c/* d/*)

যখন পাঠ্য জটিল হয়, তখন আপনি এটিকে একটি নাম দিয়ে পাঠযোগ্যতা উন্নত করতে পারেন
অতিরিক্ত পরিবর্তনশীল:

find_files = $(ওয়াইল্ডকার্ড $(dir)/*)
dirs:= abcd
ফাইল := $(foreach dir,$(dirs),$(find_files))

এখানে আমরা ভেরিয়েবল find_files এভাবে ব্যবহার করি। একটি সংজ্ঞায়িত করতে আমরা প্লেইন "=" ব্যবহার করি
পুনরাবৃত্ত-প্রসারণশীল ভেরিয়েবল, যাতে এর মানটিতে একটি প্রকৃত ফাংশন কল থাকে
foreach নিয়ন্ত্রণে পুনরায় প্রসারিত করা; একটি সহজ-প্রসারিত পরিবর্তনশীল কাজ করবে না,
যেহেতু find_files সংজ্ঞায়িত করার সময় ওয়াইল্ডকার্ড শুধুমাত্র একবার কল করা হবে।

দ্রষ্টব্য: এটিকে "$(foreach)" বিশেষ ভেরিয়েবলের সাথে বিভ্রান্ত করবেন না।

তথ্য পাঠ
সতর্কবার্তা পাঠ
ভুল পাঠ
আউটপুট টেক্সট কিছুই ফেরত. প্রথমটি STDOUT-এ যায়, দ্বিতীয়টি STDERR-এ,
তৃতীয়টি অতিরিক্ত প্রক্রিয়াকরণ বাতিল করে।

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

ফাইল_তালিকা :
# শেল কমান্ডগুলি প্রোগ্রামে রাখার জন্য ফাইলগুলির একটি তালিকা গণনা করে

my_program : $(&cat $(prebuild file_list))

আপনার যদি একাধিক নিয়মে তালিকার প্রয়োজন হয় তবে এটি ব্যবহার করা আরও কার্যকর হবে
সর্বাধিক একবার পরিবর্তনশীল প্রসারিত করুন:

ফাইল_তালিকা ;= $(&cat $(প্রি-বিল্ড ফাইল_লিস্ট))

my_program1 : ao $(file_list)

my_program2 : bo $(file_list)

পরিবর্তে যদি আপনি শুধুমাত্র "$(&cat file_list)" উল্লেখ করেন, তাহলে makepp জোর করবে না
ফাইল_লিস্ট শেল কমান্ড কার্যকর করার আগে আপ-টু-ডেট হতে হবে। "$(প্রি-বিল্ড)" ব্যবহার করা হচ্ছে
এই সমস্যা সমাধানের সেরা উপায়। আপনি অন্যান্য জিনিস চেষ্টা করতে প্রলুব্ধ হতে পারে, যেমন
এই:

my_program : file_list $(&cat file_list)

কিন্তু এটি কাজ করবে না কারণ "$(&cat file_list)" মেকপিপ চেষ্টা করার আগে মূল্যায়ন করা হয়
"ফাইল_লিস্ট" তৈরি করুন।

only_phony_targets নাম
তালিকায় শুধুমাত্র সেই নামগুলি ফেরত দেয় যেগুলি কিছু নিয়মের ভুয়া লক্ষ্য (হয়
স্পষ্ট বা প্যাটার্ন নিয়ম)। আপনি ওয়াইল্ডকার্ড নির্দিষ্ট করতে পারেন (মেকপিপের বিশেষ সহ
ওয়াইল্ডকার্ড, "**") ফাইলের নামগুলিতে। (আরো বিশদ বিবরণের জন্য "$(ওয়াইল্ডকার্ড)" ফাংশনটি দেখুন।
এটি লক্ষ্যবস্তু গ্রুপ করার জন্য ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ:

$(ফনি টেস্ট): $(only_phony_targets*/**/tests)

উত্স পরিবর্তনশীল
একটি ভেরিয়েবলের নাম দেওয়া, আপনাকে বলে যে এর মান কোথা থেকে এসেছে।

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

দ্রষ্টব্য, যে, সমস্ত ফাংশনের মতো, ব্যবহৃত ফাংশন ডিলিমিটারের মধ্যে উপস্থিত নাও হতে পারে
একক বা ডবল উদ্ধৃত স্ট্রিং এর বাইরে perlcode. কিন্তু আপনি এটি হিসাবে দ্বিগুণ করতে পারেন
শেষ উদাহরণ:

VAR = 1
VAR1 = ${perl ($VAR + 1) * 3}
VAR2 = $(perl do { $VAR *= 3; ফেরত $VAR + 1 } হলে $VAR)
VAR3 = $(makeperl $(VAR1) * 3 + $$VAR) # একটি Make var এবং একটি পার্ল var
VAR = $((পার্ল যদি(...) { ... }))

অপ্রকৃত শব্দ
ইঙ্গিত করে যে শব্দের তালিকা আসলে ভুয়া লক্ষ্য, এবং এর তালিকা প্রদান করে
লক্ষ্য এটি এই মত ব্যবহার করার উদ্দেশ্যে করা হয়েছে:

$(সমস্ত মিথ্যা): my_program

$(ফনি ক্লিন):
&rm -f *.o my_program

আপনি যেকোন জায়গায় এইরকম একটি লাইন দিয়ে এক বা একাধিক লক্ষ্যকে নকল হিসেবে ঘোষণা করতে পারেন
আপনার মেকফাইল:

ফোনি: সব পরিষ্কার

ছাপানো পাঠ
টেক্সট আউটপুট এবং এটি ফেরত. এটি বেশিরভাগ ডিবাগিংয়ের জন্য দরকারী, যখন আপনি না করেন
পরিবর্তনশীল প্রতিস্থাপনের ফলাফল কেন তা করে তা বুঝুন। উদাহরণ স্বরূপ,

XYZ := $(প্রিন্ট $(patsubst %.c, %o, $(SOURCE_FILES)))

"patsubst" কলের ফলাফল প্রিন্ট করবে।

XYZ := $(patsubst %.c, %o, $(প্রিন্ট $(SOURCE_FILES)))

"patsubst" কলে শেষ আর্গুমেন্ট প্রিন্ট করবে।

খোল শেল-কমান্ড
প্রদত্ত শেল কমান্ড থেকে আউটপুট ফেরত দেয়, নতুন লাইন স্পেস দ্বারা প্রতিস্থাপিত হয়।

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

তারিখ = $(শেল তারিখ) # আরও ভাল: $(পার্ল স্কেলার স্থানীয় সময়)
VAR = ${{শেল f() { ইকো হ্যালো; }; f}}

xargs কমান্ড, আর্গুমেন্ট[, প্রত্যয় [, দৈর্ঘ্য]]
কমান্ডের একটি নতুন লাইন-বিচ্ছিন্ন তালিকা প্রদান করে যা প্রতিটি নির্দিষ্ট দিয়ে শুরু হয়
কমান্ড, এবং যতটা সম্ভব তালিকার অনেক উপাদান দিয়ে শেষ না করে শেষ করুন
লম্বা (ডিফল্ট 1000) অক্ষর।

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

$(ফনি ক্লিন):
$(xargs $(RM), $(only_targets**/*))

এটির একটি পার্শ্ব-প্রতিক্রিয়াও রয়েছে যে তালিকা থাকলে কোন কমান্ড তৈরি হয় না
খালি হতে হবে কিন্তু এই ক্ষেত্রে বিল্টইন &rm ব্যবহার করা ভাল হবে,
কারণ বিল্টইন কমান্ডের আর্গুমেন্ট শুধুমাত্র পার্লের মেমরি দ্বারা সীমাবদ্ধ:

$(ফনি ক্লিন):
&rm -f $(only_targets**/*)

যদি একটি তৃতীয় যুক্তি নির্দিষ্ট করা হয়, তাহলে এটি প্রতিটি কমান্ড পোস্টফিক্স করতে ব্যবহৃত হয়। এই
পুনঃনির্দেশক নির্দিষ্ট করার জন্য দরকারী, যেমন (যদিও এখানে আবার &ইকো সাহায্য করবে):

প্রকাশ:
&rm -f $@
$@ স্পর্শ করুন
$(xargs echo, $(only_nontargets**/*), >> $@)

এই ডকুমেন্টেশনের কিছু GNU মেক ডকুমেন্টেশনের উপর ভিত্তি করে।

দয়া করে মনে রাখবেন যে মেকফাইল ইনিশিয়ালাইজেশনের সময় যদি একটি ফাংশন কল করা হয়, যেমন
এক্সপোর্ট ভেরিয়েবলের সম্প্রসারণ, ত্রুটি বা সতর্কতা বার্তা লাইন নম্বর 0 রিপোর্ট করবে।

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



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