BMAKE(1) General Commands Manual BMAKE(1)

bmake — نگهداری وابستگی‌های برنامه

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 ...]

bmake برنامه‌ای است که برای آسان‌سازی نگهداری برنامه‌های دیگر طراحی شده است. ورودی آن فهرستی از مشخصات فایل‌هایی است که برنامه‌ها و دیگر پرونده‌ها به آن‌ها وابسته هستند. اگر گزینه -f makefile مشخص نشود، bmake برای یافتن مشخصات، به دنبال makefileهای فهرست‌شده در .MAKE.MAKEFILE_PREFERENCE (پیش‌فرض ‘makefile’, ‘Makefile’) می‌گردد. اگر پرونده ‘.depend’ وجود داشته باشد، خوانده می‌شود؛ نگاه کنید به mkdep(1).

این صفحه راهنما صرفاً به عنوان یک سند مرجع در نظر گرفته شده است. برای شرح جامع‌ترِ bmake و makefileها، لطفاً رجوع کنید به PMake - A Tutorial (از سال ۱۹۹۳).

bmake پیش از تجزیه آرگومان‌های خط فرمان، محتویات متغیر محیطی MAKEFLAGS را به ابتدای آرگومان‌ها می‌افزاید.

گزینه‌ها به شرح زیر هستند:

تلاش برای حفظ سازگاری با گذشته از طریق اجرای یک پوسته منفرد برای هر دستور و ساخت متوالی منابع یک خط وابستگی.
directory
تغییر به directory پیش از خواندن makefileها یا انجام هر کار دیگر. اگر چندین گزینه -C مشخص شده باشد، هر یک نسبت به گزینه پیشین تفسیر می‌شود: -C / -C etc معادل است با -C /etc.
variable
تعریف variable برابر با ۱، در حوزه سراسری.
[-]flags
فعال‌سازی اشکال‌زدایی، و تعیین اینکه کدام بخش‌های bmake اطلاعات اشکال‌زدایی را چاپ کنند. مگر اینکه قبل از پرچم‌ها یک ‘-’ قرار گیرد، آن‌ها به متغیر محیطی MAKEFLAGS افزوده شده و به تمام فرایندهای فرزند make منتقل می‌شوند. به‌طور پیش‌فرض، اطلاعات اشکال‌زدایی در خروجی خطای استاندارد چاپ می‌شود، اما این مقدار با استفاده از پرچم اشکال‌زدایی F قابل تغییر است. خروجی اشکال‌زدایی همیشه بدون بافر است؛ علاوه بر این، اگر اشکال‌زدایی فعال باشد اما خروجی اشکال‌زدایی به خروجی استاندارد هدایت نشود، خروجی استاندارد به صورت خط‌به‌خط بافر می‌شود. flags موجود عبارتند از:
چاپ تمام اطلاعات اشکال‌زدایی ممکن؛ معادل مشخص کردن همه پرچم‌های اشکال‌زدایی.
چاپ اطلاعات اشکال‌زدایی درباره جستجو و حافظه پنهان (caching) بایگانی‌ها.
چاپ اطلاعات اشکال‌زدایی درباره دایرکتوری کاری جاری.
چاپ اطلاعات اشکال‌زدایی درباره ارزیابی شرطی.
چاپ اطلاعات اشکال‌زدایی درباره جستجو و حافظه پنهان دایرکتوری‌ها.
چاپ اطلاعات اشکال‌زدایی درباره دستورها و هدف‌های ناموفق.
[+]filename
تعیین محل نوشتن خروجی اشکال‌زدایی. این باید آخرین پرچم باشد، زیرا باقی‌مانده آرگومان را مصرف می‌کند. اگر نویسه بلافاصله پس از پرچم F برابر با ‘+’ باشد، پرونده در حالت الحاق (append) باز می‌شود؛ در غیر این صورت پرونده رونویسی می‌شود. اگر نام پرونده ‘stdout’ یا ‘stderr’ باشد، خروجی اشکال‌زدایی به ترتیب در خروجی استاندارد یا خروجی خطای استاندارد نوشته می‌شود (و گزینه ‘+’ هیچ اثری ندارد). در غیر این صورت، خروجی در پرونده نام‌برده نوشته می‌شود. اگر نام پرونده به ‘.%d’ ختم شود، ‘%d’ با pid جایگزین می‌شود.
چاپ اطلاعات اشکال‌زدایی درباره ارزیابی حلقه.
چاپ گراف ورودی پیش از ساخت هر چیزی.
چاپ گراف ورودی پس از ساخت همه چیز، یا پیش از خروج هنگام بروز خطا.
چاپ گراف ورودی پیش از خروج هنگام بروز خطا.
چاپ اطلاعات اشکال‌زدایی درباره عملیات جدول درهم‌سازی (hash table).
چاپ اطلاعات اشکال‌زدایی درباره اجرای چندین پوسته.
فعال‌سازی بررسی‌های lint. این گزینه هنگام انتساب متغیر، در صورت وجود خطای تجزیه خطا صادر می‌کند تا نام پرونده و شماره خط در دسترس باشند.
چاپ دستورها در Makefile بدون در نظر گرفتن اینکه آیا با پیشوند ‘@’ یا سایر پرچم‌های “quiet” همراه هستند یا خیر. همچنین با عنوان رفتار “loud” شناخته می‌شود.
چاپ اطلاعات اشکال‌زدایی درباره تصمیم‌های حالت “meta” پیرامون هدف‌ها.
چاپ اطلاعات اشکال‌زدایی درباره ساخت هدف‌ها، شامل تاریخ‌های تغییر.
عدم حذف اسکریپت‌های موقت فرمان که هنگام اجرای دستورها ایجاد شده‌اند. این اسکریپت‌های موقت در دایرکتوری ارجاع‌شده توسط متغیر محیطی TMPDIR ایجاد می‌شوند، یا در /tmp اگر TMPDIR تنظیم نشده باشد یا روی رشته خالی تنظیم شده باشد. اسکریپت‌های موقت توسط mkstemp(3) ایجاد می‌شوند و نام‌هایی به فرم makeXXXXXX دارند. نکته: این کار می‌تواند پرونده‌های زیادی در TMPDIR یا /tmp ایجاد کند، بنابراین با احتیاط استفاده شود.
چاپ اطلاعات اشکال‌زدایی درباره تجزیه makefile.
چاپ اطلاعات اشکال‌زدایی درباره قواعد تبدیل پسوند (suffix-transformation rules).
چاپ اطلاعات اشکال‌زدایی درباره نگهداری فهرست هدف‌ها (target list).
اجبار گزینه -V به چاپ مقادیر خام متغیرها، که رفتار پیش‌فرض تنظیم‌شده از طریق .MAKE.EXPAND_VARIABLES را لغو می‌کند.
چاپ اطلاعات اشکال‌زدایی درباره مقداردهی و بسط متغیرها.
اجرای دستورهای پوسته با -x تا دستورهای واقعی هنگام اجرا چاپ شوند.
اجازه می‌دهد متغیرهای محیطی، متغیرهای سراسری درون makefileها را بازنویسی کنند.
makefile
مشخص کردن یک makefile برای خواندن به جای یکی از موارد پیش‌فرض فهرست‌شده در .MAKE.MAKEFILE_PREFERENCE. اگر makefile برابر با ‘-’ باشد، ورودی استاندارد خوانده می‌شود. اگر makefile با رشته ‘.../’ آغاز شود، bmake مسیر مشخص‌شده در ادامه آرگومان را در پوشه جاری و پوشه‌های والد آن جستجو می‌کند. می‌توان چندین makefile مشخص کرد که به همان ترتیب تعیین‌شده خوانده می‌شوند.
directory
مشخص کردن پوشه‌ای برای جستجوی makefileها و makefileهای گنجانده‌شده (included). پوشه makefile سیستم (یا پوشه‌ها، گزینه -m را ببینید) به طور خودکار به عنوان بخشی از این فهرست گنجانده می‌شود.
نادیده گرفتن خروج غیرصفر دستورهای پوسته در makefile. معادل با مشخص کردن ‘-’ پیش از هر خط دستور در makefile.
private
این گزینه نباید توسط کاربر مشخص شود.

