انگلیسیفرانسویاسپانیایی

Ad


فاویکون OnWorks

منفی - آنلاین در ابر

اجرای معایب در ارائه دهنده هاست رایگان OnWorks از طریق Ubuntu Online، Fedora Online، شبیه ساز آنلاین ویندوز یا شبیه ساز آنلاین MAC OS

این فرمان منفی است که می تواند در ارائه دهنده هاست رایگان OnWorks با استفاده از یکی از چندین ایستگاه کاری آنلاین رایگان ما مانند Ubuntu Online، Fedora Online، شبیه ساز آنلاین ویندوز یا شبیه ساز آنلاین MAC OS اجرا شود.

برنامه:

نام


معایب - یک سیستم ساخت نرم افزار

شرح


راهنما و مرجع نسخه 2.2.0

حق چاپ (ج) 1996-2000 Free Software Foundation، Inc.

این برنامه نرم افزار رایگان است. می توانید آن را مجدداً توزیع کنید و/یا آن را تحت شرایط تغییر دهید
مجوز عمومی عمومی گنو که توسط بنیاد نرم افزار آزاد منتشر شده است. یا
نسخه 2 مجوز، یا (به انتخاب شما) هر نسخه بعدی.

این برنامه به این امید که مفید باشد، اما بدون ضمانت توزیع شده است.
حتی بدون ضمانت ضمنی تجارت یا تناسب برای یک هدف خاص.
برای جزئیات بیشتر به مجوز عمومی عمومی گنو مراجعه کنید.

شما باید یک نسخه از مجوز عمومی عمومی گنو را همراه با این برنامه دریافت کرده باشید.
فایل کپی را ببینید. اگر نه، به بنیاد نرم افزار آزاد، شرکت، 59 معبد بنویسید
Place - Suite 330, Boston, MA 02111-1307, USA.

معرفی


منفی یک سیستم برای ساخت، در درجه اول، نرم افزار است، اما کاملا متفاوت است
سیستم های ساخت نرم افزار قبلی نکات منفی از ابتدا تا به معامله طراحی شده بود
به راحتی با ساخت نرم افزاری که در چندین فهرست منبع پخش می شود. منفی
ایجاد اسکریپت های ساخت ساده، قابل فهم و قابل نگهداری را آسان می کند.
Cons تضمین می کند که نرم افزار پیچیده به راحتی و با دقت قابل تکرار است.

Cons از تعدادی تکنیک برای انجام همه اینها استفاده می کند. اسکریپت های ساخت و ساز فقط هستند
اسکریپت های پرل، که هم درک آنها را آسان و هم بسیار انعطاف پذیر می کند. محدوده جهانی
متغیرها با مکانیزم واردات/صادرات برای به اشتراک گذاری اطلاعات بین آنها جایگزین می شود
اسکریپت ها، به طور قابل توجهی خوانایی و قابلیت نگهداری هر اسکریپت را بهبود می بخشد.
ساخت محیط معرفی می شوند: اینها اشیاء پرل هستند که تصویر را ضبط می کنند
اطلاعات مورد نیاز برای کنترل فرآیند ساخت محیط های متعددی استفاده می شود
زمانی که معنای متفاوتی برای تولید محصولات در درخت ساخت مورد نیاز است. منفی
تجزیه و تحلیل وابستگی خودکار را پیاده سازی می کند و از آن برای توالی جهانی کل استفاده می کند
ساختن. ساخت های مختلف به راحتی از یک درخت منفرد تولید می شوند. ساخت هوشمند
هنگام کار بر روی تغییرات محلی، تنظیمات فرعی امکان پذیر است. لغو را می توان به راه اندازی کرد
به راحتی دستورالعمل های ساخت را بدون تغییر اسکریپت لغو کنید. رمزنگاری MD5
امضا با فایل های مشتق شده مرتبط هستند و برای تعیین دقیق اینکه آیا استفاده می شود
یک فایل داده شده نیاز به بازسازی دارد.

در حالی که تمام موارد بالا و موارد دیگر را ارائه می دهد، موارد منفی همچنان ساده و آسان برای استفاده باقی می مانند. این اراده،
امیدوارم با خواندن ادامه این سند روشن شود.

چرا معایب؟ چرا نه درست کردن؟


منفی است ساخت جایگزینی در پاراگراف های بعدی به چند مورد از این موارد نگاه می کنیم
ویژگی های نامطلوب ساخت - و محیط های ساخت معمولی بر اساس ساخت - که
انگیزه توسعه Cons.

ساختن پیچیدگی

سیستم‌های مبتنی بر ساخت سنتی با هر اندازه‌ای که باشند، بسیار پیچیده می‌شوند. ساخت اصلی
مطلوبیت و مشتقات آن به طرق مختلف در این گرایش نقش داشته اند. ساخت است
در برخورد با سیستم هایی که در چندین دایرکتوری پخش شده اند خوب نیست. کارهای مختلف -
اطراف برای غلبه بر این مشکل استفاده می شود. انتخاب معمولی برای فراخوانی است
خود به صورت بازگشتی برای هر زیر شاخه از یک ساخت. این منجر به کد پیچیده، در
که اغلب مشخص نیست که یک متغیر چگونه تنظیم می شود، یا تنظیم یک متغیر چه تأثیری دارد
به طور کلی روی ساخت خواهد داشت. زبان اسکریپت make به تدریج گسترش یافته است
برای فراهم کردن امکانات بیشتر، اما اینها تا حد زیادی به درهم ریختن یک در حال حاضر کمک کرده اند
زبان بیش از حد گسترش یافته اغلب، ساخت‌ها در چند پاس به منظور ارائه انجام می‌شوند
محصولات مناسب از یک دایرکتوری به دایرکتوری دیگر. این نشان دهنده یک چیز بیشتر است
افزایش پیچیدگی ساخت

ساختن تکرارپذیری

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

نوع دیگر می سازد

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

مخازن

Make تنها پشتیبانی محدودی را برای ساختن نرم افزار از روی کد موجود در a ارائه می کند
ساختار دایرکتوری مخزن مرکزی ویژگی VPATH ساخت گنو (و برخی دیگر
make implements) برای ارائه این در نظر گرفته شده است، اما آنطور که انتظار می رود کار نمی کند: آن
مسیر فایل هدف را به نام VPATH خیلی زود در تجزیه و تحلیل خود تغییر می دهد و بنابراین
تمام وابستگی ها را در فهرست VPATH جستجو می کند. برای اطمینان از توسعه صحیح
ساخت، مهم است که بتوانید یک فایل در یک فهرست ساخت محلی ایجاد کنید و داشته باشید
هر فایلی در یک مخزن کد (به عبارت ساخت، یک فهرست VPATH) که به محلی بستگی دارد
فایل به درستی بازسازی شود این کار با VPATH بدون کدنویسی زیاد امکان پذیر نیست
دانش مخزن پیچیده مستقیماً وارد فایل‌های سازنده می‌شود.

نگهداری it ساده


تعدادی از مشکلات ساخت در بالا ذکر شده است. در این و پس از آن
در بخش، نکات منفی را معرفی خواهیم کرد و نشان خواهیم داد که چگونه به این مسائل پرداخته می شود.

پرل اسکریپت

Cons مبتنی بر پرل است. یعنی اسکریپت های منفی --سرباز وظیفه و ساختن فایل ها، معادل
به makefile or تهیه پرونده-- همه به زبان پرل نوشته شده اند. این یک مزیت فوری دارد:
زبان برای نوشتن اسکریپت زبان آشنا است. حتی اگر شما یک پرل نباشید
برنامه نویس، دانستن اینکه Perl اساساً فقط یک زبان اعلانی ساده است کمک می کند.
با یک جریان کاملاً تعریف شده از کنترل، و معناشناسی آشنا. دارای متغیرهایی است که رفتار می کنند
اساساً همانطور که از آنها انتظار دارید، برنامه های فرعی، جریان کنترل و غیره. آنجا
دستور خاصی برای Cons معرفی نشده است. استفاده از پرل به عنوان زبان برنامه نویسی
کار بیان راه حل مناسب برای اغلب پیچیده ها را ساده می کند
الزامات یک ساخت

سلام، جهان!

برای مبنا کردن بحث زیر، در اینجا نحوه ساختن آن آورده شده است سلام، جهان! C
برنامه با معایب:

$env = منفی جدید();
برنامه $env 'hello', 'hello.c';

اگر این اسکریپت را در دایرکتوری نصب کنید، اسکریپت را نامگذاری کنید ساختن، و ایجاد کنید
سلام سی فایل منبع در همان دایرکتوری است، سپس می‌توانید «cons hello» را برای ساختن تایپ کنید
برنامه:

% منفی سلام
cc -c hello.c -o hello.o
cc -o سلام سلام.o

ساخت محیط

ساده‌سازی کلیدی Cons ایده الف است ساخت و ساز محیط. یک ساخت و ساز
محیط یک است هدف با مجموعه ای از جفت های کلید/مقدار و مجموعه ای از مواد و روشها.
برای اینکه به Cons بگویید چگونه چیزی بسازد، روش مناسب را از طریق an فراخوانی می کنید
محیط ساخت و ساز مناسب به مثال زیر توجه کنید:

$env = منفی جدید(
CC => 'gcc',
LIBS => 'libworld.a'
);

برنامه $env 'hello', 'hello.c';

در این مورد، به جای استفاده از محیط ساخت و ساز پیش فرض، همانطور که هست، داریم
مقدار "CC" را لغو کرد تا در عوض از معادل کامپایلر C GNU استفاده شود. از آنجا که
این نسخه از سلام، جهان! نیاز به کتابخانه دارد، libworld.a، ما مشخص کرده ایم که هر
برنامه لینک شده در این محیط باید با آن کتابخانه پیوند داده شود. اگر کتابخانه
از قبل وجود دارد، خوب و خوب، اما اگر نه، باید این عبارت را نیز اضافه کنیم:

کتابخانه $env 'libworld', 'world.c';

حال اگر «cons hello» را تایپ کنید، کتابخانه قبل از پیوند دادن برنامه ساخته می‌شود، و
البته، «gcc» برای کامپایل هر دو ماژول استفاده خواهد شد:

% منفی سلام
gcc -c hello.c -o hello.o
gcc -c world.c -o world.o
ar r libworld.a world.o
ar: ایجاد libworld.a
ranlib libworld.a
gcc -o سلام hello.o libworld.a

اتوماتیک و کامل وابستگی تحلیل

با Cons، وابستگی ها به طور خودکار مدیریت می شوند. در ادامه مثال قبلی توجه کنید
که وقتی اصلاح می کنیم world.c, world.o دوباره کامپایل می شود، libworld.a بازسازی شد، و سلام
پیوند مجدد:

% vi world.c
[ویرایش]
% منفی سلام
gcc -c world.c -o world.o
ar r libworld.a world.o
ar: ایجاد libworld.a
ranlib libworld.a
gcc -o سلام hello.o libworld.a

این یک مثال نسبتاً ساده است: منفی "می داند" world.o بستگی داره به world.c، به دلیل
وابستگی به صراحت توسط روش "کتابخانه" تنظیم شده است. این را هم می داند libworld.a
بستگی داره به world.o و آن سلام بستگی داره به libworld.a، همه به دلایل مشابه.

حالا معلوم می شود که سلام سی همچنین شامل فایل تعریف رابط، world.h:

% emacs world.h
[ویرایش]
% منفی سلام
gcc -c hello.c -o hello.o
gcc -o سلام hello.o libworld.a

Cons چگونه این را می داند سلام سی شامل world.h، و آن سلام.و بنابراین باید باشد
دوباره کامپایل شد؟ در حال حاضر، در مورد اینکه آیا یا نه، همین را بگوییم سلام.و بالا است-
تا به امروز، Cons از یک اسکنر برای وابستگی خود استفاده می کند، سلام سی. این اسکنر را شمارش می کند
فایل های موجود توسط سلام سی فهرستی از وابستگی‌های بیشتر، فراتر از آن‌ها ارائه شود
توسط اسکریپت Cons مشخص شده است. این فرآیند بازگشتی است: هر فایلی که توسط
فایل های همراه نیز اسکن خواهند شد.

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

اتوماتیک جهانی ساختن ترتیب دهی

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

بنا بزرگ درختان -- هنوز تنها as ساده


A سلسله مراتب of ساختن اسکریپت

یک ساخت بزرگتر، در Cons، با ایجاد یک سلسله مراتب سازماندهی می شود ساختن اسکریپت. در بالا
از درخت یک اسکریپت است به نام ساختن. بقیه فیلمنامه ها، طبق قرارداد، هر کدام هستند
نام سرباز وظیفه. این اسکریپت ها به سادگی توسط "Build" به یکدیگر متصل می شوند،
دستورات "Export" و "Import".

La ساختن فرمان

دستور "Build" لیستی از سرباز وظیفه نام فایل ها، و ترتیب آنها را می دهد
در ساخت گنجانده شده است. مثلا:

ساخت qw(
رانندگان / نمایش / سرباز وظیفه
رانندگان / موش / سرباز وظیفه
تجزیه کننده / سرباز وظیفه
خدمات آب و برق / سرباز وظیفه
);

این یک سلسله مراتب ساده دو سطحی از اسکریپت های ساخت است: همه شرکت های فرعی سرباز وظیفه فایل ها
در سطح بالا ذکر شده است ساختن فایل. توجه داشته باشید که همه دایرکتوری ها در درخت نیستند
لزوماً دارای اسکریپت های ساخت مرتبط با آنها هستند.

این همچنین می تواند به عنوان یک اسکریپت چند سطحی نوشته شود. به عنوان مثال ساختن ممکن است فایل
حاوی این دستور:

ساخت qw(
تجزیه کننده / سرباز وظیفه
رانندگان / سرباز وظیفه
خدمات آب و برق / سرباز وظیفه
);

و سرباز وظیفه فایل در درایور دایرکتوری ممکن است حاوی این باشد:

ساخت qw(
نمایش / سرباز وظیفه
موش / سرباز وظیفه
);

