.\" $NetBSD: make.1,v 1.394 2026/07/03 15:31:34 sjg Exp $ .\" .\" Copyright (c) 1990, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" from: @(#)make.1 8.4 (Berkeley) 3/19/94 .\" .Dd July 3, 2026 .Dt BMAKE 1 .Os .Sh "نام (NAME)" .Nm bmake .Nd نگهداری وابستگی‌های برنامه .Sh "خلاصه دستور (SYNOPSIS)" .Nm .Op Fl BeikNnqrSstWwX .Op Fl C Ar directory .Op Fl D Ar variable .Op Fl d Ar flags .Op Fl f Ar makefile .Op Fl I Ar directory .Op Fl J Ar private .Op Fl j Ar max_jobs .Op Fl m Ar directory .Op Fl T Ar file .Op Fl V Ar variable .Op Fl v Ar variable .Op Ar variable\| Ns Cm \&= Ns Ar value No ... .Op Ar target No ... .Sh "توضیحات (DESCRIPTION)" .Nm برنامه‌ای است که برای آسان‌سازی نگهداری برنامه‌های دیگر طراحی شده است. ورودی آن فهرستی از مشخصات فایل‌هایی است که برنامه‌ها و دیگر پرونده‌ها به آن‌ها وابسته هستند. اگر گزینه .Fl f Ar makefile مشخص نشود، .Nm برای یافتن مشخصات، به دنبال makefileهای فهرست‌شده در .Va .MAKE.MAKEFILE_PREFERENCE (پیش‌فرض .Sq Pa makefile , .Sq Pa Makefile ) می‌گردد. اگر پرونده .Sq Pa .depend وجود داشته باشد، خوانده می‌شود؛ نگاه کنید به .Xr mkdep 1 . .Pp این صفحه راهنما صرفاً به عنوان یک سند مرجع در نظر گرفته شده است. برای شرح جامع‌ترِ .Nm و makefileها، لطفاً رجوع کنید به .%T "PMake \- A Tutorial" (از سال ۱۹۹۳). .Pp .Nm پیش از تجزیه آرگومان‌های خط فرمان، محتویات متغیر محیطی .Ev MAKEFLAGS را به ابتدای آرگومان‌ها می‌افزاید. .Pp گزینه‌ها به شرح زیر هستند: .Bl -tag -width Ds .It Fl B تلاش برای حفظ سازگاری با گذشته از طریق اجرای یک پوسته منفرد برای هر دستور و ساخت متوالی منابع یک خط وابستگی. .It Fl C Ar directory تغییر به .Ar directory پیش از خواندن makefileها یا انجام هر کار دیگر. اگر چندین گزینه .Fl C مشخص شده باشد، هر یک نسبت به گزینه پیشین تفسیر می‌شود: .Fl C Pa / Fl C Pa etc معادل است با .Fl C Pa /etc . .It Fl D Ar variable تعریف .Ar variable برابر با ۱، در حوزه سراسری. .It Fl d Oo Cm \- Oc Ns Ar flags فعال‌سازی اشکال‌زدایی، و تعیین اینکه کدام بخش‌های .Nm اطلاعات اشکال‌زدایی را چاپ کنند. مگر اینکه قبل از پرچم‌ها یک .Ql \- قرار گیرد، آن‌ها به متغیر محیطی .Ev MAKEFLAGS افزوده شده و به تمام فرایندهای فرزند make منتقل می‌شوند. به‌طور پیش‌فرض، اطلاعات اشکال‌زدایی در خروجی خطای استاندارد چاپ می‌شود، اما این مقدار با استفاده از پرچم اشکال‌زدایی .Cm F قابل تغییر است. خروجی اشکال‌زدایی همیشه بدون بافر است؛ علاوه بر این، اگر اشکال‌زدایی فعال باشد اما خروجی اشکال‌زدایی به خروجی استاندارد هدایت نشود، خروجی استاندارد به صورت خط‌به‌خط بافر می‌شود. .Ar flags موجود عبارتند از: .Bl -tag -width Ds .It Cm A چاپ تمام اطلاعات اشکال‌زدایی ممکن؛ معادل مشخص کردن همه پرچم‌های اشکال‌زدایی. .It Cm a چاپ اطلاعات اشکال‌زدایی درباره جستجو و حافظه پنهان (caching) بایگانی‌ها. .It Cm C چاپ اطلاعات اشکال‌زدایی درباره دایرکتوری کاری جاری. .It Cm c چاپ اطلاعات اشکال‌زدایی درباره ارزیابی شرطی. .It Cm d چاپ اطلاعات اشکال‌زدایی درباره جستجو و حافظه پنهان دایرکتوری‌ها. .It Cm e چاپ اطلاعات اشکال‌زدایی درباره دستورها و هدف‌های ناموفق. .It Cm F Ns Oo Cm \&+ Oc Ns Ar filename تعیین محل نوشتن خروجی اشکال‌زدایی. این باید آخرین پرچم باشد، زیرا باقی‌مانده آرگومان را مصرف می‌کند. اگر نویسه بلافاصله پس از پرچم .Cm F برابر با .Ql \&+ باشد، پرونده در حالت الحاق (append) باز می‌شود؛ در غیر این صورت پرونده رونویسی می‌شود. اگر نام پرونده .Ql stdout یا .Ql stderr باشد، خروجی اشکال‌زدایی به ترتیب در خروجی استاندارد یا خروجی خطای استاندارد نوشته می‌شود (و گزینه .Ql \&+ هیچ اثری ندارد). در غیر این صورت، خروجی در پرونده نام‌برده نوشته می‌شود. اگر نام پرونده به .Ql .%d ختم شود، .Ql %d با pid جایگزین می‌شود. .It Cm f چاپ اطلاعات اشکال‌زدایی درباره ارزیابی حلقه. .It Cm g1 چاپ گراف ورودی پیش از ساخت هر چیزی. .It Cm g2 چاپ گراف ورودی پس از ساخت همه چیز، یا پیش از خروج هنگام بروز خطا. .It Cm g3 چاپ گراف ورودی پیش از خروج هنگام بروز خطا. .It Cm h چاپ اطلاعات اشکال‌زدایی درباره عملیات جدول درهم‌سازی (hash table). .It Cm j چاپ اطلاعات اشکال‌زدایی درباره اجرای چندین پوسته. .It Cm L فعال‌سازی بررسی‌های lint. این گزینه هنگام انتساب متغیر، در صورت وجود خطای تجزیه خطا صادر می‌کند تا نام پرونده و شماره خط در دسترس باشند. .It Cm l چاپ دستورها در Makefile بدون در نظر گرفتن اینکه آیا با پیشوند .Ql @ یا سایر پرچم‌های .Dq quiet همراه هستند یا خیر. همچنین با عنوان رفتار .Dq loud شناخته می‌شود. .It Cm M چاپ اطلاعات اشکال‌زدایی درباره تصمیم‌های حالت .Dq meta پیرامون هدف‌ها. .It Cm m چاپ اطلاعات اشکال‌زدایی درباره ساخت هدف‌ها، شامل تاریخ‌های تغییر. .It Cm n عدم حذف اسکریپت‌های موقت فرمان که هنگام اجرای دستورها ایجاد شده‌اند. این اسکریپت‌های موقت در دایرکتوری ارجاع‌شده توسط متغیر محیطی .Ev TMPDIR ایجاد می‌شوند، یا در .Pa /tmp اگر .Ev TMPDIR تنظیم نشده باشد یا روی رشته خالی تنظیم شده باشد. اسکریپت‌های موقت توسط .Xr mkstemp 3 ایجاد می‌شوند و نام‌هایی به فرم .Pa makeXXXXXX دارند. .Em نکته : این کار می‌تواند پرونده‌های زیادی در .Ev TMPDIR یا .Pa /tmp ایجاد کند، بنابراین با احتیاط استفاده شود. .It Cm p چاپ اطلاعات اشکال‌زدایی درباره تجزیه makefile. .It Cm s چاپ اطلاعات اشکال‌زدایی درباره قواعد تبدیل پسوند (suffix-transformation rules). .It Cm t چاپ اطلاعات اشکال‌زدایی درباره نگهداری فهرست هدف‌ها (target list). .It Cm V اجبار گزینه .Fl V به چاپ مقادیر خام متغیرها، که رفتار پیش‌فرض تنظیم‌شده از طریق .Va .MAKE.EXPAND_VARIABLES را لغو می‌کند. .It Cm v چاپ اطلاعات اشکال‌زدایی درباره مقداردهی و بسط متغیرها. .It Cm x اجرای دستورهای پوسته با .Fl x تا دستورهای واقعی هنگام اجرا چاپ شوند. .El .It Fl e اجازه می‌دهد متغیرهای محیطی، متغیرهای سراسری درون makefileها را بازنویسی کنند. .It Fl f Ar makefile مشخص کردن یک makefile برای خواندن به جای یکی از موارد پیش‌فرض فهرست‌شده در .Va .MAKE.MAKEFILE_PREFERENCE . اگر .Ar makefile برابر با .Ql \&- باشد، ورودی استاندارد خوانده می‌شود. اگر .Ar makefile با رشته .Ql \&.../ آغاز شود، .Nm مسیر مشخص‌شده در ادامه آرگومان را در پوشه جاری و پوشه‌های والد آن جستجو می‌کند. می‌توان چندین makefile مشخص کرد که به همان ترتیب تعیین‌شده خوانده می‌شوند. .It Fl I Ar directory مشخص کردن پوشه‌ای برای جستجوی makefileها و makefileهای گنجانده‌شده (included). پوشه makefile سیستم (یا پوشه‌ها، گزینه .Fl m را ببینید) به طور خودکار به عنوان بخشی از این فهرست گنجانده می‌شود. .It Fl i نادیده گرفتن خروج غیرصفر دستورهای پوسته در makefile. معادل با مشخص کردن .Ql \&- پیش از هر خط دستور در makefile. .It Fl J Ar private این گزینه .Em نباید توسط کاربر مشخص شود. .Pp هنگامی که گزینه .Fl j در یک ساخت بازگشتی (recursive build) استفاده می‌شود، این گزینه توسط make به makeهای فرزند ارسال می‌گردد تا تمام فرآیندهای make در فرایند ساخت بتوانند برای جلوگیری از تحمیل بار بیش از حد به سیستم همکاری کنند. .It Fl j Ar max_jobs مشخص کردن بیشینه تعداد کارهایی که .Nm می‌تواند در هر لحظه به صورت هم‌زمان در حال اجرا داشته باشد. اگر .Ar max_jobs یک عدد ممیز شناور باشد، یا به .Ql C ختم شود، آن‌گاه این مقدار در تعداد پردازنده‌هایی که توسط .Xr sysconf 3 به عنوان آنلاین گزارش شده‌اند ضرب می‌شود. مقدار .Ar max_jobs در .Va .MAKE.JOBS ذخیره می‌شود. حالت سازگاری را غیرفعال می‌کند، مگر اینکه گزینه .Fl B نیز مشخص شده باشد. هنگامی که حالت سازگاری خاموش است، تمام دستورهای مربوط به یک هدف در یک فراخوانی منفرد پوسته اجرا می‌شوند، بر خلاف روش سنتی که یک پوسته برای هر خط فراخوانی می‌شد. این امر می‌تواند اسکریپت‌های سنتی را که با هر فراخوانی دستور، پوشه را تغییر داده و سپس انتظار دارند در خط بعد با محیطی تازه شروع به کار کنند، با شکست مواجه کند. اصلاح اسکریپت‌ها کارآمدتر از فعال کردن سازگاری رو به عقب است. .Pp یک مخزن نشانه‌های کار با .Ar max_jobs نشانه برای مهار تعداد کل کارهای در حال اجرا استفاده می‌شود. هر نمونه از .Nm پیش از اجرای یک کار تازه، منتظر یک نشانه از مخزن خواهد ماند. .It Fl k ادامه پردازش پس از مواجهه با خطاها، اما فقط بر روی آن هدف‌هایی که به هدفی که ساخت آن باعث خطا شده است وابسته نیستند. .It Fl m Ar directory مشخص کردن پوشه‌ای برای جستجوی .Pa sys.mk و makefileهای گنجانده‌شده از طریق عبارت include به سبک .Li \&< Ns Ar file Ns Li \&> Ns -style . گزینه .Fl m می‌تواند چندین بار برای تشکیل مسیر جستجو استفاده شود. این مسیر، مسیر پیش‌فرض include سیستم .Pa /usr/share/mk را بازنویسی می‌کند. علاوه بر این، مسیر include سیستم به مسیر جستجوی مورد استفاده برای عبارت‌های include به سبک .Li \*q Ns Ar file Ns Li \*q Ns -style افزوده می‌شود (گزینه .Fl I را ببینید). مسیر include سیستم را می‌توان از طریق متغیر فقط‌خواندنی .Va .SYSPATH ارجاع داد. .Pp اگر نام یک پوشه در آرگومان .Fl m (یا متغیر محیطی .Ev MAKESYSPATH ) با رشته .Ql \&.../ آغاز شود، .Nm پرونده یا پوشه مشخص‌شده در بخش باقی‌مانده رشته آرگومان را جستجو می‌کند. جستجو از پوشه جاری آغاز شده و سپس به سمت ریشه سیستم فایل به بالا پیش می‌رود. اگر جستجو موفقیت‌آمیز باشد، پوشه حاصل جایگزین تعیین .Ql \&.../ در آرگومان .Fl m می‌شود. این ویژگی به .Nm امکان می‌دهد تا به آسانی در درخت مبدأ جاری به دنبال پرونده‌های سفارشی‌شده .Pa sys.mk بگردد (برای نمونه با استفاده از .Ql \&.../mk/sys.mk به عنوان یک آرگومان). .It Fl n نمایش دستورهایی که اجرا می‌شدند، بدون اجرای واقعی آن‌ها؛ مگر اینکه هدف به منبع ویژه .Va .MAKE وابسته باشد (پایین‌تر را ببینید) یا پیشوند دستور .Sq Cm + باشد. .It Fl N نمایش دستورهایی که اجرا می‌شدند، اما هیچ‌کدام را واقعاً اجرا نمی‌کند؛ برای اشکال‌زدایی makefileهای سطح بالا بدون ورود به زیرپوشه‌ها سودمند است. .It Fl q هیچ دستوری را اجرا نمی‌کند، در عوض اگر هدف‌های مشخص‌شده به‌روز باشند با وضعیت 0 و در غیر این صورت با 1 خارج می‌شود. .It Fl r از قواعد توکار مشخص‌شده در makefile سیستم استفاده نمی‌کند. .It Fl S در صورت مواجهه با خطا، پردازش را متوقف می‌کند. این رفتار پیش‌فرض و نقطه مقابل .Fl k است. .It Fl s هیچ دستوری را هنگام اجرا بازتاب نمی‌دهد. معادل با مشخص کردن .Sq Ic @ پیش از هر خط دستور در makefile. .It Fl T Ar tracefile هنگام استفاده با پرچم .Fl j ، یک رکورد ردگیری به .Ar tracefile برای هر کار آغازشده و پایان‌یافته اضافه می‌کند. .It Fl t به جای بازسازی یک هدف طبق makefile، آن را ایجاد کرده یا زمان ویرایش آن را به‌روزرسانی می‌کند تا به‌روز به نظر برسد. .It Fl V Ar variable چاپ مقدار .Ar variable . هیچ هدفی ساخته نمی‌شود. می‌توان چندین نمونه از این گزینه را مشخص کرد؛ متغیرها در هر خط یکی چاپ می‌شوند، همراه با یک خط خالی برای هر متغیر تهی یا تعریف‌نشده. مقدار چاپ‌شده پس از خوانده شدن تمام makefileها از حوزه سراسری استخراج می‌شود. .Pp به‌طور پیش‌فرض، محتوای خام متغیر (که ممکن است شامل ارجاع‌های متغیر بسط‌نیافته اضافی باشد) نمایش داده می‌شود. اگر .Ar variable شامل یک .Ql \&$ باشد، نه به عنوان نام متغیر بلکه به عنوان یک عبارت تفسیر می‌شود. مقدار آن پیش از چاپ بسط داده می‌شود. همچنین اگر .Va .MAKE.EXPAND_VARIABLES روی true تنظیم شده باشد و گزینه .Fl dV برای بازنویسی آن به کار نرفته باشد، مقدار پیش از چاپ بسط داده می‌شود. .Pp توجه داشته باشید که متغیرهای محلی حلقه و محلی هدف، و همچنین مقادیری که به صورت موقت توسط متغیرهای سراسری در طول پردازش makefile گرفته می‌شوند، از طریق این گزینه در دسترس نیستند. حالت اشکال‌زدایی .Fl dv می‌تواند برای مشاهده این موارد به قیمت تولید خروجی‌های اضافی قابل توجه استفاده شود. .It Fl v Ar variable همانند .Fl V ، اما تمام متغیرهای چاپ‌شده همواره به مقدار کامل خود بسط داده می‌شوند. آخرین رخداد .Fl V یا .Fl v تعیین می‌کند که آیا همه متغیرها بسط داده شوند یا خیر. .It Fl W برخورد با هرگونه هشدار در زمان تجزیه makefile به‌عنوان خطا. .It Fl w چاپ پیام‌های ورود به شاخه و خروج از آن، پیش و پس از پردازش. .It Fl X متغیرهای منتقل‌شده در خط فرمان را به‌صورت جداگانه به متغیرهای محیطی صادر .Pq export نکن. متغیرهای منتقل‌شده در خط فرمان همچنان از طریق متغیر محیطی .Ev MAKEFLAGS صادر می‌شوند. این گزینه می‌تواند در سامانه‌هایی که محدودیت کمی برای اندازه آرگومان‌های فرمان دارند سودمند باشد. .It Ar variable\| Ns Cm \&= Ns Ar value تنظیم مقدار متغیر .Ar variable بر روی .Ar value . به‌طور معمول، تمام مقادیر منتقل‌شده در خط فرمان به زیر-makeها در محیط نیز صادر می‌شوند. پرچم .Fl X این رفتار را غیرفعال می‌کند. انتساب‌های متغیر برای سازگاری با POSIX باید پس از گزینه‌ها بیایند، اما هیچ ترتیبی اجبار نمی‌شود. .El .Pp چندین نوع خط گوناگون در یک makefile وجود دارد: مشخصات وابستگی، دستورهای شل، انتساب‌های متغیر، عبارت‌های شمول .Pq include ، رهنمودهای شرطی، حلقه‌های for، دیگر رهنمودها، و یادداشت‌ها. .Pp خطوط را می‌توان با قرار دادن یک ممیز وارونه .Pq Ql \e در پایان آن‌ها، از یک خط به خط بعدی امتداد داد. نویسه خط جدید پایانی و فاصله‌های خالی آغازین در خط بعد در قالب یک فاصله تکی فشرده می‌شوند. .Sh "مشخصات وابستگی پرونده (FILE DEPENDENCY SPECIFICATIONS)" خطوط وابستگی شامل یک یا چند هدف، یک عملگر، و صفر یا چند منبع هستند. این ساختار رابطه‌ای ایجاد می‌کند که در آن هدف‌ها به منابع .Dq وابسته هستند و به‌طور معمول از آن‌ها ساخته می‌شوند. یک هدف در صورتی که وجود نداشته باشد، یا زمان ویرایش آن قدیمی‌تر از هر یک از منابعش باشد، کهنه در نظر گرفته می‌شود. یک هدف کهنه دوباره ساخته می‌شود، اما تنها پس از آنکه تمام منابع بررسی شده و خود در صورت نیاز دوباره ساخته شده باشند. سه عملگر را می‌توان به کار برد: .Bl -tag -width flag .It Ic \&: بسیاری از خطوط وابستگی می‌توانند این هدف را نام ببرند اما تنها یکی می‌تواند دستورهای شل پیوست‌شده داشته باشد. تمام منابع نام‌برده در همه خطوط وابستگی همراه با یکدیگر در نظر گرفته می‌شوند، و در صورت نیاز دستورهای شل پیوست‌شده برای ایجاد یا ساخت دوباره هدف اجرا می‌شوند. اگر اجرای .Nm متوقف شود، هدف حذف می‌گردد. .It Ic \&! مشابه حالت پیش، اما هدف همواره چه کهنه باشد چه نباشد، دوباره ساخته می‌شود. .It Ic \&:: هر خط وابستگی می‌تواند دستورهای شل پیوست‌شده داشته باشد، اما با هر کدام به‌طور مستقل رفتار می‌شود: منابع آن بررسی شده و اگر هدف نسبت به (تنها) آن منابع کهنه باشد، دستورهای شل پیوست‌شده اجرا می‌شوند. بدین ترتیب، بسته به شرایط، ممکن است دسته‌های گوناگونی از دستورهای شل پیوست‌شده به اجرا درآیند. افزون بر این، برخلاف .Ic \&: ، برای خطوط وابستگی بدون منبع، دستورهای شل پیوست‌شده همواره اجرا می‌شوند. همچنین برخلاف .Ic \&: ، اگر اجرای .Nm متوقف شود، هدف حذف نمی‌گردد. .El .Pp تمام خطوط وابستگی که به یک هدف معین اشاره دارند باید از همان عملگر استفاده کنند. .Pp هدف‌ها و منابع می‌توانند شامل مقادیر نویسه عام شل .Ql \&? ، .Ql * ، .Ql [] ، و .Ql {} باشند. مقادیر .Ql \&? ، .Ql * ، و .Ql [] تنها می‌توانند به‌عنوان بخشی از بخش پایانی هدف یا منبع استفاده شوند، و تنها با پرونده‌های موجود مطابقت می‌یابند. مقدار .Ql {} لزوماً نیازی نیست برای توصیف پرونده‌های موجود به کار رود. بسط به ترتیب شاخه انجام می‌شود، نه به ترتیب الفبایی آن‌گونه که در شل صورت می‌گیرد. .Sh "دستورهای شل (SHELL COMMANDS)" هر هدف می‌تواند یک یا چند خط از دستورهای شل همراه خود داشته باشد، که به‌طور معمول برای ساخت هدف به کار می‌روند. پیش از هر خط در این اسکریپت .Em باید یک نویسه تب (tab) قرار گیرد. (به دلایل تاریخی، فاصله پذیرفته نیست.) در حالی که هدف‌ها در صورت تمایل می‌توانند در چندین خط وابستگی حضور یابند، به‌طور پیش‌فرض تنها یکی از این قواعد می‌تواند دارای اسکریپت ساخت باشد. اما اگر عملگر .Sq Ic \&:: استفاده شود، تمام قواعد می‌توانند دارای اسکریپت باشند، و اسکریپت‌های مربوطه به ترتیبی که یافت شوند اجرا می‌گردند. .Pp با هر خط به‌عنوان یک دستور شل مستقل رفتار می‌شود، مگر آن‌که انتهای خط با یک ممیز وارونه .Ql \e گریخته (escape) شده باشد، که در این صورت آن خط و خط پس از آن یکی می‌شوند. اگر نویسه‌های نخستین دستور هر ترکیبی از .Sq Ic @ ، .Sq Ic + ، یا .Sq Ic \- باشند، با دستور به‌گونه‌ای ویژه رفتار می‌شود. .Bl -tag -offset indent -width indent .It Ic @ باعث می‌شود دستور پیش از اجرا در خروجی بازتاب (echo) داده نشود. .It Ic + باعث می‌شود دستور حتی در صورت تعیین .Fl n اجرا گردد. این ویژگی شبیه اثر منبع ویژه .Va .MAKE است، با این تفاوت که اثر آن می‌تواند به یک خط منفرد از اسکریپت محدود شود. .It Ic \- در حالت سازگاری (compatibility mode) باعث نادیده گرفته شدن هرگونه وضعیت خروج غیرصفر خط فرمان می‌شود. .Pp هنگامی که .Nm در حالت کارها (jobs mode) با .Fl j Ar max_jobs اجرا می‌شود، کل اسکریپت برای هدف به یک نمونه منفرد از شل داده می‌شود. در حالت سازگاری (غیر از کارها)، هر دستور در یک فرایند جداگانه اجرا می‌گردد. اگر دستور حاوی هر یک از فرا-نویسه‌های (meta-characters) شل .Pq Ql #=|^(){};&<>*?[]:$`\e\en باشد، به شل منتقل می‌شود؛ در غیر این صورت .Nm برای اجرای مستقیم تلاش می‌کند. اگر خطی با .Sq Ic \- آغاز شود و شل دارای ErrCtl فعال باشد، شکست خط فرمان همانند حالت سازگاری نادیده گرفته می‌شود. در غیر این صورت .Sq Ic \- بر کل کار اثر می‌گذارد؛ اسکریپت در اولین خط فرمانی که شکست بخورد متوقف می‌شود، اما هدف شکست‌خورده تلقی نمی‌گردد. .El .Pp makefileها باید به گونه‌ای نوشته شوند که حالت اجرای .Nm رفتار آن‌ها را دگرگون نسازد. برای نمونه، هر دستوری که بدون قصد تغییر شاخه برای دستورهای بعدی از .Dq cd یا .Dq chdir استفاده می‌کند، باید در پرانتز قرار داده شود تا در یک زیر-شل اجرا گردد. برای اجبار به استفاده از یک شل واحد، شکست‌های خط را بگریزید تا کل اسکریپت به یک دستور تبدیل شود. برای نمونه: .Bd -literal -offset indent 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)"; \e (cd ${.CURDIR} && ${MAKE} $@); \e echo "Back in $$(pwd)" .Ed .Pp از آنجا که .Nm پیش از اجرای هر هدفی شاخه کاری جاری را به .Sq Va .OBJDIR تغییر می‌دهد، هر فرایند فرزند با آن به‌عنوان شاخه کاری جاری خود آغاز می‌شود..Sh "انتساب متغیرها (VARIABLE ASSIGNMENTS)" متغیرها در make رفتاری بسیار شبیه به ماکروها در پیش‌پردازنده C دارند. .Pp انتساب‌های متغیر دارای ساختار .Sq Ar NAME Ar op Ar value هستند، که در آن: .Bl -tag -offset Ds -width Ds .It Ar NAME نام متغیر تک‌کلمه‌ای است، که بر اساس سنت، از حروف کاملاً بزرگ تشکیل شده است، .It Ar op یکی از عملگرهای انتساب متغیر است که در ادامه تشریح شده‌اند، و .It Ar value بسته به عملگر انتساب متغیر تفسیر می‌شود. .El .Pp فاصله‌های خالی پیرامون .Ar NAME , .Ar op و .Ar value نادیده گرفته می‌شوند. .Ss "عملگرهای انتساب متغیر (Variable assignment operators)" پنج عملگری که مقادیر را به متغیرها اختصاص می‌دهند عبارتند از: .Bl -tag -width Ds .It Ic \&= اختصاص مقدار به متغیر. هر مقدار قبلی بازنویسی می‌شود. .It Ic \&+= افزودن مقدار به مقدار فعلی متغیر، با جدا کردن آن‌ها با یک فاصله تکی. .It Ic \&?= اختصاص مقدار به متغیر، چنانچه از پیش تعریف نشده باشد. .It Ic \&:= گسترش مقدار، سپس اختصاص آن به متغیر. .Pp .Em "نکته" : ارجاعات به متغیرهای تعریف‌نشده .Em گسترش نمی‌یابند . این امر می‌تواند هنگام استفاده از اصلاح‌کننده‌های متغیر مشکلاتی ایجاد کند. .\" See var-op-expand.mk, the section with LATER and INDIRECT. .It Ic \&!= گسترش مقدار و ارسال آن به پوسته جهت اجرا، سپس اختصاص خروجی استاندارد فرایند فرزند به متغیر. هر نویسه خط جدید در نتیجه با فاصله جایگزین می‌شود. .El .Ss "گسترش متغیرها (Expansion of variables)" در بیشتر زمینه‌هایی که متغیرها گسترش می‌یابند، .Ql \&$$ به یک علامت دلار تکی گسترش می‌یابد. در سایر زمینه‌ها (اکثر اصلاح‌کننده‌های متغیر، رشته‌های تحت‌اللفظی در شرط‌ها)، .Ql \&\e$ به یک علامت دلار تکی گسترش می‌یابد. .Pp ارجاع به متغیرها دارای ساختار .Cm \&${ Ns Ar name Ns Oo Ns Cm \&: Ns Ar modifiers Oc Ns Cm \&} یا .Cm \&$( Ns Ar name Ns Oo Ns Cm \&: Ns Ar modifiers Oc Ns Cm \&) است. اگر نام متغیر تنها از یک نویسه تشکیل شده باشد و عبارت شامل هیچ اصلاح‌کننده‌ای نباشد، آکولادها یا پرانتزهای احاطه‌کننده الزامی نیستند. استفاده از این شکل کوتاه‌تر توصیه نمی‌شود. .Pp اگر نام متغیر شامل یک علامت دلار باشد، ابتدا خود نام گسترش می‌یابد. این امر امکان استفاده از نام‌های متغیر تقریباً دلخواه را فراهم می‌کند، با این حال بهتر است جداً از نام‌های حاوی دلار، آکولاد، پرانتز یا فاصله خالی پرهیز شود. .Pp اگر نتیجه گسترش یک عبارت متغیر تودرتو شامل یک علامت دلار باشد .Pq Ql \&$ , نتیجه مشمول گسترش بیشتر خواهد بود. .Pp جایگزینی متغیر در چهار زمان مجزا رخ می‌دهد، بسته به جایی که متغیر در آن استفاده می‌شود. .Bl -enum .It متغیرها در خطوط وابستگی به هنگام خوانده شدن خط گسترش می‌یابند. .It متغیرها در عبارات شرطی به صورت مجزا گسترش می‌یابند، اما تنها تا حدی که برای تعیین نتیجه شرط لازم است. .It متغیرها در دستورات پوسته هنگام اجرای دستور پوسته گسترش می‌یابند. .It متغیرهای شاخص حلقه .Ic .for در هر تکرار حلقه گسترش می‌یابند. توجه داشته باشید که سایر متغیرها هنگام تشکیل بدنه حلقه گسترش نمی‌یابند، بنابراین در نمونه کد زیر: .Bd -literal -offset indent \&.for i in 1 2 3 a+= ${i} j= ${i} b+= ${j} \&.endfor all: @echo ${a} @echo ${b} .Ed .Pp چاپ می‌شود: .Bd -literal -offset indent 1 2 3 3 3 3 .Ed .Pp پس از اجرای حلقه: .Bl -tag -offset indent -width indent .It Va a شامل .Ql ${:U1} ${:U2} ${:U3} است، که به .Ql 1 2 3 گسترش می‌یابد. .It Va j شامل .Ql ${:U3} است، که به .Ql 3 گسترش می‌یابد. .It Va b شامل .Ql ${j} ${j} ${j} است، که به .Ql ${:U3} ${:U3} ${:U3} و در ادامه به .Ql 3 3 3 گسترش می‌یابد. .El .El .Ss "دسته‌های متغیر (Variable classes)" چهار دسته مختلف متغیرها (به ترتیب افزایش اولویت) عبارتند از: .Bl -tag -width Ds .It "متغیرهای محیطی (Environment variables)" متغیرهای تعریف‌شده به عنوان بخشی از محیط .Nm . .It "متغیرهای سراسری (Global variables)" متغیرهای تعریف‌شده در makefile یا در makefileهای ضمیمه‌شده. .It "متغیرهای خط فرمان (Command line variables)" متغیرهای تعریف‌شده به عنوان بخشی از خط فرمان. .It "متغیرهای محلی (Local variables)" متغیرهایی که اختصاصاً برای یک هدف معین تعریف شده‌اند. .El .Pp متغیرهای محلی را می‌توان روی خط وابستگی مقداردهی کرد، مگر اینکه .Va .MAKE.TARGET_LOCAL_VARIABLES بر روی .Ql false تنظیم شده باشد. باقی‌مانده خط (که متغیرهای سراسری آن از پیش گسترش یافته‌اند) مقدار متغیر خواهد بود. برای مثال: .Bd -literal -offset indent COMPILER_WRAPPERS= ccache distcc icecc ${OBJS}: .MAKE.META.CMP_FILTER=${COMPILER_WRAPPERS:S,^,N,} .Ed .Pp تنها اهداف .Ql ${OBJS} تحت تأثیر آن فیلتر (در حالت .Dq meta ) قرار می‌گیرند و صرفاً با فعال یا غیرفعال کردن هر یک از غلاف‌های کامپایلر (compiler wrappers)، تمام آن اهداف نیازمند بازسازی (out-of-date) نمی‌شوند. .Pp .Em "نکته" : انتساب‌های متغیر محلیِ هدف رفتار متفاوتی دارند بدین گونه که: .Bl -tag -width Ds -offset indent .It Ic \&+= تنها به انتساب محلی پیشین برای همان هدف و متغیر می‌افزاید. .It Ic \&:= نسبت به متغیرهای سراسری که پیش‌تر گسترش یافته‌اند، حشو (افزونه) است. .El .Pp متغیرهای محلی توکار عبارتند از: .Bl -tag -width ".Va .ARCHIVE" -offset indent .It Va .ALLSRC فهرست تمام منابع برای این هدف؛ همچنین معروف به .Sq Va \&> یا .Sq Va \&^ . .It Va .ARCHIVE نام فایل آرشیو؛ همچنین معروف به .Sq Va \&! . .It Va .IMPSRC در قواعد تبدیل پسوند، نام/مسیر منبعی که هدف باید از آن تبدیل شود (منبع .Dq ضمنی )؛ همچنین معروف به .Sq Va \&< . این متغیر در قواعد صریح تعریف نشده است. .It Va .MEMBER نام عضو آرشیو؛ همچنین معروف به .Sq Va % . .It Va .OODATE فهرست منابعی برای این هدف که منسوخ (out-of-date) تشخیص داده شده‌اند؛ همچنین معروف به .Sq Va \&? . .It Va .PREFIX نام هدف با پسوند حذف‌شده (در صورتی که در .Ic .SUFFIXES اعلام شده باشد)؛ همچنین با نام .Sq Va * شناخته می‌شود. .It Va .TARGET نام هدف؛ همچنین با نام .Sq Va @ . برای سازگاری با دیگر نسخه‌های make، در قواعد اعضای بایگانی این متغیر نام مستعاری برای .Va .ARCHIVE است. .El .Pp شکل‌های کوتاه‌تر .Po .Sq Va \&> , .Sq Va \&^ , .Sq Va \&! , .Sq Va \&< , .Sq Va \&% , .Sq Va \&? , .Sq Va \&* , و .Sq Va \&@ .Pc تنها به منظور سازگاری پس‌رو با makefileهای قدیمی و نسخه موروثی POSIX make مجاز شمرده شده‌اند و توصیه نمی‌شوند. .Pp گونه‌های این متغیرها که در آن‌ها بلافاصله پس از علامت نقطه‌گذاری نویسه .Ql D یا .Ql F , می‌آید، مانند .Ql $(@D) , شکل‌های موروثی و معادل با استفاده از تغییردهنده‌های .Ql :H و .Ql :T هستند. این شکل‌ها برای سازگاری با makefileهای .At V و POSIX پذیرفته می‌شوند اما توصیه نمی‌گردند. .Pp چهار مورد از متغیرهای محلی را می‌توان در منابع خطوط وابستگی به کار برد، زیرا به مقدار مناسب برای هر هدف موجود در آن خط بسط می‌یابند. این متغیرها عبارتند از: .Sq Va .TARGET , .Sq Va .PREFIX , .Sq Va .ARCHIVE , و .Sq Va .MEMBER . .Ss "متغیرهای توکار اضافی (Additional built-in variables)" علاوه بر این، .Nm متغیرهای زیر را تنظیم می‌کند یا از آن‌ها آگاهی دارد: .Bl -tag .\" NB: This list is sorted case-insensitive, ignoring punctuation. .\" NB: To find all built-in variables in make's source code, .\" NB: search for Var_*, Global_*, SetVarObjdir, GetBooleanExpr, .\" NB: and the implementation of Var_SetWithFlags. .\" NB: Last synced on 2023-01-01. .It Va .ALLTARGETS فهرست تمامی اهداف دیده‌شده در makefileها. اگر در طول تجزیه makefile ارزیابی شود، تنها اهدافی را که تا آن لحظه دیده شده‌اند فهرست می‌کند. .It Va .CURDIR مسیری به پوشه‌ای که .Nm در آن اجرا شده است. برای جزئیات بیشتر به شرح .Sq Va PWD مراجعه کنید. .It Va .ERROR_CMD در رسیدگی به خطا به کار می‌رود؛ ببینید: .Va MAKE_PRINT_VAR_ON_ERROR . .It Va .ERROR_CWD در رسیدگی به خطا به کار می‌رود؛ ببینید: .Va MAKE_PRINT_VAR_ON_ERROR . .It Va .ERROR_EXIT در رسیدگی به خطا به کار می‌رود؛ ببینید: .Va MAKE_PRINT_VAR_ON_ERROR . .It Va .ERROR_META_FILE در رسیدگی به خطا در حالت .Dq meta به کار می‌رود؛ ببینید: .Va MAKE_PRINT_VAR_ON_ERROR . .It Va .ERROR_TARGET در رسیدگی به خطا به کار می‌رود؛ ببینید: .Va MAKE_PRINT_VAR_ON_ERROR . .It Va .INCLUDEDFROMDIR پوشه پرونده‌ای که این makefile از آن فراخوانی (include) شده است. .It Va .INCLUDEDFROMFILE نام پرونده‌ای که این makefile از آن فراخوانی (include) شده است. .\" .INCLUDES is intentionally undocumented, as it is obsolete. .\" .LIBS is intentionally undocumented, as it is obsolete. .It Va MACHINE نام سخت‌افزار دستگاه؛ ببینید: .Xr uname 1 . .It Va MACHINE_ARCH نام معماری پردازنده دستگاه؛ ببینید: .Xr uname 1 . .It Va MAKE نامی که .Nm با آن اجرا شده است .Pq Va argv[0] . .It Va .MAKE برای سازگاری، همانند .Va MAKE است. متغیر ارجح برای استفاده، متغیر محیطی .Ev MAKE است؛ زیرا با سایر نسخه‌های make سازگاری بیشتری دارد و با هدف ویژه‌ای با همین نام اشتباه گرفته نمی‌شود. .\" '.MAKE.cmd_filtered' is intentionally undocumented, .\" as it is an internal implementation detail. .It Va .MAKE.DEPENDFILE نام makefile (به طور پیش‌فرض .Sq Pa .depend ) را مشخص می‌کند که وابستگی‌های تولیدشده از آن خوانده می‌شوند. .It Va .MAKE.DIE_QUIETLY اگر روی .Ql true تنظیم شود، اطلاعات خطا را در پایان چاپ نمی‌کند. .It Va .MAKE.EXPAND_VARIABLES یک مقدار بولی که رفتار پیش‌فرض گزینه .Fl V را مهار می‌کند. اگر true باشد، مقادیر متغیرها هنگام چاپ با .Fl V به طور کامل بسط می‌یابند؛ اگر false باشد، محتوای خام متغیر (که ممکن است شامل ارجاعات اضافی به متغیرهای بسط‌نیافته باشد) نمایش داده می‌شود. .It Va .MAKE.EXPORTED فهرست متغیرهای برون‌ریزی‌شده توسط .Nm . .It Va MAKE_VERSION این متغیر نسخه .Nm را نشان می‌دهد. معمولاً تاریخ آخرین درون‌ریزی از NetBSD است. برای بررسی در دسترس بودن برخی ویژگی‌ها سودمند است. .It Va MAKEFILE سطح‌بالاترین makefile که هم‌اکنون خوانده می‌شود، همان‌طور که در خط فرمان داده شده است. .It Va .MAKEFLAGS متغیر محیطی .Sq Ev MAKEFLAGS می‌تواند شامل هر آن چیزی باشد که ممکن است در خط فرمان .Nm تعیین شود. هر آنچه در خط فرمان .Nm مشخص گردد به متغیر .Va .MAKEFLAGS افزوده می‌شود، که سپس به محیط اجرای تمامی برنامه‌هایی که توسط .Nm اجرا می‌شوند اضافه خواهد شد. .It Va .MAKE.GID شناسه عددی گروه کاربری که .Nm را اجرا می‌کند. این متغیر فقط‌خواندنی است. .It Va .MAKE.JOB.PREFIX اگر .Nm با .Fl j اجرا شود، خروجی هر هدف با نشانه .Dl --- Ar target Li --- پیشوند می‌گیرد که بخش نخست آن از طریق .Va .MAKE.JOB.PREFIX قابل کنترل است. اگر .Va .MAKE.JOB.PREFIX تهی باشد، هیچ نشانه‌ای چاپ نمی‌شود. برای نمونه، با مقداردهی .Va .MAKE.JOB.PREFIX به .Ql ${.newline}---${.MAKE:T}[${.MAKE.PID}] نشانه‌هایی مانند .Dl ---make[1234] Ar target Li --- تولید می‌شود که ردیابی میزان هم‌زمانی به‌دست‌آمده را آسان‌تر می‌سازد. .It Va .MAKE.JOBS آرگومان ورودی گزینه .Fl j . .It Va .MAKE.JOBS.C یک مقدار بولی فقط‌خواندنی که مشخص می‌کند آیا گزینه .Fl j از کاربرد .Ql C پشتیبانی می‌کند یا خیر. .It Va .MAKE.LEVEL عمق بازگشتی .Nm . نمونه سطح‌بالای .Nm دارای سطح 0 است، و هر make فرزند، سطح والد خود به علاوه ۱ را دریافت می‌کند. این امر بررسی‌هایی مانند: .Li .if ${.MAKE.LEVEL} == 0 را امکان‌پذیر می‌سازد تا از مواردی که تنها باید در نمونه سطح‌بالای .Nm ارزیابی شوند محافظت گردد. .It Va .MAKE.LEVEL.ENV نام متغیر محیطی که سطح فراخوانی‌های تو در تو به .Nm را ذخیره می‌کند. .It Va .MAKE.MAKEFILE_PREFERENCE فهرست مرتب‌شده‌ای از نام‌های makefile (پیش‌فرض .Sq Pa makefile , .Sq Pa Makefile ) که .Nm به دنبال آن‌ها می‌گردد. .It Va .MAKE.MAKEFILES فهرست makefileهای خوانده‌شده توسط .Nm که برای ردیابی وابستگی‌ها سودمند است. هر makefile بدون در نظر گرفتن تعداد دفعات خوانده شدن، تنها یک بار ثبت می‌شود. .It Va .MAKE.META.BAILIWICK در حالت .Dq meta , فهرستی از پیشوندهایی را فراهم می‌کند که با پوشه‌های تحت کنترل .Nm هم‌خوانی دارند. اگر پرونده‌ای که خارج از .Va .OBJDIR اما درون حوزه یادشده ایجاد شده است موجود نباشد، هدف فعلی قدیمی تلقی می‌شود. .It Va .MAKE.META.CMP_FILTER در حالت .Dq meta , گاهی پالایش خطوط دستور پیش از مقایسه می‌تواند سودمند باشد. این متغیر می‌تواند شامل فهرستی از تغییردهنده‌ها باشد که با .Ql \&: به یکدیگر متصل شده و به هر خط از دستورهای کهنه و نو که دارای تفاوت هستند اعمال می‌شوند. چنانچه دستورهای پالایش‌شده همچنان تفاوت داشته باشند، هدف قدیمی در نظر گرفته می‌شود. .It Va .MAKE.META.FILTER در حالت .Dq meta , پالایش بخش عمده داده‌های درون پرونده meta می‌تواند سودمند باشد. به عنوان نمونه، هنگامی که یک درخت ساخت از پیش آماده جابه‌جا یا همسان‌سازی می‌شود، بدون پالایه‌ای برای جایگزینی مکان پیشین با مکان جدید، تمامی هدف‌ها قدیمی در نظر گرفته خواهند شد. این متغیر مشابه .Va .MAKE.META.CMP_FILTER است اما به دستورها، cwd و رکوردهای فراخوانی سیستمی (syscall) حاصل از filemon اعمال می‌شود. در مورد دستورها، این کار پیش از اعمال هرگونه تغییردهنده .Va .MAKE.META.CMP_FILTER در طول مقایسه صورت می‌پذیرد. .It Va .MAKE.META.CREATED در حالت .Dq meta , این متغیر حاوی فهرستی از تمامی پرونده‌های meta به‌روزرسانی‌شده است. در صورت خالی نبودن، می‌تواند برای تحریک پردازش .Va .MAKE.META.FILES به کار رود. .It Va .MAKE.META.FILES در حالت .Dq meta , این متغیر حاوی فهرستی از تمامی پرونده‌های meta استفاده‌شده (به‌روزرسانی‌شده یا نشده) است. این فهرست می‌تواند برای پردازش پرونده‌های meta جهت استخراج اطلاعات وابستگی مورد استفاده قرار گیرد. .It Va .MAKE.META.IGNORE_FILTER فهرستی از تغییردهنده‌های متغیر را برای اعمال بر هر نام مسیر فراهم می‌آورد. چنانچه حاصل گسترش یک رشته خالی باشد نادیده گرفته می‌شود. .It Va .MAKE.META.IGNORE_PATHS فهرستی از پیشوندهای مسیر را ارائه می‌دهد که باید نادیده گرفته شوند؛ زیرا انتظار می‌رود محتوای آن‌ها در گذر زمان تغییر یابد. فهرست پیش‌فرض شامل این موارد است: .Sq Pa /dev /etc /proc /tmp /var/run /var/tmp .It Va .MAKE.META.IGNORE_PATTERNS فهرستی از الگوها را برای تطبیق با نام مسیرها فراهم می‌سازد. هر موردی که مطابقت یابد نادیده گرفته می‌شود. .It Va .MAKE.META.PREFIX پیامی را تعریف می‌کند که برای هر پرونده meta به‌روزرسانی‌شده در حالت .Dq meta verbose چاپ می‌شود. مقدار پیش‌فرض عبارت است از: .Dl Building ${.TARGET:H:tA}/${.TARGET:T} .It Va .MAKE.MODE پس از خواندن تمامی makefileها پردازش می‌شود. بر حالتی که .Nm در آن اجرا می‌شود اثر می‌گذارد. می‌تواند شامل این کلیدواژه‌ها باشد: .Bl -tag -width indent .It Cm compat همانند .Fl B , .Nm را در حالت .Dq compat قرار می‌دهد. .It Cm meta .Nm را در حالت .Dq meta قرار می‌دهد، که در آن پرونده‌های meta برای هر هدف ایجاد می‌شوند تا دستورهای اجراشده، خروجی تولیدشده، و در صورت در دسترس بودن .Xr filemon 4 , فراخوانی‌های سیستمی مورد نظر .Nm را ثبت کنند. خروجی ثبت‌شده می‌تواند هنگام ریشه‌یابی خطاها سودمند باشد. .Pp .Nm از اطلاعات درون پرونده meta برای کمک به تعیین اینکه آیا یک هدف با وجود عدم اشاره قواعد معمول وابستگی به قدیمی بودن آن، قدیمی است یا خیر استفاده خواهد کرد. .Pp نخست، دستورهایی که باید اجرا شوند، با دستورهای پیش‌تر ثبت‌شده مقایسه خواهند شد؛ اگر تفاوتی داشته باشند، هدف قدیمی در نظر گرفته می‌شود. .Pp این امر موجب بهبود چشم‌گیری در قابلیت اطمینان و کارایی ساخت‌های به‌روزرسانی می‌شود. دیگر نیازی نیست هدف‌ها صرفاً به این دلیل که شاید makefileها متغیری مرتبط را مقداردهی کرده باشند، به آن‌ها وابسته شوند. سازوکارهایی همچون .Va .MAKE.META.CMP_FILTER و .Ic .NOMETA_CMP , امکان محدودسازی یا غیرفعال کردن این مقایسه را به ازای هر هدف فراهم می‌سازند. می‌توان از ارجاع به متغیر .Va .OODATE برای جلوگیری از مقایسه برخی دستورهای معین بهره جست. برای نمونه: .Ql ${.OODATE:M} به هیچ مقداری بسط نمی‌یابد و هیچ اثری بر هدف ندارد، اما اثر جانبی آن، جلوگیری از مقایسه هر خط دستوری است که در آن ظاهر شده است. برای مقاصد مستندسازی، .Ql ${.OODATE:MNOMETA_CMP} سودمند است. .Pp در صورت نیاز، .Nm سپس از اطلاعات ثبت‌شده توسط .Xr filemon 4 بهره می‌گیرد تا زمان آخرین ویرایش هر پرونده به‌کاررفته در تولید هدف را بررسی کند؛ اگر هر کدام تازه‌تر باشد، هدف قدیمی تلقی می‌شود. .Pp چنین بررسی دقیقی می‌تواند به آسانی منجر به مواردی شود که در آن یک هدف .Em همواره قدیمی در نظر گرفته شود، به همین دلیل است که .Va .MAKE.META.IGNORE_FILTER , .Va .MAKE.META.IGNORE_PATHS و .Va .MAKE.META.IGNORE_PATTERNS , برای محدود ساختن این بازرسی در صورت لزوم ارائه شده‌اند. .It Cm curdirOk= Ns Ar bf به طور پیش‌فرض، .Nm پرونده‌های .Pa .meta را در .Sq Va .CURDIR ایجاد نمی‌کند. این رفتار را می‌توان با تنظیم .Ar bf روی مقداری که نشان‌دهنده درستی (true) است لغو کرد. .It Cm missing-meta= Ns Ar bf اگر .Ar bf درست (true) باشد، نبود پرونده .Pa .meta سبب می‌شود هدف قدیمی تلقی گردد. .It Cm missing-filemon= Ns Ar bf اگر .Ar bf درست (true) باشد، نبود داده‌های filemon سبب می‌شود هدف قدیمی تلقی گردد. .It Cm nofilemon از .Xr filemon 4 استفاده نکن. .It Cm env برای اشکال‌زدایی، گنجاندن محیط در پرونده .Pa .meta می‌تواند سودمند باشد. .It Cm verbose در صورت قرار داشتن در حالت .Dq meta , راهنمایی درباره هدف در حال ساخت چاپ کن. این قابلیت در صورتی که فرایند ساخت در غیر این صورت به آرامی (بی‌صدا) اجرا شود سودمند است. پیام چاپ‌شده، مقدار بسط‌یافته .Va .MAKE.META.PREFIX است. .It Cm ignore-cmd برخی makefileها دارای دستورهایی هستند که اساساً ناپایدارند. این کلیدواژه سبب می‌شود آن‌ها در تعیین اینکه آیا هدفی در حالت .Dq meta قدیمی است یا خیر نادیده گرفته شوند. همچنین ببینید: .Ic .NOMETA_CMP . .It Cm silent= Ns Ar bf اگر .Ar bf درست (true) باشد، هنگام ایجاد یک پرونده .meta، هدف را به عنوان .Ic .SILENT علامت‌گذاری کن..It Cm randomize-targets در هر دو حالت سازگاری (compat) و موازی، هدف‌ها را با ترتیب معمول نمی‌سازد، بلکه ترتیب آن‌ها را تصادفی می‌کند. این حالت می‌تواند برای شناسایی وابستگی‌های اعلان‌نشده میان پرونده‌ها به کار رود. .El .It Va MAKEOBJDIR برای ایجاد پرونده‌ها در یک شاخه جداگانه به کار می‌رود؛ ببینید .Va .OBJDIR . .It Va MAKE_OBJDIR_CHECK_WRITABLE هنگامی که true باشد، .Nm بررسی می‌کند که .Va .OBJDIR قابل‌نوشتن باشد، و در غیر این صورت هشدار می‌دهد. .It Va MAKE_DEBUG_OBJDIR_CHECK_WRITABLE هنگامی که true باشد و .Nm درباره غیرقابل‌نوشتن بودن .Va .OBJDIR , هشدار دهد، متغیرهای فهرست‌شده در .Va MAKE_PRINT_VAR_ON_ERROR را برای کمک به اشکال‌زدایی گزارش می‌کند. .It Va MAKEOBJDIRPREFIX برای ایجاد پرونده‌ها در یک شاخه جداگانه به کار می‌رود؛ ببینید .Va .OBJDIR . باید یک مسیر مطلق باشد. .It Va .MAKE.OS نام سیستم‌عامل؛ ببینید .Xr uname 1 . فقط‌خواندنی است. .It Va .MAKEOVERRIDES این متغیر برای ثبت نام متغیرهایی که در خط فرمان مقداردهی شده‌اند به کار می‌رود، تا بتوان آن‌ها را به عنوان بخشی از .Sq Ev MAKEFLAGS . صادر کرد. این رفتار را می‌توان با انتساب مقداری خالی به .Sq Va .MAKEOVERRIDES درون یک makefile غیرفعال کرد. متغیرهای اضافی را می‌توان با افزودن نام‌هایشان به .Sq Va .MAKEOVERRIDES . از یک makefile صادر کرد. .Sq Ev MAKEFLAGS هر زمان که .Sq Va .MAKEOVERRIDES تغییر یابد، دوباره صادر می‌شود. .It Va .MAKE.PATH_FILEMON اگر .Nm همراه با پشتیبانی از .Xr filemon 4 ساخته شده باشد، این متغیر روی مسیر گره دستگاه تنظیم می‌شود. این به makefileها اجازه می‌دهد چنین پشتیبانی را بررسی کنند. .It Va .MAKE.PID شناسه فرایند (PID) مربوط به .Nm . فقط‌خواندنی است. .It Va .MAKE.PPID شناسه فرایند والد (PPID) مربوط به .Nm . فقط‌خواندنی است. .It Va MAKE_PRINT_VAR_ON_ERROR هنگامی که .Nm به دلیل بروز خطا متوقف می‌شود، .Sq Va .ERROR_TARGET را روی نام هدفی که با شکست مواجه شده، .Sq Va .ERROR_EXIT را روی وضعیت خروج هدف شکست‌خورده، .Sq Va .ERROR_CMD را روی دستورهای هدف شکست‌خورده تنظیم می‌کند، و در حالت .Dq meta همچنین .Sq Va .ERROR_CWD را روی .Xr getcwd 3 , و .Sq Va .ERROR_META_FILE را روی مسیر پرونده meta (در صورت وجود) توصیف‌کننده هدف شکست‌خورده تنظیم می‌کند. سپس نام خود و مقدار .Sq Va .CURDIR و همچنین مقدار هر متغیری را چاپ می‌کند که در .Sq Va MAKE_PRINT_VAR_ON_ERROR . نام برده شده است. .It Va .MAKE.SAVE_DOLLARS اگر true باشد، .Ql $$ هنگام انجام انتساب‌های .Ql := حفظ می‌شوند. پیش‌گزیده به منظور سازگاری با گذشته false است. برای سازگاری با سایر نسخه‌های make روی true تنظیم کنید. اگر روی false تنظیم شود، .Ql $$ طبق قواعد ارزیابی عادی به .Ql $ تبدیل می‌شود. .It Va .MAKE.TARGET_LOCAL_VARIABLES اگر روی .Ql false , تنظیم شود، انتساب‌های ظاهری متغیر در خط‌های وابستگی به عنوان منبع‌های عادی در نظر گرفته می‌شوند. .It Va .MAKE.UID شناسه عددی کاربری که در حال اجرای .Nm . است. فقط‌خواندنی است. .\" 'MAKE_VERSION' is intentionally undocumented .\" since it is only defined in the bmake distribution, .\" but not in NetBSD's native make. .\" '.meta.%d.lcwd' is intentionally undocumented .\" since it is an internal implementation detail. .\" '.meta.%d.ldir' is intentionally undocumented .\" since it is an internal implementation detail. .\" 'MFLAGS' is intentionally undocumented .\" since it is obsolete. .It Va .newline به این متغیر صرفاً یک نویسه خط جدید به عنوان مقدار اختصاص یافته است. فقط‌خواندنی است. این قابلیت به بسط‌هایی که از اصلاح‌کننده .Cm \&:@ استفاده می‌کنند اجازه می‌دهد میان تکرارهای حلقه به جای فاصله، یک خط جدید قرار دهند. برای نمونه در صورت بروز خطا، .Nm نام متغیرها و مقادیر آن‌ها را با این شیوه چاپ می‌کند: .Dl ${MAKE_PRINT_VAR_ON_ERROR:@v@$v='${$v}'${.newline}@} .It Va .OBJDIR مسیری به شاخه‌ای که هدف‌ها در آن ساخته می‌شوند. مقدار آن با تلاش برای فراخوانی .Xr chdir 2 به شاخه‌های زیر به ترتیب و استفاده از نخستین مورد منطبق تعیین می‌شود: .Bl -enum .It .Cm ${MAKEOBJDIRPREFIX} Ns Cm ${.CURDIR} .Pp (تنها در صورتی که .Sq Ev MAKEOBJDIRPREFIX در محیط یا در خط فرمان تنظیم شده باشد.) .It .Cm ${MAKEOBJDIR} .Pp (تنها در صورتی که .Sq Ev MAKEOBJDIR در محیط یا در خط فرمان تنظیم شده باشد.) .It .Cm ${.CURDIR} Ns Pa /obj. Ns Cm ${MACHINE} .It .Cm ${.CURDIR} Ns Pa /obj .It .Pa /usr/obj/ Ns Cm ${.CURDIR} .It .Cm ${.CURDIR} .El .Pp بسط متغیر پیش از استفاده بر روی مقدار اعمال می‌شود، بنابراین عباراتی مانند .Cm ${.CURDIR:S,^/usr/src,/var/obj,} می‌توانند به کار روند. این ویژگی به‌ویژه سودمند است همراه با .Sq Ev MAKEOBJDIR . .Pp .Sq Va .OBJDIR می‌تواند درون makefile از طریق هدف ویژه .Sq Ic .OBJDIR . تغییر یابد. در تمام موارد، .Nm در صورت وجود داشتن شاخه مشخص‌شده به آن تغییر مسیر می‌دهد، و پیش از اجرای هر هدفی، .Sq Va .OBJDIR و .Sq Va PWD را روی آن شاخه تنظیم می‌کند. .Pp به جز در مورد هدف صریح .Sq Ic .OBJDIR ، .Nm بررسی می‌کند که شاخه مشخص‌شده قابل‌نوشتن باشد و در غیر این صورت آن را نادیده می‌گیرد. این بررسی را می‌توان با تنظیم متغیر محیطی .Sq Ev MAKE_OBJDIR_CHECK_WRITABLE روی .Dq no . نادیده گرفت. .It Va .PARSEDIR نام شاخه makefile کنونی در حال تجزیه. .It Va .PARSEFILE نام پایه makefile کنونی در حال تجزیه. این متغیر و .Sq Va .PARSEDIR هر دو تنها در هنگام تجزیه makefileها تنظیم می‌شوند. برای حفظ مقادیر کنونی آن‌ها، آن‌ها را با استفاده از انتساب همراه با بسط .Sq Cm \&:= . به یک متغیر نسبت دهید. .It Va .PATH فهرست شاخه‌های جداشده با فاصله‌ای که .Nm در آن‌ها به دنبال پرونده‌ها می‌گردد. برای به‌روزرسانی این فهرست جستجو، به جای تغییر مستقیم متغیر از هدف ویژه .Sq Ic .PATH استفاده کنید. .It Va %POSIX در حالت POSIX تنظیم می‌شود؛ به هدف ویژه .Ql Va .POSIX نگاه کنید. .\" XXX: There is no make variable named 'PWD', .\" XXX: make only reads and writes the environment variable 'PWD'..It Va PWD مسیر جایگزین برای شاخهٔ جاری. .Nm به‌طور معمول .Sq Va .CURDIR را روی مسیر متعارف ارائه‌شده توسط .Xr getcwd 3 تنظیم می‌کند. با این حال، اگر متغیر محیطی .Sq Ev PWD تنظیم شده باشد و مسیری به شاخهٔ جاری ارائه دهد، .Nm در عوض .Sq Va .CURDIR را روی مقدار .Sq Ev PWD تنظیم می‌کند. این رفتار در صورتی که .Sq Ev MAKEOBJDIRPREFIX تنظیم شده باشد یا .Sq Ev MAKEOBJDIR حاوی یک تبدیل متغیر باشد، غیرفعال می‌شود. .Sq Va PWD برای همه برنامه‌هایی که .Nm اجرا می‌کند، روی مقدار .Sq Va .OBJDIR تنظیم می‌شود. .It Va .SHELL مسیر پوسته مورد استفاده برای اجرای اسکریپت‌های هدف. این متغیر فقط‌خواندنی است. .It Va .SUFFIXES فهرست پسوندهای شناخته‌شده. این متغیر فقط‌خواندنی است. .It Va .SYSPATH فهرست جداشده با فاصله‌ای از شاخه‌ها که .Nm در آن‌ها به دنبال makefileها می‌گردد؛ که با نام مسیر دربرگیری سامانه (system include path) شناخته می‌شود. برای به‌روزرسانی این فهرست جستجو، به جای ویرایش این متغیر که فقط‌خواندنی است، از هدف ویژهٔ .Sq Ic .SYSPATH استفاده کنید. .It Va .TARGETS فهرست هدف‌هایی که در صورت وجود، به صراحت در خط فرمان مشخص شده‌اند. .It Va VPATH فهرست جداشده با دونقطه .Pq Dq \&: از شاخه‌هایی که .Nm در آن‌ها به دنبال پرونده‌ها می‌گردد. این متغیر تنها برای سازگاری با برنامه‌های make قدیمی پشتیبانی می‌شود؛ به جای آن از .Sq Va .PATH استفاده کنید. .El .Ss "تغییردهنده‌های متغیر (Variable modifiers)" قالب کلی گسترش متغیر به صورت زیر است: .Pp .Sm off .D1 Ic \&${ Ar variable\| Oo Ic \&: Ar modifier\| Oo Ic \&: No ... Oc Oc Ic \&} .Sm on .Pp هر تغییردهنده با یک دونقطه آغاز می‌شود. برای گریز از دونقطه، پیش از آن یک ممیز وارونه (backslash) .Ql \e بگذارید. .Pp فهرستی از تغییردهنده‌های غیرمستقیم را می‌توان از طریق یک متغیر، به شرح زیر مشخص کرد: .Pp .Bd -literal -offset indent .Ar modifier_variable\^ Li \&= Ar modifier Ns Oo Ic \&: Ns No ... Oc .Sm off .Ic \&${ Ar variable Ic \&:${ Ar modifier_variable Ic \&} Oo Ic \&: No ... Oc Ic \&} .Sm on .Ed .Pp در این حالت، نخستین تغییردهنده در .Ar modifier_variable با دونقطه آغاز نمی‌شود، زیرا آن دونقطه از قبل در متغیر ارجاع‌دهنده آمده است. اگر هر یک از تغییردهنده‌ها در .Ar modifier_variable حاوی نشان دلار .Pq Ql $ باشد، این نشان‌ها باید دو بار تکرار شوند تا از گسترش زودهنگام جلوگیری شود. .Pp برخی تغییردهنده‌ها مقدار عبارت را به صورت یک رشته منفرد تفسیر می‌کنند، دیگران با مقدار عبارت مانند فهرستی از کلمات جداشده با نویسه‌های فاصله‌ساز برخورد می‌کنند. هنگام بخش‌بندی یک رشته به کلمات، فاصله‌ها را می‌توان همانند پوسته با نقل‌قول دوگانه، نقل‌قول تکی و ممیز وارونه گریز داد. نقل‌قول‌ها و ممیزهای وارونه در کلمات حفظ می‌شوند. .Pp تغییردهنده‌های پشتیبانی‌شده عبارتند از: .Bl -tag -width EEE .It Cm \&:E هر کلمه را با پسوند آن جایگزین می‌کند. .It Cm \&:H هر کلمه را با نام شاخهٔ آن (dirname) جایگزین می‌کند. .It Cm \&:M\| Ns Ar pattern تنها کلماتی را انتخاب می‌کند که با .Ar pattern مطابقت دارند. نویسه‌های عامه‌کارت استاندارد پوسته .Pf ( Ql * , .Ql \&? , و .Ql \&[] ) می‌توانند به کار روند. از ابروها می‌توان برای فهرست کردن الگوهای جایگزین استفاده کرد. برای نمونه، .Ql ${.ALLSRC:M*{Makefile*,.mk}} می‌تواند برای مطابقت با هر .Ql *Makefile* یا .Ql *.mk در .Va .ALLSRC به کار رود. نویسه‌های عامه‌کارت و ابروها را می‌توان با یک ممیز وارونه .Pq Ql \e گریز داد. به عنوان نتیجه‌ای از نحوه بخش‌بندی مقادیر به کلمات، تطبیق، و سپس پیوستن آن‌ها، سازهٔ .Ql ${VAR:M*} تمام فاصله‌های سفید ابتدا و انتها را حذف کرده و فاصله‌گذاری بین کلمات را به یک فاصله یکدست می‌کند. .It Cm \&:N\| Ns Ar pattern این برعکس .Sq Cm \&:M است، و تمام کلماتی را انتخاب می‌کند که با .Ar pattern مطابقت .Em ندارند . .It Cm \&:O کلمات را بر اساس الفبا مرتب می‌کند. .It Cm \&:On کلمات را به صورت عددی مرتب می‌کند. عددی که به دنبال آن یکی از .Ql k , .Ql M یا .Ql G آمده باشد، در ضریب مناسب ضرب می‌شود که برابر ۱۰۲۴ برای .Ql k , ۱۰۴۸۵۷۶ برای .Ql M , یا ۱۰۷۳۷۴۱۸۲۴ برای .Ql G است. هر دو حروف بزرگ و کوچک پذیرفته می‌شوند. .It Cm \&:Or کلمات را با ترتیب الفبایی معکوس مرتب می‌کند. .It Cm \&:Orn کلمات را با ترتیب عددی معکوس مرتب می‌کند. .It Cm \&:Ox کلمات را بر می‌زند (درهم می‌ریزد). هر بار که به متغیر تغییریافته ارجاع دهید، نتایج متفاوت خواهد بود؛ برای جلوگیری از این رفتار، از انتساب همراه با گسترش .Sq Cm \&:= استفاده کنید. برای نمونه، .Bd -literal -offset indent 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}" .Ed ممکن است خروجی مشابه زیر تولید کند: .Bd -literal -offset indent quattro due tre uno tre due quattro uno due uno quattro tre due uno quattro tre .Ed .It Cm \&:Q تمام فرانویست‌های پوسته در مقدار را نقل‌قول‌گذاری می‌کند، تا بتوان آن را با امنیت به پوسته منتقل کرد. .It Cm \&:q تمام فرانویست‌های پوسته در مقدار را نقل‌قول‌گذاری می‌کند، و همچنین نویسه‌های .Sq $ را دو برابر می‌کند تا بتواند بدون خطر در فراخوانی‌های بازگشتی .Nm منتقل شود. این معادل است با .Sq Cm \&:S/\e\&$/&&/g:Q . .It Cm \&:R هر کلمه را با همه‌چیز به جز پسوند آن جایگزین می‌کند. .It Cm \&:range Ns Oo Cm = Ns Ar count Oc مقدار، یک دنباله از اعداد صحیح است که نشان‌دهنده کلمات مقدار اصلی، یا مقدار ارائه‌شدهٔ .Ar count می‌باشد. .It Cm \&:gmtime Ns Oo Cm = Ns Ar timestamp Oc مقدار به عنوان یک رشته قالب برای .Xr strftime 3 تفسیر می‌شود، با استفاده از .Xr gmtime 3 که مهرزمانی قالب‌بندی‌شده تولید می‌کند. نکته: قالب .Ql %s تنها باید با .Sq Cm \&:localtime استفاده شود. اگر مقدار .Ar timestamp ارائه نشود یا 0 باشد، زمان جاری استفاده می‌شود. .It Cm \&:hash یک هش ۳۲ بیتی از مقدار محاسبه کرده و آن را به صورت ۸ رقم هگزادسیمال کدبندی می‌کند. .It Cm \&:localtime Ns Oo Cm = Ns Ar timestamp Oc مقدار به عنوان یک رشته قالب برای .Xr strftime 3 , با استفاده از .Xr localtime 3 , تفسیر شده و برچسب زمانی قالب‌بندی‌شده را تولید می‌کند. اگر مقدار .Ar timestamp ارائه نشود یا ۰ باشد، از زمان جاری استفاده می‌شود. .It Cm \&:mtime Ns Oo Cm = Ns Ar timestamp Oc فراخوانی .Xr stat 2 با هر کلمه به عنوان نام مسیر؛ استفاده از .Ql st_mtime به عنوان مقدار جدید. اگر .Xr stat 2 شکست بخورد؛ از .Ar timestamp یا زمان جاری استفاده می‌شود. اگر .Ar timestamp بر روی .Ql error تنظیم شده باشد، آنگاه شکست .Xr stat 2 موجب بروز یک خطا خواهد شد. .It Cm \&:tA تلاش می‌کند تا با استفاده از .Xr realpath 3 مقدار را به یک مسیر مطلق تبدیل کند. اگر ناموفق باشد، مقدار بدون تغییر می‌ماند. .It Cm \&:tl مقدار را به حروف کوچک تبدیل می‌کند. .It Cm \&:ts Ns Ar c هنگام پیوند دادن کلمات پس از اصلاح‌کننده‌ای که با مقدار به عنوان کلمات رفتار می‌کند، کلمات معمولاً با یک فاصله جدا می‌شوند. این اصلاح‌کننده جداکننده را به نویسه .Ar c تغییر می‌دهد. اگر .Ar c حذف شود، هیچ جداکننده‌ای به کار نمی‌رود. گریزه‌های رایج (از جمله کدهای عددی هشت‌هشتی) مطابق انتظار کار می‌کنند. .It Cm \&:tt نخستین نویسه هر کلمه را به حروف بزرگ، و باقی را به حروف کوچک تبدیل می‌کند. .It Cm \&:tu مقدار را به حروف بزرگ تبدیل می‌کند. .It Cm \&:tW باعث می‌شود اصلاح‌کننده‌های بعدی با مقدار به عنوان یک تک‌کلمه رفتار کنند (که احتمالاً حاوی نویسه‌های فاصله‌دار درون‌متنی است). همچنین ببینید: .Sq Cm \&:[*] . .It Cm \&:tw باعث می‌شود با مقدار به عنوان فهرستی از کلمات رفتار شود. همچنین ببینید: .Sq Cm \&:[@] . .Sm off .It Cm \&:S\| No \&/ Oo Cm \&^ Oc Ar old_string\| No Oo Cm \&$ Oc \&/ Ar new_string\| No \&/ Op Cm 1gW .Sm on نخستین رخداد .Ar old_string را در هر کلمه از مقدار تغییر داده و آن را با .Ar new_string جایگزین می‌کند. .Pp اگر پیش از .Ar old_string یک علامت هشتک (caret) .Pq Ql ^ , بیاید، .Ar old_string در ابتدای هر کلمه مهار می‌شود. اگر پس از .Ar old_string یک علامت دلار .Pq Ql \&$ , بیاید، در انتهای هر کلمه مهار می‌شود. درون .Ar new_string , یک علامت امپرسند .Pq Ql & با .Ar old_string جایگزین می‌شود. هر دو .Ar old_string و .Ar new_string می‌توانند حاوی عبارت‌های تودرتو باشند. .Pp گزینه‌های بیشتر (Further options): .Bl -tag .It Cm 1 تنها کلمه دارای نخستین رخداد تحت تأثیر قرار می‌گیرد. .It Cm g تمام رخدادها در هر کلمه تحت تأثیر جایگزین می‌شوند. .It Cm W مقدار عبارت به عنوان یک تک‌کلمه در نظر گرفته می‌شود. .El .Pp هر نویسه‌ای می‌تواند به عنوان جداکننده بخش‌های رشته اصلاح‌کننده استفاده شود. نویسه‌های مهارکننده، امپرسند، دلار و جداکننده می‌توانند با یک ممیز وارونه .Pq Ql \e گریز داده شوند. .Sm off .It Cm \&:C\| No \&/ Ar pattern\| No \&/ Ar replacement\| No \&/ Op Cm 1gW .Sm on نخستین رخداد عبارت منظم گسترش‌یافته .Ar pattern (ببینید: .Xr regex 3 ) در هر کلمه از مقدار را تغییر داده و آن را با یک .Ar replacement به سبک .Xr ed 1 Ns \-style جایگزین می‌کند. .Pp هر دو .Ar pattern و .Ar replacement می‌توانند حاوی عبارت‌های تودرتو باشند. .Pp گزینه‌های بیشتر (Further options): .Bl -tag .It Cm 1 تنها کلمه دارای نخستین رخداد تحت تأثیر قرار می‌گیرد. .It Cm g تمام رخدادها در هر کلمه تحت تأثیر جایگزین می‌شوند. .It Cm W مقدار عبارت به عنوان یک تک‌کلمه در نظر گرفته می‌شود. .El .Pp هر نویسه‌ای می‌تواند به عنوان جداکننده بخش‌های رشته اصلاح‌کننده استفاده شود. نویسه‌های مهارکننده، امپرسند، دلار و جداکننده می‌توانند با یک ممیز وارونه .Pq Ql \e گریز داده شوند. .It Cm \&:T هر کلمه را با آخرین مؤلفه مسیر آن (basename) جایگزین می‌کند. .It Cm \&:u کلمات تکراری مجاور را حذف می‌کند (مانند .Xr uniq 1 ) . .Sm off .It Cm \&:\&?\| Ar true_string\| Cm \&: Ar false_string .Sm on اگر نام متغیر (نه مقدار آن)، هنگام تجزیه به عنوان یک عبارت شرطی .Cm .if , به true ارزیابی شود، مقدار .Ar true_string را به عنوان مقدار خود بازمی‌گرداند؛ در غیر این صورت .Ar false_string را بازمی‌گرداند. از آنجا که نام متغیر به عنوان عبارت استفاده می‌شود، \&:\&? باید نخستین اصلاح‌کننده پس از نام .No خود متغیر Ns \^\(em\^ Ns باشد؛ که البته معمولاً شامل بسط‌های متغیر است. یک خطای متداول، تلاش برای استفاده از عباراتی مانند .Dl ${NUMBERS:M42:?match:no} است که در واقع defined(NUMBERS) را می‌آزماید. برای تعیین اینکه آیا کلمه‌ای با .Dq 42 مطابقت دارد یا خیر، باید از چیزی مانند این استفاده کنید: .Dl ${"${NUMBERS:M42}" != \&"\&":?match:no} . .It Cm :\| Ns Ar old_string\| Ns Cm = Ns Ar new_string این جایگزینی به سبک .At V است. فقط می‌تواند آخرین اصلاح‌کننده تعیین‌شده باشد، زیرا یک .Ql \&: در هر یک از .Ar old_string یا .Ar new_string به عنوان یک نویسه معمولی در نظر گرفته می‌شود، نه پایان اصلاح‌کننده. .Pp اگر .Ar old_string شامل نویسه تطبیق الگوی .Ql % نباشد، و کلمه با .Ar old_string پایان یابد یا با آن برابر باشد، آن پسوند با .Ar new_string جایگزین می‌شود. .Pp در غیر این صورت، نخستین .Ql % در .Ar old_string با یک زیررشته احتمالاً خالی از نویسه‌های دلخواه مطابقت می‌یابد، و اگر کل الگو در کلمه یافت شود، بخش منطبق با .Ar new_string جایگزین می‌شود، و نخستین رخداد .Ql % در .Ar new_string (در صورت وجود) با زیررشته منطبق‌شده توسط .Ql % جایگزین می‌گردد. .Pp هر دو .Ar old_string و .Ar new_string می‌توانند حاوی عبارت‌های تودرتو باشند. برای جلوگیری از اینکه علامت دلار یک عبارت تودرتو را آغاز کند، آن را با یک ممیز وارونه گریز دهید. .Sm off .It Cm \&:@ Ar varname\| Cm @ Ar string\| Cm @ .Sm on این سازوکار بسط حلقه برگرفته از make در محیط توسعه او‌اس‌اف (OSF Development Environment یا ODE) است. برخلاف حلقه‌های .Cm \&.for بسط در زمان ارجاع رخ می‌دهد. به‌ازای هر کلمه در مقدار، کلمه به متغیری با نام .Ar varname انتساب داده می‌شود و .Ar string ارزیابی می‌گردد. قاعده مرسوم در ODE این است که .Ar varname باید با یک نقطه آغاز شود و پایان یابد، برای نمونه: .Dl ${LINKS:@.LINK.@${LN} ${TARGET} ${.LINK.}@} .Pp با این حال، یک متغیر تک‌حرفی اغلب خواناتر است: .Dl ${MAKE_PRINT_VAR_ON_ERROR:@v@$v='${$v}'${.newline}@} .It Cm \&:_ Ns Oo Cm = Ns Ar var Oc مقدار فعلی متغیر را در .Ql $_ یا .Ar var نام‌گذاری‌شده برای ارجاع بعدی ذخیره می‌کند. نمونه کاربرد: .Bd -literal -offset indent M_cmpv.units = 1 1000 1000000 M_cmpv = S,., ,g:_:range:@i@+ $${_:[-$$i]} \&\\ \\* $${M_cmpv.units:[$$i]}@:S,^,expr 0 ,1:sh .Dv .if ${VERSION:${M_cmpv}} < ${3.1.12:L:${M_cmpv}} .Ed در اینجا .Ql $_ برای ذخیره نتیجه اصلاح‌کننده .Ql :S به‌کار می‌رود که بعداً با استفاده از مقادیر نمایه برگرفته از .Ql :range به آن ارجاع داده می‌شود. .It Cm \&:U\| Ns Ar newval اگر متغیر تعریف‌نشده باشد، .Ar newval اختیاری (که ممکن است تهی باشد) مقدار خواهد بود. اگر متغیر تعریف شده باشد، مقدار موجود برگردانده می‌شود. این یکی دیگر از قابلیت‌های ODE make است. برای نمونه، جهت تنظیم CFLAGS به‌ازای هر هدف سودمند است: .Dl ${_${.TARGET:T}_CFLAGS:U${DEF_CFLAGS}} اگر مقدار تنها در صورت تعریف‌نشده بودن متغیر نیاز باشد، از این عبارت استفاده کنید: .Dl ${VAR:D:Unewval} .It Cm \&:D\| Ns Ar newval اگر متغیر تعریف شده باشد، .Ar newval (که ممکن است تهی باشد) مقدار خواهد بود. .It Cm \&:L نام متغیر، همان مقدار است. .It Cm \&:P مسیر گرهی که همنام متغیر است، مقدار خواهد بود. اگر چنین گرهی وجود نداشته باشد یا مسیر آن تهی باشد، از نام متغیر استفاده می‌شود. برای اینکه این اصلاح‌کننده کار کند، نام (گره) باید دست‌کم در سمت راست یک وابستگی ظاهر شده باشد. .Sm off .It Cm \&:\&! Ar cmd\| Cm \&! .Sm on خروجی اجرای .Ar cmd مقدار خواهد بود. .It Cm \&:sh مقدار به عنوان یک دستور اجرا می‌شود و خروجی آن به مقدار جدید تبدیل می‌گردد. .It Cm \&:sh1 مقدار تنها برای نخستین ارجاع به عنوان یک دستور اجرا می‌شود و خروجی آن برای ارجاع‌های پسین ذخیره می‌گردد. این اصلاح‌کننده زمانی سودمند است که انتظار نمی‌رود نتیجه تغییر کند. .It Cm \&::= Ns Ar str متغیر پس از جایگزینی با مقدار .Ar str مقداردهی می‌شود. این اصلاح‌کننده و گونه‌های دیگر آن در شرایط خاص و نادر سودمند هستند، مانند زمانی که قصد دارید متغیری را در نقطه‌ای که دستورهای پوسته یک هدف در حال تجزیه هستند مقداردهی کنید. این اصلاح‌کننده‌های انتساب همیشه به هیچ بسط می‌یابند. .Pp عبارت .Sq Cm \&:: به جلوگیری از تطابق اشتباه با اصلاح‌کننده سبک .At V .Ql \&:= کمک می‌کند و از آنجا که جایگزینی همواره انجام می‌شود، ساختار .Ql \&::= تا حدی مناسب است. .It Cm \&::?= Ns Ar str مانند .Cm \&::= عمل می‌کند، اما تنها در صورتی که متغیر از پیش مقداری نداشته باشد. .It Cm \&::+= Ns Ar str رشته .Ar str را به انتهای متغیر می‌افزاید. .It Cm \&::!= Ns Ar cmd خروجی .Ar cmd را به متغیر انتساب می‌دهد. .It Cm \&:\&[ Ns Ar range Ns Cm \&] یک یا چند کلمه را از مقدار برمی‌گزیند، یا عملیات دیگری مرتبط با نحوه تقسیم مقدار به کلمات انجام می‌دهد. .Pp یک مقدار تهی، یا مقداری که به تمامی از فاصله‌های سفید تشکیل شده باشد، به عنوان یک کلمه واحد در نظر گرفته می‌شود. برای اهداف اصلاح‌کننده .Sq Cm \&:[] کلمات هم رو به جلو با اعداد صحیح مثبت نمایه‌گذاری می‌شوند (که در آن نمایه ۱ نمایانگر کلمه نخست است)، و هم رو به عقب با اعداد صحیح منفی (که در آن نمایه \-1 نمایانگر کلمه پایانی است). .Pp مقدار .Ar range دستخوش بسط متغیر قرار می‌گیرد و نتیجه بسط‌یافته سپس به شرح زیر تفسیر می‌شود: .Bl -tag -width index .\" :[n] .It Ar index یک کلمه واحد را از مقدار برمی‌گزیند. .\" :[start..end] .It Ar start Ns Cm \&.. Ns Ar end همه کلمات را از .Ar start تا .Ar end به صورت فراگیر برمی‌گزیند. برای نمونه، .Sq Cm \&:[2..-1] همه کلمات را از کلمه دوم تا کلمه پایانی برمی‌گزیند. اگر .Ar start بزرگتر از .Ar end باشد، کلمات به ترتیب معکوس خروجی داده می‌شوند. برای نمونه، .Sq Cm \&:[-1..1] همه کلمات را از آخر به اول برمی‌گزیند. اگر فهرست از پیش مرتب باشد، این کار عملاً فهرست را معکوس می‌کند، اما استفاده از .Sq Cm \&:Or به جای .Sq Cm \&:O:[-1..1] کارآمدتر است. .\" :[*] .It Cm \&* باعث می‌شود اصلاح‌کننده‌های بعدی مقدار را به عنوان یک کلمه منفرد (احتمالاً دارای فاصله‌های خالی میانی) در نظر بگیرند. مشابه اثر .Li \&$* در پوسته Bourne است. .\" :[0] .It 0 همان معنای .Sq Cm \&:[*] را دارد. .\" :[*] .It Cm \&@ باعث می‌شود اصلاح‌کننده‌های بعدی مقدار را به عنوان دنباله‌ای از کلمات جداشده با فاصله‌های سفید در نظر بگیرند. مشابه اثر .Li \&$@ در پوسته Bourne است. .\" :[#] .It Cm \&# تعداد کلمات موجود در مقدار را برمی‌گرداند. .El \" :[range] .El .Sh "رهنمودها (DIRECTIVES)" .Nm رهنمودهایی را برای گنجاندن makefileها، عبارت‌های شرطی و حلقه‌های for ارائه می‌دهد. تمام این رهنمودها با خطی مشخص می‌شوند که با یک نویسه نقطه تکی .Pq Ql \&. آغاز می‌شود، و در پی آن کلمه کلیدی رهنمود می‌آید، مانند .Cm include یا .Cm if . .Ss "شمول پرونده (File inclusion)" پرونده‌ها با .Cm \&.include \&< Ns Ar file Ns Cm \&> یا .Cm \&.include \&\*q Ns Ar file Ns Cm \&\*q گنجانده می‌شوند. متغیرهای میان قلاب‌های زاویه‌دار یا علامت‌های نقل‌قول دوتایی بسط داده می‌شوند تا نام پرونده را تشکیل دهند. اگر قلاب‌های زاویه‌دار به کار روند، انتظار می‌رود makefile گنجانده‌شده در شاخه makefile سامانه باشد. اگر علامت‌های نقل‌قول دوتایی به کار روند، شاخه makefile شامل‌کننده و هر شاخه‌ای که با استفاده از گزینه .Fl I مشخص شده باشد، پیش از شاخه makefile سامانه جستجو می‌شوند. .Pp برای سازگاری با دیگر گونه‌های make، .Sq Cm include Ar file No ... (بدون نقطه آغازین) نیز پذیرفته می‌شود. .Pp اگر عبارت include به‌صورت .Cm .-include یا به‌صورت .Cm .sinclude نوشته شود، خطاهای یافتن و/یا باز کردن پرونده‌های شمول نادیده گرفته می‌شوند. .Pp اگر عبارت include به‌صورت .Cm .dinclude نوشته شود، نه‌تنها خطاهای یافتن و/یا باز کردن پرونده‌های شمول نادیده گرفته می‌شوند، بلکه وابستگی‌های کهنه درون پرونده گنجانده‌شده نیز درست مانند .Va .MAKE.DEPENDFILE نادیده گرفته می‌شوند. .Ss "صدور متغیرها (Exporting variables)" رهنمودها برای صدور و لغو صدور متغیرها عبارتند از: .Bl -tag -width Ds .It Ic .export Ar variable No ... متغیر سراسری مشخص‌شده را صادر می‌کند. .Pp برای سازگاری با دیگر برنامه‌های make، .Cm export Ar variable\| Ns Cm \&= Ns Ar value (بدون نقطه آغازین) نیز پذیرفته می‌شود. .Pp افزودن نام یک متغیر به .Va .MAKE.EXPORTED معادل صدور یک متغیر است. .It Ic .export-all تمام متغیرهای سراسری به جز متغیرهای داخلی (آن‌هایی که با .Ql \&. آغاز می‌شوند) را صادر می‌کند. این مورد تحت تأثیر پرچم .Fl X قرار نمی‌گیرد، بنابراین باید با احتیاط استفاده شود. .It Ic .export-env Ar variable No ... همانند .Ql .export ، است، به جز اینکه متغیر به .Va .MAKE.EXPORTED افزوده نمی‌شود. این به کاربر امکان می‌دهد مقداری را به محیط صادر کند که با مقدار مورد استفاده داخلی .Nm متفاوت است. .It Ic .export-literal Ar variable No ... همانند .Ql .export-env ، است، به جز اینکه متغیرهای درون مقدار بسط داده نمی‌شوند. .It Ic .unexport Ar variable No ... نقطه مقابل .Ql .export . متغیر سراسری مشخص‌شده .Ar variable از .Va .MAKE.EXPORTED حذف می‌شود. اگر هیچ فهرستی از متغیرها ارائه نشود، صدور تمام متغیرهای سراسری لغو شده، و .Va .MAKE.EXPORTED حذف می‌شود. .It Ic .unexport-env تمام متغیرهای سراسری که پیش‌تر صادر شده‌اند را لغو صدور کرده و محیط به ارث رسیده از والد را پاک می‌کند. این عملیات باعث نشت حافظه در محیط اولیه می‌شود، بنابراین باید به‌ندرت استفاده شود. بررسی اینکه .Va .MAKE.LEVEL برابر 0 باشد معقول خواهد بود. همچنین توجه داشته باشید که هرگونه متغیر برگرفته از محیط والد در صورت نیاز باید به‌صراحت حفظ شود. برای نمونه: .Bd -literal -offset indent .Li .if ${.MAKE.LEVEL} == 0 PATH := ${PATH} .Li .unexport-env .Li .export PATH .Li .endif .Pp .Ed منجر به محیطی می‌شود که تنها شامل .Sq Ev PATH است، که کمینه محیط کارآمد به شمار می‌رود. .\" TODO: Check the below sentence, environment variables don't start with '.'. در عمل .Sq Va .MAKE.LEVEL نیز به محیط جدید فرستاده می‌شود. .El .Ss "پیام‌ها (Messages)" رهنمودها برای چاپ پیام‌ها در خروجی عبارتند از: .Bl -tag -width Ds .It Ic .info Ar message پیام همراه با نام makefile و شماره خط چاپ می‌شود. .It Ic .warning Ar message پیام با پیشوند .Sq Li warning: همراه با نام makefile و شماره خط چاپ می‌شود. .It Ic .error Ar message پیام همراه با نام makefile و شماره خط چاپ می‌شود، .Nm بلافاصله خارج می‌شود. .El .Ss "شرطی‌ها (Conditionals)" رهنمودها برای شرطی‌ها عبارتند از: .ds maybenot Oo Ic \&! Oc Ns .Bl -tag .It Ic .if \*[maybenot] Ar expression Op Ar operator expression No ... بررسی مقدار یک عبارت. .It Ic .ifdef \*[maybenot] Ar variable Op Ar operator variable No ... بررسی اینکه آیا یک متغیر تعریف شده است یا خیر. .It Ic .ifndef \*[maybenot] Ar variable Op Ar operator variable No ... بررسی اینکه آیا یک متغیر تعریف نشده است یا خیر. .It Ic .ifmake \*[maybenot] Ar target Op Ar operator target No ... بررسی هدفی که درخواست شده است. .It Ic .ifnmake \*[maybenot] Ar target Op Ar operator target No ... بررسی هدفی که درخواست نشده است. .It Ic .else معکوس کردن وضعیت آخرین شرطی. .It Ic .elif \*[maybenot] Ar expression Op Ar operator expression No ... ترکیبی از .Sq Ic .else و در پی آن .Sq Ic .if . .It Ic .elifdef \*[maybenot] Ar variable Op Ar operator variable No ... ترکیبی از .Sq Ic .else و در پی آن .Sq Ic .ifdef . .It Ic .elifndef \*[maybenot] Ar variable Op Ar operator variable No ... ترکیبی از .Sq Ic .else و در پی آن .Sq Ic .ifndef . .It Ic .elifmake \*[maybenot] Ar target Op Ar operator target No ... ترکیبی از .Sq Ic .else و در پی آن .Sq Ic .ifmake . .It Ic .elifnmake \*[maybenot] Ar target Op Ar operator target No ... ترکیبی از .Sq Ic .else و در پی آن .Sq Ic .ifnmake . .It Ic .endif پایان دادن به بدنه شرطی. .El .Pp عملگر .Ar operator می‌تواند هر یک از موارد زیر باشد: .Bl -tag .It Ic \&|\&| یا (OR) منطقی. .It Ic \&&& و (AND) منطقی؛ دارای تقدم بالاتری نسبت به .Sq Ic \&|\&| . .El .Pp .Nm یک شرطی را تنها تا اندازه‌ای که برای تعیین مقدار آن لازم است ارزیابی می‌کند. پرانتزها می‌توانند برای نادیده گرفتن تقدم عملگرها به کار روند. عملگر بولی .Sq Ic \&! می‌تواند برای نقیض منطقی یک عبارت، به‌طور معمول یک فراخوانی تابع، استفاده شود. تقدم آن بالاتر از .Sq Ic \&&& است. .Pp مقدار .Ar expression می‌تواند هر یک از عبارت‌های فراخوانی تابع زیر باشد: .Bl -tag .Sm off .It Ic defined Li \&( Ar varname Li \&) .Sm on اگر متغیر .Ar varname تعریف شده باشد، برابر با true ارزیابی می‌شود. .Sm off .It Ic make Li \&( Ar target Li \&) .Sm on اگر هدف به عنوان بخشی از خط فرمان .Nm مشخص شده باشد یا به عنوان هدف پیش‌فرض (خواه به‌طور ضمنی یا صریح، ببینید .Va .MAIN ) پیش از خط شامل شرطی اعلان شده باشد، برابر با true ارزیابی می‌شود. .Sm off .It Ic empty Li \&( Ar varname Oo Li : Ar modifiers Oc Li \&) .Sm on چنانچه گسترش متغیر، پس از اعمال اصلاح‌کننده‌ها، به رشته‌ای تهی بیانجامد، به درست ارزیابی می‌شود. .Sm off .It Ic exists Li \&( Ar pathname Li \&) .Sm on اگر مسیر داده‌شده وجود داشته باشد، به درست ارزیابی می‌شود. چنانچه نسبی باشد، مسیر در مسیر جستجوی سامانه (رجوع کنید به .Va .PATH ) جستجو می‌شود. .Sm off .It Ic target Li \&( Ar target Li \&) .Sm on اگر هدف تعریف شده باشد، به درست ارزیابی می‌شود. .Sm off .It Ic commands Li \&( Ar target Li \&) .Sm on اگر هدف تعریف شده باشد و دستوراتی وابسته به آن وجود داشته باشند، به درست ارزیابی می‌شود. .El .Pp .Ar Expression همچنین می‌تواند یک مقایسه حسابی یا رشته‌ای باشد. گسترش متغیر بر روی هر دو سوی مقایسه انجام می‌گیرد. اگر هر دو سو عددی باشند و هیچ‌یک در علامت نقل‌قول قرار نگرفته باشند، مقایسه به‌صورت عددی و در غیر این صورت به‌صورت الفبایی انجام می‌شود. یک رشته در صورتی که پیش از آن .Li 0x آمده باشد، به‌صورت عدد صحیح در مبنای شانزده تفسیر می‌شود، در غیر این صورت به‌صورت یک عدد اعشاری ممیز شناور ده‌دهی تفسیر خواهد شد؛ از عددهای مبنای هشت پشتیبانی نمی‌شود. .Pp تمامی مقایسه‌ها می‌توانند از عملگرهای .Sq Ic \&== و .Sq Ic \&!= استفاده کنند. مقایسه‌های عددی همچنین می‌توانند از عملگرهای .Sq Ic \&< , .Sq Ic \&<= , .Sq Ic \&> و .Sq Ic \&>= بهره ببرند. .Pp اگر مقایسه فاقد عملگر مقایسه یا سمت راست باشد، عبارت در صورتی که غیرتهی باشد و مقدار عددی آن (در صورت وجود) صفر نباشد، به درست ارزیابی می‌شود. .Pp هنگامی که .Nm یکی از این عبارت‌های شرطی را ارزیابی می‌کند، و با واژه‌ای (جداشده با نویسه فاصله) روبرو می‌شود که آن را بازنمی‌شناسد، بسته به شکل شرط، تابع .Dq make یا .Dq defined بر روی آن اعمال می‌شود. اگر شکل شرط به‌صورت .Sq Ic .ifdef , .Sq Ic .ifndef یا .Sq Ic .if باشد، تابع .Dq defined اعمال می‌گردد. به همین ترتیب، اگر شکل شرط به‌صورت .Sq Ic .ifmake یا .Sq Ic .ifnmake باشد، تابع .Dq make اعمال می‌شود. .Pp اگر عبارت شرطی به درست ارزیابی شود، تجزیه makefile همچون گذشته ادامه می‌یابد. اگر به نادرست ارزیابی شود، خطوط بعدی تا گونه متناظر .Sq Ic .elif , .Sq Ic .else یا .Sq Ic .endif نادیده گرفته می‌شوند. .Ss "حلقه‌های For (For loops)" حلقه‌های for معمولاً برای اعمال مجموعه‌ای از قواعد بر روی فهرستی از پرونده‌ها به کار می‌روند. نحو یک حلقه for به این صورت است: .Pp .Bl -tag -compact -width Ds .It Ic \&.for Ar variable Oo Ar variable No ... Oc Ic in Ar expression .It Aq Ar make-lines .It Ic \&.endfor .El .Pp عبارت .Ar expression گسترش یافته و سپس به واژه‌ها شکسته می‌شود. در هر تکرار از حلقه، یک واژه برداشته شده و به هر .Ar variable , به ترتیب اختصاص داده می‌شود، و این .Ar variables درون .Ar make-lines در بدنه حلقه for جایگزین می‌شوند. شمار واژه‌ها باید میزان و متناسب باشد؛ یعنی اگر سه متغیر تکرار وجود داشته باشد، تعداد واژه‌های ارائه‌شده باید مضربی از سه باشد. .Pp اگر .Sq Ic .break درون یک حلقه .Cm \&.for دیده شود، باعث پایان زودهنگام حلقه می‌شود، در غیر این صورت یک خطای تجزیه است. .\" TODO: Describe limitations with defined/empty. .Ss "سایر دستورالعمل‌ها (Other directives)" .Bl -tag -width Ds .It Ic .undef Ar variable No ... تعریف متغیرهای سراسری مشخص‌شده را لغو می‌کند. تنها متغیرهای سراسری را می‌توان لغو تعریف کرد. .El .Sh "توضیحات (COMMENTS)" توضیحات با نویسه هش .Pq Ql \&# در هر جایی به‌جز در سطر فرمان پوسته آغاز می‌شوند، و تا انتهای یک سطر تازه مهارنشده (unescaped) ادامه می‌یابند. .Sh "منابع ویژه (ویژگی‌ها) (SPECIAL SOURCES (ATTRIBUTES))" .Bl -tag -width .IGNOREx .It Ic .EXEC هدف هرگز تاریخ‌گذشته در نظر گرفته نمی‌شود، اما در هر حال فرمان‌ها همواره اجرا می‌شوند. .It Ic .IGNORE چشم‌پوشی از هرگونه خطا در فرمان‌های مرتبط با این هدف، دقیقاً همانند آنکه پیش از همه آن‌ها یک خط تیره .Pq Ql \- آمده باشد. .\" .It Ic .INVISIBLE .\" XXX .\" .It Ic .JOIN .\" XXX .It Ic .MADE هدف(ها) را به‌روز علامت‌گذاری می‌کند. .It Ic .MAKE اجرای فرمان‌های مرتبط با این هدف حتی در صورتی که گزینه‌های .Fl n یا .Fl t تعیین شده باشند. معمولاً برای مشخص کردن فراخوانی‌های بازگشتی .Nm به کار می‌رود. .It Ic .META ایجاد یک پرونده فراداده (meta file) برای هدف، حتی اگر با .Ic .PHONY , .Ic .MAKE , یا .Ic .SPECIAL نشانه‌گذاری شده باشد. کاربرد در کنار .Ic .MAKE محتمل‌ترین حالت است. در حالت .Dq meta اگر پرونده فراداده وجود نداشته باشد، هدف تاریخ‌گذشته تلقی می‌شود. .It Ic .NOMETA برای هدف پرونده فراداده ایجاد نکن. پرونده‌های فراداده همچنین برای هدف‌های .Ic .PHONY , .Ic .MAKE , یا .Ic .SPECIAL ایجاد نمی‌شوند. .It Ic .NOMETA_CMP چشم‌پوشی از تفاوت‌های موجود در فرمان‌ها هنگام تصمیم‌گیری درباره تاریخ‌گذشته بودن هدف. این ویژگی زمانی سودمند است که فرمان حاوی مقداری باشد که همواره تغییر می‌کند. با این حال اگر شمار فرمان‌ها تغییر کند، هدف همچنان تاریخ‌گذشته در نظر گرفته می‌شود. همین اثر برای هر خط فرمانی که از متغیر .Va .OODATE استفاده کند نیز اعمال می‌شود، که می‌توان برای همین منظور از آن استفاده کرد حتی اگر در غیر این صورت نیازی به آن نباشد یا مطلوب نباشد: .Bd -literal -offset indent skip-compare-for-some: @echo this is compared @echo this is not ${.OODATE:M.NOMETA_CMP} @echo this is also compared .Ed الگوی .Cm \&:M از هرگونه بسط متغیر ناخواسته جلوگیری می‌کند. .It Ic .NOPATH در شاخه‌های مشخص‌شده توسط .Va .PATH به دنبال هدف نگرد. .It Ic .NOTMAIN در حالت معمول .Nm نخستین هدفی را که با آن مواجه شود، در صورت تعیین نشدن هدف، به عنوان هدف پیش‌فرض برای ساخت انتخاب می‌کند. این منبع از انتخاب شدن این هدف جلوگیری می‌کند. .It Ic .OPTIONAL اگر هدفی با این ویژگی نشانه‌گذاری شده باشد و .Nm نتواند چگونگی ایجاد آن را دریابد، این موضوع را نادیده می‌گیرد و فرض می‌کند پرونده نیازی نبوده یا از پیش وجود دارد. .It Ic .PHONY هدف با پرونده واقعی تطابق ندارد؛ همواره تاریخ‌گذشته در نظر گرفته می‌شود، و با گزینه .Fl t ایجاد نمی‌شود. قواعد تبدیل پسوند بر روی هدف‌های .Ic .PHONY اعمال نمی‌شوند. .It Ic .PRECIOUS هنگامی که اجرای .Nm قطع می‌شود، معمولاً هر هدفی را که به صورت نیمه‌کاره ساخته شده حذف می‌کند. این منبع از حذف شدن هدف جلوگیری می‌کند. .It Ic .RECURSIVE مترادفی برای .Ic .MAKE . .It Ic .SILENT هیچ‌یک از فرمان‌های مرتبط با این هدف را در خروجی نمایش نده، دقیقاً همانند آنکه پیش از همه آن‌ها یک نشانه ات .Pq Ql @ آمده باشد. .It Ic .USE هدف را به نگارش .Nm از یک ماکرو تبدیل می‌کند. هنگامی که هدف به عنوان یک منبع برای هدفی دیگر به کار رود، آن هدف دیگر فرمان‌ها، منابع و ویژگی‌های منبع (به‌جز .Ic .USE ) را به خود اختصاص می‌دهد. اگر هدف از پیش دارای فرمان‌هایی باشد، فرمان‌های هدف .Ic .USE به انتهای آن‌ها پیوست می‌شوند. .It Ic .USEBEFORE مانند .Ic .USE , اما به جای پیوست به انتها، فرمان‌های هدف .Ic .USEBEFORE را به ابتدای هدف می‌افزاید. .It Ic .WAIT اگر .Ic .WAIT در یک خط وابستگی پدیدار شود، منابع پیش از آن پیش از منابع پس از آن در همان خط ساخته می‌شوند. از آنجا که وابسته‌های پرونده‌ها تا زمانی که خود پرونده امکان ساخت نداشته باشد ساخته نمی‌شوند، این امر همچنین از ساخت وابسته‌ها جلوگیری می‌کند مگر اینکه برای شاخه دیگری از درخت وابستگی مورد نیاز باشند. بنابراین با در نظر گرفتن: .Bd -literal x: a .WAIT b echo x a: echo a b: b1 echo b b1: echo b1 .Ed خروجی همواره برابر است با .Ql a , .Ql b1 , .Ql b , .Ql x . .Pp ترتیب اعمال‌شده توسط .Ic .WAIT تنها برای ساخت‌های موازی (parallel makes) اهمیت دارد. .El .Sh "هدف‌های ویژه (SPECIAL TARGETS)" هدف‌های ویژه نمی‌توانند همراه با دیگر هدف‌ها آورده شوند، بدین معنا که باید تنها هدف مشخص‌شده باشند. .Bl -tag -width .BEGINx .It Ic .BEGIN هر سطر فرمانی که به این هدف پیوست شده باشد، پیش از انجام هر کار دیگری اجرا می‌شود. .It Ic .DEFAULT این به‌نوعی یک قاعده .Ic .USE برای هر هدفی است (که تنها به‌عنوان یک منبع به کار رفته بود) که .Nm روش دیگری برای ساخت آن نمی‌یابد. تنها اسکریپت شل به کار گرفته می‌شود. متغیر .Va .IMPSRC هدفی که دستورهای .Ic .DEFAULT را به ارث می‌برد، روی نام خود هدف تنظیم می‌شود. .It Ic .DELETE_ON_ERROR اگر این هدف در makefile وجود داشته باشد، به گونه‌ای سراسری موجب می‌شود make هدف‌هایی را که دستورهایشان شکست می‌خورند، حذف کند. (به‌طور پیش‌فرض، تنها هدف‌هایی که دستورهایشان هنگام اجرا دچار وقفه می‌شوند، حذف می‌گردند. این رفتار دیرینه است.) این تنظیم می‌تواند برای جلوگیری از بر جای ماندن هدف‌های نیمه‌کاره یا ناقص و خراب شدن ساخت‌های مجدد در آینده به کار رود. .It Ic .END هر سطر فرمانی که به این هدف پیوست شده باشد، پس از انجام موفقیت‌آمیز همه کارهای دیگر اجرا می‌شود. .It Ic .ERROR هر سطر فرمانی که به این هدف پیوست شده باشد، هنگام شکست هدفی دیگر اجرا می‌شود. برای متغیرهایی که مقداردهی خواهند شد، .Va MAKE_PRINT_VAR_ON_ERROR را ببینید. .It Ic .IGNORE هر یک از منابع را با صفت .Ic .IGNORE نشانه‌گذاری می‌کند. اگر منبعی مشخص نشده باشد، معادل مشخص کردن گزینه .Fl i است. .It Ic .INTERRUPT اگر اجرای .Nm دچار وقفه شود، دستورهای این هدف اجرا می‌شوند. .It Ic .MAIN اگر هنگام فراخوانی .Nm هیچ هدفی مشخص نشده باشد، این هدف ساخته می‌شود. .It Ic .MAKEFLAGS این هدف راهی برای مشخص کردن پرچم‌ها برای .Nm در زمان خوانده شدن makefileها فراهم می‌کند. پرچم‌ها همانند آن هستند که در شل تایپ شده باشند، هرچند گزینه .Fl f بی‌اثر است. .\" XXX: NOT YET!!!! .\" .It Ic .NOTPARALLEL .\" The named targets are executed in non parallel mode. .\" If no targets are .\" specified, all targets are executed in non parallel mode. .It Ic .NOPATH صفت .Ic .NOPATH را به هر یک از منابع مشخص‌شده اعمال می‌کند. .It Ic .NOTPARALLEL حالت موازی را غیرفعال می‌کند. .It Ic .NO_PARALLEL مترادفی برای .Ic .NOTPARALLEL Ns ، جهت سازگاری با دیگر نگارش‌های pmake. .It Ic .NOREADONLY صفت فقط‌خواندنی را از متغیرهای سراسری مشخص‌شده به‌عنوان منبع پاک می‌کند. .It Ic .OBJDIR منبع، مقداری تازه برای .Sq Va .OBJDIR است. در صورت وجود، .Nm دایرکتوری کاری جاری را به آن تغییر داده و مقدار .Sq Va .OBJDIR را به‌روزرسانی می‌کند. .It Ic .ORDER در حالت موازی، هدف‌های نام‌برده به ترتیب و پیاپی ساخته می‌شوند. این ترتیب‌دهی، هدفی را به فهرست هدف‌های آماده ساخت نمی‌افزاید. .Pp از آنجا که وابسته‌های یک هدف تا زمانی که خود هدف نتواند ساخته شود، ساخته نمی‌شوند، مگر آنکه .Ql a توسط بخش دیگری از گراف وابستگی ساخته شود، مورد زیر یک حلقه وابستگی خواهد بود: .Bd -literal \&.ORDER: b a b: a .Ed .Pp .\" XXX: NOT YET!!!! .\" .It Ic .PARALLEL .\" The named targets are executed in parallel mode. .\" If no targets are .\" specified, all targets are executed in parallel mode. .It Ic .PATH منابع، دایرکتوری‌هایی هستند که باید برای یافتن پرونده‌های ناموجود در دایرکتوری جاری جستجو شوند. اگر منبعی مشخص نشده باشد، هر دایرکتوری مشخص‌شده پیشین از مسیر جستجو حذف می‌شود. اگر منبع، هدف ویژه .Ic .DOTLAST باشد، دایرکتوری کاری جاری در پایان جستجو می‌شود. .It Ic .PATH. Ns Ar suffix همانند .Ic .PATH اما تنها بر پرونده‌هایی با پسوند مشخص اعمال می‌شود. این پسوند باید پیش‌تر با .Ic .SUFFIXES تعریف شده باشد. .It Ic .PHONY صفت .Ic .PHONY را به هر یک از منابع مشخص‌شده اعمال می‌کند. .It Ic .POSIX اگر این سطر نخستین سطر غیرتوضیحی در makefile اصلی باشد، متغیر .Va %POSIX بر روی مقدار .Ql 1003.2 تنظیم می‌گردد و در صورت وجود پرونده makefile با نام .Ql Ns ، برای ارائه قواعد پیش‌فرض سازگار با POSIX شمول می‌یابد (include می‌شود). اگر .Nm با پرچم .Fl r اجرا شود، تنها .Ql posix.mk در قواعد پیش‌فرض سهم خواهد داشت. در حالت سازگار با POSIX، اصلاح‌گر جایگزینی به سبک AT&T System V UNIX ابتدا بررسی می‌شود، نه به‌عنوان گزینه پس‌نشست. .It Ic .PRECIOUS صفت .Ic .PRECIOUS را به هر یک از منابع مشخص‌شده اعمال می‌کند. اگر منبعی مشخص نشود، صفت .Ic .PRECIOUS به همه هدف‌های پرونده اعمال می‌گردد. .It Ic .READONLY صفت فقط‌خواندنی را روی متغیرهای سراسری مشخص‌شده به‌عنوان منبع تنظیم می‌کند. .It Ic .SHELL شلی را که .Nm برای اجرای دستورها به کار می‌برد، تعیین می‌کند. منابع، مجموعه‌ای از جفت‌های .Ar field\| Ns Cm \&= Ns Ar value هستند. .Bl -tag -width ".Li hasErrCtls" .It Li name این کمینه‌ترین مشخصه است که برای انتخاب یکی از مشخصه‌های توکار شل؛ یعنی .Li sh Ns ، .Li ksh و .Li csh به کار می‌رود. .It Li path مسیر مطلق به شل را مشخص می‌کند. .It Li hasErrCtl مشخص می‌کند که آیا شل از خروج در هنگام بروز خطا پشتیبانی می‌کند یا خیر. .It Li check دستور فعال‌سازی بررسی خطا. .It Li ignore دستور غیرفعال‌سازی بررسی خطا. .It Li echo دستور فعال‌سازی بازتاب (echo) دستورهای اجراشده. .It Li quiet دستور خاموش کردن بازتاب دستورهای اجراشده. .It Li filter خروجی که باید پس از صدور دستور .Li quiet فیلتر شود. این معمولاً همسان با .Li quiet است. .It Li errFlag پرچمی که برای فعال‌سازی بررسی خطا به شل داده می‌شود. .It Li echoFlag پرچمی که برای فعال‌سازی بازتاب دستورها به شل داده می‌شود. .It Li newline رشته متنی لفظی که به شل فرستاده می‌شود و در صورت استفاده خارج از نویسه‌های نقل‌قول، به یک نویسه خط جدید تکی می‌انجامد. .El نمونه: .Bd -literal \&.SHELL: name=ksh path=/bin/ksh hasErrCtl=true \e check="set \-e" ignore="set +e" \e echo="set \-v" quiet="set +v" filter="set +v" \e echoFlag=v errFlag=e newline="'\en'" .Ed .It Ic .SILENT صفت .Ic .SILENT را به هر یک از منابع مشخص‌شده اعمال می‌کند. اگر منبعی مشخص نشود، صفت .Ic .SILENT به تمام دستورهای پرونده اعمال می‌گردد. .It Ic .STALE این هدف هنگامی اجرا می‌شود که یک پرونده وابستگی دارای مدخل‌های کهنه باشد، در حالی که .Va .ALLSRC روی نام آن پرونده وابستگی تنظیم شده است. .It Ic .SUFFIXES هر منبع پسوندی را برای .Nm مشخص می‌کند. اگر هیچ منبعی مشخص نشود، تمامی پسوندهای مشخص‌شده پیشین حذف می‌شوند. این ویژگی امکان ایجاد قواعد تبدیل پسوند را فراهم می‌آورد. .Pp نمونه: .Bd -literal \&.SUFFIXES: .c .o \&.c.o: cc \-o ${.TARGET} \-c ${.IMPSRC} .Ed .It Ic .SYSPATH منابع، شاخه‌هایی هستند که باید به مسیر گنجاندن سیستمی اضافه شوند؛ مسیری که .Nm در آن به دنبال پرونده‌های ساخت (makefiles) می‌گردد. اگر هیچ منبعی مشخص نشود، هر شاخه‌ای که پیش‌تر مشخص شده بود از مسیر گنجاندن سیستمی حذف می‌شود. .El .Sh "محیط (ENVIRONMENT)" .Nm در صورت وجود، از متغیرهای محیطی زیر استفاده می‌کند: .Ev MACHINE , .Ev MACHINE_ARCH , .Ev MAKE , .Ev MAKEFLAGS , .Ev MAKEOBJDIR , .Ev MAKEOBJDIRPREFIX , .Ev MAKESYSPATH , .Ev MAKE_STACK_TRACE , .Ev PWD و .Ev TMPDIR . .Pp .Ev MAKEOBJDIRPREFIX و .Ev MAKEOBJDIR باید در محیط یا در خط فرمان برای .Nm تنظیم شوند و نه به عنوان متغیرهای makefile؛ برای جزئیات بیشتر به شرح .Sq Va .OBJDIR مراجعه کنید. امکان تنظیم این موارد از طریق متغیرهای makefile وجود دارد، اما مگر آنکه بسیار زود انجام شود و از هدف .Sq Ic .OBJDIR برای بازنشانی .Sq Va .OBJDIR استفاده شود، ممکن است پیامدهای جانبی غیرمنتظره‌ای داشته باشد. .Pp اگر متغیر محیطی .Ev MAKE_STACK_TRACE روی .Dq yes تنظیم شده باشد، هرگونه ردپای پشته شامل زنجیره فراخوانی فرایندهای والد خواهد بود. .\" .Sh EXIT STATUS .\" .Sh ENVIRONMENT .Sh "پرونده‌ها (FILES)" .Bl -tag -width /usr/share/mk -compact .It .depend فهرست وابستگی‌ها .It makefile نخستین پرونده ساخت پیش‌فرض در صورتی که هیچ makefile در خط فرمان مشخص نشده باشد .It Makefile دومین پرونده ساخت پیش‌فرض در صورتی که هیچ makefile در خط فرمان مشخص نشده باشد .It sys.mk پرونده ساخت سامانه .It /usr/share/mk شاخه پرونده‌های ساخت سامانه .El .\" .Sh EXAMPLES .Sh "پیام‌های تشخیصی (DIAGNOSTICS)" .Bl -tag .It Dv Invalid internal option \(dq-J\(dq in \(dq Ns Ar directory Ns Dv \(dq گزینه داخلی .Fl J فرایند اصلی .Nm را با فرایندهای make فرعی (sub-make) هماهنگ می‌سازد تا شمار کارهایی را که به طور موازی اجرا می‌شوند، محدود کند. این گزینه از طریق متغیر محیطی .Ev MAKEFLAGS به تمام فرایندهای فرزند منتقل می‌شود. برای معتبر شدن، این گزینه نیازمند آن است که هدفِ اجراکننده sub-make با منبع ویژه .Dv .MAKE نشانه‌گذاری شده باشد، یا اینکه یکی از دستورهای هدف مستقیماً شامل کلمه .Dq make یا یکی از عبارت‌های .Dq ${MAKE} , .Dq ${.MAKE} , .Dq $(MAKE) , .Dq $(.MAKE) باشد. در غیر این صورت، make هشدار بالا را صادر کرده و به حالت سازگاری (compat mode) بازمی‌گردد. .Pp برای مشاهده زنجیره sub-makeهایی که به گزینه نامعتبر می‌انجامد، متغیر محیطی .Ev MAKE_STACK_TRACE را روی .Dq yes تنظیم کنید. .Pp برای اجرای sub-make در حالت موازی، حتی در حالت اجرای آزمایشی (dry-run) (به گزینه .Fl n مراجعه کنید)، شبه‌منبع .Dv .MAKE را به هدف اضافه کنید. این کار هنگامی مناسب است که sub-make همان هدف را در یک زیرشاخه اجرا کند. .Pp برای اجرای sub-make در حالت موازی اما نه در حالت dry-run، نشانگر .Dq ${:D make} را به یکی از دستورهای هدف بیفزایید. این نشانگر به یک رشته تهی گسترش می‌یابد و بنابراین بر دستورهای اجراشده اثری نمی‌گذارد. .\" The marker can even be added before any of the "@+-" modifiers, .\" so no need to mention this explicitly. .Pp برای اجرای sub-make در حالت compat، گزینه .Fl B را به فراخوانی آن اضافه کنید. این کار هنگامی مناسب است که sub-make صرفاً برای چاپ مقدار یک متغیر با استفاده از گزینه‌های .Fl v یا .Fl V به کار رود. .Pp برای مستقل کردن sub-make از make والد، متغیر محیطی .Ev MAKEFLAGS را در دستورهای هدف لغو کنید (unset نمایید). .El .Sh "سازگاری (COMPATIBILITY)" نحو پایه‌ای make میان گونه‌های گوناگون make سازگار است؛ با این حال متغیرهای ویژه، پیراینده‌های متغیر و شرطی‌ها سازگار نیستند. .Ss "نسخه‌های قدیمی‌تر (Older versions)" فهرستی ناتمام از دگرگونی‌ها در نسخه‌های پیشین .Nm : .Pp روش جایگزینی متغیرهای حلقه .for پس از NetBSD 5.0 دگرگون شد تا همچنان مانند گسترش‌های متغیر به نظر برسند. به‌ویژه این امر از برخورد با آن‌ها به عنوان نحو جلوگیری کرده و برخی دشواری‌های مبهم در به‌کارگیری آن‌ها درون گزاره‌های .if را برطرف می‌کند. .Pp روش زمان‌بندی makeهای موازی در NetBSD 4.0 دگرگون شد تا .ORDER و .WAIT به‌گونه بازگشتی بر گره‌های وابسته اعمال شوند. الگوریتم‌های به‌کاررفته شاید در آینده دوباره تغییر یابند. .Ss "دیگر گویش‌های make (Other make dialects)" دیگر گویش‌های make (مانند GNU make، SVR4 make، POSIX make و غیره) از بیشتر ویژگی‌های .Nm به شرحی که در این راهنما آمده پشتیبانی نمی‌کنند. به‌ویژه: .Bl -bullet -offset indent .It اعلان‌های .Ic .WAIT و .Ic .ORDER و بیشتر کارکردهای مربوط به موازی‌سازی. (ابزار GNU make از موازی‌سازی پشتیبانی می‌کند اما فاقد ویژگی‌های موردنیاز برای مهار کارآمد آن است.) .It دستورالعمل‌ها، دربرگیرنده حلقه‌های for، شرطی‌ها و بیشتر حالت‌های پرونده‌های گنجانده‌شده (include). (ابزار GNU make نحو ناسازگار و کم‌توان‌تری برای شرطی‌ها دارد.) .\" عبارت "کم‌توان‌تر" در بالا به این معناست که GNU make از توابع .\" make(target)، target(target) و commands(target) برخوردار نیست. .It همه متغیرهای توکار که با نقطه آغاز می‌شوند. .It بیشتر منابع و هدف‌های ویژه که با نقطه آغاز می‌شوند، با استثنای چشمگیرِ .Ic .PHONY , .Ic .PRECIOUS , و .Ic .SUFFIXES . .It پیراینده‌های متغیر، به جز جایگزینی رشته‌ایِ .Ql :old=new که به‌گونه‌ای حمل‌پذیر از تطبیق الگو (globbing) با .Ql % پشتیبانی نمی‌کند و از دید تاریخی تنها روی پسوندهای اعلان‌شده کار می‌کند. .It متغیر .Ic $> حتی در شکل کوتاهش؛ بیشتر makeها از این کارکرد پشتیبانی می‌کنند اما نام آن تفاوت دارد. .El .Pp برخی ویژگی‌ها تا اندازه‌ای حمل‌پذیرترند، مانند انتساب با .Ic += , .Ic ?= , و .Ic != . کارکرد .Va .PATH بر پایه ویژگی قدیمی‌ترِ .Ic VPATH موجود در GNU make و نسخه‌های متعددی از SVR4 make بنا شده است؛ با این حال، از دید تاریخی رفتار آن بیش از اندازه مبهم (و دارای اشکال) است و نمی‌توان به آن اتکا کرد. .Pp متغیرهای .Ic $@ و .Ic $< کم‌وبیش در همه‌جا حمل‌پذیرند، همچنین است متغیر .Ic $(MAKE) . به‌کارگیری پایه‌ای قواعد پسوند (تنها برای پرونده‌های شاخه کنونی، بدون تلاش برای زنجیره‌ای کردن تبدیلات، و مانند آن) نیز به اندازه معقولی حمل‌پذیر است. .Sh "همچنین ببینید (SEE ALSO)" .Xr mkdep 1 .\" .Sh STANDARDS .Sh "تاریخچه (HISTORY)" .Nm از .Xr make 1 در NetBSD برگرفته شده است. این ابزار از autoconf برای آسان‌سازی حمل‌پذیری به دیگر سکوها بهره می‌برد. .Pp دستور make در .At v7 پدیدار شد. این پیاده‌سازی make بر پایه برنامه pmake از Adam de Boor است، که برای Sprite در برکلی نوشته شده بود. این برنامه به عنوان یک make توزیع‌شده موازی برای اجرای وظایف روی ماشین‌های گوناگون با به‌کارگیری یک دیمن به نام .Dq customs . طراحی شده بود. .Pp از دید تاریخی، هدف/وابستگی .Ic FRC برای وادار کردن به بازسازی (FoRCe rebuilding) به کار می‌رفته است (چرا که این هدف/وابستگی وجود ندارد ... مگر آنکه کسی پرونده‌ای به نام .Pa FRC بسازد). .\" .Sh AUTHORS .\" .Sh CAVEATS .Sh "اشکالات (BUGS)" نحو .Nm برای تجزیه دشوار است. برای نمونه، یافتن پایان کاربرد یک متغیر باید نیازمند پیمایش تک‌تک پیراینده‌ها با استفاده از پایان‌دهنده درست برای هر بخش باشد. در بسیاری از جاها .Nm تنها {} و () را به منظور یافتن پایان گسترش متغیر شمارش می‌کند. .Pp هیچ راهی برای گریز دادن نویسه فاصله درون یک نام پرونده وجود ندارد. .Pp در حالت وظایف (jobs)، هنگامی که یک هدف شکست بخورد؛ .Nm یک نشانه (توکن) خطا در مخزن نشانه‌های وظیفه قرار می‌دهد. این امر موجب می‌شود تمام نمونه‌های دیگر .Nm که از آن مخزن نشانه استفاده می‌کنند، ساخت را متوقف کرده و با کد خطای ۶ خارج شوند. گاهی تلاش برای جلوگیری از آبشاری از خطاهای غیرضروری، می‌تواند به خطای به ظاهر نامشخصِ .Ql *** Error code 6 بینجامد. .\" .Sh SECURITY CONSIDERATIONS