| BMAKE(1) | General Commands Manual | BMAKE(1) |
نام (NAME)
bmake —
نگهداری
وابستگیهای
برنامه
خلاصه دستور (SYNOPSIS)
bmake
[-BeikNnqrSstWwX] [-C
directory] [-D
variable] [-d
flags] [-f
makefile] [-I
directory] [-J
private] [-j
max_jobs] [-m
directory] [-T
file] [-V
variable] [-v
variable]
[variable=value
...] [target
...]
توضیحات (DESCRIPTION)
bmake
برنامهای
است که برای
آسانسازی
نگهداری
برنامههای
دیگر طراحی
شده است.
ورودی آن
فهرستی از
مشخصات
فایلهایی
است که
برنامهها
و دیگر
پروندهها
به آنها
وابسته
هستند. اگر
گزینه -f
makefile مشخص
نشود، bmake
برای یافتن
مشخصات، به
دنبال makefileهای
فهرستشده
در .MAKE.MAKEFILE_PREFERENCE
(پیشفرض
‘makefile’,
‘Makefile’)
میگردد.
اگر پرونده
‘.depend’
وجود داشته
باشد،
خوانده
میشود؛
نگاه کنید
به mkdep(1).
این صفحه
راهنما
صرفاً به
عنوان یک
سند مرجع در
نظر گرفته
شده است.
برای شرح
جامعترِ
bmake و makefileها،
لطفاً رجوع
کنید به PMake -
A Tutorial (از سال
۱۹۹۳).
bmake پیش
از تجزیه
آرگومانهای
خط فرمان،
محتویات
متغیر
محیطی MAKEFLAGS
را به
ابتدای
آرگومانها
میافزاید.
گزینهها به شرح زیر هستند:
-B- تلاش برای حفظ سازگاری با گذشته از طریق اجرای یک پوسته منفرد برای هر دستور و ساخت متوالی منابع یک خط وابستگی.
-Cdirectory- تغییر به
directory پیش از
خواندن makefileها
یا انجام هر
کار دیگر.
اگر چندین
گزینه
-Cمشخص شده باشد، هر یک نسبت به گزینه پیشین تفسیر میشود:-C/-Cetc معادل است با-C/etc. -Dvariable- تعریف variable برابر با ۱، در حوزه سراسری.
-d[-]flags- فعالسازی
اشکالزدایی،
و تعیین
اینکه کدام
بخشهای
bmakeاطلاعات اشکالزدایی را چاپ کنند. مگر اینکه قبل از پرچمها یک ‘-’ قرار گیرد، آنها به متغیر محیطیMAKEFLAGSافزوده شده و به تمام فرایندهای فرزند make منتقل میشوند. بهطور پیشفرض، اطلاعات اشکالزدایی در خروجی خطای استاندارد چاپ میشود، اما این مقدار با استفاده از پرچم اشکالزداییFقابل تغییر است. خروجی اشکالزدایی همیشه بدون بافر است؛ علاوه بر این، اگر اشکالزدایی فعال باشد اما خروجی اشکالزدایی به خروجی استاندارد هدایت نشود، خروجی استاندارد به صورت خطبهخط بافر میشود. flags موجود عبارتند از:A- چاپ تمام اطلاعات اشکالزدایی ممکن؛ معادل مشخص کردن همه پرچمهای اشکالزدایی.
a- چاپ اطلاعات اشکالزدایی درباره جستجو و حافظه پنهان (caching) بایگانیها.
C- چاپ اطلاعات اشکالزدایی درباره دایرکتوری کاری جاری.
c- چاپ اطلاعات اشکالزدایی درباره ارزیابی شرطی.
d- چاپ اطلاعات اشکالزدایی درباره جستجو و حافظه پنهان دایرکتوریها.
e- چاپ اطلاعات اشکالزدایی درباره دستورها و هدفهای ناموفق.
F[+]filename- تعیین محل
نوشتن
خروجی
اشکالزدایی.
این باید
آخرین
پرچم
باشد،
زیرا
باقیمانده
آرگومان
را مصرف
میکند.
اگر نویسه
بلافاصله
پس از پرچم
Fبرابر با ‘+’ باشد، پرونده در حالت الحاق (append) باز میشود؛ در غیر این صورت پرونده رونویسی میشود. اگر نام پرونده ‘stdout’ یا ‘stderr’ باشد، خروجی اشکالزدایی به ترتیب در خروجی استاندارد یا خروجی خطای استاندارد نوشته میشود (و گزینه ‘+’ هیچ اثری ندارد). در غیر این صورت، خروجی در پرونده نامبرده نوشته میشود. اگر نام پرونده به ‘.%d’ ختم شود، ‘%d’ با pid جایگزین میشود. f- چاپ اطلاعات اشکالزدایی درباره ارزیابی حلقه.
g1- چاپ گراف ورودی پیش از ساخت هر چیزی.
g2- چاپ گراف ورودی پس از ساخت همه چیز، یا پیش از خروج هنگام بروز خطا.
g3- چاپ گراف ورودی پیش از خروج هنگام بروز خطا.
h- چاپ اطلاعات اشکالزدایی درباره عملیات جدول درهمسازی (hash table).
j- چاپ اطلاعات اشکالزدایی درباره اجرای چندین پوسته.
L- فعالسازی بررسیهای lint. این گزینه هنگام انتساب متغیر، در صورت وجود خطای تجزیه خطا صادر میکند تا نام پرونده و شماره خط در دسترس باشند.
l- چاپ
دستورها
در Makefile بدون
در نظر
گرفتن
اینکه آیا
با پیشوند
‘
@’ یا سایر پرچمهای “quiet” همراه هستند یا خیر. همچنین با عنوان رفتار “loud” شناخته میشود. M- چاپ اطلاعات اشکالزدایی درباره تصمیمهای حالت “meta” پیرامون هدفها.
m- چاپ اطلاعات اشکالزدایی درباره ساخت هدفها، شامل تاریخهای تغییر.
n- عدم حذف
اسکریپتهای
موقت
فرمان که
هنگام
اجرای
دستورها
ایجاد
شدهاند.
این
اسکریپتهای
موقت در
دایرکتوری
ارجاعشده
توسط
متغیر
محیطی
TMPDIRایجاد میشوند، یا در /tmp اگرTMPDIRتنظیم نشده باشد یا روی رشته خالی تنظیم شده باشد. اسکریپتهای موقت توسط mkstemp(3) ایجاد میشوند و نامهایی به فرم makeXXXXXX دارند. نکته: این کار میتواند پروندههای زیادی درTMPDIRیا /tmp ایجاد کند، بنابراین با احتیاط استفاده شود. p- چاپ اطلاعات اشکالزدایی درباره تجزیه makefile.
s- چاپ اطلاعات اشکالزدایی درباره قواعد تبدیل پسوند (suffix-transformation rules).
t- چاپ اطلاعات اشکالزدایی درباره نگهداری فهرست هدفها (target list).
V- اجبار
گزینه
-Vبه چاپ مقادیر خام متغیرها، که رفتار پیشفرض تنظیمشده از طریق .MAKE.EXPAND_VARIABLES را لغو میکند. v- چاپ اطلاعات اشکالزدایی درباره مقداردهی و بسط متغیرها.
x- اجرای
دستورهای
پوسته با
-xتا دستورهای واقعی هنگام اجرا چاپ شوند.
-e- اجازه میدهد متغیرهای محیطی، متغیرهای سراسری درون makefileها را بازنویسی کنند.
-fmakefile- مشخص کردن
یک makefile برای
خواندن به
جای یکی از
موارد
پیشفرض
فهرستشده
در .MAKE.MAKEFILE_PREFERENCE.
اگر makefile
برابر با
‘
-’ باشد، ورودی استاندارد خوانده میشود. اگر makefile با رشته ‘.../’ آغاز شود،bmakeمسیر مشخصشده در ادامه آرگومان را در پوشه جاری و پوشههای والد آن جستجو میکند. میتوان چندین makefile مشخص کرد که به همان ترتیب تعیینشده خوانده میشوند. -Idirectory- مشخص کردن
پوشهای
برای
جستجوی makefileها
و makefileهای
گنجاندهشده
(included). پوشه makefile
سیستم (یا
پوشهها،
گزینه
-mرا ببینید) به طور خودکار به عنوان بخشی از این فهرست گنجانده میشود. -i- نادیده
گرفتن خروج
غیرصفر
دستورهای
پوسته در makefile.
معادل با
مشخص کردن
‘
-’ پیش از هر خط دستور در makefile. -Jprivate- این گزینه
نباید
توسط کاربر
مشخص شود.
هنگامی که گزینه
-jدر یک ساخت بازگشتی (recursive build) استفاده میشود، این گزینه توسط make به makeهای فرزند ارسال میگردد تا تمام فرآیندهای make در فرایند ساخت بتوانند برای جلوگیری از تحمیل بار بیش از حد به سیستم همکاری کنند. -jmax_jobs- مشخص کردن
بیشینه
تعداد
کارهایی که
bmakeمیتواند در هر لحظه به صورت همزمان در حال اجرا داشته باشد. اگر max_jobs یک عدد ممیز شناور باشد، یا به ‘C’ ختم شود، آنگاه این مقدار در تعداد پردازندههایی که توسط sysconf(3) به عنوان آنلاین گزارش شدهاند ضرب میشود. مقدار max_jobs در .MAKE.JOBS ذخیره میشود. حالت سازگاری را غیرفعال میکند، مگر اینکه گزینه-Bنیز مشخص شده باشد. هنگامی که حالت سازگاری خاموش است، تمام دستورهای مربوط به یک هدف در یک فراخوانی منفرد پوسته اجرا میشوند، بر خلاف روش سنتی که یک پوسته برای هر خط فراخوانی میشد. این امر میتواند اسکریپتهای سنتی را که با هر فراخوانی دستور، پوشه را تغییر داده و سپس انتظار دارند در خط بعد با محیطی تازه شروع به کار کنند، با شکست مواجه کند. اصلاح اسکریپتها کارآمدتر از فعال کردن سازگاری رو به عقب است.یک مخزن نشانههای کار با max_jobs نشانه برای مهار تعداد کل کارهای در حال اجرا استفاده میشود. هر نمونه از
bmakeپیش از اجرای یک کار تازه، منتظر یک نشانه از مخزن خواهد ماند. -k- ادامه پردازش پس از مواجهه با خطاها، اما فقط بر روی آن هدفهایی که به هدفی که ساخت آن باعث خطا شده است وابسته نیستند.
-mdirectory- مشخص کردن
پوشهای
برای
جستجوی
sys.mk و makefileهای
گنجاندهشده
از طریق
عبارت include به
سبک
<file>-style. گزینه-mمیتواند چندین بار برای تشکیل مسیر جستجو استفاده شود. این مسیر، مسیر پیشفرض include سیستم /usr/share/mk را بازنویسی میکند. علاوه بر این، مسیر include سیستم به مسیر جستجوی مورد استفاده برای عبارتهای include به سبک"file"-style افزوده میشود (گزینه-Iرا ببینید). مسیر include سیستم را میتوان از طریق متغیر فقطخواندنی .SYSPATH ارجاع داد.اگر نام یک پوشه در آرگومان
-m(یا متغیر محیطیMAKESYSPATH) با رشته ‘.../’ آغاز شود،bmakeپرونده یا پوشه مشخصشده در بخش باقیمانده رشته آرگومان را جستجو میکند. جستجو از پوشه جاری آغاز شده و سپس به سمت ریشه سیستم فایل به بالا پیش میرود. اگر جستجو موفقیتآمیز باشد، پوشه حاصل جایگزین تعیین ‘.../’ در آرگومان-mمیشود. این ویژگی بهbmakeامکان میدهد تا به آسانی در درخت مبدأ جاری به دنبال پروندههای سفارشیشده sys.mk بگردد (برای نمونه با استفاده از ‘.../mk/sys.mk’ به عنوان یک آرگومان). -n- نمایش
دستورهایی
که اجرا
میشدند،
بدون اجرای
واقعی
آنها؛ مگر
اینکه هدف
به منبع
ویژه .MAKE
وابسته
باشد
(پایینتر
را ببینید)
یا پیشوند
دستور
‘
+’ باشد. -N- نمایش دستورهایی که اجرا میشدند، اما هیچکدام را واقعاً اجرا نمیکند؛ برای اشکالزدایی makefileهای سطح بالا بدون ورود به زیرپوشهها سودمند است.
-q- هیچ دستوری را اجرا نمیکند، در عوض اگر هدفهای مشخصشده بهروز باشند با وضعیت 0 و در غیر این صورت با 1 خارج میشود.
-r- از قواعد توکار مشخصشده در makefile سیستم استفاده نمیکند.
-S- در صورت
مواجهه با
خطا،
پردازش را
متوقف
میکند. این
رفتار
پیشفرض و
نقطه مقابل
-kاست. -s- هیچ دستوری
را هنگام
اجرا
بازتاب
نمیدهد.
معادل با
مشخص کردن
‘
@’ پیش از هر خط دستور در makefile. -Ttracefile- هنگام
استفاده با
پرچم
-j-،یک رکورد ردگیری به tracefile برای هر کار آغازشده و پایانیافته اضافه میکند. -t- به جای بازسازی یک هدف طبق makefile، آن را ایجاد کرده یا زمان ویرایش آن را بهروزرسانی میکند تا بهروز به نظر برسد.
-Vvariable- چاپ مقدار
variable. هیچ
هدفی ساخته
نمیشود.
میتوان
چندین
نمونه از
این گزینه
را مشخص
کرد؛
متغیرها در
هر خط یکی
چاپ
میشوند،
همراه با یک
خط خالی
برای هر
متغیر تهی
یا
تعریفنشده.
مقدار
چاپشده پس
از خوانده
شدن تمام
makefileها از حوزه
سراسری
استخراج
میشود.
بهطور پیشفرض، محتوای خام متغیر (که ممکن است شامل ارجاعهای متغیر بسطنیافته اضافی باشد) نمایش داده میشود. اگر variable شامل یک ‘
$’ باشد، نه به عنوان نام متغیر بلکه به عنوان یک عبارت تفسیر میشود. مقدار آن پیش از چاپ بسط داده میشود. همچنین اگر .MAKE.EXPAND_VARIABLES روی true تنظیم شده باشد و گزینه-dVبرای بازنویسی آن به کار نرفته باشد، مقدار پیش از چاپ بسط داده میشود.توجه داشته باشید که متغیرهای محلی حلقه و محلی هدف، و همچنین مقادیری که به صورت موقت توسط متغیرهای سراسری در طول پردازش makefile گرفته میشوند، از طریق این گزینه در دسترس نیستند. حالت اشکالزدایی
-dvمیتواند برای مشاهده این موارد به قیمت تولید خروجیهای اضافی قابل توجه استفاده شود. -vvariable- همانند
-V-،اما تمام متغیرهای چاپشده همواره به مقدار کامل خود بسط داده میشوند. آخرین رخداد-Vیا-vتعیین میکند که آیا همه متغیرها بسط داده شوند یا خیر. -W- برخورد با هرگونه هشدار در زمان تجزیه makefile بهعنوان خطا.
-w- چاپ پیامهای ورود به شاخه و خروج از آن، پیش و پس از پردازش.
-X- متغیرهای
منتقلشده
در خط فرمان
را بهصورت
جداگانه به
متغیرهای
محیطی صادر
(export) نکن.
متغیرهای
منتقلشده
در خط فرمان
همچنان از
طریق متغیر
محیطی
MAKEFLAGSصادر میشوند. این گزینه میتواند در سامانههایی که محدودیت کمی برای اندازه آرگومانهای فرمان دارند سودمند باشد. - variable
=value - تنظیم
مقدار
متغیر variable
بر روی value.
بهطور
معمول،
تمام
مقادیر
منتقلشده
در خط فرمان
به زیر-makeها
در محیط نیز
صادر
میشوند.
پرچم
-Xاین رفتار را غیرفعال میکند. انتسابهای متغیر برای سازگاری با POSIX باید پس از گزینهها بیایند، اما هیچ ترتیبی اجبار نمیشود.
چندین نوع خط گوناگون در یک makefile وجود دارد: مشخصات وابستگی، دستورهای شل، انتسابهای متغیر، عبارتهای شمول (include ،) رهنمودهای شرطی، حلقههای for، دیگر رهنمودها، و یادداشتها.
خطوط را
میتوان با
قرار دادن
یک ممیز
وارونه
(‘\’) در
پایان
آنها، از
یک خط به خط
بعدی
امتداد داد.
نویسه خط
جدید
پایانی و
فاصلههای
خالی
آغازین در
خط بعد در
قالب یک
فاصله تکی
فشرده
میشوند.
مشخصات وابستگی پرونده (FILE DEPENDENCY SPECIFICATIONS)
خطوط وابستگی شامل یک یا چند هدف، یک عملگر، و صفر یا چند منبع هستند. این ساختار رابطهای ایجاد میکند که در آن هدفها به منابع “وابسته هستند” و بهطور معمول از آنها ساخته میشوند. یک هدف در صورتی که وجود نداشته باشد، یا زمان ویرایش آن قدیمیتر از هر یک از منابعش باشد، کهنه در نظر گرفته میشود. یک هدف کهنه دوباره ساخته میشود، اما تنها پس از آنکه تمام منابع بررسی شده و خود در صورت نیاز دوباره ساخته شده باشند. سه عملگر را میتوان به کار برد:
:- بسیاری از
خطوط
وابستگی
میتوانند
این هدف را
نام ببرند
اما تنها
یکی
میتواند
دستورهای
شل
پیوستشده
داشته باشد.
تمام منابع
نامبرده
در همه خطوط
وابستگی
همراه با
یکدیگر در
نظر گرفته
میشوند، و
در صورت
نیاز
دستورهای
شل
پیوستشده
برای ایجاد
یا ساخت
دوباره هدف
اجرا
میشوند.
اگر اجرای
bmakeمتوقف شود، هدف حذف میگردد. !- مشابه حالت پیش، اما هدف همواره چه کهنه باشد چه نباشد، دوباره ساخته میشود.
::- هر خط
وابستگی
میتواند
دستورهای
شل
پیوستشده
داشته
باشد، اما
با هر کدام
بهطور
مستقل
رفتار
میشود:
منابع آن
بررسی شده و
اگر هدف
نسبت به
(تنها) آن
منابع کهنه
باشد،
دستورهای
شل
پیوستشده
اجرا
میشوند.
بدین
ترتیب،
بسته به
شرایط،
ممکن است
دستههای
گوناگونی
از
دستورهای
شل
پیوستشده
به اجرا
درآیند.
افزون بر
این،
برخلاف
: ،برای خطوط وابستگی بدون منبع، دستورهای شل پیوستشده همواره اجرا میشوند. همچنین برخلاف: ،اگر اجرایbmakeمتوقف شود، هدف حذف نمیگردد.
تمام خطوط وابستگی که به یک هدف معین اشاره دارند باید از همان عملگر استفاده کنند.
هدفها و
منابع
میتوانند
شامل
مقادیر
نویسه عام
شل ‘? ،’
‘* ،’
‘[] ،’ و
‘{}’
باشند.
مقادیر ‘?
،’ ‘* ،’
و ‘[]’
تنها
میتوانند
بهعنوان
بخشی از بخش
پایانی هدف
یا منبع
استفاده
شوند، و
تنها با
پروندههای
موجود
مطابقت
مییابند.
مقدار
‘{}’
لزوماً
نیازی نیست
برای توصیف
پروندههای
موجود به
کار رود. بسط
به ترتیب
شاخه انجام
میشود، نه
به ترتیب
الفبایی
آنگونه که
در شل صورت
میگیرد.
دستورهای شل (SHELL COMMANDS)
هر هدف
میتواند
یک یا چند خط
از
دستورهای
شل همراه
خود داشته
باشد، که
بهطور
معمول برای
ساخت هدف به
کار
میروند.
پیش از هر خط
در این
اسکریپت
باید یک
نویسه تب (tab)
قرار گیرد.
(به دلایل
تاریخی،
فاصله
پذیرفته
نیست.) در
حالی که
هدفها در
صورت تمایل
میتوانند
در چندین خط
وابستگی
حضور
یابند،
بهطور
پیشفرض
تنها یکی از
این قواعد
میتواند
دارای
اسکریپت
ساخت باشد.
اما اگر
عملگر
‘::’
استفاده
شود، تمام
قواعد
میتوانند
دارای
اسکریپت
باشند، و
اسکریپتهای
مربوطه به
ترتیبی که
یافت شوند
اجرا
میگردند.
با هر خط
بهعنوان
یک دستور شل
مستقل
رفتار
میشود،
مگر آنکه
انتهای خط
با یک ممیز
وارونه
‘\’
گریخته (escape)
شده باشد،
که در این
صورت آن خط و
خط پس از آن
یکی
میشوند.
اگر
نویسههای
نخستین
دستور هر
ترکیبی از
‘@ ،’
‘+ ،’ یا
‘-’
باشند، با
دستور
بهگونهای
ویژه رفتار
میشود.
@- باعث میشود دستور پیش از اجرا در خروجی بازتاب (echo) داده نشود.
+- باعث
میشود
دستور حتی
در صورت
تعیین
-nاجرا گردد. این ویژگی شبیه اثر منبع ویژه .MAKE است، با این تفاوت که اثر آن میتواند به یک خط منفرد از اسکریپت محدود شود. -- در حالت
سازگاری (compatibility
mode) باعث
نادیده
گرفته شدن
هرگونه
وضعیت خروج
غیرصفر خط
فرمان
میشود.
هنگامی که
bmakeدر حالت کارها (jobs mode) با-jmax_jobs اجرا میشود، کل اسکریپت برای هدف به یک نمونه منفرد از شل داده میشود. در حالت سازگاری (غیر از کارها)، هر دستور در یک فرایند جداگانه اجرا میگردد. اگر دستور حاوی هر یک از فرا-نویسههای (meta-characters) شل (‘#=|^(){};&<>*?[]:$`\\n’) باشد، به شل منتقل میشود؛ در غیر این صورتbmakeبرای اجرای مستقیم تلاش میکند. اگر خطی با ‘-’ آغاز شود و شل دارای ErrCtl فعال باشد، شکست خط فرمان همانند حالت سازگاری نادیده گرفته میشود. در غیر این صورت ‘-’ بر کل کار اثر میگذارد؛ اسکریپت در اولین خط فرمانی که شکست بخورد متوقف میشود، اما هدف شکستخورده تلقی نمیگردد.
makefileها باید
به گونهای
نوشته شوند
که حالت
اجرای bmake
رفتار
آنها را
دگرگون
نسازد. برای
نمونه، هر
دستوری که
بدون قصد
تغییر شاخه
برای
دستورهای
بعدی از “cd”
یا “chdir”
استفاده
میکند،
باید در
پرانتز
قرار داده
شود تا در یک
زیر-شل اجرا
گردد. برای
اجبار به
استفاده از
یک شل واحد،
شکستهای
خط را
بگریزید تا
کل اسکریپت
به یک دستور
تبدیل شود.
برای
نمونه:
avoid-chdir-side-effects:
@echo "Building $@ in $$(pwd)"
@(cd ${.CURDIR} && ${MAKE} $@)
@echo "Back in $$(pwd)"
ensure-one-shell-regardless-of-mode:
@echo "Building $@ in $$(pwd)"; \
(cd ${.CURDIR} && ${MAKE} $@); \
echo "Back in $$(pwd)"
از آنجا که
bmake پیش از
اجرای هر
هدفی شاخه
کاری جاری
را به
‘.OBJDIR’
تغییر
میدهد، هر
فرایند
فرزند با آن
بهعنوان
شاخه کاری
جاری خود
آغاز
میشود..Sh
"انتساب
متغیرها (VARIABLE
ASSIGNMENTS)" متغیرها
در make رفتاری
بسیار شبیه
به ماکروها
در
پیشپردازنده
C دارند.
انتسابهای متغیر دارای ساختار ‘NAME op value’ هستند، که در آن:
- NAME
- نام متغیر تککلمهای است، که بر اساس سنت، از حروف کاملاً بزرگ تشکیل شده است،
- op
- یکی از عملگرهای انتساب متغیر است که در ادامه تشریح شدهاند، و
- value
- بسته به عملگر انتساب متغیر تفسیر میشود.
فاصلههای خالی پیرامون NAME, op و value نادیده گرفته میشوند.
عملگرهای انتساب متغیر (Variable assignment operators)
پنج عملگری که مقادیر را به متغیرها اختصاص میدهند عبارتند از:
=- اختصاص مقدار به متغیر. هر مقدار قبلی بازنویسی میشود.
+=- افزودن مقدار به مقدار فعلی متغیر، با جدا کردن آنها با یک فاصله تکی.
?=- اختصاص مقدار به متغیر، چنانچه از پیش تعریف نشده باشد.
:=- گسترش
مقدار، سپس
اختصاص آن
به متغیر.
نکته: ارجاعات به متغیرهای تعریفنشده گسترش نمییابند. این امر میتواند هنگام استفاده از اصلاحکنندههای متغیر مشکلاتی ایجاد کند.
!=- گسترش مقدار و ارسال آن به پوسته جهت اجرا، سپس اختصاص خروجی استاندارد فرایند فرزند به متغیر. هر نویسه خط جدید در نتیجه با فاصله جایگزین میشود.
گسترش متغیرها (Expansion of variables)
در بیشتر
زمینههایی
که متغیرها
گسترش
مییابند،
‘$$’ به یک
علامت دلار
تکی گسترش
مییابد. در
سایر
زمینهها
(اکثر
اصلاحکنندههای
متغیر،
رشتههای
تحتاللفظی
در شرطها)،
‘\$’ به یک
علامت دلار
تکی گسترش
مییابد.
ارجاع به
متغیرها
دارای
ساختار
${name[:modifiers]}
یا
$(name[:modifiers])
است. اگر نام
متغیر تنها
از یک نویسه
تشکیل شده
باشد و
عبارت شامل
هیچ
اصلاحکنندهای
نباشد،
آکولادها
یا
پرانتزهای
احاطهکننده
الزامی
نیستند.
استفاده از
این شکل
کوتاهتر
توصیه
نمیشود.
اگر نام متغیر شامل یک علامت دلار باشد، ابتدا خود نام گسترش مییابد. این امر امکان استفاده از نامهای متغیر تقریباً دلخواه را فراهم میکند، با این حال بهتر است جداً از نامهای حاوی دلار، آکولاد، پرانتز یا فاصله خالی پرهیز شود.
اگر نتیجه
گسترش یک
عبارت
متغیر
تودرتو
شامل یک
علامت دلار
باشد
(‘$’),
نتیجه
مشمول
گسترش
بیشتر
خواهد بود.
جایگزینی متغیر در چهار زمان مجزا رخ میدهد، بسته به جایی که متغیر در آن استفاده میشود.
- متغیرها در خطوط وابستگی به هنگام خوانده شدن خط گسترش مییابند.
- متغیرها در عبارات شرطی به صورت مجزا گسترش مییابند، اما تنها تا حدی که برای تعیین نتیجه شرط لازم است.
- متغیرها در دستورات پوسته هنگام اجرای دستور پوسته گسترش مییابند.
- متغیرهای
شاخص حلقه
.forدر هر تکرار حلقه گسترش مییابند. توجه داشته باشید که سایر متغیرها هنگام تشکیل بدنه حلقه گسترش نمییابند، بنابراین در نمونه کد زیر:.for i in 1 2 3 a+= ${i} j= ${i} b+= ${j} .endfor all: @echo ${a} @echo ${b}چاپ میشود:
1 2 3 3 3 3
پس از اجرای حلقه:
- a
- شامل ‘
${:U1} ${:U2} ${:U3}’ است، که به ‘1 2 3’ گسترش مییابد. - j
- شامل
‘
${:U3}’ است، که به ‘3’ گسترش مییابد. - b
- شامل ‘
${j} ${j} ${j}’ است، که به ‘${:U3} ${:U3} ${:U3}’ و در ادامه به ‘3 3 3’ گسترش مییابد.
دستههای متغیر (Variable classes)
چهار دسته مختلف متغیرها (به ترتیب افزایش اولویت) عبارتند از:
- متغیرهای محیطی (Environment variables)
- متغیرهای
تعریفشده
به عنوان
بخشی از
محیط
bmake. - متغیرهای سراسری (Global variables)
- متغیرهای تعریفشده در makefile یا در makefileهای ضمیمهشده.
- متغیرهای خط فرمان (Command line variables)
- متغیرهای تعریفشده به عنوان بخشی از خط فرمان.
- متغیرهای محلی (Local variables)
- متغیرهایی که اختصاصاً برای یک هدف معین تعریف شدهاند.
متغیرهای
محلی را
میتوان
روی خط
وابستگی
مقداردهی
کرد، مگر
اینکه
.MAKE.TARGET_LOCAL_VARIABLES بر
روی ‘false’
تنظیم شده
باشد.
باقیمانده
خط (که
متغیرهای
سراسری آن
از پیش
گسترش
یافتهاند)
مقدار
متغیر
خواهد بود.
برای مثال:
COMPILER_WRAPPERS= ccache distcc icecc
${OBJS}: .MAKE.META.CMP_FILTER=${COMPILER_WRAPPERS:S,^,N,}
تنها
اهداف
‘${OBJS}’ تحت
تأثیر آن
فیلتر (در
حالت “meta”)
قرار
میگیرند و
صرفاً با
فعال یا
غیرفعال
کردن هر یک
از
غلافهای
کامپایلر (compiler
wrappers)، تمام آن
اهداف
نیازمند
بازسازی (out-of-date)
نمیشوند.
نکته: انتسابهای متغیر محلیِ هدف رفتار متفاوتی دارند بدین گونه که:
متغیرهای محلی توکار عبارتند از:
- .ALLSRC
- فهرست تمام منابع برای این هدف؛ همچنین معروف به ‘>’ یا ‘^’.
- .ARCHIVE
- نام فایل آرشیو؛ همچنین معروف به ‘!’.
- .IMPSRC
- در قواعد تبدیل پسوند، نام/مسیر منبعی که هدف باید از آن تبدیل شود (منبع “ضمنی )؛” همچنین معروف به ‘<’. این متغیر در قواعد صریح تعریف نشده است.
- .MEMBER
- نام عضو آرشیو؛ همچنین معروف به ‘%’.
- .OODATE
- فهرست منابعی برای این هدف که منسوخ (out-of-date) تشخیص داده شدهاند؛ همچنین معروف به ‘?’.
- .PREFIX
- نام هدف با
پسوند
حذفشده (در
صورتی که در
.SUFFIXESاعلام شده باشد)؛ همچنین با نام ‘*’ شناخته میشود. - .TARGET
- نام هدف؛ همچنین با نام ‘@’. برای سازگاری با دیگر نسخههای make، در قواعد اعضای بایگانی این متغیر نام مستعاری برای .ARCHIVE است.
شکلهای کوتاهتر (‘>’, ‘^’, ‘!’, ‘<’, ‘%’, ‘?’, ‘*’, و ‘@’) تنها به منظور سازگاری پسرو با makefileهای قدیمی و نسخه موروثی POSIX make مجاز شمرده شدهاند و توصیه نمیشوند.
گونههای
این
متغیرها که
در آنها
بلافاصله
پس از علامت
نقطهگذاری
نویسه
‘D’ یا
‘F’,
میآید،
مانند
‘$(@D)’,
شکلهای
موروثی و
معادل با
استفاده از
تغییردهندههای
‘:H’ و
‘:T’
هستند. این
شکلها
برای
سازگاری با
makefileهای AT&T System V
UNIX و POSIX
پذیرفته
میشوند
اما توصیه
نمیگردند.
چهار مورد از متغیرهای محلی را میتوان در منابع خطوط وابستگی به کار برد، زیرا به مقدار مناسب برای هر هدف موجود در آن خط بسط مییابند. این متغیرها عبارتند از: ‘.TARGET’, ‘.PREFIX’, ‘.ARCHIVE’, و ‘.MEMBER’.
متغیرهای توکار اضافی (Additional built-in variables)
علاوه بر
این، bmake
متغیرهای
زیر را
تنظیم
میکند یا
از آنها
آگاهی
دارد:
- .ALLTARGETS
- فهرست تمامی اهداف دیدهشده در makefileها. اگر در طول تجزیه makefile ارزیابی شود، تنها اهدافی را که تا آن لحظه دیده شدهاند فهرست میکند.
- .CURDIR
- مسیری به
پوشهای که
bmakeدر آن اجرا شده است. برای جزئیات بیشتر به شرح ‘PWD’ مراجعه کنید. - .ERROR_CMD
- در رسیدگی به خطا به کار میرود؛ ببینید: MAKE_PRINT_VAR_ON_ERROR.
- .ERROR_CWD
- در رسیدگی به خطا به کار میرود؛ ببینید: MAKE_PRINT_VAR_ON_ERROR.
- .ERROR_EXIT
- در رسیدگی به خطا به کار میرود؛ ببینید: MAKE_PRINT_VAR_ON_ERROR.
- .ERROR_META_FILE
- در رسیدگی به خطا در حالت “meta” به کار میرود؛ ببینید: MAKE_PRINT_VAR_ON_ERROR.
- .ERROR_TARGET
- در رسیدگی به خطا به کار میرود؛ ببینید: MAKE_PRINT_VAR_ON_ERROR.
- .INCLUDEDFROMDIR
- پوشه پروندهای که این makefile از آن فراخوانی (include) شده است.
- .INCLUDEDFROMFILE
- نام پروندهای که این makefile از آن فراخوانی (include) شده است.
- MACHINE
- نام سختافزار دستگاه؛ ببینید: uname(1).
- MACHINE_ARCH
- نام معماری پردازنده دستگاه؛ ببینید: uname(1).
- MAKE
- نامی که
bmakeبا آن اجرا شده است (argv[0]). - .MAKE
- برای
سازگاری،
همانند
MAKE است.
متغیر ارجح
برای
استفاده،
متغیر
محیطی
MAKEاست؛ زیرا با سایر نسخههای make سازگاری بیشتری دارد و با هدف ویژهای با همین نام اشتباه گرفته نمیشود. - .MAKE.DEPENDFILE
- نام makefile (به طور پیشفرض ‘.depend’) را مشخص میکند که وابستگیهای تولیدشده از آن خوانده میشوند.
- .MAKE.DIE_QUIETLY
- اگر روی
‘
true’ تنظیم شود، اطلاعات خطا را در پایان چاپ نمیکند. - .MAKE.EXPAND_VARIABLES
- یک مقدار
بولی که
رفتار
پیشفرض
گزینه
-Vرا مهار میکند. اگر true باشد، مقادیر متغیرها هنگام چاپ با-Vبه طور کامل بسط مییابند؛ اگر false باشد، محتوای خام متغیر (که ممکن است شامل ارجاعات اضافی به متغیرهای بسطنیافته باشد) نمایش داده میشود. - .MAKE.EXPORTED
- فهرست
متغیرهای
برونریزیشده
توسط
bmake. - MAKE_VERSION
- این متغیر
نسخه
bmakeرا نشان میدهد. معمولاً تاریخ آخرین درونریزی از NetBSD است. برای بررسی در دسترس بودن برخی ویژگیها سودمند است. - MAKEFILE
- سطحبالاترین makefile که هماکنون خوانده میشود، همانطور که در خط فرمان داده شده است.
- .MAKEFLAGS
- متغیر
محیطی
‘
MAKEFLAGS’ میتواند شامل هر آن چیزی باشد که ممکن است در خط فرمانbmakeتعیین شود. هر آنچه در خط فرمانbmakeمشخص گردد به متغیر .MAKEFLAGS افزوده میشود، که سپس به محیط اجرای تمامی برنامههایی که توسطbmakeاجرا میشوند اضافه خواهد شد. - .MAKE.GID
- شناسه عددی
گروه
کاربری که
bmakeرا اجرا میکند. این متغیر فقطخواندنی است. - .MAKE.JOB.PREFIX
- اگر
bmakeبا-jاجرا شود، خروجی هر هدف با نشانهپیشوند میگیرد که بخش نخست آن از طریق .MAKE.JOB.PREFIX قابل کنترل است. اگر .MAKE.JOB.PREFIX تهی باشد، هیچ نشانهای چاپ نمیشود. برای نمونه، با مقداردهی .MAKE.JOB.PREFIX به ‘--- target---${.newline}---${.MAKE:T}[${.MAKE.PID}]’ نشانههایی مانندتولید میشود که ردیابی میزان همزمانی بهدستآمده را آسانتر میسازد.---make[1234] target--- - .MAKE.JOBS
- آرگومان
ورودی
گزینه
-j. - .MAKE.JOBS.C
- یک مقدار
بولی
فقطخواندنی
که مشخص
میکند آیا
گزینه
-jاز کاربرد ‘C’ پشتیبانی میکند یا خیر. - .MAKE.LEVEL
- عمق
بازگشتی
bmake. نمونه سطحبالایbmakeدارای سطح 0 است، و هر make فرزند، سطح والد خود به علاوه ۱ را دریافت میکند. این امر بررسیهایی مانند:.if ${.MAKE.LEVEL} == 0را امکانپذیر میسازد تا از مواردی که تنها باید در نمونه سطحبالایbmakeارزیابی شوند محافظت گردد. - .MAKE.LEVEL.ENV
- نام متغیر
محیطی که
سطح
فراخوانیهای
تو در تو به
bmakeرا ذخیره میکند. - .MAKE.MAKEFILE_PREFERENCE
- فهرست
مرتبشدهای
از نامهای
makefile (پیشفرض
‘makefile’,
‘Makefile’) که
bmakeبه دنبال آنها میگردد. - .MAKE.MAKEFILES
- فهرست makefileهای
خواندهشده
توسط
bmakeکه برای ردیابی وابستگیها سودمند است. هر makefile بدون در نظر گرفتن تعداد دفعات خوانده شدن، تنها یک بار ثبت میشود. - .MAKE.META.BAILIWICK
- در حالت “meta”,
فهرستی از
پیشوندهایی
را فراهم
میکند که
با
پوشههای
تحت کنترل
bmakeهمخوانی دارند. اگر پروندهای که خارج از .OBJDIR اما درون حوزه یادشده ایجاد شده است موجود نباشد، هدف فعلی قدیمی تلقی میشود. - .MAKE.META.CMP_FILTER
- در حالت “meta”,
گاهی
پالایش
خطوط دستور
پیش از
مقایسه
میتواند
سودمند
باشد. این
متغیر
میتواند
شامل
فهرستی از
تغییردهندهها
باشد که با
‘
:’ به یکدیگر متصل شده و به هر خط از دستورهای کهنه و نو که دارای تفاوت هستند اعمال میشوند. چنانچه دستورهای پالایششده همچنان تفاوت داشته باشند، هدف قدیمی در نظر گرفته میشود. - .MAKE.META.FILTER
- در حالت “meta”, پالایش بخش عمده دادههای درون پرونده meta میتواند سودمند باشد. به عنوان نمونه، هنگامی که یک درخت ساخت از پیش آماده جابهجا یا همسانسازی میشود، بدون پالایهای برای جایگزینی مکان پیشین با مکان جدید، تمامی هدفها قدیمی در نظر گرفته خواهند شد. این متغیر مشابه .MAKE.META.CMP_FILTER است اما به دستورها، cwd و رکوردهای فراخوانی سیستمی (syscall) حاصل از filemon اعمال میشود. در مورد دستورها، این کار پیش از اعمال هرگونه تغییردهنده .MAKE.META.CMP_FILTER در طول مقایسه صورت میپذیرد.
- .MAKE.META.CREATED
- در حالت “meta”, این متغیر حاوی فهرستی از تمامی پروندههای meta بهروزرسانیشده است. در صورت خالی نبودن، میتواند برای تحریک پردازش .MAKE.META.FILES به کار رود.
- .MAKE.META.FILES
- در حالت “meta”, این متغیر حاوی فهرستی از تمامی پروندههای meta استفادهشده (بهروزرسانیشده یا نشده) است. این فهرست میتواند برای پردازش پروندههای meta جهت استخراج اطلاعات وابستگی مورد استفاده قرار گیرد.
- .MAKE.META.IGNORE_FILTER
- فهرستی از تغییردهندههای متغیر را برای اعمال بر هر نام مسیر فراهم میآورد. چنانچه حاصل گسترش یک رشته خالی باشد نادیده گرفته میشود.
- .MAKE.META.IGNORE_PATHS
- فهرستی از پیشوندهای مسیر را ارائه میدهد که باید نادیده گرفته شوند؛ زیرا انتظار میرود محتوای آنها در گذر زمان تغییر یابد. فهرست پیشفرض شامل این موارد است: ‘/dev /etc /proc /tmp /var/run /var/tmp’
- .MAKE.META.IGNORE_PATTERNS
- فهرستی از الگوها را برای تطبیق با نام مسیرها فراهم میسازد. هر موردی که مطابقت یابد نادیده گرفته میشود.
- .MAKE.META.PREFIX
- پیامی را
تعریف
میکند که
برای هر
پرونده meta
بهروزرسانیشده
در حالت “meta
verbose” چاپ
میشود.
مقدار
پیشفرض
عبارت است
از:
Building ${.TARGET:H:tA}/${.TARGET:T} - .MAKE.MODE
- پس از
خواندن
تمامی makefileها
پردازش
میشود. بر
حالتی که
bmakeدر آن اجرا میشود اثر میگذارد. میتواند شامل این کلیدواژهها باشد:compat- همانند
-B,bmakeرا در حالت “compat” قرار میدهد. metabmakeرا در حالت “meta” قرار میدهد، که در آن پروندههای meta برای هر هدف ایجاد میشوند تا دستورهای اجراشده، خروجی تولیدشده، و در صورت در دسترس بودن filemon(4), فراخوانیهای سیستمی مورد نظرbmakeرا ثبت کنند. خروجی ثبتشده میتواند هنگام ریشهیابی خطاها سودمند باشد.bmakeاز اطلاعات درون پرونده meta برای کمک به تعیین اینکه آیا یک هدف با وجود عدم اشاره قواعد معمول وابستگی به قدیمی بودن آن، قدیمی است یا خیر استفاده خواهد کرد.نخست، دستورهایی که باید اجرا شوند، با دستورهای پیشتر ثبتشده مقایسه خواهند شد؛ اگر تفاوتی داشته باشند، هدف قدیمی در نظر گرفته میشود.
این امر موجب بهبود چشمگیری در قابلیت اطمینان و کارایی ساختهای بهروزرسانی میشود. دیگر نیازی نیست هدفها صرفاً به این دلیل که شاید makefileها متغیری مرتبط را مقداردهی کرده باشند، به آنها وابسته شوند. سازوکارهایی همچون .MAKE.META.CMP_FILTER و
.NOMETA_CMP, امکان محدودسازی یا غیرفعال کردن این مقایسه را به ازای هر هدف فراهم میسازند. میتوان از ارجاع به متغیر .OODATE برای جلوگیری از مقایسه برخی دستورهای معین بهره جست. برای نمونه: ‘${.OODATE:M}’ به هیچ مقداری بسط نمییابد و هیچ اثری بر هدف ندارد، اما اثر جانبی آن، جلوگیری از مقایسه هر خط دستوری است که در آن ظاهر شده است. برای مقاصد مستندسازی، ‘${.OODATE:MNOMETA_CMP}’ سودمند است.در صورت نیاز،
bmakeسپس از اطلاعات ثبتشده توسط filemon(4) بهره میگیرد تا زمان آخرین ویرایش هر پرونده بهکاررفته در تولید هدف را بررسی کند؛ اگر هر کدام تازهتر باشد، هدف قدیمی تلقی میشود.چنین بررسی دقیقی میتواند به آسانی منجر به مواردی شود که در آن یک هدف همواره قدیمی در نظر گرفته شود، به همین دلیل است که .MAKE.META.IGNORE_FILTER, .MAKE.META.IGNORE_PATHS و .MAKE.META.IGNORE_PATTERNS, برای محدود ساختن این بازرسی در صورت لزوم ارائه شدهاند.
curdirOk=bf- به طور
پیشفرض،
bmakeپروندههای .meta را در ‘.CURDIR’ ایجاد نمیکند. این رفتار را میتوان با تنظیم bf روی مقداری که نشاندهنده درستی (true) است لغو کرد. missing-meta=bf- اگر bf درست (true) باشد، نبود پرونده .meta سبب میشود هدف قدیمی تلقی گردد.
missing-filemon=bf- اگر bf درست (true) باشد، نبود دادههای filemon سبب میشود هدف قدیمی تلقی گردد.
nofilemon- از filemon(4) استفاده نکن.
env- برای اشکالزدایی، گنجاندن محیط در پرونده .meta میتواند سودمند باشد.
verbose- در صورت قرار داشتن در حالت “meta”, راهنمایی درباره هدف در حال ساخت چاپ کن. این قابلیت در صورتی که فرایند ساخت در غیر این صورت به آرامی (بیصدا) اجرا شود سودمند است. پیام چاپشده، مقدار بسطیافته .MAKE.META.PREFIX است.
ignore-cmd- برخی makefileها
دارای
دستورهایی
هستند که
اساساً
ناپایدارند.
این
کلیدواژه
سبب
میشود
آنها در
تعیین
اینکه آیا
هدفی در
حالت “meta”
قدیمی است
یا خیر
نادیده
گرفته
شوند.
همچنین
ببینید:
.NOMETA_CMP. silent=bf- اگر bf
درست (true)
باشد،
هنگام
ایجاد یک
پرونده .meta،
هدف را به
عنوان
.SILENTعلامتگذاری کن..It Cm randomize-targets در هر دو حالت سازگاری (compat) و موازی، هدفها را با ترتیب معمول نمیسازد، بلکه ترتیب آنها را تصادفی میکند. این حالت میتواند برای شناسایی وابستگیهای اعلاننشده میان پروندهها به کار رود.
- MAKEOBJDIR
- برای ایجاد پروندهها در یک شاخه جداگانه به کار میرود؛ ببینید .OBJDIR.
- MAKE_OBJDIR_CHECK_WRITABLE
- هنگامی که true
باشد،
bmakeبررسی میکند که .OBJDIR قابلنوشتن باشد، و در غیر این صورت هشدار میدهد. - MAKE_DEBUG_OBJDIR_CHECK_WRITABLE
- هنگامی که true
باشد و
bmakeدرباره غیرقابلنوشتن بودن .OBJDIR, هشدار دهد، متغیرهای فهرستشده در MAKE_PRINT_VAR_ON_ERROR را برای کمک به اشکالزدایی گزارش میکند. - MAKEOBJDIRPREFIX
- برای ایجاد پروندهها در یک شاخه جداگانه به کار میرود؛ ببینید .OBJDIR. باید یک مسیر مطلق باشد.
- .MAKE.OS
- نام سیستمعامل؛ ببینید uname(1). فقطخواندنی است.
- .MAKEOVERRIDES
- این متغیر
برای ثبت
نام
متغیرهایی
که در خط
فرمان
مقداردهی
شدهاند به
کار
میرود، تا
بتوان
آنها را به
عنوان بخشی
از ‘
MAKEFLAGS’. صادر کرد. این رفتار را میتوان با انتساب مقداری خالی به ‘.MAKEOVERRIDES’ درون یک makefile غیرفعال کرد. متغیرهای اضافی را میتوان با افزودن نامهایشان به ‘.MAKEOVERRIDES’. از یک makefile صادر کرد. ‘MAKEFLAGS’ هر زمان که ‘.MAKEOVERRIDES’ تغییر یابد، دوباره صادر میشود. - .MAKE.PATH_FILEMON
- اگر
bmakeهمراه با پشتیبانی از filemon(4) ساخته شده باشد، این متغیر روی مسیر گره دستگاه تنظیم میشود. این به makefileها اجازه میدهد چنین پشتیبانی را بررسی کنند. - .MAKE.PID
- شناسه
فرایند (PID)
مربوط به
bmake. فقطخواندنی است. - .MAKE.PPID
- شناسه
فرایند
والد (PPID)
مربوط به
bmake. فقطخواندنی است. - MAKE_PRINT_VAR_ON_ERROR
- هنگامی که
bmakeبه دلیل بروز خطا متوقف میشود، ‘.ERROR_TARGET’ را روی نام هدفی که با شکست مواجه شده، ‘.ERROR_EXIT’ را روی وضعیت خروج هدف شکستخورده، ‘.ERROR_CMD’ را روی دستورهای هدف شکستخورده تنظیم میکند، و در حالت “meta” همچنین ‘.ERROR_CWD’ را روی getcwd(3), و ‘.ERROR_META_FILE’ را روی مسیر پرونده meta (در صورت وجود) توصیفکننده هدف شکستخورده تنظیم میکند. سپس نام خود و مقدار ‘.CURDIR’ و همچنین مقدار هر متغیری را چاپ میکند که در ‘MAKE_PRINT_VAR_ON_ERROR’. نام برده شده است. - .MAKE.SAVE_DOLLARS
- اگر true باشد،
‘
$$’ هنگام انجام انتسابهای ‘:=’ حفظ میشوند. پیشگزیده به منظور سازگاری با گذشته false است. برای سازگاری با سایر نسخههای make روی true تنظیم کنید. اگر روی false تنظیم شود، ‘$$’ طبق قواعد ارزیابی عادی به ‘$’ تبدیل میشود. - .MAKE.TARGET_LOCAL_VARIABLES
- اگر روی
‘
false’, تنظیم شود، انتسابهای ظاهری متغیر در خطهای وابستگی به عنوان منبعهای عادی در نظر گرفته میشوند. - .MAKE.UID
- شناسه عددی
کاربری که
در حال
اجرای
bmake. است. فقطخواندنی است. - .newline
- به این
متغیر
صرفاً یک
نویسه خط
جدید به
عنوان
مقدار
اختصاص
یافته است.
فقطخواندنی
است. این
قابلیت به
بسطهایی
که از
اصلاحکننده
:@استفاده میکنند اجازه میدهد میان تکرارهای حلقه به جای فاصله، یک خط جدید قرار دهند. برای نمونه در صورت بروز خطا،bmakeنام متغیرها و مقادیر آنها را با این شیوه چاپ میکند:${MAKE_PRINT_VAR_ON_ERROR:@v@$v='${$v}'${.newline}@} - .OBJDIR
- مسیری به
شاخهای که
هدفها در
آن ساخته
میشوند.
مقدار آن با
تلاش برای
فراخوانی
chdir(2) به
شاخههای
زیر به
ترتیب و
استفاده از
نخستین
مورد منطبق
تعیین
میشود:
${MAKEOBJDIRPREFIX}${.CURDIR}(تنها در صورتی که ‘
MAKEOBJDIRPREFIX’ در محیط یا در خط فرمان تنظیم شده باشد.)${MAKEOBJDIR}(تنها در صورتی که ‘
MAKEOBJDIR’ در محیط یا در خط فرمان تنظیم شده باشد.)${.CURDIR}/obj.${MACHINE}${.CURDIR}/obj- /usr/obj/
${.CURDIR} ${.CURDIR}
بسط متغیر پیش از استفاده بر روی مقدار اعمال میشود، بنابراین عباراتی مانند
${.CURDIR:S,^/usr/src,/var/obj,}میتوانند به کار روند. این ویژگی بهویژه سودمند است همراه با ‘MAKEOBJDIR’.‘.OBJDIR’ میتواند درون makefile از طریق هدف ویژه ‘
.OBJDIR’. تغییر یابد. در تمام موارد،bmakeدر صورت وجود داشتن شاخه مشخصشده به آن تغییر مسیر میدهد، و پیش از اجرای هر هدفی، ‘.OBJDIR’ و ‘PWD’ را روی آن شاخه تنظیم میکند.به جز در مورد هدف صریح ‘
.OBJDIR’ ،bmakeبررسی میکند که شاخه مشخصشده قابلنوشتن باشد و در غیر این صورت آن را نادیده میگیرد. این بررسی را میتوان با تنظیم متغیر محیطی ‘MAKE_OBJDIR_CHECK_WRITABLE’ روی “no”. نادیده گرفت. - .PARSEDIR
- نام شاخه makefile کنونی در حال تجزیه.
- .PARSEFILE
- نام پایه makefile
کنونی در
حال تجزیه.
این متغیر و
‘.PARSEDIR’ هر
دو تنها در
هنگام
تجزیه makefileها
تنظیم
میشوند.
برای حفظ
مقادیر
کنونی
آنها،
آنها را با
استفاده از
انتساب
همراه با
بسط ‘
:=’. به یک متغیر نسبت دهید. - .PATH
- فهرست
شاخههای
جداشده با
فاصلهای
که
bmakeدر آنها به دنبال پروندهها میگردد. برای بهروزرسانی این فهرست جستجو، به جای تغییر مستقیم متغیر از هدف ویژه ‘.PATH’ استفاده کنید. - %POSIX
- در حالت POSIX
تنظیم
میشود؛ به
هدف ویژه
‘
.POSIX’ نگاه کنید. مسیر جایگزین برای شاخهٔ جاری.bmakeبهطور معمول ‘.CURDIR’ را روی مسیر متعارف ارائهشده توسط getcwd(3) تنظیم میکند. با این حال، اگر متغیر محیطی ‘PWD’ تنظیم شده باشد و مسیری به شاخهٔ جاری ارائه دهد،bmakeدر عوض ‘.CURDIR’ را روی مقدار ‘PWD’ تنظیم میکند. این رفتار در صورتی که ‘MAKEOBJDIRPREFIX’ تنظیم شده باشد یا ‘MAKEOBJDIR’ حاوی یک تبدیل متغیر باشد، غیرفعال میشود. ‘PWD’ برای همه برنامههایی کهbmakeاجرا میکند، روی مقدار ‘.OBJDIR’ تنظیم میشود. - .SHELL
- مسیر پوسته مورد استفاده برای اجرای اسکریپتهای هدف. این متغیر فقطخواندنی است.
- .SUFFIXES
- فهرست پسوندهای شناختهشده. این متغیر فقطخواندنی است.
- .SYSPATH
- فهرست
جداشده با
فاصلهای
از شاخهها
که
bmakeدر آنها به دنبال makefileها میگردد؛ که با نام مسیر دربرگیری سامانه (system include path) شناخته میشود. برای بهروزرسانی این فهرست جستجو، به جای ویرایش این متغیر که فقطخواندنی است، از هدف ویژهٔ ‘.SYSPATH’ استفاده کنید. - .TARGETS
- فهرست هدفهایی که در صورت وجود، به صراحت در خط فرمان مشخص شدهاند.
- VPATH
- فهرست
جداشده با
دونقطه (“:”)
از
شاخههایی
که
bmakeدر آنها به دنبال پروندهها میگردد. این متغیر تنها برای سازگاری با برنامههای make قدیمی پشتیبانی میشود؛ به جای آن از ‘.PATH’ استفاده کنید.
تغییردهندههای متغیر (Variable modifiers)
قالب کلی گسترش متغیر به صورت زیر است:
${variable[:modifier[:...]]}هر
تغییردهنده
با یک
دونقطه
آغاز
میشود.
برای گریز
از دونقطه،
پیش از آن یک
ممیز
وارونه (backslash)
‘\’
بگذارید.
فهرستی از تغییردهندههای غیرمستقیم را میتوان از طریق یک متغیر، به شرح زیر مشخص کرد:
modifier_variable=modifier[:...]${variable:${modifier_variable}[:...]}
در این
حالت،
نخستین
تغییردهنده
در modifier_variable با
دونقطه
آغاز
نمیشود،
زیرا آن
دونقطه از
قبل در
متغیر
ارجاعدهنده
آمده است.
اگر هر یک از
تغییردهندهها
در modifier_variable
حاوی نشان
دلار (‘$’)
باشد، این
نشانها
باید دو بار
تکرار شوند
تا از گسترش
زودهنگام
جلوگیری
شود.
برخی تغییردهندهها مقدار عبارت را به صورت یک رشته منفرد تفسیر میکنند، دیگران با مقدار عبارت مانند فهرستی از کلمات جداشده با نویسههای فاصلهساز برخورد میکنند. هنگام بخشبندی یک رشته به کلمات، فاصلهها را میتوان همانند پوسته با نقلقول دوگانه، نقلقول تکی و ممیز وارونه گریز داد. نقلقولها و ممیزهای وارونه در کلمات حفظ میشوند.
تغییردهندههای پشتیبانیشده عبارتند از:
:E- هر کلمه را با پسوند آن جایگزین میکند.
:H- هر کلمه را با نام شاخهٔ آن (dirname) جایگزین میکند.
:Mpattern- تنها
کلماتی را
انتخاب
میکند که
با pattern
مطابقت
دارند.
نویسههای
عامهکارت
استاندارد
پوسته
(‘
*’, ‘?’, و ‘[]’) میتوانند به کار روند. از ابروها میتوان برای فهرست کردن الگوهای جایگزین استفاده کرد. برای نمونه، ‘${.ALLSRC:M*{Makefile*,.mk}}’ میتواند برای مطابقت با هر ‘*Makefile*’ یا ‘*.mk’ در .ALLSRC به کار رود. نویسههای عامهکارت و ابروها را میتوان با یک ممیز وارونه (‘\’) گریز داد. به عنوان نتیجهای از نحوه بخشبندی مقادیر به کلمات، تطبیق، و سپس پیوستن آنها، سازهٔ ‘${VAR:M*}’ تمام فاصلههای سفید ابتدا و انتها را حذف کرده و فاصلهگذاری بین کلمات را به یک فاصله یکدست میکند. :Npattern- این برعکس
‘
:M’ است، و تمام کلماتی را انتخاب میکند که با pattern مطابقت ندارند. :O- کلمات را بر اساس الفبا مرتب میکند.
:On- کلمات را به
صورت عددی
مرتب
میکند.
عددی که به
دنبال آن
یکی از
‘
k’, ‘M’ یا ‘G’ آمده باشد، در ضریب مناسب ضرب میشود که برابر ۱۰۲۴ برای ‘k’, ۱۰۴۸۵۷۶ برای ‘M’, یا ۱۰۷۳۷۴۱۸۲۴ برای ‘G’ است. هر دو حروف بزرگ و کوچک پذیرفته میشوند. :Or- کلمات را با ترتیب الفبایی معکوس مرتب میکند.
:Orn- کلمات را با ترتیب عددی معکوس مرتب میکند.
:Ox- کلمات را بر
میزند
(درهم
میریزد).
هر بار که
به متغیر
تغییریافته
ارجاع
دهید،
نتایج
متفاوت
خواهد بود؛
برای
جلوگیری از
این رفتار،
از انتساب
همراه با
گسترش
‘
:=’ استفاده کنید. برای نمونه،ممکن است خروجی مشابه زیر تولید کند:LIST= uno due tre quattro RANDOM_LIST= ${LIST:Ox} STATIC_RANDOM_LIST:= ${LIST:Ox} all: @echo "${RANDOM_LIST}" @echo "${RANDOM_LIST}" @echo "${STATIC_RANDOM_LIST}" @echo "${STATIC_RANDOM_LIST}"quattro due tre uno tre due quattro uno due uno quattro tre due uno quattro tre
:Q- تمام فرانویستهای پوسته در مقدار را نقلقولگذاری میکند، تا بتوان آن را با امنیت به پوسته منتقل کرد.
:q- تمام
فرانویستهای
پوسته در
مقدار را
نقلقولگذاری
میکند، و
همچنین
نویسههای
‘$’ را دو
برابر
میکند تا
بتواند
بدون خطر در
فراخوانیهای
بازگشتی
bmakeمنتقل شود. این معادل است با ‘:S/\$/&&/g:Q’. :R- هر کلمه را با همهچیز به جز پسوند آن جایگزین میکند.
:range[=count]- مقدار، یک دنباله از اعداد صحیح است که نشاندهنده کلمات مقدار اصلی، یا مقدار ارائهشدهٔ count میباشد.
:gmtime[=timestamp]- مقدار به
عنوان یک
رشته قالب
برای
strftime(3)
تفسیر
میشود، با
استفاده از
gmtime(3) که
مهرزمانی
قالببندیشده
تولید
میکند.
نکته: قالب
‘
%s’ تنها باید با ‘:localtime’ استفاده شود. اگر مقدار timestamp ارائه نشود یا 0 باشد، زمان جاری استفاده میشود. :hash- یک هش ۳۲ بیتی از مقدار محاسبه کرده و آن را به صورت ۸ رقم هگزادسیمال کدبندی میکند.
:localtime[=timestamp]- مقدار به عنوان یک رشته قالب برای strftime(3), با استفاده از localtime(3), تفسیر شده و برچسب زمانی قالببندیشده را تولید میکند. اگر مقدار timestamp ارائه نشود یا ۰ باشد، از زمان جاری استفاده میشود.
:mtime[=timestamp]- فراخوانی
stat(2) با
هر کلمه به
عنوان نام
مسیر؛
استفاده از
‘
st_mtime’ به عنوان مقدار جدید. اگر stat(2) شکست بخورد؛ از timestamp یا زمان جاری استفاده میشود. اگر timestamp بر روی ‘error’ تنظیم شده باشد، آنگاه شکست stat(2) موجب بروز یک خطا خواهد شد. :tA- تلاش میکند تا با استفاده از realpath(3) مقدار را به یک مسیر مطلق تبدیل کند. اگر ناموفق باشد، مقدار بدون تغییر میماند.
:tl- مقدار را به حروف کوچک تبدیل میکند.
:tsc- هنگام پیوند دادن کلمات پس از اصلاحکنندهای که با مقدار به عنوان کلمات رفتار میکند، کلمات معمولاً با یک فاصله جدا میشوند. این اصلاحکننده جداکننده را به نویسه c تغییر میدهد. اگر c حذف شود، هیچ جداکنندهای به کار نمیرود. گریزههای رایج (از جمله کدهای عددی هشتهشتی) مطابق انتظار کار میکنند.
:tt- نخستین نویسه هر کلمه را به حروف بزرگ، و باقی را به حروف کوچک تبدیل میکند.
:tu- مقدار را به حروف بزرگ تبدیل میکند.
:tW- باعث
میشود
اصلاحکنندههای
بعدی با
مقدار به
عنوان یک
تککلمه
رفتار کنند
(که
احتمالاً
حاوی
نویسههای
فاصلهدار
درونمتنی
است).
همچنین
ببینید:
‘
:[*]’. :tw- باعث
میشود با
مقدار به
عنوان
فهرستی از
کلمات
رفتار شود.
همچنین
ببینید:
‘
:[@]’. :S/[^]old_string[$]/new_string/[1gW]- نخستین
رخداد old_string
را در هر
کلمه از
مقدار
تغییر داده
و آن را با
new_string
جایگزین
میکند.
اگر پیش از old_string یک علامت هشتک (caret) (‘
^’), بیاید، old_string در ابتدای هر کلمه مهار میشود. اگر پس از old_string یک علامت دلار (‘$’), بیاید، در انتهای هر کلمه مهار میشود. درون new_string, یک علامت امپرسند (‘&’) با old_string جایگزین میشود. هر دو old_string و new_string میتوانند حاوی عبارتهای تودرتو باشند.گزینههای بیشتر (Further options):
1- تنها کلمه دارای نخستین رخداد تحت تأثیر قرار میگیرد.
g- تمام رخدادها در هر کلمه تحت تأثیر جایگزین میشوند.
W- مقدار عبارت به عنوان یک تککلمه در نظر گرفته میشود.
هر نویسهای میتواند به عنوان جداکننده بخشهای رشته اصلاحکننده استفاده شود. نویسههای مهارکننده، امپرسند، دلار و جداکننده میتوانند با یک ممیز وارونه (‘
\’) گریز داده شوند. :C/pattern/replacement/[1gW]- نخستین
رخداد
عبارت منظم
گسترشیافته
pattern
(ببینید:
regex(3)) در
هر کلمه از
مقدار را
تغییر داده
و آن را با
یک replacement به
سبک ed(1)-style
جایگزین
میکند.
هر دو pattern و replacement میتوانند حاوی عبارتهای تودرتو باشند.
گزینههای بیشتر (Further options):
1- تنها کلمه دارای نخستین رخداد تحت تأثیر قرار میگیرد.
g- تمام رخدادها در هر کلمه تحت تأثیر جایگزین میشوند.
W- مقدار عبارت به عنوان یک تککلمه در نظر گرفته میشود.
هر نویسهای میتواند به عنوان جداکننده بخشهای رشته اصلاحکننده استفاده شود. نویسههای مهارکننده، امپرسند، دلار و جداکننده میتوانند با یک ممیز وارونه (‘
\’) گریز داده شوند. :T- هر کلمه را با آخرین مؤلفه مسیر آن (basename) جایگزین میکند.
:u- کلمات تکراری مجاور را حذف میکند (مانند uniq(1)).
:?true_string:false_string- اگر نام
متغیر (نه
مقدار آن)،
هنگام
تجزیه به
عنوان یک
عبارت شرطی
.if, به true ارزیابی شود، مقدار true_string را به عنوان مقدار خود بازمیگرداند؛ در غیر این صورت false_string را بازمیگرداند. از آنجا که نام متغیر به عنوان عبارت استفاده میشود، :? باید نخستین اصلاحکننده پس از نام خود متغیر—باشد؛ که البته معمولاً شامل بسطهای متغیر است. یک خطای متداول، تلاش برای استفاده از عباراتی ماننداست که در واقع defined(NUMBERS) را میآزماید. برای تعیین اینکه آیا کلمهای با “42” مطابقت دارد یا خیر، باید از چیزی مانند این استفاده کنید:${NUMBERS:M42:?match:no}.${"${NUMBERS:M42}" != "":?match:no} :old_string=new_string- این
جایگزینی
به سبک AT&T
System V UNIX است.
فقط
میتواند
آخرین
اصلاحکننده
تعیینشده
باشد، زیرا
یک ‘
:’ در هر یک از old_string یا new_string به عنوان یک نویسه معمولی در نظر گرفته میشود، نه پایان اصلاحکننده.اگر old_string شامل نویسه تطبیق الگوی ‘
%’ نباشد، و کلمه با old_string پایان یابد یا با آن برابر باشد، آن پسوند با new_string جایگزین میشود.در غیر این صورت، نخستین ‘
%’ در old_string با یک زیررشته احتمالاً خالی از نویسههای دلخواه مطابقت مییابد، و اگر کل الگو در کلمه یافت شود، بخش منطبق با new_string جایگزین میشود، و نخستین رخداد ‘%’ در new_string (در صورت وجود) با زیررشته منطبقشده توسط ‘%’ جایگزین میگردد.هر دو old_string و new_string میتوانند حاوی عبارتهای تودرتو باشند. برای جلوگیری از اینکه علامت دلار یک عبارت تودرتو را آغاز کند، آن را با یک ممیز وارونه گریز دهید.
:@varname@string@- این
سازوکار
بسط حلقه
برگرفته از
make در محیط
توسعه
اواساف (OSF
Development Environment یا ODE) است.
برخلاف
حلقههای
.forبسط در زمان ارجاع رخ میدهد. بهازای هر کلمه در مقدار، کلمه به متغیری با نام varname انتساب داده میشود و string ارزیابی میگردد. قاعده مرسوم در ODE این است که varname باید با یک نقطه آغاز شود و پایان یابد، برای نمونه:${LINKS:@.LINK.@${LN} ${TARGET} ${.LINK.}@}با این حال، یک متغیر تکحرفی اغلب خواناتر است:
${MAKE_PRINT_VAR_ON_ERROR:@v@$v='${$v}'${.newline}@} :_[=var]- مقدار فعلی
متغیر را در
‘
$_’ یا var نامگذاریشده برای ارجاع بعدی ذخیره میکند. نمونه کاربرد:در اینجا ‘M_cmpv.units = 1 1000 1000000 M_cmpv = S,., ,g:_:range:@i@+ $${_:[-$$i]} \ \* $${M_cmpv.units:[$$i]}@:S,^,expr 0 ,1:sh.if ${VERSION:${M_cmpv}} < ${3.1.12:L:${M_cmpv}}$_’ برای ذخیره نتیجه اصلاحکننده ‘:S’ بهکار میرود که بعداً با استفاده از مقادیر نمایه برگرفته از ‘:range’ به آن ارجاع داده میشود. :Unewval- اگر متغیر
تعریفنشده
باشد، newval
اختیاری (که
ممکن است
تهی باشد)
مقدار
خواهد بود.
اگر متغیر
تعریف شده
باشد،
مقدار
موجود
برگردانده
میشود. این
یکی دیگر از
قابلیتهای
ODE make است. برای
نمونه، جهت
تنظیم CFLAGS
بهازای هر
هدف سودمند
است:
اگر مقدار تنها در صورت تعریفنشده بودن متغیر نیاز باشد، از این عبارت استفاده کنید:
${_${.TARGET:T}_CFLAGS:U${DEF_CFLAGS}}${VAR:D:Unewval} :Dnewval- اگر متغیر تعریف شده باشد، newval (که ممکن است تهی باشد) مقدار خواهد بود.
:L- نام متغیر، همان مقدار است.
:P- مسیر گرهی که همنام متغیر است، مقدار خواهد بود. اگر چنین گرهی وجود نداشته باشد یا مسیر آن تهی باشد، از نام متغیر استفاده میشود. برای اینکه این اصلاحکننده کار کند، نام (گره) باید دستکم در سمت راست یک وابستگی ظاهر شده باشد.
:!cmd!- خروجی اجرای cmd مقدار خواهد بود.
:sh- مقدار به عنوان یک دستور اجرا میشود و خروجی آن به مقدار جدید تبدیل میگردد.
:sh1- مقدار تنها برای نخستین ارجاع به عنوان یک دستور اجرا میشود و خروجی آن برای ارجاعهای پسین ذخیره میگردد. این اصلاحکننده زمانی سودمند است که انتظار نمیرود نتیجه تغییر کند.
::=str- متغیر پس از
جایگزینی
با مقدار
str
مقداردهی
میشود. این
اصلاحکننده
و گونههای
دیگر آن در
شرایط خاص و
نادر
سودمند
هستند،
مانند
زمانی که
قصد دارید
متغیری را
در نقطهای
که
دستورهای
پوسته یک
هدف در حال
تجزیه
هستند
مقداردهی
کنید. این
اصلاحکنندههای
انتساب
همیشه به
هیچ بسط
مییابند.
عبارت ‘
::’ به جلوگیری از تطابق اشتباه با اصلاحکننده سبک AT&T System V UNIX ‘:=’ کمک میکند و از آنجا که جایگزینی همواره انجام میشود، ساختار ‘::=’ تا حدی مناسب است. ::?=str- مانند
::=عمل میکند، اما تنها در صورتی که متغیر از پیش مقداری نداشته باشد. ::+=str- رشته str را به انتهای متغیر میافزاید.
::!=cmd- خروجی cmd را به متغیر انتساب میدهد.
:[range]- یک یا چند
کلمه را از
مقدار
برمیگزیند،
یا عملیات
دیگری
مرتبط با
نحوه تقسیم
مقدار به
کلمات
انجام
میدهد.
یک مقدار تهی، یا مقداری که به تمامی از فاصلههای سفید تشکیل شده باشد، به عنوان یک کلمه واحد در نظر گرفته میشود. برای اهداف اصلاحکننده ‘
:[]’ کلمات هم رو به جلو با اعداد صحیح مثبت نمایهگذاری میشوند (که در آن نمایه ۱ نمایانگر کلمه نخست است)، و هم رو به عقب با اعداد صحیح منفی (که در آن نمایه -1 نمایانگر کلمه پایانی است).مقدار range دستخوش بسط متغیر قرار میگیرد و نتیجه بسطیافته سپس به شرح زیر تفسیر میشود:
- index
- یک کلمه واحد را از مقدار برمیگزیند.
- start
..end - همه کلمات
را از start
تا end به
صورت
فراگیر
برمیگزیند.
برای
نمونه،
‘
:[2..-1]’ همه کلمات را از کلمه دوم تا کلمه پایانی برمیگزیند. اگر start بزرگتر از end باشد، کلمات به ترتیب معکوس خروجی داده میشوند. برای نمونه، ‘:[-1..1]’ همه کلمات را از آخر به اول برمیگزیند. اگر فهرست از پیش مرتب باشد، این کار عملاً فهرست را معکوس میکند، اما استفاده از ‘:Or’ به جای ‘:O:[-1..1]’ کارآمدتر است. *- باعث
میشود
اصلاحکنندههای
بعدی
مقدار را
به عنوان
یک کلمه
منفرد
(احتمالاً
دارای
فاصلههای
خالی
میانی) در
نظر
بگیرند.
مشابه اثر
$*در پوسته Bourne است. - 0
- همان
معنای
‘
:[*]’ را دارد. @- باعث
میشود
اصلاحکنندههای
بعدی
مقدار را
به عنوان
دنبالهای
از کلمات
جداشده با
فاصلههای
سفید در
نظر
بگیرند.
مشابه اثر
$@در پوسته Bourne است. #- تعداد کلمات موجود در مقدار را برمیگرداند.
رهنمودها (DIRECTIVES)
bmake
رهنمودهایی
را برای
گنجاندن
makefileها،
عبارتهای
شرطی و
حلقههای for
ارائه
میدهد.
تمام این
رهنمودها
با خطی مشخص
میشوند که
با یک نویسه
نقطه تکی
(‘.’) آغاز
میشود، و
در پی آن
کلمه کلیدی
رهنمود
میآید،
مانند include
یا if.
شمول پرونده (File inclusion)
پروندهها
با .include
<file>
یا .include
"file"
گنجانده
میشوند.
متغیرهای
میان
قلابهای
زاویهدار
یا
علامتهای
نقلقول
دوتایی بسط
داده
میشوند تا
نام پرونده
را تشکیل
دهند. اگر
قلابهای
زاویهدار
به کار
روند،
انتظار
میرود makefile
گنجاندهشده
در شاخه makefile
سامانه
باشد. اگر
علامتهای
نقلقول
دوتایی به
کار روند،
شاخه makefile
شاملکننده
و هر
شاخهای که
با استفاده
از گزینه
-I مشخص
شده باشد،
پیش از شاخه
makefile سامانه
جستجو
میشوند.
برای
سازگاری با
دیگر
گونههای
make، ‘include
file ...’
(بدون نقطه
آغازین) نیز
پذیرفته
میشود.
اگر عبارت
include بهصورت
.-include یا
بهصورت
.sinclude نوشته
شود،
خطاهای
یافتن و/یا
باز کردن
پروندههای
شمول
نادیده
گرفته
میشوند.
اگر عبارت
include بهصورت
.dinclude نوشته
شود،
نهتنها
خطاهای
یافتن و/یا
باز کردن
پروندههای
شمول
نادیده
گرفته
میشوند،
بلکه
وابستگیهای
کهنه درون
پرونده
گنجاندهشده
نیز درست
مانند
.MAKE.DEPENDFILE
نادیده
گرفته
میشوند.
صدور متغیرها (Exporting variables)
رهنمودها برای صدور و لغو صدور متغیرها عبارتند از:
.exportvariable ...- متغیر
سراسری
مشخصشده
را صادر
میکند.
برای سازگاری با دیگر برنامههای make،
exportvariable=value (بدون نقطه آغازین) نیز پذیرفته میشود.افزودن نام یک متغیر به .MAKE.EXPORTED معادل صدور یک متغیر است.
.export-all- تمام
متغیرهای
سراسری به
جز
متغیرهای
داخلی
(آنهایی که
با ‘
.’ آغاز میشوند) را صادر میکند. این مورد تحت تأثیر پرچم-Xقرار نمیگیرد، بنابراین باید با احتیاط استفاده شود. .export-envvariable ...- همانند
‘
.export ،’ است، به جز اینکه متغیر به .MAKE.EXPORTED افزوده نمیشود. این به کاربر امکان میدهد مقداری را به محیط صادر کند که با مقدار مورد استفاده داخلیbmakeمتفاوت است. .export-literalvariable ...- همانند
‘
.export-env ،’ است، به جز اینکه متغیرهای درون مقدار بسط داده نمیشوند. .unexportvariable ...- نقطه مقابل
‘
.export’. متغیر سراسری مشخصشده variable از .MAKE.EXPORTED حذف میشود. اگر هیچ فهرستی از متغیرها ارائه نشود، صدور تمام متغیرهای سراسری لغو شده، و .MAKE.EXPORTED حذف میشود. .unexport-env- تمام
متغیرهای
سراسری که
پیشتر
صادر
شدهاند را
لغو صدور
کرده و محیط
به ارث
رسیده از
والد را پاک
میکند. این
عملیات
باعث نشت
حافظه در
محیط اولیه
میشود،
بنابراین
باید
بهندرت
استفاده
شود. بررسی
اینکه .MAKE.LEVEL
برابر 0
باشد معقول
خواهد بود.
همچنین
توجه داشته
باشید که
هرگونه
متغیر
برگرفته از
محیط والد
در صورت
نیاز باید
بهصراحت
حفظ شود.
برای نمونه:
منجر به محیطی میشود که تنها شامل ‘
.if ${.MAKE.LEVEL} == 0PATH := ${PATH}.unexport-env.export PATH.endifPATH’ است، که کمینه محیط کارآمد به شمار میرود. در عمل ‘.MAKE.LEVEL’ نیز به محیط جدید فرستاده میشود.
پیامها (Messages)
رهنمودها برای چاپ پیامها در خروجی عبارتند از:
شرطیها (Conditionals)
رهنمودها برای شرطیها عبارتند از:
.if[!]expression [operator expression ...]- بررسی مقدار یک عبارت.
.ifdef[!]variable [operator variable ...]- بررسی اینکه آیا یک متغیر تعریف شده است یا خیر.
.ifndef[!]variable [operator variable ...]- بررسی اینکه آیا یک متغیر تعریف نشده است یا خیر.
.ifmake[!]target [operator target ...]- بررسی هدفی که درخواست شده است.
.ifnmake[!]target [operator target ...]- بررسی هدفی که درخواست نشده است.
.else- معکوس کردن وضعیت آخرین شرطی.
.elif[!]expression [operator expression ...]- ترکیبی از
‘
.else’ و در پی آن ‘.if’. .elifdef[!]variable [operator variable ...]- ترکیبی از
‘
.else’ و در پی آن ‘.ifdef’. .elifndef[!]variable [operator variable ...]- ترکیبی از
‘
.else’ و در پی آن ‘.ifndef’. .elifmake[!]target [operator target ...]- ترکیبی از
‘
.else’ و در پی آن ‘.ifmake’. .elifnmake[!]target [operator target ...]- ترکیبی از
‘
.else’ و در پی آن ‘.ifnmake’. .endif- پایان دادن به بدنه شرطی.
عملگر operator میتواند هر یک از موارد زیر باشد:
bmake یک
شرطی را
تنها تا
اندازهای
که برای
تعیین
مقدار آن
لازم است
ارزیابی
میکند.
پرانتزها
میتوانند
برای
نادیده
گرفتن تقدم
عملگرها به
کار روند.
عملگر بولی
‘!’
میتواند
برای نقیض
منطقی یک
عبارت،
بهطور
معمول یک
فراخوانی
تابع،
استفاده
شود. تقدم آن
بالاتر از
‘&&’
است.
مقدار expression میتواند هر یک از عبارتهای فراخوانی تابع زیر باشد:
defined(varname)- اگر متغیر varname تعریف شده باشد، برابر با true ارزیابی میشود.
make(target)- اگر هدف به
عنوان بخشی
از خط فرمان
bmakeمشخص شده باشد یا به عنوان هدف پیشفرض (خواه بهطور ضمنی یا صریح، ببینید .MAIN) پیش از خط شامل شرطی اعلان شده باشد، برابر با true ارزیابی میشود. empty(varname[:modifiers])- چنانچه گسترش متغیر، پس از اعمال اصلاحکنندهها، به رشتهای تهی بیانجامد، به درست ارزیابی میشود.
exists(pathname)- اگر مسیر دادهشده وجود داشته باشد، به درست ارزیابی میشود. چنانچه نسبی باشد، مسیر در مسیر جستجوی سامانه (رجوع کنید به .PATH) جستجو میشود.
target(target)- اگر هدف تعریف شده باشد، به درست ارزیابی میشود.
commands(target)- اگر هدف تعریف شده باشد و دستوراتی وابسته به آن وجود داشته باشند، به درست ارزیابی میشود.
Expression
همچنین
میتواند
یک مقایسه
حسابی یا
رشتهای
باشد. گسترش
متغیر بر
روی هر دو
سوی مقایسه
انجام
میگیرد.
اگر هر دو سو
عددی باشند
و هیچیک در
علامت
نقلقول
قرار
نگرفته
باشند،
مقایسه
بهصورت
عددی و در
غیر این
صورت
بهصورت
الفبایی
انجام
میشود. یک
رشته در
صورتی که
پیش از آن
0x آمده
باشد،
بهصورت
عدد صحیح در
مبنای
شانزده
تفسیر
میشود، در
غیر این
صورت
بهصورت یک
عدد اعشاری
ممیز شناور
دهدهی
تفسیر
خواهد شد؛
از عددهای
مبنای هشت
پشتیبانی
نمیشود.
تمامی
مقایسهها
میتوانند
از
عملگرهای
‘==’ و
‘!=’
استفاده
کنند.
مقایسههای
عددی
همچنین
میتوانند
از
عملگرهای
‘<’,
‘<=’,
‘>’ و
‘>=’
بهره
ببرند.
اگر مقایسه فاقد عملگر مقایسه یا سمت راست باشد، عبارت در صورتی که غیرتهی باشد و مقدار عددی آن (در صورت وجود) صفر نباشد، به درست ارزیابی میشود.
هنگامی که
bmake یکی از
این
عبارتهای
شرطی را
ارزیابی
میکند، و
با واژهای
(جداشده با
نویسه
فاصله)
روبرو
میشود که
آن را
بازنمیشناسد،
بسته به شکل
شرط، تابع
“make” یا “defined”
بر روی آن
اعمال
میشود. اگر
شکل شرط
بهصورت
‘.ifdef’,
‘.ifndef’ یا
‘.if’
باشد، تابع
“defined” اعمال
میگردد. به
همین
ترتیب، اگر
شکل شرط
بهصورت
‘.ifmake’ یا
‘.ifnmake’
باشد، تابع
“make” اعمال
میشود.
اگر عبارت
شرطی به
درست
ارزیابی
شود، تجزیه
makefile همچون
گذشته
ادامه
مییابد.
اگر به
نادرست
ارزیابی
شود، خطوط
بعدی تا
گونه
متناظر
‘.elif’,
‘.else’ یا
‘.endif’
نادیده
گرفته
میشوند.
حلقههای For (For loops)
حلقههای for معمولاً برای اعمال مجموعهای از قواعد بر روی فهرستی از پروندهها به کار میروند. نحو یک حلقه for به این صورت است:
عبارت expression گسترش یافته و سپس به واژهها شکسته میشود. در هر تکرار از حلقه، یک واژه برداشته شده و به هر variable, به ترتیب اختصاص داده میشود، و این variables درون make-lines در بدنه حلقه for جایگزین میشوند. شمار واژهها باید میزان و متناسب باشد؛ یعنی اگر سه متغیر تکرار وجود داشته باشد، تعداد واژههای ارائهشده باید مضربی از سه باشد.
اگر
‘.break’
درون یک
حلقه .for
دیده شود،
باعث پایان
زودهنگام
حلقه
میشود، در
غیر این
صورت یک
خطای تجزیه
است.
سایر دستورالعملها (Other directives)
.undefvariable ...- تعریف متغیرهای سراسری مشخصشده را لغو میکند. تنها متغیرهای سراسری را میتوان لغو تعریف کرد.
توضیحات (COMMENTS)
توضیحات
با نویسه هش
(‘#’) در
هر جایی
بهجز در
سطر فرمان
پوسته آغاز
میشوند، و
تا انتهای
یک سطر تازه
مهارنشده (unescaped)
ادامه
مییابند.
منابع ویژه (ویژگیها) (SPECIAL SOURCES (ATTRIBUTES))
.EXEC- هدف هرگز تاریخگذشته در نظر گرفته نمیشود، اما در هر حال فرمانها همواره اجرا میشوند.
.IGNORE- چشمپوشی
از هرگونه
خطا در
فرمانهای
مرتبط با
این هدف،
دقیقاً
همانند
آنکه پیش از
همه آنها
یک خط تیره
(‘
-’) آمده باشد. .MADE- هدف(ها) را بهروز علامتگذاری میکند.
.MAKE- اجرای
فرمانهای
مرتبط با
این هدف حتی
در صورتی که
گزینههای
-nیا-tتعیین شده باشند. معمولاً برای مشخص کردن فراخوانیهای بازگشتیbmakeبه کار میرود. .META- ایجاد یک
پرونده
فراداده (meta file)
برای هدف،
حتی اگر با
.PHONY,.MAKE, یا.SPECIALنشانهگذاری شده باشد. کاربرد در کنار.MAKEمحتملترین حالت است. در حالت “meta” اگر پرونده فراداده وجود نداشته باشد، هدف تاریخگذشته تلقی میشود. .NOMETA- برای هدف
پرونده
فراداده
ایجاد نکن.
پروندههای
فراداده
همچنین
برای
هدفهای
.PHONY,.MAKE, یا.SPECIALایجاد نمیشوند. .NOMETA_CMP- چشمپوشی
از
تفاوتهای
موجود در
فرمانها
هنگام
تصمیمگیری
درباره
تاریخگذشته
بودن هدف.
این ویژگی
زمانی
سودمند است
که فرمان
حاوی
مقداری
باشد که
همواره
تغییر
میکند. با
این حال اگر
شمار
فرمانها
تغییر کند،
هدف همچنان
تاریخگذشته
در نظر
گرفته
میشود.
همین اثر
برای هر خط
فرمانی که
از متغیر
.OODATE
استفاده
کند نیز
اعمال
میشود، که
میتوان
برای همین
منظور از آن
استفاده
کرد حتی اگر
در غیر این
صورت نیازی
به آن نباشد
یا مطلوب
نباشد:
الگوی
skip-compare-for-some: @echo this is compared @echo this is not ${.OODATE:M.NOMETA_CMP} @echo this is also compared:Mاز هرگونه بسط متغیر ناخواسته جلوگیری میکند. .NOPATH- در شاخههای مشخصشده توسط .PATH به دنبال هدف نگرد.
.NOTMAIN- در حالت
معمول
bmakeنخستین هدفی را که با آن مواجه شود، در صورت تعیین نشدن هدف، به عنوان هدف پیشفرض برای ساخت انتخاب میکند. این منبع از انتخاب شدن این هدف جلوگیری میکند. .OPTIONAL- اگر هدفی با
این ویژگی
نشانهگذاری
شده باشد و
bmakeنتواند چگونگی ایجاد آن را دریابد، این موضوع را نادیده میگیرد و فرض میکند پرونده نیازی نبوده یا از پیش وجود دارد. .PHONY- هدف با
پرونده
واقعی
تطابق
ندارد؛
همواره
تاریخگذشته
در نظر
گرفته
میشود، و
با گزینه
-tایجاد نمیشود. قواعد تبدیل پسوند بر روی هدفهای.PHONYاعمال نمیشوند. .PRECIOUS- هنگامی که
اجرای
bmakeقطع میشود، معمولاً هر هدفی را که به صورت نیمهکاره ساخته شده حذف میکند. این منبع از حذف شدن هدف جلوگیری میکند. .RECURSIVE- مترادفی
برای
.MAKE. .SILENT- هیچیک از
فرمانهای
مرتبط با
این هدف را
در خروجی
نمایش نده،
دقیقاً
همانند
آنکه پیش از
همه آنها
یک نشانه ات
(‘
@’) آمده باشد. .USE- هدف را به
نگارش
bmakeاز یک ماکرو تبدیل میکند. هنگامی که هدف به عنوان یک منبع برای هدفی دیگر به کار رود، آن هدف دیگر فرمانها، منابع و ویژگیهای منبع (بهجز.USE) را به خود اختصاص میدهد. اگر هدف از پیش دارای فرمانهایی باشد، فرمانهای هدف.USEبه انتهای آنها پیوست میشوند. .USEBEFORE- مانند
.USE, اما به جای پیوست به انتها، فرمانهای هدف.USEBEFOREرا به ابتدای هدف میافزاید. .WAIT- اگر
.WAITدر یک خط وابستگی پدیدار شود، منابع پیش از آن پیش از منابع پس از آن در همان خط ساخته میشوند. از آنجا که وابستههای پروندهها تا زمانی که خود پرونده امکان ساخت نداشته باشد ساخته نمیشوند، این امر همچنین از ساخت وابستهها جلوگیری میکند مگر اینکه برای شاخه دیگری از درخت وابستگی مورد نیاز باشند. بنابراین با در نظر گرفتن:خروجی همواره برابر است با ‘x: a .WAIT b echo x a: echo a b: b1 echo b b1: echo b1
a’, ‘b1’, ‘b’, ‘x’.ترتیب اعمالشده توسط
.WAITتنها برای ساختهای موازی (parallel makes) اهمیت دارد.
هدفهای ویژه (SPECIAL TARGETS)
هدفهای ویژه نمیتوانند همراه با دیگر هدفها آورده شوند، بدین معنا که باید تنها هدف مشخصشده باشند.
.BEGIN- هر سطر فرمانی که به این هدف پیوست شده باشد، پیش از انجام هر کار دیگری اجرا میشود.
.DEFAULT- این
بهنوعی یک
قاعده
.USEبرای هر هدفی است (که تنها بهعنوان یک منبع به کار رفته بود) کهbmakeروش دیگری برای ساخت آن نمییابد. تنها اسکریپت شل به کار گرفته میشود. متغیر .IMPSRC هدفی که دستورهای.DEFAULTرا به ارث میبرد، روی نام خود هدف تنظیم میشود. .DELETE_ON_ERROR- اگر این هدف در makefile وجود داشته باشد، به گونهای سراسری موجب میشود make هدفهایی را که دستورهایشان شکست میخورند، حذف کند. (بهطور پیشفرض، تنها هدفهایی که دستورهایشان هنگام اجرا دچار وقفه میشوند، حذف میگردند. این رفتار دیرینه است.) این تنظیم میتواند برای جلوگیری از بر جای ماندن هدفهای نیمهکاره یا ناقص و خراب شدن ساختهای مجدد در آینده به کار رود.
.END- هر سطر فرمانی که به این هدف پیوست شده باشد، پس از انجام موفقیتآمیز همه کارهای دیگر اجرا میشود.
.ERROR- هر سطر فرمانی که به این هدف پیوست شده باشد، هنگام شکست هدفی دیگر اجرا میشود. برای متغیرهایی که مقداردهی خواهند شد، MAKE_PRINT_VAR_ON_ERROR را ببینید.
.IGNORE- هر یک از
منابع را با
صفت
.IGNOREنشانهگذاری میکند. اگر منبعی مشخص نشده باشد، معادل مشخص کردن گزینه-iاست. .INTERRUPT- اگر اجرای
bmakeدچار وقفه شود، دستورهای این هدف اجرا میشوند. .MAIN- اگر هنگام
فراخوانی
bmakeهیچ هدفی مشخص نشده باشد، این هدف ساخته میشود. .MAKEFLAGS- این هدف
راهی برای
مشخص کردن
پرچمها
برای
bmakeدر زمان خوانده شدن makefileها فراهم میکند. پرچمها همانند آن هستند که در شل تایپ شده باشند، هرچند گزینه-fبیاثر است. .NOPATH- صفت
.NOPATHرا به هر یک از منابع مشخصشده اعمال میکند. .NOTPARALLEL- حالت موازی را غیرفعال میکند.
.NO_PARALLEL- مترادفی
برای
.NOTPARALLEL، جهت سازگاری با دیگر نگارشهای pmake. .NOREADONLY- صفت فقطخواندنی را از متغیرهای سراسری مشخصشده بهعنوان منبع پاک میکند.
.OBJDIR- منبع،
مقداری
تازه برای
‘.OBJDIR’ است.
در صورت
وجود،
bmakeدایرکتوری کاری جاری را به آن تغییر داده و مقدار ‘.OBJDIR’ را بهروزرسانی میکند. .ORDER- در حالت
موازی،
هدفهای
نامبرده
به ترتیب و
پیاپی
ساخته
میشوند.
این
ترتیبدهی،
هدفی را به
فهرست
هدفهای
آماده ساخت
نمیافزاید.
از آنجا که وابستههای یک هدف تا زمانی که خود هدف نتواند ساخته شود، ساخته نمیشوند، مگر آنکه ‘
a’ توسط بخش دیگری از گراف وابستگی ساخته شود، مورد زیر یک حلقه وابستگی خواهد بود:.ORDER: b a b: a
.PATH- منابع،
دایرکتوریهایی
هستند که
باید برای
یافتن
پروندههای
ناموجود در
دایرکتوری
جاری جستجو
شوند. اگر
منبعی مشخص
نشده باشد،
هر
دایرکتوری
مشخصشده
پیشین از
مسیر جستجو
حذف میشود.
اگر منبع،
هدف ویژه
.DOTLASTباشد، دایرکتوری کاری جاری در پایان جستجو میشود. .PATH.suffix- همانند
.PATHاما تنها بر پروندههایی با پسوند مشخص اعمال میشود. این پسوند باید پیشتر با.SUFFIXESتعریف شده باشد. .PHONY- صفت
.PHONYرا به هر یک از منابع مشخصشده اعمال میکند. .POSIX- اگر این سطر
نخستین سطر
غیرتوضیحی
در makefile اصلی
باشد،
متغیر %POSIX
بر روی
مقدار
‘
1003.2’ تنظیم میگردد و در صورت وجود پرونده makefile با نام ‘<posix.mk>،’ برای ارائه قواعد پیشفرض سازگار با POSIX شمول مییابد (include میشود). اگرbmakeبا پرچم-rاجرا شود، تنها ‘posix.mk’ در قواعد پیشفرض سهم خواهد داشت. در حالت سازگار با POSIX، اصلاحگر جایگزینی به سبک AT&T System V UNIX ابتدا بررسی میشود، نه بهعنوان گزینه پسنشست. .PRECIOUS- صفت
.PRECIOUSرا به هر یک از منابع مشخصشده اعمال میکند. اگر منبعی مشخص نشود، صفت.PRECIOUSبه همه هدفهای پرونده اعمال میگردد. .READONLY- صفت فقطخواندنی را روی متغیرهای سراسری مشخصشده بهعنوان منبع تنظیم میکند.
.SHELL- شلی را که
bmakeبرای اجرای دستورها به کار میبرد، تعیین میکند. منابع، مجموعهای از جفتهای field=value هستند.name- این
کمینهترین
مشخصه است
که برای
انتخاب
یکی از
مشخصههای
توکار شل؛
یعنی
sh،kshوcshبه کار میرود. path- مسیر مطلق به شل را مشخص میکند.
hasErrCtl- مشخص میکند که آیا شل از خروج در هنگام بروز خطا پشتیبانی میکند یا خیر.
check- دستور فعالسازی بررسی خطا.
ignore- دستور غیرفعالسازی بررسی خطا.
echo- دستور فعالسازی بازتاب (echo) دستورهای اجراشده.
quiet- دستور خاموش کردن بازتاب دستورهای اجراشده.
filter- خروجی که
باید پس از
صدور
دستور
quietفیلتر شود. این معمولاً همسان باquietاست. errFlag- پرچمی که برای فعالسازی بررسی خطا به شل داده میشود.
echoFlag- پرچمی که برای فعالسازی بازتاب دستورها به شل داده میشود.
newline- رشته متنی لفظی که به شل فرستاده میشود و در صورت استفاده خارج از نویسههای نقلقول، به یک نویسه خط جدید تکی میانجامد.
.SHELL: name=ksh path=/bin/ksh hasErrCtl=true \ check="set -e" ignore="set +e" \ echo="set -v" quiet="set +v" filter="set +v" \ echoFlag=v errFlag=e newline="'\n'"
.SILENT- صفت
.SILENTرا به هر یک از منابع مشخصشده اعمال میکند. اگر منبعی مشخص نشود، صفت.SILENTبه تمام دستورهای پرونده اعمال میگردد. .STALE- این هدف هنگامی اجرا میشود که یک پرونده وابستگی دارای مدخلهای کهنه باشد، در حالی که .ALLSRC روی نام آن پرونده وابستگی تنظیم شده است.
.SUFFIXES- هر منبع
پسوندی را
برای
bmakeمشخص میکند. اگر هیچ منبعی مشخص نشود، تمامی پسوندهای مشخصشده پیشین حذف میشوند. این ویژگی امکان ایجاد قواعد تبدیل پسوند را فراهم میآورد.نمونه:
.SUFFIXES: .c .o .c.o: cc -o ${.TARGET} -c ${.IMPSRC} .SYSPATH- منابع،
شاخههایی
هستند که
باید به
مسیر
گنجاندن
سیستمی
اضافه
شوند؛
مسیری که
bmakeدر آن به دنبال پروندههای ساخت (makefiles) میگردد. اگر هیچ منبعی مشخص نشود، هر شاخهای که پیشتر مشخص شده بود از مسیر گنجاندن سیستمی حذف میشود.
محیط (ENVIRONMENT)
bmake در
صورت وجود،
از
متغیرهای
محیطی زیر
استفاده
میکند:
MACHINE, MACHINE_ARCH,
MAKE, MAKEFLAGS,
MAKEOBJDIR,
MAKEOBJDIRPREFIX,
MAKESYSPATH,
MAKE_STACK_TRACE, PWD
و TMPDIR.
MAKEOBJDIRPREFIX و
MAKEOBJDIR باید
در محیط یا
در خط فرمان
برای bmake
تنظیم شوند
و نه به
عنوان
متغیرهای
makefile؛ برای
جزئیات
بیشتر به
شرح ‘.OBJDIR’
مراجعه
کنید. امکان
تنظیم این
موارد از
طریق
متغیرهای makefile
وجود دارد،
اما مگر
آنکه بسیار
زود انجام
شود و از هدف
‘.OBJDIR’
برای
بازنشانی
‘.OBJDIR’
استفاده
شود، ممکن
است
پیامدهای
جانبی
غیرمنتظرهای
داشته
باشد.
اگر متغیر
محیطی
MAKE_STACK_TRACE روی
“yes” تنظیم
شده باشد،
هرگونه
ردپای پشته
شامل
زنجیره
فراخوانی
فرایندهای
والد خواهد
بود.
پروندهها (FILES)
- .depend
- فهرست وابستگیها
- makefile
- نخستین پرونده ساخت پیشفرض در صورتی که هیچ makefile در خط فرمان مشخص نشده باشد
- Makefile
- دومین پرونده ساخت پیشفرض در صورتی که هیچ makefile در خط فرمان مشخص نشده باشد
- sys.mk
- پرونده ساخت سامانه
- /usr/share/mk
- شاخه پروندههای ساخت سامانه
پیامهای تشخیصی (DIAGNOSTICS)
Invalid internal option "-J" in "directory"- گزینه
داخلی
-Jفرایند اصلیbmakeرا با فرایندهای make فرعی (sub-make) هماهنگ میسازد تا شمار کارهایی را که به طور موازی اجرا میشوند، محدود کند. این گزینه از طریق متغیر محیطیMAKEFLAGSبه تمام فرایندهای فرزند منتقل میشود. برای معتبر شدن، این گزینه نیازمند آن است که هدفِ اجراکننده sub-make با منبع ویژه.MAKEنشانهگذاری شده باشد، یا اینکه یکی از دستورهای هدف مستقیماً شامل کلمه “make” یا یکی از عبارتهای “${MAKE}”, “${.MAKE}”, “$(MAKE)”, “$(.MAKE)” باشد. در غیر این صورت، make هشدار بالا را صادر کرده و به حالت سازگاری (compat mode) بازمیگردد.برای مشاهده زنجیره sub-makeهایی که به گزینه نامعتبر میانجامد، متغیر محیطی
MAKE_STACK_TRACEرا روی “yes” تنظیم کنید.برای اجرای sub-make در حالت موازی، حتی در حالت اجرای آزمایشی (dry-run) (به گزینه
-nمراجعه کنید)، شبهمنبع.MAKEرا به هدف اضافه کنید. این کار هنگامی مناسب است که sub-make همان هدف را در یک زیرشاخه اجرا کند.برای اجرای sub-make در حالت موازی اما نه در حالت dry-run، نشانگر “${:D make}” را به یکی از دستورهای هدف بیفزایید. این نشانگر به یک رشته تهی گسترش مییابد و بنابراین بر دستورهای اجراشده اثری نمیگذارد.
برای اجرای sub-make در حالت compat، گزینه
-Bرا به فراخوانی آن اضافه کنید. این کار هنگامی مناسب است که sub-make صرفاً برای چاپ مقدار یک متغیر با استفاده از گزینههای-vیا-Vبه کار رود.برای مستقل کردن sub-make از make والد، متغیر محیطی
MAKEFLAGSرا در دستورهای هدف لغو کنید (unset نمایید).
سازگاری (COMPATIBILITY)
نحو پایهای make میان گونههای گوناگون make سازگار است؛ با این حال متغیرهای ویژه، پیرایندههای متغیر و شرطیها سازگار نیستند.
نسخههای قدیمیتر (Older versions)
فهرستی
ناتمام از
دگرگونیها
در
نسخههای
پیشین bmake:
روش جایگزینی متغیرهای حلقه .for پس از NetBSD 5.0 دگرگون شد تا همچنان مانند گسترشهای متغیر به نظر برسند. بهویژه این امر از برخورد با آنها به عنوان نحو جلوگیری کرده و برخی دشواریهای مبهم در بهکارگیری آنها درون گزارههای .if را برطرف میکند.
روش زمانبندی makeهای موازی در NetBSD 4.0 دگرگون شد تا .ORDER و .WAIT بهگونه بازگشتی بر گرههای وابسته اعمال شوند. الگوریتمهای بهکاررفته شاید در آینده دوباره تغییر یابند.
دیگر گویشهای make (Other make dialects)
دیگر
گویشهای make
(مانند GNU make، SVR4 make،
POSIX make و غیره) از
بیشتر
ویژگیهای
bmake به
شرحی که در
این راهنما
آمده
پشتیبانی
نمیکنند.
بهویژه:
- اعلانهای
.WAITو.ORDERو بیشتر کارکردهای مربوط به موازیسازی. (ابزار GNU make از موازیسازی پشتیبانی میکند اما فاقد ویژگیهای موردنیاز برای مهار کارآمد آن است.) - دستورالعملها، دربرگیرنده حلقههای for، شرطیها و بیشتر حالتهای پروندههای گنجاندهشده (include). (ابزار GNU make نحو ناسازگار و کمتوانتری برای شرطیها دارد.)
- همه متغیرهای توکار که با نقطه آغاز میشوند.
- بیشتر
منابع و
هدفهای
ویژه که با
نقطه آغاز
میشوند،
با استثنای
چشمگیرِ
.PHONY,.PRECIOUS, و.SUFFIXES. - پیرایندههای
متغیر، به
جز
جایگزینی
رشتهایِ
‘
:old=new’ که بهگونهای حملپذیر از تطبیق الگو (globbing) با ‘%’ پشتیبانی نمیکند و از دید تاریخی تنها روی پسوندهای اعلانشده کار میکند. - متغیر
$>حتی در شکل کوتاهش؛ بیشتر makeها از این کارکرد پشتیبانی میکنند اما نام آن تفاوت دارد.
برخی
ویژگیها
تا
اندازهای
حملپذیرترند،
مانند
انتساب با
+=, ?=, و
!=. کارکرد
.PATH بر
پایه ویژگی
قدیمیترِ
VPATH موجود
در GNU make و
نسخههای
متعددی از SVR4 make
بنا شده
است؛ با این
حال، از دید
تاریخی
رفتار آن
بیش از
اندازه
مبهم (و
دارای
اشکال) است و
نمیتوان
به آن اتکا
کرد.
متغیرهای
$@ و $<
کموبیش در
همهجا
حملپذیرند،
همچنین است
متغیر $(MAKE).
بهکارگیری
پایهای
قواعد
پسوند (تنها
برای
پروندههای
شاخه
کنونی،
بدون تلاش
برای
زنجیرهای
کردن
تبدیلات، و
مانند آن)
نیز به
اندازه
معقولی
حملپذیر
است.
همچنین ببینید (SEE ALSO)
تاریخچه (HISTORY)
bmake از
make(1) در NetBSD
برگرفته
شده است. این
ابزار از autoconf
برای
آسانسازی
حملپذیری
به دیگر
سکوها بهره
میبرد.
دستور make در Version 7 AT&T UNIX پدیدار شد. این پیادهسازی make بر پایه برنامه pmake از Adam de Boor است، که برای Sprite در برکلی نوشته شده بود. این برنامه به عنوان یک make توزیعشده موازی برای اجرای وظایف روی ماشینهای گوناگون با بهکارگیری یک دیمن به نام “customs”. طراحی شده بود.
از دید
تاریخی،
هدف/وابستگی
FRC برای
وادار کردن
به بازسازی
(FoRCe rebuilding) به کار
میرفته
است (چرا که
این
هدف/وابستگی
وجود ندارد
... مگر آنکه
کسی
پروندهای
به نام FRC
بسازد).
اشکالات (BUGS)
نحو bmake
برای تجزیه
دشوار است.
برای
نمونه،
یافتن
پایان
کاربرد یک
متغیر باید
نیازمند
پیمایش
تکتک
پیرایندهها
با استفاده
از
پایاندهنده
درست برای
هر بخش باشد.
در بسیاری
از جاها
bmake تنها {} و
() را به
منظور
یافتن
پایان
گسترش
متغیر
شمارش
میکند.
هیچ راهی برای گریز دادن نویسه فاصله درون یک نام پرونده وجود ندارد.
در حالت
وظایف (jobs)،
هنگامی که
یک هدف شکست
بخورد؛
bmake یک
نشانه (توکن)
خطا در مخزن
نشانههای
وظیفه قرار
میدهد. این
امر موجب
میشود
تمام
نمونههای
دیگر bmake
که از آن
مخزن نشانه
استفاده
میکنند،
ساخت را
متوقف کرده
و با کد خطای
۶ خارج شوند.
گاهی تلاش
برای
جلوگیری از
آبشاری از
خطاهای
غیرضروری،
میتواند
به خطای به
ظاهر
نامشخصِ
‘*** Error code 6’
بینجامد.
| July 3, 2026 | Linux 6.12.107+deb13-amd64 |