تجربه نشان داده است که درک مدل قبلی کمی ساده تر است، زیرا
کل درخت ساخت و ساز در مقابل شما، در سطح بالا قرار گرفته است. طرح های ترکیبی هستند
نیز ممکن است. یک جزء جداگانه نگهداری می شود که باید در الف گنجانده شود
برای مثال build tree ممکن است در یک مکان به درخت ساخت قلاب شود، اما خودش را تعریف کند
سلسله مراتب ساخت و ساز

به طور پیش فرض، Cons دایرکتوری کاری خود را به دایرکتوری حاوی a تغییر نمی دهد
فرعی سرباز وظیفه فایل شامل آن است. این رفتار را می توان برای ساخت توسط فعال کرد
مشخص کردن، در سطح بالا ساختن فایل:

سرباز وظیفه_چدر 1;

وقتی فعال شود، Cons به شرکت فرعی تغییر خواهد کرد سرباز وظیفه فایل حاوی دایرکتوری
در حین خواندن در آن فایل، و سپس یک بار فایل را به دایرکتوری سطح بالا برگردید
پردازش شده است.

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

سرباز وظیفه_چدر 0;

نسبت فامیلی، نسبی بالا، و مطلق پرونده نام

ممکن است متوجه شده باشید که نام فایل های مشخص شده در دستور Build نسبت به
محل اسکریپت که از آن فراخوانی شده است. این به طور کلی برای نام فایل های دیگر صادق است
آرگومان هایی برای دستورات دیگر نیز وجود دارد، اگرچه ممکن است در اینجا به خوبی اشاره کنیم که اگر شروع کنید
یک نام فایل با علامت هش، «#»، سپس آن فایل نسبت به بالا تفسیر می شود.
دایرکتوری سطح (که در آن ساختن فایل موجود است). و جای تعجب نیست که اگر آن را شروع کنید
با ``/''، سپس به عنوان یک نام مسیر مطلق در نظر گرفته می شود. این حتی در سیستم ها نیز صادق است
که برای نامگذاری مسیرهای مطلق از اسلش عقب به جای اسلش جلو استفاده می کنند.

با استفاده از ماژول ها in ساختن اسکریپت

شما می توانید ماژول ها را در هر کدام بکشید سرباز وظیفه فایل با استفاده از «استفاده» یا «نیاز» پرل معمولی
بیانیه:

از انگلیسی استفاده کن؛
نیازمند My::Module;

هر «استفاده» یا «نیاز» فقط بر یک مورد تأثیر می گذارد سرباز وظیفه فایلی که در آن ظاهر می شود. برای استفاده از a
ماژول به صورت چندگانه سرباز وظیفه شما باید در هر کدام یک عبارت «use» یا «require» قرار دهید
یکی که به ماژول نیاز دارد.

حوزه of متغیرها

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

متغیرها می توانند به صراحت باشند وارد شده توسط یک اسکریپت از اسکریپت مادرش. برای واردات یک
متغیر، باید بوده باشد صادر شده است توسط والد و مقداردهی اولیه (در غیر این صورت یک خطا
پیش خواهد آمد).

La صادرات فرمان

دستور 'Export' مانند مثال زیر استفاده می شود:

$env = منفی جدید();
$INCLUDE = "#export/include";
$LIB = "#export/lib";
صادرات qw( env INCLUDE LIB );
ساخت qw (util/Conscript)؛

مقادیر متغیرهای ساده ذکر شده در لیست «صادرات» حذف خواهند شد
با هر دستور بعدی "Build". دستور 'Export' فقط Perl را صادر می کند اسکالر
متغیرها، یعنی متغیرهایی که نام آنها با «$» شروع می شود. سایر متغیرها، اشیاء و غیره
را می توان با مرجع صادر کرد - اما همه اسکریپت ها به یک شی ارجاع می دهند و این
شی باید توسط اسکریپت های فرعی و اصلی فقط خواندنی در نظر گرفته شود
صادرات اسکریپت با این حال، اختصاص یک مقدار جدید به اسکالر صادر شده قابل قبول است
متغیر - که متغیر اساسی ارجاع شده را تغییر نمی دهد. این دنباله، برای
به عنوان مثال، خوب است:

$env = منفی جدید();
صادرات qw( env INCLUDE LIB );
ساخت qw (util/Conscript)؛
$env = منفی جدید (CFLAGS => '-O');
ساخت qw (دیگر / سرباز وظیفه)؛

فرقی نمی کند که متغیر قبل یا بعد از دستور 'Export' تنظیم شده باشد. در
نکته مهم مقدار متغیر در زمان اجرای دستور «Build» است.
این چیزی است که سنجاب دور می شود. به هر حال، هر دستور بعدی «صادرات»،
اولی را باطل کنید: باید همه متغیرهایی را که می خواهید روی هر کدام صادر کنید ذکر کنید
دستور "صادرات".

La وارد كردن فرمان

متغیرهای صادر شده توسط فرمان "Export" را می توان به اسکریپت های فرعی وارد کرد.
دستور "وارد کردن". اسکریپت فرعی همیشه متغیرها را مستقیماً از اسکریپت وارد می کند
فیلمنامه برتر این مثال را در نظر بگیرید:

وارد کردن qw( env شامل )؛

این تنها در صورتی قانونی است که اسکریپت والد «$env» و «$INCLUDE» را صادر کند. همچنین باید
به هر یک از این متغیرها مقادیر داده اند. فقط برای اسکریپت فرعی مشکلی ندارد
زیرمجموعه ای از متغیرهای صادر شده را وارد کنید (در این مثال، '$LIB'، که توسط صادر شده است
مثال قبلی، وارد نشده است).

همه متغیرهای وارد شده به طور خودکار دوباره صادر می شوند، بنابراین دنباله:

واردات qw ( env INCLUDE )؛
ساخت qw (زیر من / سرباز وظیفه)؛

"$env" و "$INCLUDE" را به فایل فرعی عرضه می کند. اگر فقط «$env» باشد
صادر می شود، سپس موارد زیر کافی است:

واردات qw ( env INCLUDE )؛
صادرات qw ( env )؛
ساخت qw (زیر من / سرباز وظیفه)؛

نیازی به گفتن نیست، متغیرها ممکن است قبل از فراخوانی «Build» به صورت محلی اصلاح شوند
اسکریپت فرعی

ساختن خط ارزیابی سفارش

تنها محدودیت در ترتیب اسکریپت های ساخت این است که اسکریپت های برتر هستند
قبل از اسکریپت های ضعیف خود ارزیابی می شوند. سطح بالا ساختن فایل، به عنوان مثال، است
ابتدا مورد ارزیابی قرار می گیرد، و سپس هر اسکریپت ضعیفی ارزیابی می شود. این تمام چیزی است که واقعاً باید بدانید
در مورد ترتیب ارزیابی، زیرا ترتیب به طور کلی نامربوط است. موارد زیر را در نظر بگیرید
دستور ساخت:

ساخت qw(
رانندگان / نمایش / سرباز وظیفه
رانندگان / موش / سرباز وظیفه
تجزیه کننده / سرباز وظیفه
خدمات آب و برق / سرباز وظیفه
);

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

A مدل برای اشتراک فایل ها


برخی از ساده کنوانسیون

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

قانون اساسی این است که همه محصولات ساختنی را ملزم کنیم که بین آنها به اشتراک گذاشته شود
دایرکتوری ها از طریق یک دایرکتوری میانی به اشتراک گذاشته می شوند. ما معمولاً این را نامیده ایم
صادرات، و در یک محیط C، زیرمجموعه های مرسوم این دایرکتوری ارائه شده است،
مانند شامل, لوب, صندوق، و غیره

این دایرکتوری ها توسط سطح بالا تعریف می شوند ساختن فایل. یک ساده ساختن پرونده برای
a سلام، جهان! برنامه، سازماندهی شده با استفاده از چندین فهرست، ممکن است به شکل زیر باشد:

# ساخت فایل برای Hello, World!

# همه محصولات مشترک خود را کجا قرار دهیم.
$EXPORT = '#صادرات';

صادرات qw (شامل BIN LIB)

# دایرکتوری استاندارد برای به اشتراک گذاری محصولات.
$INCLUDE = "$EXPORT/شامل";
$LIB = "$EXPORT/lib";
$BIN = "$EXPORT/bin";

# محیط ساخت و ساز استاندارد.
$CONS = منفی جدید (
CPPPATH => $INCLUDE، # شامل مسیر برای C Compilations
LIBPATH => $LIB، # مسیر کتابخانه برای پیوند دادن برنامه ها
LIBS => '-lworld'، # فهرست کتابخانه های استاندارد
);

ساخت qw(
سلام / سرباز وظیفه
جهان / سرباز وظیفه
);

La جهان دایرکتوری سرباز وظیفه فایل به شکل زیر است:

# فایل سرباز وظیفه برای جهان دایرکتوری
واردات qw( Cons INCLUDE LIB )؛

# محصولات این دایرکتوری را نصب کنید
$CONS $LIB، 'libworld.a' را نصب کنید.
$CONS $INCLUDE، 'world.h' را نصب کنید.

# محصولات داخلی
کتابخانه $CONS 'libworld.a', 'world.c';

و سلام دایرکتوری سرباز وظیفه فایل به شکل زیر است:

# فایل سربازی برای دایرکتوری سلام
واردات qw( CONS BIN )؛

# محصولات صادراتی
$CONS $BIN، 'hello' را نصب کنید.

# محصولات داخلی
برنامه $CONS 'hello', 'hello.c';

برای ساختن a سلام، جهان! برنامه با این ساختار دایرکتوری، به سطح بالا بروید
دایرکتوری، و "cons" را با آرگومان های مناسب فراخوانی کنید. در مثال زیر ما
به Cons برای ساخت دایرکتوری بگویید صادرات. برای ساخت دایرکتوری، Cons به صورت بازگشتی همه را می سازد
محصولات شناخته شده در آن فهرست (البته فقط در صورتی که نیاز به بازسازی داشته باشند). اگر هر یک از
آن محصولات به محصولات دیگر در فهرست های دیگر بستگی دارند، سپس آن ها ساخته خواهند شد،
بیش از حد.

درصد منفی صادرات
world/world.h را به صورت export/include/world.h نصب کنید
cc -Iexport/include -c hello/hello.c -o hello/hello.o
cc -Iexport/include -c world/world.c -o world/world.o
ar r world/libworld.a world/world.o
ar: ایجاد جهان/libworld.a
ranlib world/libworld.a
world/libworld.a را به عنوان export/lib/libworld.a نصب کنید
cc -o hello/hello hello/hello.o -Lexport/lib -lworld
hello/hello را به صورت export/bin/hello نصب کنید

تمیز، قابل درک، مستقل از مکان اسکریپت

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

همچنین توجه داشته باشید که Cons چگونه از جزئیات کوچک برای شما مراقبت می کند. همه صادرات دایرکتوری ها، برای
به عنوان مثال، به طور خودکار ساخته شدند. و فایل های نصب شده واقعاً به سختی پیوند داده شده بودند
دایرکتوری صادرات مربوطه، برای صرفه جویی در فضا و زمان. این توجه به جزئیات باعث صرفه جویی می شود
کار قابل توجهی است و حتی تولید اسکریپت های ساده و قابل نگهداری را آسان تر می کند.

جدا کردن منبع و ساختن درختان


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

جدا کردن ساختن و منبع دایرکتوری با استفاده از la ارتباط دادن فرمان

Cons مکانیسم ساده ای را ارائه می دهد که تمام این الزامات را برطرف می کند. "پیوند"
دستور مانند این مثال فراخوانی می شود:

پیوند 'build' => 'src';

دایرکتوری های مشخص شده به دایرکتوری منبع مشخص شده "پیوند" می شوند. بیایید فرض کنیم
که یک دایرکتوری منبع راه اندازی می کنید، "، با دایرکتوری های فرعی جهان و سلام در زیر آن،
مانند مثال قبلی سپس می توانید خطوط ساخت اصلی را جایگزین کنید
زیر است:

ساخت qw(
ساخت / جهان / سرباز وظیفه
ساخت / سلام / سرباز وظیفه
);

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

درصد منفی صادرات
build/world/world.h را به صورت export/include/world.h نصب کنید
cc -Iexport/include -c build/hello/hello.c -o build/hello/hello.o
cc -Iexport/include -c build/world/world.c -o build/world/world.o
ar r build/world/libworld.a build/world/world.o
ar: ایجاد build/world/libworld.a
ranlib build/world/libworld.a
build/world/libworld.a را به صورت export/lib/libworld.a نصب کنید
cc -o build/hello/hello build/hello/hello.o -Lexport/lib -lworld
build/hello/hello را به صورت export/bin/hello نصب کنید

باز هم Cons از جزئیات برای شما مراقبت کرده است. به طور خاص، شما متوجه خواهید شد که همه
ساخت‌ها با استفاده از فایل‌های منبع و فایل‌های شی از فهرست ساخت انجام می‌شوند. برای
مثال، build/world/world.o از گردآوری شده است build/world/world.cو
export/include/world.h از نصب شده است build/world/world.h. این در اکثر موارد انجام می شود
سیستم ها با استفاده از ابزار ساده «سخت» پیوند دادن فایل های مورد نیاز از هر منبع
دایرکتوری به دایرکتوری ساخت مناسب.

لینک ها به درستی توسط Cons نگهداری می شوند، مهم نیست که چه کاری با دایرکتوری منبع انجام می دهید.
اگر یک فایل منبع را تغییر دهید، ویرایشگر شما ممکن است این کار را «درجا» انجام دهد یا نام آن را تغییر دهد
ابتدا یک فایل جدید ایجاد کنید. در مورد دوم، هر لینک سخت از بین خواهد رفت. منفی خواهد شد
دفعه بعد که فایل منبع مورد نیاز است، این وضعیت را شناسایی کرده و آن را مجدداً پیوند خواهد داد
به درستی

به هر حال، شما همچنین متوجه آن خواهید شد نه تغییرات در زمینه مورد نیاز بود سرباز وظیفه
فایل ها. و همانطور که در بخش بعدی خواهیم دید، می توانیم جلوتر برویم.

نوع دیگر می سازد


سلام، جهان! برای موز و هلو سیستم عامل ها