هنگامی که گزینه -j در یک ساخت بازگشتی (recursive build) استفاده می‌شود، این گزینه توسط make به makeهای فرزند ارسال می‌گردد تا تمام فرآیندهای make در فرایند ساخت بتوانند برای جلوگیری از تحمیل بار بیش از حد به سیستم همکاری کنند.

max_jobs
مشخص کردن بیشینه تعداد کارهایی که bmake می‌تواند در هر لحظه به صورت هم‌زمان در حال اجرا داشته باشد. اگر max_jobs یک عدد ممیز شناور باشد، یا به ‘C’ ختم شود، آن‌گاه این مقدار در تعداد پردازنده‌هایی که توسط sysconf(3) به عنوان آنلاین گزارش شده‌اند ضرب می‌شود. مقدار max_jobs در .MAKE.JOBS ذخیره می‌شود. حالت سازگاری را غیرفعال می‌کند، مگر اینکه گزینه -B نیز مشخص شده باشد. هنگامی که حالت سازگاری خاموش است، تمام دستورهای مربوط به یک هدف در یک فراخوانی منفرد پوسته اجرا می‌شوند، بر خلاف روش سنتی که یک پوسته برای هر خط فراخوانی می‌شد. این امر می‌تواند اسکریپت‌های سنتی را که با هر فراخوانی دستور، پوشه را تغییر داده و سپس انتظار دارند در خط بعد با محیطی تازه شروع به کار کنند، با شکست مواجه کند. اصلاح اسکریپت‌ها کارآمدتر از فعال کردن سازگاری رو به عقب است.

یک مخزن نشانه‌های کار با max_jobs نشانه برای مهار تعداد کل کارهای در حال اجرا استفاده می‌شود. هر نمونه از bmake پیش از اجرای یک کار تازه، منتظر یک نشانه از مخزن خواهد ماند.

ادامه پردازش پس از مواجهه با خطاها، اما فقط بر روی آن هدف‌هایی که به هدفی که ساخت آن باعث خطا شده است وابسته نیستند.
directory
مشخص کردن پوشه‌ای برای جستجوی 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’ به عنوان یک آرگومان).

نمایش دستورهایی که اجرا می‌شدند، بدون اجرای واقعی آن‌ها؛ مگر اینکه هدف به منبع ویژه .MAKE وابسته باشد (پایین‌تر را ببینید) یا پیشوند دستور ‘+’ باشد.
نمایش دستورهایی که اجرا می‌شدند، اما هیچ‌کدام را واقعاً اجرا نمی‌کند؛ برای اشکال‌زدایی makefileهای سطح بالا بدون ورود به زیرپوشه‌ها سودمند است.
هیچ دستوری را اجرا نمی‌کند، در عوض اگر هدف‌های مشخص‌شده به‌روز باشند با وضعیت 0 و در غیر این صورت با 1 خارج می‌شود.
از قواعد توکار مشخص‌شده در makefile سیستم استفاده نمی‌کند.
در صورت مواجهه با خطا، پردازش را متوقف می‌کند. این رفتار پیش‌فرض و نقطه مقابل -k است.
هیچ دستوری را هنگام اجرا بازتاب نمی‌دهد. معادل با مشخص کردن ‘@’ پیش از هر خط دستور در makefile.
tracefile
هنگام استفاده با پرچم -j -، یک رکورد ردگیری به tracefile برای هر کار آغازشده و پایان‌یافته اضافه می‌کند.
به جای بازسازی یک هدف طبق makefile، آن را ایجاد کرده یا زمان ویرایش آن را به‌روزرسانی می‌کند تا به‌روز به نظر برسد.
variable
چاپ مقدار variable. هیچ هدفی ساخته نمی‌شود. می‌توان چندین نمونه از این گزینه را مشخص کرد؛ متغیرها در هر خط یکی چاپ می‌شوند، همراه با یک خط خالی برای هر متغیر تهی یا تعریف‌نشده. مقدار چاپ‌شده پس از خوانده شدن تمام makefileها از حوزه سراسری استخراج می‌شود.

به‌طور پیش‌فرض، محتوای خام متغیر (که ممکن است شامل ارجاع‌های متغیر بسط‌نیافته اضافی باشد) نمایش داده می‌شود. اگر variable شامل یک ‘$’ باشد، نه به عنوان نام متغیر بلکه به عنوان یک عبارت تفسیر می‌شود. مقدار آن پیش از چاپ بسط داده می‌شود. همچنین اگر .MAKE.EXPAND_VARIABLES روی true تنظیم شده باشد و گزینه -dV برای بازنویسی آن به کار نرفته باشد، مقدار پیش از چاپ بسط داده می‌شود.

توجه داشته باشید که متغیرهای محلی حلقه و محلی هدف، و همچنین مقادیری که به صورت موقت توسط متغیرهای سراسری در طول پردازش makefile گرفته می‌شوند، از طریق این گزینه در دسترس نیستند. حالت اشکال‌زدایی -dv می‌تواند برای مشاهده این موارد به قیمت تولید خروجی‌های اضافی قابل توجه استفاده شود.

variable
همانند -V -، اما تمام متغیرهای چاپ‌شده همواره به مقدار کامل خود بسط داده می‌شوند. آخرین رخداد -V یا -v تعیین می‌کند که آیا همه متغیرها بسط داده شوند یا خیر.
برخورد با هرگونه هشدار در زمان تجزیه makefile به‌عنوان خطا.
چاپ پیام‌های ورود به شاخه و خروج از آن، پیش و پس از پردازش.
متغیرهای منتقل‌شده در خط فرمان را به‌صورت جداگانه به متغیرهای محیطی صادر (export) نکن. متغیرهای منتقل‌شده در خط فرمان همچنان از طریق متغیر محیطی MAKEFLAGS صادر می‌شوند. این گزینه می‌تواند در سامانه‌هایی که محدودیت کمی برای اندازه آرگومان‌های فرمان دارند سودمند باشد.
variable=value
تنظیم مقدار متغیر variable بر روی value. به‌طور معمول، تمام مقادیر منتقل‌شده در خط فرمان به زیر-makeها در محیط نیز صادر می‌شوند. پرچم -X این رفتار را غیرفعال می‌کند. انتساب‌های متغیر برای سازگاری با POSIX باید پس از گزینه‌ها بیایند، اما هیچ ترتیبی اجبار نمی‌شود.

چندین نوع خط گوناگون در یک makefile وجود دارد: مشخصات وابستگی، دستورهای شل، انتساب‌های متغیر، عبارت‌های شمول (include ،) رهنمودهای شرطی، حلقه‌های for، دیگر رهنمودها، و یادداشت‌ها.

خطوط را می‌توان با قرار دادن یک ممیز وارونه (‘\’) در پایان آن‌ها، از یک خط به خط بعدی امتداد داد. نویسه خط جدید پایانی و فاصله‌های خالی آغازین در خط بعد در قالب یک فاصله تکی فشرده می‌شوند.

خطوط وابستگی شامل یک یا چند هدف، یک عملگر، و صفر یا چند منبع هستند. این ساختار رابطه‌ای ایجاد می‌کند که در آن هدف‌ها به منابع “وابسته هستند” و به‌طور معمول از آن‌ها ساخته می‌شوند. یک هدف در صورتی که وجود نداشته باشد، یا زمان ویرایش آن قدیمی‌تر از هر یک از منابعش باشد، کهنه در نظر گرفته می‌شود. یک هدف کهنه دوباره ساخته می‌شود، اما تنها پس از آنکه تمام منابع بررسی شده و خود در صورت نیاز دوباره ساخته شده باشند. سه عملگر را می‌توان به کار برد:

بسیاری از خطوط وابستگی می‌توانند این هدف را نام ببرند اما تنها یکی می‌تواند دستورهای شل پیوست‌شده داشته باشد. تمام منابع نام‌برده در همه خطوط وابستگی همراه با یکدیگر در نظر گرفته می‌شوند، و در صورت نیاز دستورهای شل پیوست‌شده برای ایجاد یا ساخت دوباره هدف اجرا می‌شوند. اگر اجرای bmake متوقف شود، هدف حذف می‌گردد.
مشابه حالت پیش، اما هدف همواره چه کهنه باشد چه نباشد، دوباره ساخته می‌شود.
هر خط وابستگی می‌تواند دستورهای شل پیوست‌شده داشته باشد، اما با هر کدام به‌طور مستقل رفتار می‌شود: منابع آن بررسی شده و اگر هدف نسبت به (تنها) آن منابع کهنه باشد، دستورهای شل پیوست‌شده اجرا می‌شوند. بدین ترتیب، بسته به شرایط، ممکن است دسته‌های گوناگونی از دستورهای شل پیوست‌شده به اجرا درآیند. افزون بر این، برخلاف : ، برای خطوط وابستگی بدون منبع، دستورهای شل پیوست‌شده همواره اجرا می‌شوند. همچنین برخلاف : ، اگر اجرای bmake متوقف شود، هدف حذف نمی‌گردد.

تمام خطوط وابستگی که به یک هدف معین اشاره دارند باید از همان عملگر استفاده کنند.

هدف‌ها و منابع می‌توانند شامل مقادیر نویسه عام شل ‘? ،’ ‘* ،’ ‘[] ،’ و ‘{}’ باشند. مقادیر ‘? ،’ ‘* ،’ و ‘[]’ تنها می‌توانند به‌عنوان بخشی از بخش پایانی هدف یا منبع استفاده شوند، و تنها با پرونده‌های موجود مطابقت می‌یابند. مقدار ‘{}’ لزوماً نیازی نیست برای توصیف پرونده‌های موجود به کار رود. بسط به ترتیب شاخه انجام می‌شود، نه به ترتیب الفبایی آن‌گونه که در شل صورت می‌گیرد.

هر هدف می‌تواند یک یا چند خط از دستورهای شل همراه خود داشته باشد، که به‌طور معمول برای ساخت هدف به کار می‌روند. پیش از هر خط در این اسکریپت باید یک نویسه تب (tab) قرار گیرد. (به دلایل تاریخی، فاصله پذیرفته نیست.) در حالی که هدف‌ها در صورت تمایل می‌توانند در چندین خط وابستگی حضور یابند، به‌طور پیش‌فرض تنها یکی از این قواعد می‌تواند دارای اسکریپت ساخت باشد. اما اگر عملگر ‘::’ استفاده شود، تمام قواعد می‌توانند دارای اسکریپت باشند، و اسکریپت‌های مربوطه به ترتیبی که یافت شوند اجرا می‌گردند.

با هر خط به‌عنوان یک دستور شل مستقل رفتار می‌شود، مگر آن‌که انتهای خط با یک ممیز وارونه ‘\’ گریخته (escape) شده باشد، که در این صورت آن خط و خط پس از آن یکی می‌شوند. اگر نویسه‌های نخستین دستور هر ترکیبی از ‘@ ،’ ‘+ ،’ یا ‘-’ باشند، با دستور به‌گونه‌ای ویژه رفتار می‌شود.

باعث می‌شود دستور پیش از اجرا در خروجی بازتاب (echo) داده نشود.
باعث می‌شود دستور حتی در صورت تعیین -n اجرا گردد. این ویژگی شبیه اثر منبع ویژه .MAKE است، با این تفاوت که اثر آن می‌تواند به یک خط منفرد از اسکریپت محدود شود.
-
در حالت سازگاری (compatibility mode) باعث نادیده گرفته شدن هرگونه وضعیت خروج غیرصفر خط فرمان می‌شود.

هنگامی که bmake در حالت کارها (jobs mode) با -j max_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 نادیده گرفته می‌شوند.

پنج عملگری که مقادیر را به متغیرها اختصاص می‌دهند عبارتند از:

اختصاص مقدار به متغیر. هر مقدار قبلی بازنویسی می‌شود.
افزودن مقدار به مقدار فعلی متغیر، با جدا کردن آن‌ها با یک فاصله تکی.
اختصاص مقدار به متغیر، چنانچه از پیش تعریف نشده باشد.
گسترش مقدار، سپس اختصاص آن به متغیر.

نکته: ارجاعات به متغیرهای تعریف‌نشده گسترش نمی‌یابند. این امر می‌تواند هنگام استفاده از اصلاح‌کننده‌های متغیر مشکلاتی ایجاد کند.

گسترش مقدار و ارسال آن به پوسته جهت اجرا، سپس اختصاص خروجی استاندارد فرایند فرزند به متغیر. هر نویسه خط جدید در نتیجه با فاصله جایگزین می‌شود.

در بیشتر زمینه‌هایی که متغیرها گسترش می‌یابند، ‘$$’ به یک علامت دلار تکی گسترش می‌یابد. در سایر زمینه‌ها (اکثر اصلاح‌کننده‌های متغیر، رشته‌های تحت‌اللفظی در شرط‌ها)، ‘\$’ به یک علامت دلار تکی گسترش می‌یابد.

ارجاع به متغیرها دارای ساختار ${name[:modifiers]} یا $(name[:modifiers]) است. اگر نام متغیر تنها از یک نویسه تشکیل شده باشد و عبارت شامل هیچ اصلاح‌کننده‌ای نباشد، آکولادها یا پرانتزهای احاطه‌کننده الزامی نیستند. استفاده از این شکل کوتاه‌تر توصیه نمی‌شود.

اگر نام متغیر شامل یک علامت دلار باشد، ابتدا خود نام گسترش می‌یابد. این امر امکان استفاده از نام‌های متغیر تقریباً دلخواه را فراهم می‌کند، با این حال بهتر است جداً از نام‌های حاوی دلار، آکولاد، پرانتز یا فاصله خالی پرهیز شود.

اگر نتیجه گسترش یک عبارت متغیر تودرتو شامل یک علامت دلار باشد (‘$’), نتیجه مشمول گسترش بیشتر خواهد بود.

جایگزینی متغیر در چهار زمان مجزا رخ می‌دهد، بسته به جایی که متغیر در آن استفاده می‌شود.

  1. متغیرها در خطوط وابستگی به هنگام خوانده شدن خط گسترش می‌یابند.
  2. متغیرها در عبارات شرطی به صورت مجزا گسترش می‌یابند، اما تنها تا حدی که برای تعیین نتیجه شرط لازم است.
  3. متغیرها در دستورات پوسته هنگام اجرای دستور پوسته گسترش می‌یابند.
  4. متغیرهای شاخص حلقه .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’ گسترش می‌یابد.

چهار دسته مختلف متغیرها (به ترتیب افزایش اولویت) عبارتند از:

متغیرهای محیطی (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’.

علاوه بر این، 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 اجرا شود، خروجی هر هدف با نشانه
--- target ---
پیشوند می‌گیرد که بخش نخست آن از طریق .MAKE.JOB.PREFIX قابل کنترل است. اگر .MAKE.JOB.PREFIX تهی باشد، هیچ نشانه‌ای چاپ نمی‌شود. برای نمونه، با مقداردهی .MAKE.JOB.PREFIX به ‘${.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 در آن اجرا می‌شود اثر می‌گذارد. می‌تواند شامل این کلیدواژه‌ها باشد:
همانند -B, bmake را در حالت “compat” قرار می‌دهد.
bmake را در حالت “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, برای محدود ساختن این بازرسی در صورت لزوم ارائه شده‌اند.

bf
به طور پیش‌فرض، bmake پرونده‌های .meta را در ‘.CURDIR’ ایجاد نمی‌کند. این رفتار را می‌توان با تنظیم bf روی مقداری که نشان‌دهنده درستی (true) است لغو کرد.
bf
اگر bf درست (true) باشد، نبود پرونده .meta سبب می‌شود هدف قدیمی تلقی گردد.
bf
اگر bf درست (true) باشد، نبود داده‌های filemon سبب می‌شود هدف قدیمی تلقی گردد.
از filemon(4) استفاده نکن.
برای اشکال‌زدایی، گنجاندن محیط در پرونده .meta می‌تواند سودمند باشد.
در صورت قرار داشتن در حالت “meta”, راهنمایی درباره هدف در حال ساخت چاپ کن. این قابلیت در صورتی که فرایند ساخت در غیر این صورت به آرامی (بی‌صدا) اجرا شود سودمند است. پیام چاپ‌شده، مقدار بسط‌یافته .MAKE.META.PREFIX است.
برخی makefileها دارای دستورهایی هستند که اساساً ناپایدارند. این کلیدواژه سبب می‌شود آن‌ها در تعیین اینکه آیا هدفی در حالت “meta” قدیمی است یا خیر نادیده گرفته شوند. همچنین ببینید: .NOMETA_CMP.
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) به شاخه‌های زیر به ترتیب و استفاده از نخستین مورد منطبق تعیین می‌شود:
  1. ${.CURDIR}

    (تنها در صورتی که ‘MAKEOBJDIRPREFIX’ در محیط یا در خط فرمان تنظیم شده باشد.)

  2. (تنها در صورتی که ‘MAKEOBJDIR’ در محیط یا در خط فرمان تنظیم شده باشد.)

  3. /obj.${MACHINE}
  4. /obj
  5. /usr/obj/${.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[:modifier[:...]]}

هر تغییردهنده با یک دونقطه آغاز می‌شود. برای گریز از دونقطه، پیش از آن یک ممیز وارونه (backslash) ‘\’ بگذارید.

فهرستی از تغییردهنده‌های غیرمستقیم را می‌توان از طریق یک متغیر، به شرح زیر مشخص کرد:

modifier_variable = modifier[:...]

${variable:${modifier_variable}[:...]}

در این حالت، نخستین تغییردهنده در modifier_variable با دونقطه آغاز نمی‌شود، زیرا آن دونقطه از قبل در متغیر ارجاع‌دهنده آمده است. اگر هر یک از تغییردهنده‌ها در modifier_variable حاوی نشان دلار (‘$’) باشد، این نشان‌ها باید دو بار تکرار شوند تا از گسترش زودهنگام جلوگیری شود.

برخی تغییردهنده‌ها مقدار عبارت را به صورت یک رشته منفرد تفسیر می‌کنند، دیگران با مقدار عبارت مانند فهرستی از کلمات جداشده با نویسه‌های فاصله‌ساز برخورد می‌کنند. هنگام بخش‌بندی یک رشته به کلمات، فاصله‌ها را می‌توان همانند پوسته با نقل‌قول دوگانه، نقل‌قول تکی و ممیز وارونه گریز داد. نقل‌قول‌ها و ممیزهای وارونه در کلمات حفظ می‌شوند.

تغییردهنده‌های پشتیبانی‌شده عبارتند از:

هر کلمه را با پسوند آن جایگزین می‌کند.
هر کلمه را با نام شاخهٔ آن (dirname) جایگزین می‌کند.
pattern
تنها کلماتی را انتخاب می‌کند که با pattern مطابقت دارند. نویسه‌های عامه‌کارت استاندارد پوسته (‘*’, ‘?’, و ‘[]’) می‌توانند به کار روند. از ابروها می‌توان برای فهرست کردن الگوهای جایگزین استفاده کرد. برای نمونه، ‘${.ALLSRC:M*{Makefile*,.mk}}’ می‌تواند برای مطابقت با هر ‘*Makefile*’ یا ‘*.mk’ در .ALLSRC به کار رود. نویسه‌های عامه‌کارت و ابروها را می‌توان با یک ممیز وارونه (‘\’) گریز داد. به عنوان نتیجه‌ای از نحوه بخش‌بندی مقادیر به کلمات، تطبیق، و سپس پیوستن آن‌ها، سازهٔ ‘${VAR:M*}’ تمام فاصله‌های سفید ابتدا و انتها را حذف کرده و فاصله‌گذاری بین کلمات را به یک فاصله یکدست می‌کند.
pattern
این برعکس ‘:M’ است، و تمام کلماتی را انتخاب می‌کند که با pattern مطابقت ندارند.
کلمات را بر اساس الفبا مرتب می‌کند.
کلمات را به صورت عددی مرتب می‌کند. عددی که به دنبال آن یکی از ‘k’, ‘M’ یا ‘G’ آمده باشد، در ضریب مناسب ضرب می‌شود که برابر ۱۰۲۴ برای ‘k’, ۱۰۴۸۵۷۶ برای ‘M’, یا ۱۰۷۳۷۴۱۸۲۴ برای ‘G’ است. هر دو حروف بزرگ و کوچک پذیرفته می‌شوند.
کلمات را با ترتیب الفبایی معکوس مرتب می‌کند.
کلمات را با ترتیب عددی معکوس مرتب می‌کند.
کلمات را بر می‌زند (درهم می‌ریزد). هر بار که به متغیر تغییریافته ارجاع دهید، نتایج متفاوت خواهد بود؛ برای جلوگیری از این رفتار، از انتساب همراه با گسترش ‘:=’ استفاده کنید. برای نمونه،
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
تمام فرانویست‌های پوسته در مقدار را نقل‌قول‌گذاری می‌کند، تا بتوان آن را با امنیت به پوسته منتقل کرد.
تمام فرانویست‌های پوسته در مقدار را نقل‌قول‌گذاری می‌کند، و همچنین نویسه‌های ‘$’ را دو برابر می‌کند تا بتواند بدون خطر در فراخوانی‌های بازگشتی bmake منتقل شود. این معادل است با ‘:S/\$/&&/g:Q’.
هر کلمه را با همه‌چیز به جز پسوند آن جایگزین می‌کند.
[=count]
مقدار، یک دنباله از اعداد صحیح است که نشان‌دهنده کلمات مقدار اصلی، یا مقدار ارائه‌شدهٔ count می‌باشد.
[=timestamp]
مقدار به عنوان یک رشته قالب برای strftime(3) تفسیر می‌شود، با استفاده از gmtime(3) که مهرزمانی قالب‌بندی‌شده تولید می‌کند. نکته: قالب ‘%s’ تنها باید با ‘:localtime’ استفاده شود. اگر مقدار timestamp ارائه نشود یا 0 باشد، زمان جاری استفاده می‌شود.
یک هش ۳۲ بیتی از مقدار محاسبه کرده و آن را به صورت ۸ رقم هگزادسیمال کدبندی می‌کند.
[=timestamp]
مقدار به عنوان یک رشته قالب برای strftime(3), با استفاده از localtime(3), تفسیر شده و برچسب زمانی قالب‌بندی‌شده را تولید می‌کند. اگر مقدار timestamp ارائه نشود یا ۰ باشد، از زمان جاری استفاده می‌شود.
[=timestamp]
فراخوانی stat(2) با هر کلمه به عنوان نام مسیر؛ استفاده از ‘st_mtime’ به عنوان مقدار جدید. اگر stat(2) شکست بخورد؛ از timestamp یا زمان جاری استفاده می‌شود. اگر timestamp بر روی ‘error’ تنظیم شده باشد، آنگاه شکست stat(2) موجب بروز یک خطا خواهد شد.
تلاش می‌کند تا با استفاده از realpath(3) مقدار را به یک مسیر مطلق تبدیل کند. اگر ناموفق باشد، مقدار بدون تغییر می‌ماند.
مقدار را به حروف کوچک تبدیل می‌کند.
c
هنگام پیوند دادن کلمات پس از اصلاح‌کننده‌ای که با مقدار به عنوان کلمات رفتار می‌کند، کلمات معمولاً با یک فاصله جدا می‌شوند. این اصلاح‌کننده جداکننده را به نویسه c تغییر می‌دهد. اگر c حذف شود، هیچ جداکننده‌ای به کار نمی‌رود. گریزه‌های رایج (از جمله کدهای عددی هشت‌هشتی) مطابق انتظار کار می‌کنند.
نخستین نویسه هر کلمه را به حروف بزرگ، و باقی را به حروف کوچک تبدیل می‌کند.
مقدار را به حروف بزرگ تبدیل می‌کند.
باعث می‌شود اصلاح‌کننده‌های بعدی با مقدار به عنوان یک تک‌کلمه رفتار کنند (که احتمالاً حاوی نویسه‌های فاصله‌دار درون‌متنی است). همچنین ببینید: ‘:[*]’.
باعث می‌شود با مقدار به عنوان فهرستی از کلمات رفتار شود. همچنین ببینید: ‘:[@]’.
/[^]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):