ساخت های مختلف فقط به یک پسوند ساده دیگر نیاز دارند. بیایید به عنوان مثال a
نیاز به اجازه ساخت برای هر دو سیستم عامل baNaNa و peAcH. در این مورد،
ما از یک سیستم فایل توزیع شده مانند NFS برای دسترسی به سیستم خاص استفاده می کنیم و
فقط یکی از سیستم ها باید برای هر فراخوانی کامپایل شود
"معایب". در اینجا یکی از راه هایی است که ما می توانیم آن را راه اندازی کنیم ساختن فایل برای ما سلام، جهان!
برنامه:

# ساخت فایل برای Hello, World!

die qq(OS باید مشخص شود) مگر اینکه $OS = $ARG{OS};
die qq (سیستم عامل باید "هلو" یا "موز" باشد)
اگر $OS نه "هلو" و&&$OS نه "موز";

# همه محصولات مشترک خود را کجا قرار دهیم.
$EXPORT = "#export/$OS";

صادرات qw (شامل BIN LIB)

# دایرکتوری استاندارد برای به اشتراک گذاری محصولات.
$INCLUDE = "$EXPORT/شامل";
$LIB = "$EXPORT/lib";
$BIN = "$EXPORT/bin";

# محیط ساخت و ساز استاندارد.
$CONS = منفی جدید (
CPPPATH => $INCLUDE، # شامل مسیر برای C Compilations
LIBPATH => $LIB، # مسیر کتابخانه برای پیوند دادن برنامه ها
LIBS => '-lworld'، # فهرست کتابخانه های استاندارد
);

# $BUILD جایی است که ما همه چیز را استخراج خواهیم کرد.
$BUILD = "#build/$OS";

# به معایب بگویید فایل های منبع $BUILD کجا هستند.
پیوند $BUILD => 'src';

ساختن (
"$BUILD/hello/Conscript"،
"$BUILD/world/Conscript"،
);

حال اگر به یک سیستم peAcH وارد شویم، می‌توانیم خود را بسازیم سلام، جهان! درخواست برای آن
سکو:

% منفی صادرات OS=هلو
build/peach/world/world.h را به صورت export/peach/include/world.h نصب کنید
cc -Iexport/peach/include -c build/peach/hello/hello.c -o build/peach/hello/hello.o
cc -Iexport/peach/include -c build/peach/world/world.c -o build/peach/world/world.o
ar r build/peach/world/libworld.a build/peach/world/world.o
ar: ایجاد build/peach/world/libworld.a
ranlib build/peach/world/libworld.a
build/peach/world/libworld.a را به عنوان export/peach/lib/libworld.a نصب کنید
cc -o build/peach/hello/hello build/peach/hello/hello.o -Lexport/peach/lib -lworld
build/peach/hello/hello را به صورت export/peach/bin/hello نصب کنید

تغییرات on a موضوع

تغییرات دیگری از این مدل امکان پذیر است. برای مثال، ممکن است تصمیم بگیرید که می خواهید
برای جدا کردن فایل های شامل خود به فایل های وابسته به پلت فرم و فایل های مستقل از پلت فرم.
در این مورد، باید جایگزینی برای «$INCLUDE» برای وابسته به پلتفرم تعریف کنید
فایل ها. اکثر سرباز وظیفه فایل‌هایی که صرفاً شامل فایل‌های مستقل از پلتفرم می‌شوند، می‌شوند
لازم نیست تغییر کند

همچنین ممکن است بخواهید بتوانید کل سیستم خود را با اشکال زدایی یا نمایه سازی کامپایل کنید.
به عنوان مثال، فعال است. شما می توانید این کار را با گزینه های خط فرمان مناسب انجام دهید، مانند
'DEBUG=روشن'. سپس این به پلتفرم خاص مناسب ترجمه می شود
الزامات برای فعال کردن اشکال زدایی (این ممکن است شامل خاموش کردن بهینه سازی باشد، برای
مثال). شما می توانید به صورت اختیاری فضای نام را برای این انواع مختلف سیستم ها تغییر دهید،
اما، همانطور که در بخش بعدی خواهیم دید، اینطور نیست ضروری است برای انجام این کار، زیرا Cons زیبا است
وقتی گزینه‌ها را تغییر می‌دهید، در مورد بازسازی چیزها هوشمندانه عمل کنید.

امضا


MD5 رمزنگاری امضا

هر زمان که Cons یک فایل مشتق شده ایجاد می کند، یک فایل را ذخیره می کند امضا برای آن فایل امضا
در یک فایل جداگانه، یکی در هر فهرست ذخیره می شود. پس از گردآوری مثال قبلی،
la ارسال فایل در ساخت / هلو / جهان دایرکتوری به شکل زیر بود:

world.o:834179303 23844c0b102ecdc0b4548d1cd1cbd8c6
libworld.a:834179304 9bf6587fa06ec49d864811a105222c00

شماره اول یک مهر زمانی است - برای سیستم های یونیکس، این معمولاً تعداد است
ثانیه از 1 ژانویه 1970. مقدار دوم یک چک جمع MD5 است. در پیام هضم
الگوریتم الگوریتمی است که با توجه به یک رشته ورودی، یک رمزنگاری قوی را محاسبه می کند
امضای آن رشته چک جمع MD5 ذخیره شده در ارسال فایل در واقع الف است
خلاصه تمام اطلاعات وابستگی برای فایل مشخص شده. بنابراین، به عنوان مثال، برای
world.o فایل، این حداقل شامل world.c فایل، و همچنین هر فایل هدر که منفی است
می داند که به طور مستقیم یا غیر مستقیم توسط world.c. نه تنها این ، بلکه همین
خط فرمان واقعی که برای تولید استفاده شد world.o همچنین به محاسبات تغذیه می شود
امضا به همین ترتیب، libworld.a امضایی دریافت می کند که شامل همه موارد می شود
امضای اجزای تشکیل دهنده آن (و از این رو، به طور موقت، امضای شان
اجزاء تشکیل دهنده)، و همچنین خط فرمانی که فایل را ایجاد کرده است.

امضای یک فایل غیر مشتق شده به طور پیش فرض با گرفتن جریان محاسبه می شود
زمان تغییر فایل و نام ورودی فایل (مگر اینکه اتفاقاً یک
جاری ارسال ورودی برای آن فایل، که در این صورت از آن امضا استفاده می شود).

توجه داشته باشید که نیازی به یک فایل مشتق شده نیست که به خاصیت خاصی وابسته باشد ساختن or
سرباز وظیفه file--اگر تغییرات در این فایل ها بر روی فایل مورد نظر تاثیر بگذارد، این مورد خواهد بود
به طور خودکار در امضای آن منعکس می شود، زیرا بخش های مربوطه خط فرمان هستند
در امضا گنجانده شده است. تغییرات نامرتبط هیچ تاثیری نخواهد داشت.

وقتی Cons در نظر می گیرد که آیا یک فایل خاص را استخراج کند یا خیر، ابتدا مقدار را محاسبه می کند
امضای مورد انتظار پرونده سپس آخرین زمان اصلاح فایل را با آن مقایسه می کند
زمان ثبت شده در ارسال ورودی، در صورت وجود. اگر این زمان ها مطابقت دارند، پس
امضا ذخیره شده در ارسال فایل صحیح تلقی می شود اگر فایل قبلی است
امضا با امضای جدید و مورد انتظار مطابقت ندارد، پس فایل باید دوباره استخراج شود.

توجه داشته باشید که هر زمان که چیزی در مورد یک فایل وابسته تغییر کند، یک فایل دوباره دریافت می شود. که در
به خصوص توجه کنید که هر تغییر به زمان اصلاح یک وابسته (به جلو یا
به عقب در زمان) باعث کامپایل مجدد فایل مشتق شده می شود.

استفاده از این امضاها روشی بسیار ساده، کارآمد و مؤثر است
بهبود - به طور چشمگیری - تکرارپذیری یک سیستم.

این را با یک مثال ساده نشان خواهیم داد:

# ساده "سلام، جهان!" ساخت فایل
$CFLAGS = '-g' اگر معادله $ARG{DEBUG} 'روشن';
$CONS = منفی جدید (CFLAGS => $CFLAGS);
برنامه $CONS 'hello', 'hello.c';

به نحوه کامپایل Cons در زمان های مناسب توجه کنید:

% منفی سلام
cc -c hello.c -o hello.o
cc -o سلام سلام.o
% منفی سلام
منفی: "سلام" به روز است.
% منفی DEBUG=در سلام
cc -g -c hello.c -o hello.o
cc -o سلام سلام.o
% منفی DEBUG=در سلام
منفی: "سلام" به روز است.
% منفی سلام
cc -c hello.c -o hello.o
cc -o سلام سلام.o

رمز مخازن


بسیاری از سازمان های توسعه نرم افزار یک یا چند دایرکتوری مخزن مرکزی دارند
درختان حاوی کد منبع فعلی برای یک یا چند پروژه، و همچنین به دست آمده
فایل های شی، کتابخانه ها و فایل های اجرایی. به منظور کاهش کامپایل مجدد غیر ضروری،
استفاده از فایل‌های مخزن برای ساختن نرم‌افزار توسعه مفید است - با فرض، از
البته، که هیچ فایل وابستگی جدیدتری در درخت ساخت محلی وجود ندارد.

مخزن

Cons مکانیزمی را برای تعیین لیستی از مخازن کدهایی که جستجو می شوند ارائه می دهد.
in-order، برای فایل های منبع و فایل های مشتق شده که در درخت دایرکتوری ساخت محلی یافت نمی شوند.

خطوط زیر در a ساختن فایل به Cons دستور می دهد که ابتدا به زیر زیر نگاه کند
/usr/experiment/repository دایرکتوری و سپس در زیر /usr/product/repository دایرکتوری:

مخزن qw (
/usr/experiment/repository
/usr/product/repository
);

دایرکتوری های مخزن مشخص شده ممکن است حاوی فایل های منبع، فایل های مشتق شده (اشیاء،
کتابخانه ها و فایل های اجرایی)، یا هر دو. اگر هیچ فایل محلی (منبع یا مشتق شده) در زیر وجود ندارد
دایرکتوری که Cons در آن اجرا می شود، سپس اولین کپی از یک فایل با همین نام یافت می شود
تحت یک دایرکتوری مخزن برای ساخت هر فایل مشتق شده محلی استفاده می شود.

Cons یک لیست جهانی از دایرکتوری های مخازن را حفظ می کند. معایب را از بین می برد
دایرکتوری فعلی، و هر دایرکتوری غیر موجود، از لیست.

کشف la ساختن پرونده in a مخزن

موارد منفی نیز جستجو خواهد شد ساختن و سرباز وظیفه فایل های موجود در درخت یا درختان مخزن.
با این حال، این به وضعیت مرغ و تخم مرغ منجر می شود: چگونه در درخت مخزن به نظر می رسید
برای ساختن فایل اگر ساختن فایل به شما می گوید که مخزن کجاست؟ برای بدست آوردن
در اطراف این، مخازن ممکن است از طریق گزینه های «-R» در خط فرمان مشخص شوند:

% منفی -R /usr/experiment/repository -R /usr/product/repository .

هر دایرکتوری مخزن مشخص شده در ساختن or سرباز وظیفه فایل ها ضمیمه خواهند شد
به دایرکتوری های مخزن مشخص شده توسط گزینه های خط فرمان "-R".

مخزن منبع فایل ها

اگر کد منبع (شامل سرباز وظیفه فایل) برای نسخه کتابخانه ای سلام،
جهان! برنامه C در یک مخزن است (بدون فایل مشتق شده)، Cons از آن استفاده خواهد کرد
فایل های منبع مخزن برای ایجاد فایل های شی محلی و فایل اجرایی:

% منفی -R /usr/src_only/repository hello
gcc -c /usr/src_only/repository/hello.c -o hello.o
gcc -c /usr/src_only/repository/world.c -o world.o
ar r libworld.a world.o
ar: ایجاد libworld.a
ranlib libworld.a
gcc -o سلام hello.o libworld.a

ایجاد یک فایل منبع محلی باعث می شود Cons فایل مشتق شده مناسب را بازسازی کند یا
فایل ها:

% pico world.c
[ویرایش]
% منفی -R /usr/src_only/repository hello
gcc -c world.c -o world.o
ar r libworld.a world.o
ar: ایجاد libworld.a
ranlib libworld.a
gcc -o سلام hello.o libworld.a

و حذف فایل منبع محلی باعث می‌شود Cons به ساخت مشتق شده برگردد
فایل ها از منبع مخزن:

% rm world.c
% منفی -R /usr/src_only/repository hello
gcc -c /usr/src_only/repository/world.c -o world.o
ar r libworld.a world.o
ar: ایجاد libworld.a
ranlib libworld.a
gcc -o سلام hello.o libworld.a

مخزن مشتق فایل ها

اگر درخت مخزن حاوی فایل های مشتق شده باشد (معمولاً فایل های شی، کتابخانه ها یا
فایل های اجرایی)، Cons محاسبه امضای عادی خود را انجام می دهد تا تصمیم بگیرد که آیا
فایل مخزن به روز است یا یک فایل مشتق شده باید به صورت محلی ساخته شود. این بدان معناست که،
به منظور اطمینان از محاسبه صحیح امضا، درخت مخزن نیز باید حاوی این باشد
ارسال فایل هایی که توسط Cons هنگام تولید فایل های مشتق شده ایجاد شده اند.

این معمولاً با ساختن نرم افزار در مخزن انجام می شود (یا
به طور متناوب، در یک پوشه ساخت و سپس کپی کردن نتیجه در مخزن):

% cd /usr/all/repository
% منفی سلام
gcc -c hello.c -o hello.o
gcc -c world.c -o world.o
ar r libworld.a world.o
ar: ایجاد libworld.a
ranlib libworld.a
gcc -o سلام hello.o libworld.a

(این حتی اگر بی خطر است ساختن فایل لیست می کند /usr/all/repository دایرکتوری در a
دستور 'Repository' زیرا Cons فهرست فعلی را از مخزن حذف می کند
لیست.)