تنها کلمه دارای نخستین رخداد تحت تأثیر قرار می‌گیرد.
تمام رخدادها در هر کلمه تحت تأثیر جایگزین می‌شوند.
مقدار عبارت به عنوان یک تک‌کلمه در نظر گرفته می‌شود.

هر نویسه‌ای می‌تواند به عنوان جداکننده بخش‌های رشته اصلاح‌کننده استفاده شود. نویسه‌های مهارکننده، امپرسند، دلار و جداکننده می‌توانند با یک ممیز وارونه (‘\’) گریز داده شوند.

/pattern/replacement/[1gW]
نخستین رخداد عبارت منظم گسترش‌یافته pattern (ببینید: regex(3)) در هر کلمه از مقدار را تغییر داده و آن را با یک replacement به سبک ed(1)-style جایگزین می‌کند.

هر دو pattern و replacement می‌توانند حاوی عبارت‌های تودرتو باشند.

گزینه‌های بیشتر (Further options):

تنها کلمه دارای نخستین رخداد تحت تأثیر قرار می‌گیرد.
تمام رخدادها در هر کلمه تحت تأثیر جایگزین می‌شوند.
مقدار عبارت به عنوان یک تک‌کلمه در نظر گرفته می‌شود.

هر نویسه‌ای می‌تواند به عنوان جداکننده بخش‌های رشته اصلاح‌کننده استفاده شود. نویسه‌های مهارکننده، امپرسند، دلار و جداکننده می‌توانند با یک ممیز وارونه (‘\’) گریز داده شوند.