حالا اگر بخواهیم یک کپی از اپلیکیشن را با خودمان بسازیم سلام سی فایل، ما فقط نیاز داریم
برای ایجاد یک فایل منبع ضروری، و از گزینه "-R" استفاده کنید تا Cons از موارد دیگر استفاده کند
فایل های موجود در مخزن:

% mkdir $HOME/build1
% سی دی $HOME/build1
% ed hello.c
[ویرایش]
% منفی -R /usr/all/repository سلام
gcc -c hello.c -o hello.o
gcc -o سلام hello.o /usr/all/repository/libworld.a

توجه داشته باشید که Cons زحمت بازآفرینی محلی را به خود نداده است libworld.a کتابخانه (یا دوباره کامپایل کنید
world.o ماژول)، اما در عوض از نسخه کامپایل شده از مخزن استفاده می کند.

زیرا امضاهای MD5 که Cons در آن قرار می دهد ارسال فایل حاوی مهر زمانی برای
فایل های مشتق شده، مهرهای زمانی امضا باید با مهر زمانی فایل برای امضا مطابقت داشته باشند
معتبر تلقی شود.

برخی از سیستم های نرم افزاری ممکن است مهر زمانی روی فایل های مخزن را تغییر دهند (با کپی کردن آنها،
به عنوان مثال)، در این صورت Cons به طور پیش‌فرض، امضاهای مخزن را نامعتبر فرض می‌کند.
و فایل ها را بی جهت بازسازی کنید. این رفتار ممکن است با مشخص کردن موارد زیر تغییر یابد:

Repository_Sig_Times_OK 0;

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

محلی نسخه of فایل ها

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

% mkdir $HOME/build2
% سی دی $HOME/build2
% منفی -R /usr/all/repository سلام
منفی: "سلام" به روز است.

چرا Cons می گوید که سلام برنامه زمانی که وجود ندارد به روز است سلام برنامه در
دایرکتوری ساخت محلی؟ زیرا مخزن (نه دایرکتوری محلی) شامل
در جریان روز سلام برنامه و Cons به درستی تعیین می کند که هیچ کاری لازم نیست انجام شود
این کپی به روز فایل را بازسازی کنید.

با این حال، بارها وجود دارد که مناسب است اطمینان حاصل شود که یک کپی محلی از a
فایل همیشه وجود دارد برای مثال، یک بسته بندی یا اسکریپت آزمایشی ممکن است چنین فرض کند
فایل های تولید شده به صورت محلی وجود دارند. به جای آگاه کردن این اسکریپت های فرعی از
دایرکتوری مخزن، دستور «محلی» ممکن است به a اضافه شود ساختن or سرباز وظیفه فایل به
مشخص کنید که یک فایل یا فایل خاص باید در فهرست ساخت محلی ظاهر شود:

محلی qw(
سلام
);

سپس، اگر همان دستور را دوباره اجرا کنیم، Cons یک کپی محلی از برنامه از روی می‌سازد
کپی مخزن (به شما می گوید که این کار را انجام می دهد):

% منفی -R /usr/all/repository سلام
کپی محلی hello از /usr/all/repository/hello
منفی: "سلام" به روز است.

توجه داشته باشید که، زیرا عمل ایجاد کپی محلی به عنوان "ساخت" از آن در نظر گرفته نمی شود
سلام Cons هنوز گزارش می دهد که به روز است.

ایجاد کپی های محلی برای فایل هایی که در حال نصب هستند بسیار مفید است
دایرکتوری میانی (برای اشتراک گذاری با سایر دایرکتوری ها) از طریق دستور 'Install'.
همراه کردن دستور 'Install' برای یک فایل با دستور 'Local' همراه است
معمول است که Cons یک دستور 'Install_Local' را به عنوان راهی راحت برای انجام هر دو ارائه می دهد:

Install_Local $env, '#export', 'hello';

دقیقا معادل است با:

$env '#export'، 'hello' را نصب کنید.
محلی '#صادرات/سلام';

هر دو دستور "Local" و "Install_Local" محلی را به روز می کنند ارسال فایل با
امضاهای فایل مناسب، به طوری که ساخت های آینده به درستی انجام شود.

مخزن وابستگی تحلیل

با توجه به اسکن داخلی، Cons درختان مخزن مشخص شده را جستجو می کند
.h فایل ها. مگر اینکه کامپایلر از درختان مخزن نیز مطلع باشد، این امر خواهد بود
قادر به پیدا کردن نیست .h فایل هایی که فقط در یک مخزن وجود دارند. اگر، برای مثال، سلام سی
فایل شامل سلام فایل در فهرست فعلی خود:

% منفی -R /usr/all/repository سلام
gcc -c /usr/all/repository/hello.c -o hello.o
/usr/all/repository/hello.c:1: hello.h: چنین فایل یا دایرکتوری وجود ندارد

حل این مشکل برخی الزامات را به نحوه محیط های ساخت و ساز تحمیل می کند
تعریف شده و بر روی روشی که دستور پیش پردازنده C «#include» برای گنجاندن فایل ها استفاده می شود.

به منظور اطلاع کامپایلر در مورد درختان مخزن، Cons «-I» مناسب را اضافه می کند.
پرچم به دستورات کامپایل. این بدان معنی است که متغیر 'CPPPATH' در
محیط ساخت باید به صراحت تمام زیر شاخه هایی را که قرار است جستجو شوند مشخص کند
برای فایل های شامل، از جمله دایرکتوری فعلی. در نتیجه، می توانیم موارد فوق را برطرف کنیم
به عنوان مثال با تغییر ایجاد محیط در ساختن به صورت زیر فایل کنید:

$env = منفی جدید(
CC => 'gcc',
CPPPATH => '.',
LIBS => 'libworld.a'،
);

با توجه به تعریف متغیر 'CPPPATH'، زمانی که ما مجدداً
فرمان:

% منفی -R /usr/all/repository سلام
gcc -c -I. -I/usr/all/repository /usr/all/repository/hello.c -o hello.o
gcc -o سلام hello.o /usr/all/repository/libworld.a

ترتیب پرچم های «-I» برای پیش پردازنده C، همان مخزن تکرار می شود.
مسیر جستجوی دایرکتوری که Cons برای تجزیه و تحلیل وابستگی خود استفاده می کند. اگر وجود دارد
مخازن چندگانه و چندین دایرکتوری 'CPPPATH'، Cons مخزن را اضافه می کند
دایرکتوری ها به ابتدای هر دایرکتوری 'CPPPATH'، تعداد را به سرعت ضرب می کند
پرچم های "-I". به عنوان یک مثال افراطی، الف ساختن فایل حاوی:

مخزن qw(
/u1
/u2
);

$env = منفی جدید(
CPPPATH => 'a:b:c'،
);

یک دستور کامپایل از:

cc -Ia -I/u1/a -I/u2/a -Ib -I/u1/b -I/u2/b -Ic -I/u1/c -I/u2/c -c hello.c -o سلام

زیرا Cons به پرچم‌های «-I» کامپایلر برای ارتباط ترتیبی که در آن انجام می‌شود متکی است
دایرکتوری‌های مخزن باید جستجو شوند، مدیریت منفی دایرکتوری‌های مخزن است
اساساً با استفاده از دو نقل قول در دستورالعمل های '#include' در C شما ناسازگار است
کد منبع:

#include "file.h" /* از نقل قول های دوگانه مانند این استفاده نکنید */

این به این دلیل است که اکثر پیش پردازشگرهای C، هنگامی که با چنین دستورالعملی روبرو می شوند، همیشه اول هستند
دایرکتوری حاوی فایل منبع را جستجو کنید. این «-I» مفصل را تضعیف می کند
گزینه هایی که Cons می سازد تا پیش پردازنده را با جستجوی ترجیحی خود مطابقت دهد
مسیر.

در نتیجه، هنگام استفاده از درختان مخزن در Cons، همیشه استفاده از براکت های زاویه برای گنجانده شده است
فایل ها:

#عبارتند از /* به جای آن از براکت های زاویه دار استفاده کنید */

Repository_List

Cons دستور "Repository_List" را برای برگرداندن لیستی از همه فهرست های مخزن ارائه می دهد
در ترتیب جستجوی فعلی خود این را می توان برای اشکال زدایی یا برای انجام کارهای پیچیده تر Perl استفاده کرد
چیز:

@list = Repository_List;
print join(' ', @list), "\n";

مخزن اثر متقابل با دیگر منفی امکانات

مدیریت منفی درختان مخزن به درستی با سایر ویژگی های منفی تعامل دارد - که
به طور کلی آنچه را که انتظار دارید انجام می دهد.

مهم‌تر از همه، درخت‌های مخزن به درستی و نسبتاً قدرتمند با «پیوند» تعامل دارند.
فرمان یک درخت مخزن ممکن است شامل یک یا چند زیر شاخه برای ساخت نسخه باشد
از طریق "پیوند" به یک زیر شاخه منبع ایجاد شده است. موارد منفی فایل های مشتق شده را در جستجو می کنند
زیر شاخه های مناسب را در زیر درخت مخزن بسازید.

به طور پیش فرض اهداف


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

% منفی سلام

به طور معمول، Cons هیچ چیزی را نمی‌سازد مگر اینکه یک هدف مشخص شده باشد، اما «» را مشخص کند.
(دایرکتوری فعلی) همه چیز را می سازد:

% cons # چیزی نمی سازد

% منفی # همه چیز را تحت دایرکتوری سطح بالا می سازد

افزودن روش «پیش‌فرض» به هر کدام ساختن or سرباز وظیفه فایل مشخص شده را اضافه می کند
به لیستی از اهداف پیش فرض هدف گذاری می کند. اگر وجود نداشته باشد، Cons این پیش‌فرض‌ها را می‌سازد
اهداف مشخص شده در خط فرمان بنابراین خط زیر را به سطح بالا اضافه کنید
ساختن فایل به طور پیش فرض رفتار معمولی Make را تقلید می کند:

پیش فرض '.';

موارد زیر را اضافه می کند سلام و خداحافظ دستورات (در همان دایرکتوری
ساختن or سرباز وظیفه فایل) به لیست پیش فرض:

qw پیش فرض (
سلام
خداحافظ
);

روش "پیش فرض" ممکن است بیش از یک بار برای افزودن اهداف به لیست پیش فرض استفاده شود.

انتخابی می سازد


Cons دو روش برای کاهش اندازه ساخت ارائه می دهد. اولی با مشخص کردن است
اهداف در خط فرمان، و دوم روشی برای هرس درخت ساخت است. خوب
ابتدا مشخصات هدف را در نظر بگیرید.

انتخابی هدف گذاری

مانند make، Cons اجازه می دهد تا مشخصات "هدف" را در خط فرمان مشخص کنید. اهداف منفی
ممکن است فایل یا دایرکتوری باشد. هنگامی که یک دایرکتوری مشخص می شود، این به سادگی یک کوتاه است
نماد دست برای هر محصول مشتق شده - که Cons در مورد آن می داند - در مشخص شده
دایرکتوری و زیر مثلا:

% معایب build/hello/hello.o

به معنی ساختن سلام.و و همه چیز سلام.و ممکن است نیاز باشد. این مال قبلیه
نسخه از سلام، جهان! برنامه ای که در آن سلام.و وابسته به
export/include/world.h. اگر آن فایل به روز نیست (به دلیل اینکه شخصی تغییر داده است
src/world/world.h)، سپس دوباره ساخته می شود، حتی اگر در دایرکتوری از راه دور باشد
ساخت / سلام.

در این مثال:

% معایب ساخت

همه چیز در ساختن دایرکتوری در صورت لزوم ساخته می شود. باز هم، این ممکن است باعث ایجاد فایل های بیشتری شود
ساخته شود. به طور خاص، هر دو export/include/world.h و export/lib/libworld.a هستند
مورد نیاز توسط ساخت / سلام دایرکتوری، و بنابراین اگر قدیمی باشند ساخته می شوند.

اگر این کار را انجام دهیم، در عوض:

درصد منفی صادرات

سپس فقط فایل هایی که باید در پوشه صادراتی نصب شوند دوباره ساخته می شوند، اگر
لازم است و سپس در آنجا نصب می شود. توجه داشته باشید که "cons build" ممکن است فایل هایی بسازد که "cons".
صادرات» ساخته نمی شود و بالعکس.

نه "ویژه" اهداف

با موارد منفی، اهداف «ویژه» به سبک ساخت مورد نیاز نیست. ساده ترین آنالوگ با Cons
استفاده از خاص است صادرات در عوض دایرکتوری ها فرض کنید، برای مثال، شما یک
مجموعه کاملی از تست های واحد که با کد شما مرتبط هستند. آزمایش ها در
دایرکتوری منبع نزدیک کد با این حال، به طور معمول، شما نمی خواهید این تست ها را بسازید.
یک راه حل این است که تمام دستورالعمل های ساخت را برای ایجاد تست ها و سپس به
تست ها را در قسمت جداگانه ای از درخت نصب کنید. اگر تست ها را در سطح بالا نصب کنیم
دایرکتوری فراخوانی شد تست، سپس:

% تست های منفی

تمام تست ها را خواهد ساخت.

درصد منفی صادرات

نسخه تولیدی سیستم را خواهد ساخت (اما نه آزمایشات)، و:

% معایب ساخت

احتمالاً باید از آن اجتناب شود (زیرا بیهوده تست ها را جمع آوری می کند).

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

اگر می خواهید کاملاً همه چیز را در درخت بسازید (با توجه به هر گزینه ای که دارید
انتخاب کنید)، می توانید استفاده کنید:

% منفی

این کار به خصوص کارآمد نیست، زیرا به طور اضافی همه درختان را راه می‌اندازد.
از جمله درخت مبدا. البته درخت منبع ممکن است دارای اشیاء قابل ساخت باشد
it--هیچ چیز شما را از انجام این کار باز نمی دارد، حتی اگر به طور معمول در یک بیلد جداگانه بسازید
درخت.

ساختن هرس


در ارتباط با انتخاب هدف، ساختن هرس کردن می توان برای کاهش دامنه استفاده کرد
ساختن. در مثال قبلی peAcH و baNaNa، ما قبلاً نحوه اسکریپت محوری را دیدیم
هرس ساختمانی را می توان برای در دسترس قرار دادن تنها نیمی از ساخت بالقوه برای هر مورد استفاده کرد
فراخوانی "معایب". Cons همچنین به عنوان یک راحتی، یک قرارداد خط فرمان را فراهم می کند که
به شما این امکان را می دهد که کدام را مشخص کنید سرباز وظیفه فایل‌ها در واقع «ساخت» می‌شوند - یعنی گنجانده می‌شوند
به درخت ساخت مثلا:

% معایب ساخت + جهان

آرگومان «+» یک عبارت منظم پرل را معرفی می کند. البته این باید نقل شود
سطح پوسته اگر متا کاراکترهای پوسته در عبارت وجود داشته باشد. در
بیان با هر یک تطبیق داده می شود سرباز وظیفه فایلی که در یک "Build" ذکر شده است
بیانیه، و فقط آن اسکریپت هایی با نام های منطبق در واقع در آن گنجانده می شوند
درخت بساز چندین چنین استدلال مجاز است، در این صورت تطبیق با هر یک از آنها
برای گنجاندن یک اسکریپت کافی است.

در مثال بالا، سلام برنامه ساخته نخواهد شد، زیرا Cons هیچ ندارد
دانش فیلمنامه سلام / سرباز وظیفه. libworld.a بایگانی ساخته خواهد شد، با این حال، اگر
نیاز باشد.

چند کاربرد برای هرس ساختن از طریق خط فرمان وجود دارد. شاید مفیدترین
توانایی ایجاد تغییرات محلی، و سپس، با دانش کافی از
پیامدهای این تغییرات، برای افزایش سرعت، اندازه درخت ساخت را محدود کنید
زمان بازسازی دومین کاربرد برای هرس ساختمانی، جلوگیری فعالانه از کامپایل مجدد است
فایل‌های خاصی که می‌دانید به دلیل یک فایل هدر تغییر یافته دوباره کامپایل می‌شوند.
ممکن است بدانید که یا تغییرات در فایل هدر بی اهمیت هستند یا اینکه
تغییرات ممکن است به طور ایمن برای بیشتر درخت، برای اهداف آزمایشی نادیده گرفته شوند. با معایب،
دیدگاه این است که پذیرش این نوع رفتار با درک این امر عملی است
در ساخت کامل بعدی هر چیزی که نیاز به بازسازی دارد خواهد بود. معادلی وجود ندارد
به دستور "make touch"، برای علامت گذاری فایل ها به عنوان به روز دائمی. بنابراین هر خطری که باشد
ناشی از هرس ساختمانی کاهش می یابد. برای انتشار کار با کیفیت، بدیهی است، ما توصیه می کنیم
که از هرس ساختنی استفاده نمی کنید (اما استفاده از آن در حین ادغام کاملاً اشکالی ندارد،
برای بررسی کامپایل و غیره
ادغام).

موقت نادیده گرفتن


Cons مکانیسم بسیار ساده ای را برای غلبه بر جنبه های یک ساخت فراهم می کند. اصل این است
که شما یک فایل بازنویسی حاوی یک یا چند دستور 'Override' بنویسید و شما
هنگامی که 'cons' را اجرا می کنید، این را در خط فرمان مشخص کنید:

% منفی بیش از صادرات

را خواهد ساخت صادرات دایرکتوری، با تمام فایل های مشتق شده در معرض موارد لغو موجود است
در روی فایل. اگر گزینه «-o» را کنار بگذارید، پس هر چیزی که لازم است حذف شود
همه موارد لغو دوباره ساخته خواهند شد.

برجسته محیط متغیرها

فایل override می تواند شامل دو نوع override باشد. اولین مورد محیط ورودی است
متغیرها اینها معمولاً در دسترس هستند ساختن فایل از هش «%ENV».
متغیر. این موارد را می توان به طور پیش پاافتاده در فایل بازنویسی با تنظیم کردن لغو کرد
عناصر مناسب «%ENV» (اینها همچنین می توانند در محیط کاربر نادیده گرفته شوند،
البته).

La باطل کردن فرمان

نوع دوم لغو با دستور 'Override' انجام می شود که به نظر می رسد
این:

لغو ، => ، => ، ...;

بیان منظم regexp با هر فایل مشتق شده ای که کاندید است مطابقت دارد
برای ساخت اگر فایل مشتق شده مطابقت داشته باشد، از جفت متغیر/مقدار استفاده می شود
مقادیر موجود در محیط ساخت مرتبط با فایل مشتق شده را نادیده بگیرید.

بیایید فرض کنیم که یک محیط ساخت و ساز مانند این داریم:

$CONS = منفی جدید(
COPT => ''،
CDBG => '-g'،
CFLAGS => '%COPT %CDBG'،
);

سپس اگر یک فایل override داشته باشیم روی حاوی این دستور:

لغو '\.o$'، COPT => '-O'، CDBG => '';

سپس هر فراخوانی "معایب" با "-o over" که ایجاد می کند .o فایل ها از طریق این محیط خواهد بود
باعث می شود که آنها با "-O" و نه "-g" کامپایل شوند. نادیده گرفتن می تواند، البته، باشد
با انتخاب مناسب یک عبارت منظم به یک دایرکتوری محدود می شود.

در اینجا نسخه اصلی Hello, World! برنامه ای که با این محیط ساخته شده است.
توجه داشته باشید که Cons هنگام اعمال یا حذف نادیده گرفتن، قطعات مناسب را بازسازی می کند:

% منفی سلام
cc -g -c hello.c -o hello.o
cc -o سلام سلام.o
% معایب -o بیش از سلام
cc -O -c hello.c -o hello.o
cc -o سلام سلام.o
% معایب -o بیش از سلام
منفی: "سلام" به روز است.
% منفی سلام
cc -g -c hello.c -o hello.o
cc -o سلام سلام.o

مهم این است که دستور 'Override' فقط برای موقت و در حین پرواز استفاده شود
نادیده گرفتن های لازم برای توسعه به این دلیل که نادیده گرفتن پلت فرم مستقل نیستند و
زیرا آنها بیش از حد به دانش صمیمی در مورد عملکرد فیلمنامه ها متکی هستند. برای
استفاده موقت، با این حال، آنها دقیقا همان چیزی هستند که شما می خواهید.

توجه داشته باشید که ارائه، مثلاً، توانایی ایجاد یک کاملاً بهینه شده همچنان مفید است
نسخه یک سیستم برای استفاده تولید - از ساختن و سرباز وظیفه فایل ها. بدین ترتیب
شما می توانید سیستم بهینه شده را برای پلتفرم تنظیم کنید. جایی که مبادلات بهینه ساز باید باشد
ساخته شده است (ممکن است فایل های خاصی برای مثال با بهینه سازی کامل کامپایل نشوند)، سپس
اینها را می توان برای آیندگان (و تکرارپذیری) مستقیماً در فیلمنامه ها ثبت کرد.

بیشتر on ساخت و ساز محیط


به طور پیش فرض ساخت و ساز متغیرها

مفهوم الف را ذکر کردیم و استفاده کردیم ساخت و ساز محیط، بارها در
صفحات قبل اکنون زمان آن است که این موضوع را کمی دقیق تر کنیم. با موارد زیر
بیانیه:

$env = منفی جدید();

یک مرجع به یک محیط ساخت و ساز پیش فرض جدید ایجاد می شود. این شامل یک عدد است
متغیرهای ساخت و ساز و برخی روش ها در حال حاضر، لیست پیش فرض
متغیرهای ساخت و ساز به صورت زیر تعریف می شوند:

CC => 'cc',
CFLAGS => ''،
CCCOM => '%CC %CFLAGS %_IFLAGS -c %< -o %>'،
INCDIRPREFIX => '-I',
CXX => '%CC'،
CXXFLAGS => '%CFLAGS'،
CXXCOM => '%CXX %CXXFLAGS %_IFLAGS -c %< -o %>'،
LINK => '%CXX'،
LINKCOM => '%LINK %LDFLAGS -o %> %< %_LDIRS %LIBS'،
LINKMODULECOM => '%LD -r -o %> %<',
LIBDIRPREFIX => '-L'،
AR => 'ar',
ARFLAGS => 'r',
ARCOM => "%AR %ARFLAGS %> %<\n%RANLIB %>"،
RANLIB => 'ranlib',
AS => 'به عنوان'،
ASFLAGS => ''،
ASCOM => '%AS %ASFLAGS %< -o %>',
LD => 'ld',
LDFLAGS => ''،
PREFLIB => 'lib',
SUFLIB => '.a'،
SUFLIBS => '.so:.a',
SUFOBJ => '.o',
ENV => { 'PATH' => '/ صندوقچه:/ usr / bin' }،

در سیستم‌های Win32 (Windows NT)، متغیرهای ساختاری زیر در سیستم لغو می‌شوند
پیش فرض:

CC => 'cl',
CFLAGS => '/nologo',
CCCOM => '%CC %CFLAGS %_IFLAGS /c %< /Fo%>'،
CXXCOM => '%CXX %CXXFLAGS %_IFLAGS /c %< /Fo%>'،
INCDIRPREFIX => '/I',
LINK => 'پیوند'،
LINKCOM => '%LINK %LDFLAGS /out:%> %< %_LDIRS %LIBS'،
LINKMODULECOM => '%LD /r /o %> %<'،
LIBDIRPREFIX => '/LIBPATH:',
AR => 'lib'،
ARFLAGS => '/nologo',
ARCOM => "%AR %ARFLAGS /out:%> %<"،
RANLIB => ''،
LD => 'پیوند'،
LDFLAGS => '/nologo',
PREFLIB => ''،
SUFEXE => '.exe',
SUFLIB => '.lib',
SUFLIBS => '.dll:.lib'،
SUFOBJ => '.obj',

این متغیرها توسط روش های مختلف مرتبط با محیط، در
به ویژه هر روشی که در نهایت یک دستور خارجی را فراخوانی کند، جایگزین آن خواهد شد
متغیرها در دستور نهایی، در صورت لزوم. به عنوان مثال، روش "اشیاء" طول می کشد
تعدادی فایل منبع و ترتیب می دهد تا در صورت لزوم، شی مربوطه را استخراج کند
فایل ها. مثلا:

اشیاء $env 'foo.c', 'bar.c';

این ترتیب تولید، در صورت لزوم، foo.o و bar.o. دستور فراخوانی شده ساده است
'%CCCOM'، که از طریق جایگزینی، به دستور خارجی مناسب مورد نیاز گسترش می یابد
برای ساختن هر شی ما قوانین تعویض را بیشتر تحت "فرمان" بررسی خواهیم کرد
روش، در زیر

متغیرهای ساخت و ساز برای مقاصد دیگر نیز استفاده می شوند. به عنوان مثال، 'CPPPATH' است
برای تعیین یک مسیر جدا شده با کولون از فهرست های شامل استفاده می شود. اینها در نظر گرفته شده است
به پیش پردازنده C منتقل می شود و همچنین توسط دستگاه های اسکن فایل C استفاده می شود
وابستگی های موجود در یک کامپایل C را تعیین کنید. متغیرهایی که با
خط زیر، با روش‌های مختلف ایجاد می‌شوند و معمولاً باید «داخلی» در نظر گرفته شوند.
متغیرها به عنوان مثال، زمانی که متدی فراخوانی می شود که خواستار ایجاد یک شی است
از یک منبع C، متغیر «_IFLAGS» ایجاد می‌شود: این متغیر مربوط به سوئیچ‌های «-I» است.
توسط کامپایلر C برای نشان دادن دایرکتوری های مشخص شده توسط "CPPPATH" مورد نیاز است.

توجه داشته باشید که برای هر محیط خاص، مقدار یک متغیر یک بار و سپس تنظیم می شود
هرگز ریست نکنید (برای تغییر یک متغیر، باید یک محیط جدید ایجاد کنید. روش ها ارائه شده است
برای کپی کردن محیط های موجود برای این منظور). برخی از متغیرهای داخلی مانند
"_IFLAGS" بنا به درخواست ایجاد می شوند، اما پس از تنظیم، برای طول عمر ثابت باقی می مانند
محیط زیست است.

متغیرهای «CFLAGS»، «LDFLAGS» و «ARFLAGS» همگی مکانی برای انتقال گزینه‌ها به
کامپایلر، لودر و بایگانی کننده به ترتیب. کمتر بدیهی است که "INCDIPRREFIX"
متغیر رشته گزینه ای را که باید به ابتدای هر شامل اضافه شود را مشخص می کند
دایرکتوری تا کامپایلر بداند کجا را پیدا کند .h فایل ها. به طور مشابه،
متغیر 'LIBDIRPREFIX' رشته گزینه ای را که باید به ابتدای آن الحاق شود را مشخص می کند.
هر دایرکتوری که پیوند دهنده باید برای کتابخانه ها جستجو کند.

متغیر دیگر، 'ENV'، برای تعیین محیط سیستم در طول اجرا استفاده می شود
از یک فرمان خارجی به‌طور پیش‌فرض، تنها متغیر محیطی که تنظیم شده «PATH» است،
که مسیر اجرای دستور یونیکس است. برای حداکثر تکرارپذیری، باید
واقعاً ترتیبی دهید که مسیر اجرای خود را در سطح بالای خود تنظیم کنید ساختن فایل (یا
شاید با وارد کردن یک بسته ساخت و ساز مناسب با دستور Perl 'use'). در
متغیرهای پیش فرض در نظر گرفته شده اند تا شما را از زمین خارج کنند.

درون یابی ساخت و ساز متغیرها

متغیرهای محیط ساخت و ساز ممکن است در نام فایل منبع و هدف درون یابی شوند
با پیشوند نام متغیر ساخت با '%'.

$env = منفی جدید(
DESTDIR => 'برنامه ها'،
SRCDIR => 'src'،
);
برنامه $env '%DESTDIR/hello', '%SRCDIR/hello.c';

بسط متغیرهای ساخت و ساز بازگشتی است - یعنی فایل نام(ها) دوباره انجام خواهد شد
گسترش می یابد تا زمانی که دیگر امکان تعویض وجود نداشته باشد. اگر یک متغیر ساخت و ساز نیست
در محیط تعریف شده است، سپس رشته تهی جایگزین خواهد شد.