هر کلمه را با آخرین مؤلفه مسیر آن (basename) جایگزین می‌کند.
کلمات تکراری مجاور را حذف می‌کند (مانند uniq(1)).
:?true_string:false_string
اگر نام متغیر (نه مقدار آن)، هنگام تجزیه به عنوان یک عبارت شرطی .if, به true ارزیابی شود، مقدار true_string را به عنوان مقدار خود بازمی‌گرداند؛ در غیر این صورت false_string را بازمی‌گرداند. از آنجا که نام متغیر به عنوان عبارت استفاده می‌شود، :? باید نخستین اصلاح‌کننده پس از نام خود متغیر—باشد؛ که البته معمولاً شامل بسط‌های متغیر است. یک خطای متداول، تلاش برای استفاده از عباراتی مانند
${NUMBERS:M42:?match:no}
است که در واقع defined(NUMBERS) را می‌آزماید. برای تعیین اینکه آیا کلمه‌ای با “42” مطابقت دارد یا خیر، باید از چیزی مانند این استفاده کنید:
${"${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’ به آن ارجاع داده می‌شود.
newval
اگر متغیر تعریف‌نشده باشد، newval اختیاری (که ممکن است تهی باشد) مقدار خواهد بود. اگر متغیر تعریف شده باشد، مقدار موجود برگردانده می‌شود. این یکی دیگر از قابلیت‌های ODE make است. برای نمونه، جهت تنظیم CFLAGS به‌ازای هر هدف سودمند است:
${_${.TARGET:T}_CFLAGS:U${DEF_CFLAGS}}
اگر مقدار تنها در صورت تعریف‌نشده بودن متغیر نیاز باشد، از این عبارت استفاده کنید:
${VAR:D:Unewval}
newval
اگر متغیر تعریف شده باشد، newval (که ممکن است تهی باشد) مقدار خواهد بود.
نام متغیر، همان مقدار است.
مسیر گرهی که همنام متغیر است، مقدار خواهد بود. اگر چنین گرهی وجود نداشته باشد یا مسیر آن تهی باشد، از نام متغیر استفاده می‌شود. برای اینکه این اصلاح‌کننده کار کند، نام (گره) باید دست‌کم در سمت راست یک وابستگی ظاهر شده باشد.
:!cmd!
خروجی اجرای cmd مقدار خواهد بود.
مقدار به عنوان یک دستور اجرا می‌شود و خروجی آن به مقدار جدید تبدیل می‌گردد.
مقدار تنها برای نخستین ارجاع به عنوان یک دستور اجرا می‌شود و خروجی آن برای ارجاع‌های پسین ذخیره می‌گردد. این اصلاح‌کننده زمانی سودمند است که انتظار نمی‌رود نتیجه تغییر کند.
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 است.
تعداد کلمات موجود در مقدار را برمی‌گرداند.

bmake رهنمودهایی را برای گنجاندن makefileها، عبارت‌های شرطی و حلقه‌های for ارائه می‌دهد. تمام این رهنمودها با خطی مشخص می‌شوند که با یک نویسه نقطه تکی (‘.’) آغاز می‌شود، و در پی آن کلمه کلیدی رهنمود می‌آید، مانند include یا if.

پرونده‌ها با .include <file> یا .include "file" گنجانده می‌شوند. متغیرهای میان قلاب‌های زاویه‌دار یا علامت‌های نقل‌قول دوتایی بسط داده می‌شوند تا نام پرونده را تشکیل دهند. اگر قلاب‌های زاویه‌دار به کار روند، انتظار می‌رود makefile گنجانده‌شده در شاخه makefile سامانه باشد. اگر علامت‌های نقل‌قول دوتایی به کار روند، شاخه makefile شامل‌کننده و هر شاخه‌ای که با استفاده از گزینه -I مشخص شده باشد، پیش از شاخه makefile سامانه جستجو می‌شوند.

برای سازگاری با دیگر گونه‌های make، ‘include file ...’ (بدون نقطه آغازین) نیز پذیرفته می‌شود.

اگر عبارت include به‌صورت .-include یا به‌صورت .sinclude نوشته شود، خطاهای یافتن و/یا باز کردن پرونده‌های شمول نادیده گرفته می‌شوند.

اگر عبارت include به‌صورت .dinclude نوشته شود، نه‌تنها خطاهای یافتن و/یا باز کردن پرونده‌های شمول نادیده گرفته می‌شوند، بلکه وابستگی‌های کهنه درون پرونده گنجانده‌شده نیز درست مانند .MAKE.DEPENDFILE نادیده گرفته می‌شوند.

رهنمودها برای صدور و لغو صدور متغیرها عبارتند از:

variable ...
متغیر سراسری مشخص‌شده را صادر می‌کند.

برای سازگاری با دیگر برنامه‌های make، export variable=value (بدون نقطه آغازین) نیز پذیرفته می‌شود.

افزودن نام یک متغیر به .MAKE.EXPORTED معادل صدور یک متغیر است.

تمام متغیرهای سراسری به جز متغیرهای داخلی (آن‌هایی که با ‘.’ آغاز می‌شوند) را صادر می‌کند. این مورد تحت تأثیر پرچم -X قرار نمی‌گیرد، بنابراین باید با احتیاط استفاده شود.
variable ...
همانند ‘.export ،’ است، به جز اینکه متغیر به .MAKE.EXPORTED افزوده نمی‌شود. این به کاربر امکان می‌دهد مقداری را به محیط صادر کند که با مقدار مورد استفاده داخلی bmake متفاوت است.
variable ...
همانند ‘.export-env ،’ است، به جز اینکه متغیرهای درون مقدار بسط داده نمی‌شوند.
variable ...
نقطه مقابل ‘.export’. متغیر سراسری مشخص‌شده variable از .MAKE.EXPORTED حذف می‌شود. اگر هیچ فهرستی از متغیرها ارائه نشود، صدور تمام متغیرهای سراسری لغو شده، و .MAKE.EXPORTED حذف می‌شود.
تمام متغیرهای سراسری که پیش‌تر صادر شده‌اند را لغو صدور کرده و محیط به ارث رسیده از والد را پاک می‌کند. این عملیات باعث نشت حافظه در محیط اولیه می‌شود، بنابراین باید به‌ندرت استفاده شود. بررسی اینکه .MAKE.LEVEL برابر 0 باشد معقول خواهد بود. همچنین توجه داشته باشید که هرگونه متغیر برگرفته از محیط والد در صورت نیاز باید به‌صراحت حفظ شود. برای نمونه:
.if ${.MAKE.LEVEL} == 0
PATH := ${PATH}
.unexport-env
.export PATH
.endif
منجر به محیطی می‌شود که تنها شامل ‘PATH’ است، که کمینه محیط کارآمد به شمار می‌رود. در عمل ‘.MAKE.LEVEL’ نیز به محیط جدید فرستاده می‌شود.

رهنمودها برای چاپ پیام‌ها در خروجی عبارتند از:

message
پیام همراه با نام makefile و شماره خط چاپ می‌شود.
message
پیام با پیشوند ‘warning:’ همراه با نام makefile و شماره خط چاپ می‌شود.
message
پیام همراه با نام makefile و شماره خط چاپ می‌شود، bmake بلافاصله خارج می‌شود.

رهنمودها برای شرطی‌ها عبارتند از:

[!]expression [operator expression ...]
بررسی مقدار یک عبارت.
[!]variable [operator variable ...]
بررسی اینکه آیا یک متغیر تعریف شده است یا خیر.
[!]variable [operator variable ...]
بررسی اینکه آیا یک متغیر تعریف نشده است یا خیر.
[!]target [operator target ...]
بررسی هدفی که درخواست شده است.
[!]target [operator target ...]
بررسی هدفی که درخواست نشده است.
معکوس کردن وضعیت آخرین شرطی.
[!]expression [operator expression ...]
ترکیبی از ‘.else’ و در پی آن ‘.if’.
[!]variable [operator variable ...]
ترکیبی از ‘.else’ و در پی آن ‘.ifdef’.
[!]variable [operator variable ...]
ترکیبی از ‘.else’ و در پی آن ‘.ifndef’.
[!]target [operator target ...]
ترکیبی از ‘.else’ و در پی آن ‘.ifmake’.
[!]target [operator target ...]
ترکیبی از ‘.else’ و در پی آن ‘.ifnmake’.
پایان دادن به بدنه شرطی.

عملگر operator می‌تواند هر یک از موارد زیر باشد:

یا (OR) منطقی.
و (AND) منطقی؛ دارای تقدم بالاتری نسبت به ‘||’.

bmake یک شرطی را تنها تا اندازه‌ای که برای تعیین مقدار آن لازم است ارزیابی می‌کند. پرانتزها می‌توانند برای نادیده گرفتن تقدم عملگرها به کار روند. عملگر بولی ‘!’ می‌تواند برای نقیض منطقی یک عبارت، به‌طور معمول یک فراخوانی تابع، استفاده شود. تقدم آن بالاتر از ‘&&’ است.

مقدار expression می‌تواند هر یک از عبارت‌های فراخوانی تابع زیر باشد:

(varname)
اگر متغیر varname تعریف شده باشد، برابر با true ارزیابی می‌شود.
(target)
اگر هدف به عنوان بخشی از خط فرمان bmake مشخص شده باشد یا به عنوان هدف پیش‌فرض (خواه به‌طور ضمنی یا صریح، ببینید .MAIN) پیش از خط شامل شرطی اعلان شده باشد، برابر با true ارزیابی می‌شود.
(varname[:modifiers])
چنانچه گسترش متغیر، پس از اعمال اصلاح‌کننده‌ها، به رشته‌ای تهی بیانجامد، به درست ارزیابی می‌شود.
(pathname)
اگر مسیر داده‌شده وجود داشته باشد، به درست ارزیابی می‌شود. چنانچه نسبی باشد، مسیر در مسیر جستجوی سامانه (رجوع کنید به .PATH) جستجو می‌شود.
(target)
اگر هدف تعریف شده باشد، به درست ارزیابی می‌شود.
(target)
اگر هدف تعریف شده باشد و دستوراتی وابسته به آن وجود داشته باشند، به درست ارزیابی می‌شود.

Expression همچنین می‌تواند یک مقایسه حسابی یا رشته‌ای باشد. گسترش متغیر بر روی هر دو سوی مقایسه انجام می‌گیرد. اگر هر دو سو عددی باشند و هیچ‌یک در علامت نقل‌قول قرار نگرفته باشند، مقایسه به‌صورت عددی و در غیر این صورت به‌صورت الفبایی انجام می‌شود. یک رشته در صورتی که پیش از آن 0x آمده باشد، به‌صورت عدد صحیح در مبنای شانزده تفسیر می‌شود، در غیر این صورت به‌صورت یک عدد اعشاری ممیز شناور ده‌دهی تفسیر خواهد شد؛ از عددهای مبنای هشت پشتیبانی نمی‌شود.

تمامی مقایسه‌ها می‌توانند از عملگرهای ‘==’ و ‘!=’ استفاده کنند. مقایسه‌های عددی همچنین می‌توانند از عملگرهای ‘<’, ‘<=’, ‘>’ و ‘>=’ بهره ببرند.

اگر مقایسه فاقد عملگر مقایسه یا سمت راست باشد، عبارت در صورتی که غیرتهی باشد و مقدار عددی آن (در صورت وجود) صفر نباشد، به درست ارزیابی می‌شود.

هنگامی که bmake یکی از این عبارت‌های شرطی را ارزیابی می‌کند، و با واژه‌ای (جداشده با نویسه فاصله) روبرو می‌شود که آن را بازنمی‌شناسد، بسته به شکل شرط، تابع “make” یا “defined” بر روی آن اعمال می‌شود. اگر شکل شرط به‌صورت ‘.ifdef’, ‘.ifndef’ یا ‘.if’ باشد، تابع “defined” اعمال می‌گردد. به همین ترتیب، اگر شکل شرط به‌صورت ‘.ifmake’ یا ‘.ifnmake’ باشد، تابع “make” اعمال می‌شود.

اگر عبارت شرطی به درست ارزیابی شود، تجزیه makefile همچون گذشته ادامه می‌یابد. اگر به نادرست ارزیابی شود، خطوط بعدی تا گونه متناظر ‘.elif’, ‘.else’ یا ‘.endif’ نادیده گرفته می‌شوند.

حلقه‌های for معمولاً برای اعمال مجموعه‌ای از قواعد بر روی فهرستی از پرونده‌ها به کار می‌روند. نحو یک حلقه for به این صورت است:

variable [variable ...] in expression
 
⟨make-lines⟩
 
 

عبارت expression گسترش یافته و سپس به واژه‌ها شکسته می‌شود. در هر تکرار از حلقه، یک واژه برداشته شده و به هر variable, به ترتیب اختصاص داده می‌شود، و این variables درون make-lines در بدنه حلقه for جایگزین می‌شوند. شمار واژه‌ها باید میزان و متناسب باشد؛ یعنی اگر سه متغیر تکرار وجود داشته باشد، تعداد واژه‌های ارائه‌شده باید مضربی از سه باشد.

اگر ‘.break’ درون یک حلقه .for دیده شود، باعث پایان زودهنگام حلقه می‌شود، در غیر این صورت یک خطای تجزیه است.

variable ...
تعریف متغیرهای سراسری مشخص‌شده را لغو می‌کند. تنها متغیرهای سراسری را می‌توان لغو تعریف کرد.

توضیحات با نویسه هش (‘#’) در هر جایی به‌جز در سطر فرمان پوسته آغاز می‌شوند، و تا انتهای یک سطر تازه مهارنشده (unescaped) ادامه می‌یابند.

هدف هرگز تاریخ‌گذشته در نظر گرفته نمی‌شود، اما در هر حال فرمان‌ها همواره اجرا می‌شوند.
چشم‌پوشی از هرگونه خطا در فرمان‌های مرتبط با این هدف، دقیقاً همانند آنکه پیش از همه آن‌ها یک خط تیره (‘-’) آمده باشد.
هدف(ها) را به‌روز علامت‌گذاری می‌کند.
اجرای فرمان‌های مرتبط با این هدف حتی در صورتی که گزینه‌های -n یا -t تعیین شده باشند. معمولاً برای مشخص کردن فراخوانی‌های بازگشتی bmake به کار می‌رود.
ایجاد یک پرونده فراداده (meta file) برای هدف، حتی اگر با .PHONY, .MAKE, یا .SPECIAL نشانه‌گذاری شده باشد. کاربرد در کنار .MAKE محتمل‌ترین حالت است. در حالت “meta” اگر پرونده فراداده وجود نداشته باشد، هدف تاریخ‌گذشته تلقی می‌شود.
برای هدف پرونده فراداده ایجاد نکن. پرونده‌های فراداده همچنین برای هدف‌های .PHONY, .MAKE, یا .SPECIAL ایجاد نمی‌شوند.
چشم‌پوشی از تفاوت‌های موجود در فرمان‌ها هنگام تصمیم‌گیری درباره تاریخ‌گذشته بودن هدف. این ویژگی زمانی سودمند است که فرمان حاوی مقداری باشد که همواره تغییر می‌کند. با این حال اگر شمار فرمان‌ها تغییر کند، هدف همچنان تاریخ‌گذشته در نظر گرفته می‌شود. همین اثر برای هر خط فرمانی که از متغیر .OODATE استفاده کند نیز اعمال می‌شود، که می‌توان برای همین منظور از آن استفاده کرد حتی اگر در غیر این صورت نیازی به آن نباشد یا مطلوب نباشد:
skip-compare-for-some:
	@echo this is compared
	@echo this is not ${.OODATE:M.NOMETA_CMP}
	@echo this is also compared
الگوی :M از هرگونه بسط متغیر ناخواسته جلوگیری می‌کند.
در شاخه‌های مشخص‌شده توسط .PATH به دنبال هدف نگرد.
در حالت معمول bmake نخستین هدفی را که با آن مواجه شود، در صورت تعیین نشدن هدف، به عنوان هدف پیش‌فرض برای ساخت انتخاب می‌کند. این منبع از انتخاب شدن این هدف جلوگیری می‌کند.
اگر هدفی با این ویژگی نشانه‌گذاری شده باشد و bmake نتواند چگونگی ایجاد آن را دریابد، این موضوع را نادیده می‌گیرد و فرض می‌کند پرونده نیازی نبوده یا از پیش وجود دارد.
هدف با پرونده واقعی تطابق ندارد؛ همواره تاریخ‌گذشته در نظر گرفته می‌شود، و با گزینه -t ایجاد نمی‌شود. قواعد تبدیل پسوند بر روی هدف‌های .PHONY اعمال نمی‌شوند.
هنگامی که اجرای bmake قطع می‌شود، معمولاً هر هدفی را که به صورت نیمه‌کاره ساخته شده حذف می‌کند. این منبع از حذف شدن هدف جلوگیری می‌کند.
مترادفی برای .MAKE.
هیچ‌یک از فرمان‌های مرتبط با این هدف را در خروجی نمایش نده، دقیقاً همانند آنکه پیش از همه آن‌ها یک نشانه ات (‘@’) آمده باشد.
هدف را به نگارش bmake از یک ماکرو تبدیل می‌کند. هنگامی که هدف به عنوان یک منبع برای هدفی دیگر به کار رود، آن هدف دیگر فرمان‌ها، منابع و ویژگی‌های منبع (به‌جز .USE) را به خود اختصاص می‌دهد. اگر هدف از پیش دارای فرمان‌هایی باشد، فرمان‌های هدف .USE به انتهای آن‌ها پیوست می‌شوند.
مانند .USE, اما به جای پیوست به انتها، فرمان‌های هدف .USEBEFORE را به ابتدای هدف می‌افزاید.
اگر .WAIT در یک خط وابستگی پدیدار شود، منابع پیش از آن پیش از منابع پس از آن در همان خط ساخته می‌شوند. از آنجا که وابسته‌های پرونده‌ها تا زمانی که خود پرونده امکان ساخت نداشته باشد ساخته نمی‌شوند، این امر همچنین از ساخت وابسته‌ها جلوگیری می‌کند مگر اینکه برای شاخه دیگری از درخت وابستگی مورد نیاز باشند. بنابراین با در نظر گرفتن:
x: a .WAIT b
	echo x
a:
	echo a
b: b1
	echo b
b1:
	echo b1
خروجی همواره برابر است با ‘a’, ‘b1’, ‘b’, ‘x’.

ترتیب اعمال‌شده توسط .WAIT تنها برای ساخت‌های موازی (parallel makes) اهمیت دارد.

هدف‌های ویژه نمی‌توانند همراه با دیگر هدف‌ها آورده شوند، بدین معنا که باید تنها هدف مشخص‌شده باشند.

هر سطر فرمانی که به این هدف پیوست شده باشد، پیش از انجام هر کار دیگری اجرا می‌شود.
این به‌نوعی یک قاعده .USE برای هر هدفی است (که تنها به‌عنوان یک منبع به کار رفته بود) که bmake روش دیگری برای ساخت آن نمی‌یابد. تنها اسکریپت شل به کار گرفته می‌شود. متغیر .IMPSRC هدفی که دستورهای .DEFAULT را به ارث می‌برد، روی نام خود هدف تنظیم می‌شود.
اگر این هدف در makefile وجود داشته باشد، به گونه‌ای سراسری موجب می‌شود make هدف‌هایی را که دستورهایشان شکست می‌خورند، حذف کند. (به‌طور پیش‌فرض، تنها هدف‌هایی که دستورهایشان هنگام اجرا دچار وقفه می‌شوند، حذف می‌گردند. این رفتار دیرینه است.) این تنظیم می‌تواند برای جلوگیری از بر جای ماندن هدف‌های نیمه‌کاره یا ناقص و خراب شدن ساخت‌های مجدد در آینده به کار رود.
هر سطر فرمانی که به این هدف پیوست شده باشد، پس از انجام موفقیت‌آمیز همه کارهای دیگر اجرا می‌شود.
هر سطر فرمانی که به این هدف پیوست شده باشد، هنگام شکست هدفی دیگر اجرا می‌شود. برای متغیرهایی که مقداردهی خواهند شد، MAKE_PRINT_VAR_ON_ERROR را ببینید.
هر یک از منابع را با صفت .IGNORE نشانه‌گذاری می‌کند. اگر منبعی مشخص نشده باشد، معادل مشخص کردن گزینه -i است.
اگر اجرای bmake دچار وقفه شود، دستورهای این هدف اجرا می‌شوند.
اگر هنگام فراخوانی bmake هیچ هدفی مشخص نشده باشد، این هدف ساخته می‌شود.
این هدف راهی برای مشخص کردن پرچم‌ها برای bmake در زمان خوانده شدن makefileها فراهم می‌کند. پرچم‌ها همانند آن هستند که در شل تایپ شده باشند، هرچند گزینه -f بی‌اثر است.
صفت .NOPATH را به هر یک از منابع مشخص‌شده اعمال می‌کند.
حالت موازی را غیرفعال می‌کند.
مترادفی برای .NOTPARALLEL، جهت سازگاری با دیگر نگارش‌های pmake.
صفت فقط‌خواندنی را از متغیرهای سراسری مشخص‌شده به‌عنوان منبع پاک می‌کند.
منبع، مقداری تازه برای ‘.OBJDIR’ است. در صورت وجود، bmake دایرکتوری کاری جاری را به آن تغییر داده و مقدار ‘.OBJDIR’ را به‌روزرسانی می‌کند.
در حالت موازی، هدف‌های نام‌برده به ترتیب و پیاپی ساخته می‌شوند. این ترتیب‌دهی، هدفی را به فهرست هدف‌های آماده ساخت نمی‌افزاید.

از آنجا که وابسته‌های یک هدف تا زمانی که خود هدف نتواند ساخته شود، ساخته نمی‌شوند، مگر آنکه ‘a’ توسط بخش دیگری از گراف وابستگی ساخته شود، مورد زیر یک حلقه وابستگی خواهد بود:

.ORDER: b a
b: a
منابع، دایرکتوری‌هایی هستند که باید برای یافتن پرونده‌های ناموجود در دایرکتوری جاری جستجو شوند. اگر منبعی مشخص نشده باشد، هر دایرکتوری مشخص‌شده پیشین از مسیر جستجو حذف می‌شود. اگر منبع، هدف ویژه .DOTLAST باشد، دایرکتوری کاری جاری در پایان جستجو می‌شود.
suffix
همانند .PATH اما تنها بر پرونده‌هایی با پسوند مشخص اعمال می‌شود. این پسوند باید پیش‌تر با .SUFFIXES تعریف شده باشد.
صفت .PHONY را به هر یک از منابع مشخص‌شده اعمال می‌کند.
اگر این سطر نخستین سطر غیرتوضیحی در makefile اصلی باشد، متغیر %POSIX بر روی مقدار ‘1003.2’ تنظیم می‌گردد و در صورت وجود پرونده makefile با نام ‘<posix.mk>،’ برای ارائه قواعد پیش‌فرض سازگار با POSIX شمول می‌یابد (include می‌شود). اگر bmake با پرچم -r اجرا شود، تنها ‘posix.mk’ در قواعد پیش‌فرض سهم خواهد داشت. در حالت سازگار با POSIX، اصلاح‌گر جایگزینی به سبک AT&T System V UNIX ابتدا بررسی می‌شود، نه به‌عنوان گزینه پس‌نشست.
صفت .PRECIOUS را به هر یک از منابع مشخص‌شده اعمال می‌کند. اگر منبعی مشخص نشود، صفت .PRECIOUS به همه هدف‌های پرونده اعمال می‌گردد.
صفت فقط‌خواندنی را روی متغیرهای سراسری مشخص‌شده به‌عنوان منبع تنظیم می‌کند.
شلی را که bmake برای اجرای دستورها به کار می‌برد، تعیین می‌کند. منابع، مجموعه‌ای از جفت‌های field=value هستند.
این کمینه‌ترین مشخصه است که برای انتخاب یکی از مشخصه‌های توکار شل؛ یعنی sh، ksh و csh به کار می‌رود.
مسیر مطلق به شل را مشخص می‌کند.
مشخص می‌کند که آیا شل از خروج در هنگام بروز خطا پشتیبانی می‌کند یا خیر.
دستور فعال‌سازی بررسی خطا.
دستور غیرفعال‌سازی بررسی خطا.
دستور فعال‌سازی بازتاب (echo) دستورهای اجراشده.
دستور خاموش کردن بازتاب دستورهای اجراشده.
خروجی که باید پس از صدور دستور quiet فیلتر شود. این معمولاً همسان با quiet است.
پرچمی که برای فعال‌سازی بررسی خطا به شل داده می‌شود.
پرچمی که برای فعال‌سازی بازتاب دستورها به شل داده می‌شود.
رشته متنی لفظی که به شل فرستاده می‌شود و در صورت استفاده خارج از نویسه‌های نقل‌قول، به یک نویسه خط جدید تکی می‌انجامد.
نمونه:
.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 به تمام دستورهای پرونده اعمال می‌گردد.
این هدف هنگامی اجرا می‌شود که یک پرونده وابستگی دارای مدخل‌های کهنه باشد، در حالی که .ALLSRC روی نام آن پرونده وابستگی تنظیم شده است.
هر منبع پسوندی را برای bmake مشخص می‌کند. اگر هیچ منبعی مشخص نشود، تمامی پسوندهای مشخص‌شده پیشین حذف می‌شوند. این ویژگی امکان ایجاد قواعد تبدیل پسوند را فراهم می‌آورد.

نمونه:

.SUFFIXES: .c .o
.c.o:
	cc -o ${.TARGET} -c ${.IMPSRC}
منابع، شاخه‌هایی هستند که باید به مسیر گنجاندن سیستمی اضافه شوند؛ مسیری که bmake در آن به دنبال پرونده‌های ساخت (makefiles) می‌گردد. اگر هیچ منبعی مشخص نشود، هر شاخه‌ای که پیش‌تر مشخص شده بود از مسیر گنجاندن سیستمی حذف می‌شود.

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” تنظیم شده باشد، هرگونه ردپای پشته شامل زنجیره فراخوانی فرایندهای والد خواهد بود.

.depend
فهرست وابستگی‌ها
makefile
نخستین پرونده ساخت پیش‌فرض در صورتی که هیچ makefile در خط فرمان مشخص نشده باشد
Makefile
دومین پرونده ساخت پیش‌فرض در صورتی که هیچ makefile در خط فرمان مشخص نشده باشد
sys.mk
پرونده ساخت سامانه
/usr/share/mk
شاخه پرونده‌های ساخت سامانه

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 نمایید).

نحو پایه‌ای make میان گونه‌های گوناگون make سازگار است؛ با این حال متغیرهای ویژه، پیراینده‌های متغیر و شرطی‌ها سازگار نیستند.

فهرستی ناتمام از دگرگونی‌ها در نسخه‌های پیشین bmake:

روش جایگزینی متغیرهای حلقه .for پس از NetBSD 5.0 دگرگون شد تا همچنان مانند گسترش‌های متغیر به نظر برسند. به‌ویژه این امر از برخورد با آن‌ها به عنوان نحو جلوگیری کرده و برخی دشواری‌های مبهم در به‌کارگیری آن‌ها درون گزاره‌های .if را برطرف می‌کند.

روش زمان‌بندی makeهای موازی در NetBSD 4.0 دگرگون شد تا .ORDER و .WAIT به‌گونه بازگشتی بر گره‌های وابسته اعمال شوند. الگوریتم‌های به‌کاررفته شاید در آینده دوباره تغییر یابند.

دیگر گویش‌های 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). به‌کارگیری پایه‌ای قواعد پسوند (تنها برای پرونده‌های شاخه کنونی، بدون تلاش برای زنجیره‌ای کردن تبدیلات، و مانند آن) نیز به اندازه معقولی حمل‌پذیر است.