به طور پیش فرض ساخت و ساز روش


لیست روش های ساخت پیش فرض شامل موارد زیر است:

La "جدید" سازنده

متد «جدید» یک سازنده شی پرل است. یعنی از طریق مرجع احضار نمی شود
به یک محیط ساخت و ساز موجود مرجع، اما، به طور ایستا، با استفاده از نام
از پرل بسته جایی که سازنده تعریف شده است. روش به این صورت فراخوانی می شود:

$env = منفی جدید( )

محیطی که برمی‌گردانید در بسته «مضرات» قرار می‌گیرد، که به این معنی است که خواهد شد
روش های پیش فرض توضیح داده شده در زیر را با آن مرتبط کرده اند. ساخت و ساز انفرادی
متغیرها را می‌توان با ارائه جفت‌های نام/مقدار در فهرست بازنویسی لغو کرد. توجه داشته باشید که
برای نادیده گرفتن هر متغیر محیطی فرمان (به عنوان مثال هر چیزی که تحت «ENV» قرار دارد)، باید این کار را انجام دهید
همه آنها را نادیده بگیرد. شما می توانید با استفاده از روش «کپی» روی این مشکل دور شوید
محیط ساخت و ساز موجود

La "کلون" روش

روش "کلون" یک کلون از یک محیط ساخت و ساز موجود ایجاد می کند، و می تواند باشد
مانند مثال زیر نامیده می شود:

$env2 = $env1->clone( )

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

La "کپی" روش

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

%env = $env1->copy( )

مقدار «ENV» که خود یک هش است نیز به یک هش جدید کپی می‌شود، بنابراین ممکن است
بدون ترس از تأثیر بر محیط اصلی تغییر کرد. بنابراین، برای مثال، اگر شما واقعا
می‌خواهید فقط متغیر «PATH» را در محیط پیش‌فرض لغو کنید، می‌توانید این کار را انجام دهید
زیر است:

%cons = new cons()->copy();
$cons{ENV}{PATH} = " "؛
$cons = منفی جدید(%cons);

با این کار هر چیز دیگری که ممکن است در محیط اجرای پیش فرض باشد باقی خواهد ماند
بدون مزاحمت

La 'نصب' روش

روش "نصب" ترتیبی می دهد که فایل های مشخص شده در قسمت مشخص شده نصب شوند
فهرست راهنما. نصب بهینه شده است: اگر بتوان فایل را پیوند داد، کپی نمی شود. اگر
این رفتار مطلوب نیست، برای نصب باید از روش دیگری استفاده کنید
فایل. به این صورت نامیده می شود:

$env را نصب کنید ، ;

توجه داشته باشید که در حالی که فایل هایی که قرار است نصب شوند ممکن است خودسرانه نامگذاری شوند، فقط آخرین آنها هستند
جزء هر نام برای نام هدف نصب شده استفاده می شود. بنابراین، برای مثال، اگر شما
ترتیب نصب فو / بار in پایگاه، این یک ایجاد می کند بار فایل در پایگاه دایرکتوری (نه
فو / بار).

La "InstallAs" روش

روش "InstallAs" منبع مشخص شده را ترتیب می دهد پرونده(ها) به عنوان نصب شود
هدف مشخص شده پرونده(ها). چندین فایل باید به عنوان یک لیست فایل مشخص شود. در
نصب بهینه شده است: اگر بتوان فایل را پیوند داد، کپی نمی شود. اگر این نیست
رفتار دلخواه، برای نصب فایل باید از روش دیگری استفاده کنید. این است
به شرح زیر نامیده می شود:

"InstallAs" به دو صورت کار می کند:

نصب تک فایل:

InstallAs $env TgtFile، SrcFile.

نصب چند فایل:

InstallAs $env ['tgt1', 'tgt2'], ['src1', 'src2'];

یا حتی به عنوان:

@srcs = qw(src1 src2 src3);
@tgts = qw(tgt1 tgt2 tgt3)؛
InstallAs $env [@tgts]، [@srcs]؛

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

La "گرانبها" روش

روش «Precious» از مخالفان می‌خواهد که فایل یا فهرست فایل‌های مشخص شده را قبلاً حذف نکنند
دوباره ساختن آنها به این صورت فراخوانی می شود:

گرانبها ;

این به ویژه برای اجازه دادن به به روز رسانی های افزایشی کتابخانه ها یا اشکال زدایی مفید است
فایل های اطلاعاتی که هر بار به جای بازسازی مجدد به روز می شوند. معایب همچنان خواهد بود
هنگامی که پرچم "-r" مشخص شده است، فایل ها را حذف کنید.

La "فرمان" روش

متد "Command" یک روش catchall است که می تواند برای ترتیب هر خارجی استفاده شود
دستوری که برای به روز رسانی هدف فراخوانی می شود. برای این دستور، یک فایل هدف و لیستی از
ورودی ها ارائه می شود. علاوه بر این یک خط فرمان ساخت و ساز، یا خطوط، به عنوان یک ارائه شده است
رشته (این رشته ممکن است چندین دستور درون آن تعبیه شده باشد که با new جدا شده اند
خطوط). "فرمان" به صورت زیر نامیده می شود:

دستور $env ، ، ;

هدف به لیست فایل های ورودی مشخص شده وابسته است و ورودی ها باید
با موفقیت ساخته شود یا Cons برای ساخت هدف تلاش نمی کند.

در دستور ساخت، هر متغیری از محیط ساخت و ساز ممکن است باشد
با پیشوند نام متغیر ساخت با «%» معرفی می شود. این بازگشتی است:
دستور تا زمانی گسترش می یابد که دیگر جایگزینی انجام نشود. اگر یک ساخت و ساز
متغیر در محیط تعریف نشده است، سپس رشته تهی جایگزین خواهد شد. آ
دو برابر شده «%%» با یک «%» در دستور ساخت جایگزین می شود.

چندین متغیر شبه وجود دارد که گسترش خواهند یافت:

%> نام فایل هدف (در یک فرمان چند هدفه، این همیشه اولین هدف است
ذکر شده).

% 0 همان "%>".

% 1، % 2، ...، % 9
اینها به ترتیب به فایل ورودی اول تا نهم اشاره دارند.

%< مجموعه کامل ورودی ها. اگر هر یک از اینها در جای دیگری استفاده شده باشد
خط فرمان فعلی (از طریق «% 1»، «% 2» و غیره)، سپس آن‌ها از
لیست ارائه شده توسط "%<". دستور زیر موجود در a را در نظر بگیرید سرباز وظیفه پرونده
در آزمون دایرکتوری:

دستور $env 'tgt'، qw(foo bar baz)، qq(
اکو %< -i %1 > %>
اکو %< -i %2 >> %>
اکو %< -i %3 >> %>
);

If tgt باید به روز شود، سپس این منجر به اجرای آن می شود
دستورات زیر، با این فرض که هیچ نقشه‌برداری مجدد برای آن ایجاد نشده است آزمون
دایرکتوری:

echo test/bar test/baz -i test/foo > test/tgt
echo test/foo test/baz -i test/bar >> test/tgt
echo test/foo test/bar -i test/baz >> test/tgt

هر یک از متغیرهای شبه فوق ممکن است بلافاصله با یکی از موارد زیر دنبال شود
پسوندها برای انتخاب بخشی از نام مسیر توسعه یافته:

:a مسیر مطلق به نام فایل
:b دایرکتوری به اضافه نام فایل بدون پسوند
دایرکتوری :d
:f نام فایل
:s پسوند نام فایل
:F نام فایل از هر پسوندی پاک شده است

در ادامه با مثال بالا، "%<:f" به "foo bar baz" گسترش می یابد و "%":d>
گسترش به "تست".

امکان بازنویسی برنامه ای بخشی از دستور با احاطه بخشی از آن وجود دارد
بین «%[» و «%]». این متغیر ساختاری را که به عنوان کلمه اول نامگذاری شده است فراخوانی می کند
در داخل پرانتز به عنوان مرجع کد Perl محصور شده است. از نتایج این فراخوان استفاده خواهد شد
برای جایگزینی محتویات براکت ها در خط فرمان. به عنوان مثال، با توجه به یک
نام فایل ورودی موجود tgt.in:

@keywords = qw(foo bar baz);
$env = منفی جدید (X_COMMA => sub { join("،"، @_) });
دستور $env 'tgt'، 'tgt.in'، qq(
echo '# کلیدواژه: %[X_COMMA @keywords %]' > %>
گربه %< >> %>
);

این اجرا خواهد شد:

echo '# کلمات کلیدی: foo,bar,baz' > tgt
cat tgt.in >> tgt

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

اگر یک رشته فرمان چند خطی ارائه شود، دستورات به صورت متوالی اجرا می شوند. در صورت وجود
از دستورات شکست می خورد، سپس هیچ یک از بقیه اجرا نمی شوند و هدف به عنوان علامت گذاری نمی شود.
به روز شد، یعنی امضای جدیدی برای هدف ذخیره نمی شود.

به طور معمول، اگر همه دستورات موفق شوند، و وضعیت صفر (یا هر پلتفرم دیگری-
نشانه خاصی از موفقیت مورد نیاز است)، سپس یک امضای جدید برای آن ذخیره می شود
هدف. اگر دستوری حتی پس از شکست به اشتباه موفقیت را گزارش کند، Cons این کار را خواهد کرد
فرض کنید فایل هدف ایجاد شده توسط آن دستور دقیق و به روز باشد.

اولین کلمه هر رشته فرمان، پس از بسط، اجرایی فرض می شود
فرمان روی متغیر محیطی «PATH» (که به نوبه خود توسط
متغیر ساخت و ساز ENV). اگر این دستور در مسیر یافت شود، هدف این کار را انجام خواهد داد
به آن بستگی دارد: بنابراین در صورت لزوم، دستور به طور خودکار ساخته می شود. این است
امکان نوشتن دستورات چند قسمتی در برخی از پوسته ها، که با نیم دونقطه از هم جدا شده اند. فقط
با این حال، اولین کلمه فرمان به آن بستگی دارد، بنابراین اگر رشته های دستور خود را بنویسید
به این ترتیب، یا باید به طور صریح یک وابستگی (با متد Depends) تنظیم کنید، یا
مطمئن شوید که دستوری که استفاده می کنید یک فرمان سیستمی است که انتظار می رود باشد
در دسترس. اگر در دسترس نباشد، مطمئناً با خطا مواجه خواهید شد.

اگر هر دستوری (حتی یکی از دستورات چند خطی) با «[perl]» شروع شود، باقیمانده
این خط فرمان به جای اینکه توسط Perl در حال اجرا باشد، توسط Perl ارزیابی می شود
پوسته. اگر خطایی در تجزیه Perl رخ دهد یا اگر عبارت Perl 0 یا را برگرداند
undef، فرمان شکست خورده در نظر گرفته می شود. به عنوان مثال، در اینجا یک ساده است
دستوری که فایل "foo" را مستقیماً از پرل ایجاد می کند:

$env = منفی جدید();
دستور $env 'foo'،
qq([perl] open(FOO,'>foo');print FOO "hi\\n"; close(FOO); 1);

توجه داشته باشید که هنگام اجرای دستور، شما در همان بسته زمانی هستید که ساختن
or سرباز وظیفه فایل خوانده شد، بنابراین می توانید توابع Perl را که در همان تعریف کرده اید فراخوانی کنید
ساختن or سرباز وظیفه فایلی که در آن 'Command' ظاهر می شود:

$env = منفی جدید();
فایل فرعی ایجاد_فایل {
my $file = shift;
open(FILE, ">$file");
چاپ FILE "hi\n";
بستن (FILE)؛
1 بازگشت؛
}
دستور $env 'foo', "[perl] &create_file('%>')";

رشته پرل برای تولید امضای فایل مشتق شده استفاده خواهد شد، بنابراین اگر شما
رشته را تغییر دهید، فایل دوباره ساخته می شود. محتویات هر زیربرنامه ای که تماس می گیرید،
با این حال، بخشی از امضا نیستند، بنابراین اگر یک زیربرنامه فراخوانی شده را تغییر دهید مانند
«create_file» در بالا، هدف این کار را انجام خواهد داد نه بازسازی شود. کاربر هشدار.

Cons معمولاً یک دستور را قبل از اجرای آن چاپ می کند. این رفتار سرکوب می شود اگر
اولین کاراکتر دستور "@" است. توجه داشته باشید که ممکن است لازم باشد «@» را از آن جدا کنید
نام فرمان یا فرار از آن برای جلوگیری از ظاهر شدن «@cmd» مانند یک آرایه به نقل قول Perl
عملگرهایی که درون یابی را انجام می دهند:

# خط فرمان اول نادرست است،
# زیرا "@cp" شبیه یک آرایه است
# به تابع Perl qq//.
# به جای آن از فرم دوم استفاده کنید.
دستور $env 'foo'، 'foo.in'، qq(
@cp %< tempfile
@ cp tempfile %>
);

اگر کاراکترهای متا پوسته در هر جایی از خط فرمان گسترش یافته وجود داشته باشد، مانند «<»،
'>'، نقل قول، یا نیمه ویرگول، سپس دستور در واقع با فراخوانی یک
پوسته. این بدان معنی است که دستوری مانند:

سی دی فو

به تنهایی معمولاً با شکست مواجه می شود، زیرا هیچ دستور 'cd' در مسیر وجود ندارد. اما فرمان
رشته:

سی دی $<:d; tar cf $>:f $<:f

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

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

دستور $env ['foo.h', 'foo.c'], 'foo.template', q(
ژن % 1
);

می تواند در مواردی استفاده شود که دستور 'gen' دو فایل را ایجاد کند، هر دو foo.h و foo.c.

La "اشیاء" روش

روش «اشیاء» ترتیبی می دهد تا فایل های شی که با موارد مشخص شده مطابقت دارند ایجاد کند
فایل های منبع. مطابق شکل زیر فراخوانی می شود:

@files = اشیاء $env ;

در زیر یونیکس، فایل های منبع که به پایان می رسند .s و .c در حال حاضر پشتیبانی می شوند و کامپایل خواهند شد
به نامی از همان فایل که به آن ختم می شود .o. به طور پیش فرض، تمام فایل ها با فراخوانی ایجاد می شوند
فرمان خارجی که از گسترش متغیر ساخت و ساز «CCCOM» با
"%<" و "%>" به ترتیب روی فایل های منبع و شی تنظیم می شوند (به روش "Command" مراجعه کنید
برای جزئیات گسترش). متغیر 'CPPPATH' همچنین هنگام اسکن فایل های منبع استفاده می شود
برای وابستگی ها این لیستی از نام مسیرهای جدا شده از دو نقطه است و برای ایجاد نیز استفاده می شود
متغیر ساخت و ساز «_IFLAGS» که حاوی لیست مناسبی از - «I» است.
گزینه هایی برای تالیف هر نام مسیر نسبی در 'CPPPATH' نسبی تفسیر می شود
به دایرکتوری که محیط ساخت و ساز مرتبط در آن ایجاد شده است (مطلق
و ممکن است از نام های نسبی بالا نیز استفاده شود). این متغیر توسط 'CCCOM' استفاده می شود. رفتار
این دستور را می توان با تغییر هر یک از متغیرهایی که درون یابی شده اند تغییر داد
به «CCCOM»، مانند «CC»، «CFLAGS» و، به طور غیرمستقیم، «CPPPATH». همچنین ممکن است
خود مقدار 'CCCOM' را جایگزین کنید. به عنوان یک راحتی، این فایل لیستی از
نام فایل اشیاء

La "برنامه" روش

روش «برنامه» ترتیبی می دهد که برنامه مشخص شده را با شی مشخص شده پیوند دهد
فایل ها. به صورت زیر احضار می شود:

برنامه $env ، ;

نام برنامه دارای مقدار متغیر ساخت و ساز «SUFEXE» خواهد بود (توسط
پیش‌فرض، «.exe» در سیستم‌های Win32، هیچ چیز در سیستم‌های یونیکس) اگر پسوند قبلاً وجود نداشته باشد
حاضر.

فایل های منبع ممکن است به جای فایل های اشیاء مشخص شوند--روش «اشیاء» خواهد بود
فراخوانی می شود تا تبدیل همه فایل ها به فایل های شی و از این رو تمام فایل ها را ترتیب دهد
مشاهدات مربوط به روش "اشیاء" در بالا، برای این روش نیز اعمال می شود.

پیوند واقعی برنامه توسط یک فرمان خارجی انجام می شود که نتیجه می شود
از گسترش متغیر ساخت «LINKCOM»، با «%<» به فایل‌های شی تنظیم شده است
پیوند داده شود (به ترتیب ارائه شده)، و "%>" به هدف تنظیم شود (به روش "Command" مراجعه کنید
برای جزئیات گسترش). کاربر ممکن است متغیرهای اضافی را در ساخت و ساز تنظیم کند
محیط، از جمله 'LINK'، برای تعریف برنامه ای که برای پیوند استفاده شود، 'LIBPATH'، a
فهرست مسیرهای جستجوی کتابخانه جدا شده با دو نقطه، برای استفاده با مشخصات کتابخانه
فرم -libو «LIBS»، فهرستی از کتابخانه‌هایی را که باید با آنها پیوند برقرار کنند (در هر یک از آنها -lib
فرم یا فقط به عنوان نام مسیر. نام مسیرهای نسبی در «LIBPATH» و «LIBS» تفسیر می‌شوند
نسبت به دایرکتوری که محیط ساخت مرتبط در آن ایجاد شده است
(از نام های مطلق و نسبی نیز ممکن است استفاده شود). معایب به طور خودکار تنظیم می شود
وابستگی به هر کتابخانه ای که در "LIBS" ذکر شده است: آن کتابخانه ها قبلا ساخته خواهند شد
فرمان پیوند داده شده است.

La "کتابخانه" روش

متد 'Library' ترتیب ایجاد کتابخانه مشخص شده از شی مشخص شده را می دهد
فایل ها. به صورت زیر احضار می شود:

کتابخانه $env ، ;

نام کتابخانه دارای مقدار متغیر ساخت و ساز «SUFLIB» است که به آن اضافه شده است (توسط
پیش‌فرض، «.lib» در سیستم‌های Win32، «.a» در سیستم‌های یونیکس) اگر پسوند قبلاً وجود نداشته باشد.
حاضر.

فایل های منبع ممکن است به جای فایل های اشیاء مشخص شوند--روش «اشیاء» خواهد بود
فراخوانی می شود تا تبدیل همه فایل ها به فایل های شی و از این رو تمام فایل ها را ترتیب دهد
مشاهدات مربوط به روش "اشیاء" در بالا، برای این روش نیز اعمال می شود.

ایجاد واقعی کتابخانه توسط یک فرمان خارجی انجام می شود که نتیجه می شود
از گسترش متغیر ساخت «ARCOM»، با «%<» به اعضای کتابخانه (در
ترتیب ارائه شده)، و "%>" به کتابخانه ای که باید ایجاد شود (به روش "Command" مراجعه کنید
جزئیات گسترش). کاربر ممکن است متغیرهایی را در محیط ساخت و ساز تنظیم کند که این کار را انجام دهد
بر عملکرد فرمان تأثیر می گذارد. اینها عبارتند از «AR»، برنامه آرشیو مورد استفاده،
"ARFLAGS"، که می تواند برای تغییر پرچم های داده شده به برنامه مشخص شده توسط "AR" استفاده شود،
و «RANLIB»، نام برنامه تولید نمایه آرشیو، در صورت نیاز (در صورت خاص
نیاز به عملکرد دومی نیاز ندارد، پس «ARCOM» باید دوباره تعریف شود
مرجع "RANLIB").

روش "کتابخانه" اجازه می دهد تا همان کتابخانه در چندین روش مشخص شود
فراخوان ها همه اشیاء کمک‌کننده از همه فراخوان‌ها (که ممکن است از
دایرکتوری های مختلف) با یک فرمان آرشیو واحد ترکیب و تولید می شوند. توجه داشته باشید،
با این حال، اگر یک بیلد را طوری هرس کنید که فقط بخشی از یک کتابخانه مشخص شود، آن وقت است
آن قسمت از کتابخانه تولید می شود (بقیه ناپدید می شوند!).

La "ماژول" روش

متد «Module» ترکیبی از روش‌های «برنامه» و «فرمان» است. به جای
با تولید مستقیم یک برنامه اجرایی، این دستور به شما امکان می دهد برنامه خود را مشخص کنید
دستور برای تولید یک ماژول. روش به صورت زیر فراخوانی می شود:

ماژول $env ، ، ;

این دستور در مواردی مفید است که می خواهید مثلاً به صورت پویا ایجاد کنید
ماژول های بارگذاری شده یا کتابخانه های کد به صورت ایستا پیوند خورده اند.

La "بستگی دارد" روش

متد Depends به شما امکان می دهد وابستگی های اضافی را برای یک هدف مشخص کنید. این است
به شرح زیر استناد می شود:

بستگی به $env دارد ، ;

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

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

بستگی دارد $env ['foo', 'bar'], 'input_file_1', 'input_file_2';

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

La "نادیده گرفتن" روش

روش "نادیده گرفتن" به شما امکان می دهد وابستگی هایی را که Cons از آن استنباط می کند به وضوح نادیده بگیرید.
خود را به صورت زیر احضار می شود:

چشم پوشی ;

این می تواند برای جلوگیری از کامپایل مجدد به دلیل تغییر در فایل های هدر سیستم یا
ابزارهایی که مشخص است بر اهداف تولید شده تأثیر نمی گذارند.

برای مثال، اگر یک برنامه در یک پوشه نصب شده بر روی NFS در چندین سیستم ساخته شده باشد که
دارای کپی های مختلف از stdio.h، تفاوت ها بر امضای همه تأثیر می گذارد
اهداف مشتق شده از فایل های منبع ساخته شده است که «#شامل '. این همه باعث می شود
آن اهدافی که باید هنگام تغییر سیستم ها بازسازی شوند. اگر این رفتار مطلوب نیست،
سپس خط زیر وابستگی ها را حذف می کند stdio.h فایل:

نادیده گرفتن '^/usr/include/stdio\.h$';

توجه داشته باشید که آرگومان های متد «نادیده گرفتن» عبارات منظم هستند، بنابراین خاص
کاراکترها باید فرار شوند و ممکن است بخواهید ابتدا یا انتهای آن را لنگر بیاندازید
عبارت با کاراکترهای «^» یا «$».

La "نمک" روش

روش "Salt" برای هر مشتق شده یک مقدار ثابت به محاسبه امضا اضافه می کند
فایل. به صورت زیر احضار می شود:

نمک $string;

تغییر مقدار Salt باعث می شود که هر فایل مشتق شده بازسازی شود. این میتواند باشد
برای بازسازی اجباری در شرایط دلخواه خاص استفاده می شود. مثلا،

نمک `uname -s`;

هر زمان که سیستم عامل روشن باشد، مجبور به بازسازی کامل هر فایل مشتق شده می شود
که ساخت آن انجام می شود (همانطور که توسط 'uname -s' گزارش شده است) تغییر می کند.

La "UseCache" روش

روش "UseCache" به Cons دستور می دهد تا حافظه پنهانی از فایل های مشتق شده را برای اشتراک گذاری حفظ کند.
در میان درختان ساخت مجزای همان پروژه.

UseCache("cache/ ") ⎪⎪ warn("دایرکتوری کش پیدا نشد");

La "SourcePath" روش

روش «SourcePath» نام مسیر منبع واقعی یک فایل را بر خلاف
نام مسیر در یک فهرست ساخت. به صورت زیر احضار می شود:

$path = SourcePath ;

La ConsPath روش

اگر مسیر ارائه شده یک فایل مشتق‌پذیر باشد، متد ConsPath درست را برمی‌گرداند و برمی‌گرداند
undef (نادرست) در غیر این صورت. به صورت زیر احضار می شود:

$result = ConsPath ;

La 'SplitPath' روش

متد «SplitPath» نام مسیرهای متعدد را در رشته‌ای که به‌صورت پیش‌فرض از هم جدا شده‌اند را جستجو می‌کند
جداکننده مسیر برای سیستم عامل (':' در سیستم های یونیکس، ';' در ویندوز NT)، و
نام های کاملا واجد شرایط را برمی گرداند. به صورت زیر احضار می شود:

@paths = SplitPath ;

متد «SplitPath» نام‌های پیشوند «#» را به ساختار سطح بالای مناسب تبدیل می‌کند.
نام (بدون "#") و نام های نسبی را به نام های سطح بالا تبدیل می کند.

La DirPath روش

متد DirPath مسیر ساخت را برمی‌گرداند نام(ها) یک فهرست یا فهرست دایرکتوری ها.
به صورت زیر احضار می شود:

$cwd = DirPath ;

رایج ترین استفاده از روش DirPath عبارت است از:

$cwd = DirPath '.';

برای واکشی مسیر دایرکتوری فعلی یک شرکت تابعه سرباز وظیفه فایل.

La "FilePath" روش

متد FilePath مسیر ساخت را برمی‌گرداند نام(ها) از یک فایل یا لیستی از فایل ها. این است
به شرح زیر استناد می شود:

$file = FilePath ;

La 'کمک' روش

روش "Help" متن راهنما را مشخص می کند که وقتی کاربر "cons" را فراخوانی می کند، نمایش داده می شود
-h'. این می تواند برای ارائه مستندات اهداف خاص، مقادیر، ساخت استفاده شود
گزینه ها و غیره برای درخت ساخت. به صورت زیر احضار می شود:

کمک ;

روش "Help" فقط یک بار ممکن است فراخوانی شود و معمولاً باید در بالا مشخص شود.
سطح ساختن فایل.

در حال گسترش منفی


برجسته ساخت و ساز متغیرها

چندین راه برای گسترش Cons وجود دارد که درجه سختی آنها متفاوت است. ساده ترین
روش این است که محیط ساخت خود را بر اساس محیط پیش فرض تعریف کنید،
اما برای منعکس کننده نیازهای خاص شما اصلاح شده است. این اغلب برای C-based کافی است
برنامه های کاربردی. می‌توانید از سازنده «جدید» و از روش‌های «کلون» و «کپی» استفاده کنید
ایجاد محیط های ترکیبی این تغییرات می‌توانند کاملاً برای موارد زیربنایی شفاف باشند
سرباز وظیفه فایل های.

اضافه کردن جدید روش

برای تغییرات کمی سخت تر، ممکن است بخواهید روش های جدیدی را به "معایب" اضافه کنید.
بسته بندی در اینجا نمونه ای از یک پسوند بسیار ساده، 'InstallScript' آورده شده است که a را نصب می کند
اسکریپت tcl در یک مکان درخواستی، اما ابتدا اسکریپت را ویرایش می کند تا یک پلتفرم را منعکس کند.
مسیر وابسته ای که باید در اسکریپت نصب شود:

# منفی::InstallScript - یک نسخه وابسته به پلتفرم از پوسته ایجاد کنید
# اسکریپت با جایگزینی رشته «#!your-path-here» با پلتفرم خاص
# مسیر $BIN_DIR.

معایب فرعی::InstallScript {
my ($env، $dst، $src) = @_;
دستور $env $dst، $src، qq(
sed s+your-path-here+$BIN_DIR+ %< > %>
chmod oug+x %>
);
}

توجه داشته باشید که این روش مستقیماً در بسته "cons" (با پیشوند نام) تعریف شده است
با "معایب::"). تغییری که به این روش ایجاد شده است به صورت جهانی برای همه محیط ها قابل مشاهده خواهد بود.
و می توان آن را در مثال زیر نامید:

InstallScript $env "$BIN/foo"، "foo.tcl";

برای یک بهبود کوچک در کلیت، متغیر "BINDIR" می تواند به عنوان یک تغییر ارسال شود
آرگومان یا برگرفته از محیط ساخت -- به عنوان '%BINDIR'.

برجسته روش

به جای اضافه کردن متد به فضای نام "مناسب"، می توانید یک بسته جدید تعریف کنید
که متدهای موجود را از بسته "cons" به ارث می برد و سایرین را لغو یا اضافه می کند. این
می توان با استفاده از مکانیسم های وراثت پرل انجام داد.