mkdep(1)

bmake از make(1) در NetBSD برگرفته شده است. این ابزار از autoconf برای آسان‌سازی حمل‌پذیری به دیگر سکوها بهره می‌برد.

دستور make در Version 7 AT&T UNIX پدیدار شد. این پیاده‌سازی make بر پایه برنامه pmake از Adam de Boor است، که برای Sprite در برکلی نوشته شده بود. این برنامه به عنوان یک make توزیع‌شده موازی برای اجرای وظایف روی ماشین‌های گوناگون با به‌کارگیری یک دیمن به نام “customs”. طراحی شده بود.

از دید تاریخی، هدف/وابستگی FRC برای وادار کردن به بازسازی (FoRCe rebuilding) به کار می‌رفته است (چرا که این هدف/وابستگی وجود ندارد ... مگر آنکه کسی پرونده‌ای به نام FRC بسازد).

نحو bmake برای تجزیه دشوار است. برای نمونه، یافتن پایان کاربرد یک متغیر باید نیازمند پیمایش تک‌تک پیراینده‌ها با استفاده از پایان‌دهنده درست برای هر بخش باشد. در بسیاری از جاها bmake تنها {} و () را به منظور یافتن پایان گسترش متغیر شمارش می‌کند.

هیچ راهی برای گریز دادن نویسه فاصله درون یک نام پرونده وجود ندارد.

در حالت وظایف (jobs)، هنگامی که یک هدف شکست بخورد؛ bmake یک نشانه (توکن) خطا در مخزن نشانه‌های وظیفه قرار می‌دهد. این امر موجب می‌شود تمام نمونه‌های دیگر bmake که از آن مخزن نشانه استفاده می‌کنند، ساخت را متوقف کرده و با کد خطای ۶ خارج شوند. گاهی تلاش برای جلوگیری از آبشاری از خطاهای غیرضروری، می‌تواند به خطای به ظاهر نامشخصِ ‘*** Error code 6’ بینجامد.

July 3, 2026 Linux 6.12.107+deb13-amd64