مثال زیر یک بسته جدید 'cons::switch' را تعریف می کند که استاندارد را لغو می کند
روش "کتابخانه". روش نادیده گرفته شده به جای کتابخانه، ماژول های کتابخانه پیوندی را ایجاد می کند
آرشیوها سازنده جدید ارائه شده است. محیط های ایجاد شده با این سازنده خواهد بود
داشتن روش کتابخانه ای جدید دیگران این کار را نخواهند کرد.

معایب بسته::سوئیچ;
شروع {@ISA = 'مضرات'}

زیر جدید {
تغییر مکان؛
برکت منفی جدید (@_);
}

کتابخانه فرعی {
my($env) = shift;
my($lib) = shift;
my(@objs) = اشیاء $env @_;
دستور $env $lib، @objs، q(
%LD -r %LDFLAGS %< -o %>
);
}

این عملکرد را می توان مانند مثال زیر فراخوانی کرد:

$env = منفی جدید::switch(@overrides);
...
کتابخانه $env 'lib.o', 'foo.c', 'bar.c';

فراخوانی منفی


دستور 'cons' معمولاً از ریشه درخت ساخت فراخوانی می شود. آ ساختن پرونده
باید در آن دایرکتوری وجود داشته باشد. اگر از آرگومان «-f» استفاده شود، یک جایگزین ساختن
ممکن است از فایل استفاده شود (و احتمالاً یک ریشه جایگزین، زیرا «معایب» به cd می‌شود ساختن
فایل حاوی دایرکتوری).

اگر «cons» از فرزند ریشه درخت ساخت با آرگومان «-t» فراخوانی شود،
به دنبال یک سلسله مراتب دایرکتوری می شود ساختن فایل. (یک نام جایگزین ممکن است
هنوز با «-f» مشخص شود.) اهداف ارائه شده در خط فرمان اصلاح خواهند شد
نسبت به کشف شده باشد ساختن فایل. به عنوان مثال، از دایرکتوری حاوی
یک سطح بالا ساختن فایل، فراخوان زیر:

% سی دی libfoo/subdir
درصد منفی -t هدف

دقیقا معادل است با:

% معایب libfoo/subdir/target

اگر اهداف «پیش‌فرض» در سلسله مراتب دایرکتوری مشخص شده باشد ساختن or
سرباز وظیفه فایل‌ها، فقط پیش‌فرض‌ها را در دایرکتوری یا زیر آن هدف قرار می‌دهد که از آن 'cons -t'
مورد استناد قرار گرفت ساخته خواهد شد.

دستور به صورت زیر فراخوانی می شود:

منفی --

جایی که استدلال به هر ترتیبی می تواند یکی از موارد زیر باشد:

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

+الگو محدود کردن سرباز وظیفه فایل‌هایی که فقط با آن‌هایی مطابقت دارند در نظر گرفته می‌شوند الگواست که
یک عبارت منظم پرل چندین آرگومان «+» پذیرفته شده است.

نام=
مجموعه نام بها دادن وال در هش "ARG" به سطح بالا منتقل می شود ساختن فایل.

"-cc" نمایش فرمانی که باید هنگام بازیابی از کش اجرا می شد. خیر
نشان می دهد که فایل بازیابی شده است. این برای
ایجاد لاگ های ساخت که می تواند با لاگ های ساخت واقعی مقایسه شود.

"-cd" غیرفعال کردن تمام حافظه پنهان. از کش بازیابی نکنید و به حافظه نهان هموار نکنید.

"-cr" وابستگی ها را به ترتیب تصادفی بسازید. این هنگام ساختن چندگانه مفید است
درختان مشابه با ذخیره سازی فعال است.

«-cs» اهداف ساخت موجود را که به‌روز می‌شوند با حافظه پنهان همگام‌سازی کنید.
اگر کش با -cc غیرفعال شده باشد یا اخیراً فعال شده باشد، مفید است
با UseCache.

"-d" اشکال زدایی وابستگی را فعال کنید.

"-f"
به جای استفاده از فایل مشخص شده ساختن (اما ابتدا به حاوی تغییر دهید
دایرکتوری از پرونده).

«-h» اگر یکی از این موارد تعریف شده باشد، یک پیام راهنما محلی برای ساخت فعلی نشان دهید و از آن خارج شوید.

«-k» تا آنجا که ممکن است پس از خطاها ادامه دهید.

"-o"
فایل لغو را بخوانید پرونده.

`-p' نمایش محصولات ساختمانی در درختان مشخص. هیچ ساختی انجام نشده است.

`-pa' نمایش محصولات ساختمانی و اقدامات مرتبط. هیچ ساختی انجام نشده است.

"-pw" محصولات و جایی که آنها تعریف شده اند را نشان دهید. هیچ ساختی انجام نشده است.

`-q' در مورد نصب و حذف اهداف پرحرف نباشید.

`-r' محصولات ساختمانی مرتبط با را حذف کنید . هیچ ساختی انجام نشده است.

"-R"
جستجوی فایل ها در استراحت. چندگانه -R استراحت دایرکتوری ها در جستجو می شوند
سفارش مشخص شده

«-t» سلسله مراتب دایرکتوری را به دنبال a. طی کنید ساختن فایل، اگر وجود نداشته باشد
در دایرکتوری فعلی اهداف تغییر خواهد کرد تا نسبت به
ساختن فایل.

«-v» نسخه «cons» را نمایش دهید و پردازش را ادامه دهید.

"-V" نمایش "معایب" نسخه و خروج.

"-wf"
تمام نام فایل های در نظر گرفته شده را بنویسید پرونده.

`-x' یک پیام راهنما مشابه این پیام نشان دهید و از آن خارج شوید.

و ساخت-ارگ می تواند هر استدلالی باشد که می خواهید در آن پردازش کنید ساختن فایل.
توجه داشته باشید که باید وجود داشته باشد -- تفکیک استدلال ها به منفی و استدلال هایی که شما
مایل به پردازش در ساختن فایل.

پردازش ساخت-ارگ می تواند توسط هر بسته استاندارد مانند انجام شود دریافت کنید یا آن
انواع، یا هر بسته تعریف شده توسط کاربر. منفی در عبور خواهد کرد ساخت-ارگ as ARGV و
سعی نخواهد کرد چیزی را بعد از آن تفسیر کند --.

% منفی -R /usr/local/repository -d os=solaris +driver -- -c test -f DEBUG

موارد زیر را به منفی منتقل می کند

-R /usr/local/repository -d os=solaris +driver

و موارد زیر، به سطح بالا ساختن فایل به عنوان ARGV

-c تست -f DEBUG

توجه داشته باشید که 'cons -r .' معادل یک «پاک کردن» بازگشتی کامل است، اما به هیچ نیازی ندارد
پشتیبانی در ساختن فایل یا هر کدام سرباز وظیفه فایل ها. اگر هستید این کار بسیار مفید است
کامپایل کردن فایل ها در دایرکتوری های منبع (در صورت جدا کردن ساختن و صادرات دایرکتوری ها ،
سپس می توانید دایرکتوری ها را حذف کنید).

گزینه های «-p»، «-pa» و «-pw» برای استفاده به عنوان کمکی در خواندن بسیار مفید هستند.
اسکریپت ها یا اشکال زدایی آنها. اگر می خواهید بدانید چه اسکریپتی نصب می شود export/include/foo.h,
برای مثال فقط تایپ کنید:

% منفی -pw export/include/foo.h

با استفاده از و نوشته وابستگی اسکنر ها


QuickScan اجازه می دهد تا اسکنرهای ساده مستقل از هدف را برای فایل های منبع تنظیم کنید. فقط
یک اسکنر QuickScan ممکن است با هر فایل منبع و محیطی مرتبط باشد.

QuickScan به صورت زیر فراخوانی می شود:

QuickScan CONSENV CODEREF، FILENAME [، PATH]

انتظار می رود که زیرروال ارجاع شده توسط CODEREF لیستی از نام فایل های موجود را برگرداند
مستقیماً توسط FILE. این نام فایل ها نیز به نوبه خود اسکن خواهند شد. آرگومان اختیاری PATH
یک مسیر جستجو برای یافتن FILENAME و/یا فایل‌های بازگردانده شده توسط کاربر ارائه می‌کند.
زیر برنامه PATH ممکن است ارجاعی به آرایه ای از نام های فهرست جستجو باشد یا a
رشته ای از نام ها که توسط کاراکتر جداکننده سیستم از هم جدا شده اند (':' در سیستم های یونیکس، ';' در
ویندوز NT).

زیر روال یک بار برای هر خط در فایل فراخوانی می شود و $_ روی خط فعلی تنظیم می شود.
اگر زیربرنامه نیاز به بررسی خطوط اضافی یا کل فایل داشته باشد،
سپس ممکن است خود آنها را از فایل Handle SCAN بخواند. همچنین ممکن است حلقه را خاتمه دهد، اگر
می‌داند که با بستن پرونده، اطلاعات دیگری در دسترس نیست.

چه مسیر جستجو ارائه شده باشد یا نه، QuickScan ابتدا سعی می کند فایل را جستجو کند
نسبت به دایرکتوری فعلی (برای فایل سطح بالای ارائه شده مستقیماً به QuickScan)،
یا از دایرکتوری حاوی فایلی که به فایل ارجاع داده شده است. این خیلی نیست
به طور کلی، اما به اندازه کافی خوب به نظر می رسد - به خصوص اگر تجملات خود را داشته باشید
ابزارهای کمکی و می تواند استفاده از مسیر جستجو را به صورت استاندارد کنترل کند. در نهایت،
مسیر جستجو در حال حاضر، کولون جدا شده است. این ممکن است اردوی NT را خوشحال نکند.

در اینجا یک مثال واقعی است که از a گرفته شده است ساختن اینجا فایل کنید:

معایب فرعی::SMFgen {
my($env، @tables) = @_;
foreach $t (@tables) {
$env->QuickScan(sub { /\b\S*?\.smf\b/g }، "$t.smf"،
$env->{SMF_INCLUDE_PATH})؛
$env->Command(
["$t.smdb.cc"، "$t.smdb.h"، "$t.snmp.cc"، "$t.ami.cc"، "$t.http.cc"]،
"$t.smf"،
q(
smfgen %( %SMF_INCLUDE_OPT %) %
)
);
}
}

[توجه داشته باشید که فرم «$env->QuickScan ...» و «$env->Command ...» نباید باشد
لازم است، اما، به دلایلی، برای این فراخوان خاص مورد نیاز است. این ظاهر می شود
یک اشکال در پرل یا یک سوء تفاهم از طرف من. این سبک فراخوانی ندارد
همیشه لازم به نظر می رسد.]

این همه نام های فرم را پیدا می کند .smf در فایل. حتی اگر اسامی را برمی گرداند
آنها در نظرات یافت می شوند، اما اشکالی ندارد (مکانیسم، فایل های اضافی را می بخشد.
آنها فقط با این فرض نادیده گرفته می شوند که فایل از دست رفته در زمانی که فایل گم شده متوجه می شود
برنامه، در این مثال، smfgen، در واقع فراخوانی شده است).

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

در اینجا روش دیگری برای ساخت همان اسکنر وجود دارد. این یکی از یک مرجع کد صریح استفاده می کند،
و همچنین (غیر ضروری، در این مورد) کل فایل را می خواند:

زیر مایسکن {
my(@شامل);
انجام دادن {
push(@شامل، /\b\S*?\.smf\b/g)؛
} در حالی که ;
@شامل می شود
}

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

QuickScan $env \myscan, "$_.smf";

پشتیبانی و پیشنهادات


معایب توسط جامعه کاربر حفظ می شود. برای اشتراک، ایمیل بفرستید مخالفت - بحث -
[ایمیل محافظت شده] با بدن مشترک.

لطفاً هرگونه پیشنهادی را از طریق [ایمیل محافظت شده] لیست پستی

از معایب آنلاین با استفاده از خدمات onworks.net استفاده کنید


سرورها و ایستگاه های کاری رایگان

دانلود برنامه های ویندوز و لینوکس

  • 1
    turkdevops
    turkdevops
    TurkDevOps a ?k kaynak yaz?l?m
    geli?tirici topluluklar? DevTurks-Team
    Taraf?ndan desteklenmektedir..
    ویژگی ها:https://github.com/turkdevopshttps://turkdevops.g...
    Turkdevops را دانلود کنید
  • 2
    asammdf
    asammdf
    *asammdf* یک تجزیه کننده سریع پایتون است و
    ویرایشگر ASAM (Associtation for
    استانداردسازی اتوماسیون و
    سیستم های اندازه گیری) MDF / MF4
    (قالب داده های اندازه گیری...
    asammdf را دانلود کنید
  • 3
    LAME (لنگ رمزگذار MP3 نیست)
    LAME (لنگ رمزگذار MP3 نیست)
    LAME یک ابزار آموزشی برای استفاده است
    برای یادگیری در مورد رمزگذاری MP3. این
    هدف پروژه LAME بهبود است
    آکوستیک روانی، کیفیت و سرعت
    نماینده مجلس ...
    دانلود LAME (Lame Aint An MP3 Encoder)
  • 4
    wxPython
    wxPython
    مجموعه ای از ماژول های افزونه پایتون که
    کلاس های رابط کاربری گرافیکی کراس پلتفرم را از
    wxWidgets.. مخاطب: توسعه دهندگان. کاربر
    رابط: X Window System (X11)، Win32 ...
    دانلود wxPython
  • 5
    packfilemanager
    packfilemanager
    این فایل منیجر بسته Total War است
    پروژه، از نسخه 1.7 شروع می شود. آ
    معرفی کوتاه Warscape
    مودینگ: ...
    دانلود packfilemanager
  • 6
    IPerf2
    IPerf2
    ابزاری برای اندازه گیری ترافیک شبکه
    عملکرد TCP و UDP با معیارها
    در اطراف هر دو ظرفیت و تأخیر. در
    اهداف شامل حفظ یک فعال است
    کد iperf...
    IPerf2 را دانلود کنید
  • بیشتر "

دستورات لینوکس

Ad