'\" t .\" Title: SCONS .\" Author: The SCons Development Team .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: Released Wed, 26 Aug 2026 21:18:42 -0700 .\" Manual: SCons 4.11.1 .\" Source: SCons 4.11.1 Version 4.11.1 .\" Language: English .\" .TH "SCONS" "1" "Released Wed, 26 Aug 2026 21:18:42 -0700" "SCons 4\&.11\&.1 Version 4.11." "SCons 4\&.11\&.1" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "نام (NAME)" scons \- ابزاری برای ساخت نرم‌افزار .SH "خلاصه دستور (SYNOPSIS)" .HP \w'\fBscons\fR\ 'u \fBscons\fR [\fIگزینه‌ها\fR...] [\fIname\fR=\fIval\fR...] [\fIهدف‌ها\fR...] .SH "توضیحات (DESCRIPTION)" .PP \fBSCons\fR یک سیستم ساخت متن‌باز و توسعه‌پذیر است که با تعیین این‌که کدام بخش‌ها و مؤلفه‌ها باید ساخته یا بازسازی شوند و فراخوانی دستورهای لازم برای ساخت آن‌ها، فرایند ساخت نرم‌افزار (و سایر خروجی‌های ملموس مانند فایل‌های مستندات) را مدیریت و هماهنگ می‌کند\&. \fBSCons\fR قابلیت‌های فراوانی را برای بهبود بهره‌وری توسعه‌دهندگان ارائه می‌دهد؛ از جمله ساخت‌های موازی، کش‌کردن مصنوعات ساخت، پویش خودکار وابستگی‌ها، و پایگاه داده‌ای از اطلاعات ساخت‌های پیشین تا نیازی به محاسبهٔ مجدد جزئیات در هر بار اجرا نباشد\&. .PP برای اجرای \fBscons\fR به Python نسخهٔ 3\&.7 یا بالاتر نیاز است؛ هیچ وابستگی یا پیش‌نیاز دیگری نباید وجود داشته باشد، مگر اینکه از ابزار آزمایشی Ninja استفاده شود (که نیازمند بستهٔ ninja است)\&. .PP \fIتغییریافته در نسخهٔ 4\&.3\&.0:\fR پشتیبانی از Python نسخهٔ 3\&.5 حذف شده است\&. پروژهٔ CPython در سپتامبر ۲۰۲۰ به پشتیبانی از 3\&.5 پایان داد: \m[blue]\fB\%https://peps.python.org/pep-0478\fR\m[]\&. .PP \fIتغییریافته در نسخهٔ 4\&.9\&.0:\fR پشتیبانی از Python نسخهٔ 3\&.6 حذف شده است\&. پروژهٔ CPython در سپتامبر ۲۰۲۱ به پشتیبانی از 3\&.6 پایان داد: \m[blue]\fB\%https://peps.python.org/pep-0494\fR\m[]\&. .PP \fIتغییریافته در نسخهٔ 4\&.11\&.0:\fR پشتیبانی از Python نسخهٔ 3\&.7 منسوخ شده است و در انتشار آیندهٔ SCons حذف خواهد شد\&. پروژهٔ CPython در ژوئن ۲۰۲۳ به پشتیبانی از 3\&.7 پایان داد: \m[blue]\fB\%https://peps.python.org/pep-0537\fR\m[]\&. .PP \fIتغییریافته در نسخهٔ 4\&.11\&.0:\fR پشتیبانی از Python نسخهٔ 3\&.8 منسوخ شده است و در انتشار آیندهٔ SCons حذف خواهد شد\&. پروژهٔ CPython در سپتامبر ۲۰۲۴ به پشتیبانی از 3\&.8 پایان داد: \m[blue]\fB\%https://peps.python.org/pep-0569\fR\m[]\&. .PP شما یک فرایند ساخت SCons را با نوشتن اسکریپتی راه‌اندازی می‌کنید که موارد مورد نیاز برای ساخت (هدف‌ها یا targets) و در صورت لزوم، قواعد ساخت آن فایل‌ها (اقدام‌ها یا actions) را توصیف می‌کند\&. SCons مجموعه‌ای از متدهای سازنده (\fBBuilder\fR) به همراه دارد که اقدام‌های آماده‌ای را برای ساخت بسیاری از مؤلفه‌های رایج نرم‌افزاری مانند برنامه‌های اجرایی، فایل‌های شیء (object files) و کتابخانه‌ها ارائه می‌دهند؛ به‌گونه‌ای که برای بسیاری از پروژه‌های نرم‌افزاری، در فراخوانی یک سازنده تنها مشخص‌کردن هدف‌ها و فایل‌های ورودی (منابع یا sources) کفایت می‌کند\&. .PP SCons در یک لایهٔ انتزاعی فراتر از نام خالص فایل‌ها عمل می‌کند\&. برای نمونه، اگر یک هدف کتابخانهٔ اشتراکی با نام \(lqfoo\(rq مشخص کنید، SCons نام فایل وابسته به سیستم‌عامل واقعی (مانند libfoo\&.so در سیستم‌های GNU/Linux و foo\&.dll در Windows) را پیگیری می‌کند و یک شناسه در اختیارتان می‌گذارد تا در مراحل دیگر به آن هدف ارجاع دهید، بنابراین نیازی نیست که خودتان از رشته‌های خاص هر سیستم‌عامل استفاده کنید\&. SCons همچنین می‌تواند اطلاعات وابستگی را به‌طور خودکار پویش کند؛ مانند فایل‌های سرایند (header) که توسط فایل‌های کد منبع فراخوانی شده‌اند (برای نمونه، دستورهای پیش‌پردازندهٔ #include در فایل‌های C یا C++)، در نتیجه نیازی به مشخص‌کردن دستی این وابستگی‌های ضمنی (implicit dependencies) نیست\&. SCons از امکان تعریف پویشگرهای جدید برای پشتیبانی از انواع فایل‌های ورودی دیگر نیز پشتیبانی می‌کند\&. .PP اطلاعات مربوط به فایل‌های دخیل در ساخت، از جمله درهم‌سازی رمزنگارانه (cryptographic hash) محتویات فایل‌های منبع، برای استفادهٔ مجدد در آینده کش می‌شوند\&. به‌طور پیش‌فرض، این هش (امضای محتوا یا content signature) برای تصمیم‌گیری در مورد اینکه آیا فایلی از زمان آخرین ساخت تغییر کرده است یا خیر استفاده می‌شود، هرچند با انتخاب یک تابع \fBDecider\fR مناسب می‌توان از الگوریتم‌های دیگری نیز استفاده کرد\&. فایل‌های وابستگی ضمنی نیز بخشی از محاسبات قدیمی‌بودن و نیاز به بازسازی (out\-of\-date) هستند\&. اطلاعات پویش‌شدهٔ وابستگی‌های ضمنی را می‌توان به‌صورت اختیاری کش کرد تا برای سرعت بخشیدن به ساخت‌های آینده به کار روند\&. همچنین هشِ هر اقدام ساختِ اجراشده (امضای ساخت یا build signature) کش می‌شود، تا تغییر در دستورالعمل‌های ساخت (تغییر پرچم‌ها و غیره) یا تغییر در خود ابزارهای ساخت (مانند ارتقای کامپایلر) نیز بتواند ساخت مجدد را آغاز کند\&. .PP SCons از دایرکتوری‌های منبع و ساخت مجزا (که \(lqساخت خارج از درخت\(rq یا out\-of\-tree builds نیز نامیده می‌شود) از طریق تعریف دایرکتوری‌های متغیر (variant directories) پشتیبانی می‌کند\&. استفاده از یک دایرکتوری ساخت جداگانه به پاکیزه نگه‌داشتن دایرکتوری منبع از مصنوعات هنگام جستجو کمک می‌کند، امکان برپایی ساخت‌های گوناگون (\(lqگونه‌ها\(rq یا variants) را بدون تداخل فراهم می‌سازد، و بازنشانی ساخت را تنها با حذف دایرکتوری ساخت امکان‌پذیر می‌کند (توجه داشته باشید که SCons حالت \(lqclean\(rq نیز دارد)\&. برای جزئیات بیشتر به بخش توضیحات \fBVariantDir\fR مراجعه کنید\&. .PP هنگام فراخوانی، \fBscons\fR در دایرکتوری جاری به دنبال فایلی می‌گردد که پیکربندی ساخت را توصیف کند و آن را می‌خواند\&. این فایل به‌طور پیش‌فرض SConstruct نام دارد، هرچند برخی حالت‌های دیگر آن، یا نامی که توسط توسعه‌دهنده انتخاب شده باشد نیز پذیرفته می‌شوند (بخش \(lqفایل‌های SConscript\(rq را ببینید)\&. در صورت یافتن، دایرکتوری جاری به‌عنوان دایرکتوری اصلی پروژه تنظیم می‌شود\&. برخی از گزینه‌های خط فرمان مکان‌های دیگری را برای جستجوی SConstruct مشخص می‌کنند (گزینه‌های \fB\-C\fR، \fB\-D\fR، \fB\-u\fR و \fB\-U\fR را ببینید)، که دایرکتوری اصلی پروژه را بر روی مسیر یافت‌شده تنظیم خواهند کرد\&. همچنین می‌توان با گزینهٔ \fB\-f\fR مسیری را برای پیکربندی ساخت مشخص کرد، که در این حالت دایرکتوری جاری همچنان دایرکتوری اصلی پروژه باقی می‌ماند\&. .PP پیکربندی ساخت ممکن است به چندین فایل تقسیم شود: فایل SConstruct می‌تواند با فراخوانی تابع \fBSConscript\fR فایل‌های پیکربندی بیشتری را مشخص کند، و هر فایلی که بدین صورت فراخوانی می‌شود نیز می‌تواند فایل‌های بیشتری را به همین روش شامل شود\&. طبق قرارداد، این فایل‌های فرعی SConscript نامیده می‌شوند، اگرچه می‌توان از هر نامی استفاده کرد\&. در نتیجهٔ این قرارداد نام‌گذاری، اصطلاح \(lqفایل‌های SConscript\(rq به‌طور کلی برای اشاره به مجموعهٔ کامل فایل‌های پیکربندی یک پروژه (شامل فایل SConstruct\c )، بدون در نظر گرفتن نام‌های واقعی یا تعداد این فایل‌ها، به کار می‌رود\&. یک ساخت سلسله‌مراتبی به‌صورت بازگشتی نیست \- تمام فایل‌های SConscript در یک مرحله (تک‌گذر) پردازش می‌شوند تا \fBscons\fR در هنگام بررسی آنچه باید ساخته شود، تصویری کامل از کل درخت وابستگی داشته باشد\&. هر فایل SConscript در یک بافتار (context) جداگانه پردازش می‌شود تا تنظیمات انجام‌شده در یک اسکریپت به اسکریپت دیگر نشت نکند؛ با این حال، اطلاعات را می‌توان به‌طور صریح میان اسکریپت‌ها به اشتراک گذاشت\&. .PP پیش از خواندن فایل‌های SConscript، دستور \fBscons\fR به دنبال یک site directory (دایرکتوری پایگاه) می‌گردد \- دایرکتوری‌ای به نام site_scons در دایرکتوری‌های سیستمی مختلف و در دایرکتوری اصلی پروژه جستجو می‌شود، یا اگر گزینهٔ \fB\-\-site\-dir\fR داده شده باشد، تنها آن دایرکتوری بررسی می‌شود\&. دایرکتوری‌های پایگاهِ یافت‌شده به ابتدای مسیر جستجوی ماژول‌های Python (\fIsys\&.path\fR) افزوده می‌شوند، و بدین ترتیب اجازه می‌دهند تا ماژول‌های موجود در چنین دایرکتوری‌هایی به روش معمول Python در فایل‌های SConscript وارد (import) شوند\&. به ازای هر دایرکتوری پایگاه یافت‌شده، (۱) اگر حاوی فایلی به نام site_init\&.py باشد، آن فایل ارزیابی و اجرا می‌شود، و (۲) اگر حاوی دایرکتوری‌ای به نام site_tools باشد، مسیر آن دایرکتوری به ابتدای toolpath پیش‌فرض افزوده می‌شود\&. برای جزئیات دربارهٔ مسیرهای پیش‌فرض و کنترل دایرکتوری‌های پایگاه، گزینه‌های \fB\-\-site\-dir\fR و \fB\-\-no\-site\-dir\fR را ببینید\&. .PP فایل‌های SConscript به زبان برنامه‌نویسی Python نوشته می‌شوند\&. برای بسیاری از وظایف، نحو ساده را می‌توان از روی مثال‌ها فرا گرفت، بنابراین معمولاً برای استفادهٔ مؤثر از SCons نیازی به برنامه‌نویس Python بودن نیست\&. فایل‌های SConscript در بستری اجرا می‌شوند که امکانات شرح‌داده‌شده در این صفحهٔ راهنما را مستقیماً در دسترس قرار می‌دهد (یعنی نیازی به import کردن نیست)\&. قابلیت‌های استاندارد اسکریپت‌نویسی Python نظیر کنترل جریان، دستکاری داده‌ها و ماژول‌های واردشدهٔ Python برای استفاده در پیکربندی‌های پیچیده‌تر ساخت در دسترس هستند\&. سایر فایل‌های Python نیز می‌توانند بخشی از سیستم ساخت شوند، اما به‌طور خودکار از بستر SCons برخوردار نیستند و در صورت نیاز به دسترسی، باید آن را وارد (import) کنند (که بعداً توضیح داده شده است)\&. .PP SCons تمام فایل‌های SConscript درج‌شده را \fIپیش از\fR شروع ساخت هر هدفی، می‌خواند و اجرا می‌کند\&. پیام‌های پیشرفت این رفتار را نشان می‌دهند (خطوط تغییر وضعیت \- آن‌هایی که با برچسب scons: شروع می‌شوند \- را می‌توان با استفاده از گزینهٔ \fB\-Q\fR پنهان کرد): .sp .if n \{\ .RS 4 .\} .nf $ \fBscons foo\&.out\fR scons: Reading SConscript files \&.\&.\&. scons: done reading SConscript files\&. scons: Building targets \&.\&.\&. cp foo\&.in foo\&.out scons: done building targets\&. $ .fi .if n \{\ .RE .\} .PP برای تضمین ساخت‌های بازتولیدپذیر، SCons به‌جای انتشار کامل محیطی که در زمان فراخوانی \fBscons\fR حاکم بوده است، از یک محیط اجرای محدود برای اجرای دستورات خارجی مورد نیاز برای ساخت اهداف استفاده می‌کند\&. این کار به جلوگیری از مشکلاتی مانند دریافت تنظیمات تصادفی یا مخرب، مقادیر اشکال‌زدایی موقتی که دیگر نیازی به آن‌ها نیست، یا تفاوت تنظیمات یک توسعه‌دهنده با توسعه‌دهنده‌ای دیگر (یا با خط‌لولهٔ CI) کمک می‌کند\&. متغیرهای محیطی مورد نیاز برای عملکرد صحیح این دستورات باید صریحاً در محیط اجرا تنظیم شوند، چه با انتساب مقادیر مورد نظر، یا با گزینش این مقادیر به‌صورت جداگانه یا جمعی از میان متغیرهای محیطی ارائه‌شده توسط دیکشنری os\&.environ در Python (این مقادیر به‌عنوان ورودی‌های برنامهٔ خارجی باید قبل از استفاده اعتبارسنجی شوند)\&. محیط اجرا برای یک محیط ساخت مشخص، مقدار \fB$ENV\fR آن است\&. تعداد کمی از متغیرهای محیطی به‌طور خودکار توسط خود \fBscons\fR دریافت می‌شوند (بخش \(lqمحیط (ENVIRONMENT)\(rq را ببینید)\&. .PP به‌ویژه، اگر یک کامپایلر یا دستور خارجی دیگر که برای ساخت یک فایل هدف مورد نیاز است، در مکان استاندارد سیستم از نظر \fBscons\fR قرار نداشته باشد، در زمان اجرا پیدا نخواهد شد مگر اینکه شما صریحاً آن مکان را به مؤلفهٔ \fIPATH\fR در محیط اجرا اضافه کنید\&. این موضوع به‌ویژه در پلتفرم‌های Windows قابل توجه است، جایی که نصب یک دستور در مکانی مختص به برنامه و وابستگی به تنظیم \fIPATH\fR برای پیدا شدن آن امری رایج است، که به‌طور خودکار برای SCons کار نمی‌کند\&. .PP یک رویکرد نمونه، استخراج کامل متغیر محیطی \fBPATH\fR و تنظیم آن در محیط اجرا است: .sp .if n \{\ .RS 4 .\} .nf import os env = Environment(ENV={\*(AqPATH\*(Aq: os\&.environ[\*(AqPATH\*(Aq]}) .fi .if n \{\ .RE .\} .PP به همین ترتیب، اگر دستورات از متغیرهای محیطی خارجی خاصی استفاده می‌کنند که \fBscons\fR آن‌ها را شناسایی نمی‌کند، می‌توان آن‌ها را به محیط اجرا منتقل کرد: .sp .if n \{\ .RS 4 .\} .nf import os env = Environment( ENV={ \*(AqPATH\*(Aq: os\&.environ[\*(AqPATH\*(Aq], \*(AqMODULEPATH\*(Aq: os\&.environ[\*(AqMODULEPATH\*(Aq], \*(AqPKG_CONFIG_PATH\*(Aq: os\&.environ[\*(AqPKG_CONFIG_PATH\*(Aq], } ) .fi .if n \{\ .RE .\} .PP یا می‌توانید کل محیط خارجی کاربری را که برنامه را فراخوانی کرده است به‌طور صریح منتقل کنید: .sp .if n \{\ .RS 4 .\} .nf import os env = Environment(ENV=os\&.environ\&.copy()) .fi .if n \{\ .RE .\} .PP این کار به بهای وابسته شدن ساخت شما به تنظیم صحیح محیط کاربر تمام می‌شود، اما ممکن است برای برخی پیکربندی‌ها راحت‌تر باشد\&. اگر این کار در یک ساختار ساختی انجام شود که چگونگی تنظیم محیط را پیش از فراخوانی \fBscons\fR به‌دقت کنترل می‌کند (مانند بسیاری از ساختارهای یکپارچه‌سازی مداوم یا CI)، نباید مشکلی ایجاد کند\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBنکته\fR .ps -1 .br .PP قطعه‌کدهای بالا برای نشان دادن یک مفهوم در نظر گرفته شده‌اند\&. معمولاً پاک کردن کل مقدار پیش‌فرض محیط اجرا (env["ENV"]) ایدهٔ خوبی نیست، زیرا ممکن است حاوی اطلاعات مهمی برای اجرای دستورات ساخت باشد\&. .sp .5v .RE .PP \fBscons\fR معمولاً در یک دایرکتوری سطح بالا که حاوی یک فایل SConstruct است (دایرکتوری ریشهٔ پروژه) اجرا می‌شود\&. هنگامی که \fBscons\fR فراخوانی می‌شود، خط فرمان (از جمله محتویات متغیر محیطی \fBSCONSFLAGS\fR در صورت تنظیم بودن) پردازش می‌شود\&. گزینه‌های خط فرمان (بخش \(lqگزینه‌ها (OPTIONS)\(rq را ببینید) پردازش می‌شوند\&. هرگونه انتساب آرگومان متغیر جمع‌آوری شده و آرگومان‌های باقی‌مانده به‌عنوان اهدافی برای ساخت در نظر گرفته می‌شوند\&. .PP مقادیر متغیرهایی که باید به پرونده‌های SConscript ارسال شوند را می‌توان در خط فرمان مشخص کرد: .sp .if n \{\ .RS 4 .\} .nf \fBscons debug=1\fR .fi .if n \{\ .RE .\} .PP این متغیرها از طریق دیکشنری \fIARGUMENTS\fR در دسترس هستند و می‌توان از آن‌ها در پرونده‌های SConscript برای تغییر فرایند ساخت به هر شکلی استفاده کرد: .sp .if n \{\ .RS 4 .\} .nf if ARGUMENTS\&.get("debug", ""): env = Environment(CCFLAGS="\-g") else: env = Environment() .fi .if n \{\ .RE .\} .PP آرگومان‌های متغیر خط فرمان همچنین در فهرست \fIARGLIST\fR نیز در دسترس هستند، که بر پایهٔ ترتیب آن‌ها در خط فرمان نمایه‌گذاری شده‌اند\&. این ویژگی به شما امکان می‌دهد در صورت نیاز آن‌ها را به ترتیب ورود، به جای نام پردازش کنید\&. هر مدخل \fIARGLIST\fR یک تاپل متشکل از نام و مقدار است\&. .PP برای اطلاعات بیشتر، بخش \(lqCommand-Line Construction Variables\(rq را ببینید\&. .PP \fBscons\fR می‌تواند حافظهٔ نهان (cache) فایل‌های هدف (مشتق‌شده) را نگهداری کند تا بتوان آن‌ها را بین چندین فرایند ساخت به اشتراک گذاشت\&. هنگامی که کش کردن فایل‌های مشتق‌شده در یک پروندهٔ SConscript فعال باشد، هر فایل هدفی که توسط \fBscons\fR ساخته شود در کش کپی خواهد شد\&. اگر یک فایل هدف به‌روز در کش یافت شود، به جای ساخت مجدد به صورت محلی، از کش بازیابی می‌شود\&. رفتار کش را می‌توان غیرفعال کرد و با استفاده از گزینه‌های خط فرمان \fB\-\-cache\-force\fR، \fB\-\-cache\-disable\fR، \fB\-\-cache\-readonly\fR و \fB\-\-cache\-show\fR به شیوه‌های دیگر کنترل نمود\&. گزینهٔ \fB\-\-random\fR برای جلوگیری از تلاش هم‌زمان چندین فرایند ساخت جهت به‌روزرسانی کش مفید است\&. .PP به‌طور پیش‌فرض، \fBscons\fR در سیستم‌های گوناگون به دنبال ابزارهای برنامه‌نویسی شناخته‌شده می‌گردد و بر اساس آنچه یافته است خود را مقداردهی اولیه می‌کند\&. در سیستم‌های Windows که با عنوان \fIwin32\fR شناسایی می‌شوند، \fBscons\fR به ترتیب به دنبال ابزارهای Microsoft Visual C++، زنجیره ابزار MinGW، ابزارهای کامپایلر Intel، ابزارهای GCC، ابزارهای LLVM/clang و کامپایلر PharLap ETS می‌گردد\&. در سیستم‌های Windows که به عنوان \fIcygwin\fR شناسایی می‌شوند (یعنی اگر \fBscons\fR از درون یک پوستهٔ cygwin اجرا شود)، این اولویت تغییر کرده و زنجیره ابزار GCC بر ابزارهای MSVC ترجیح داده می‌شود\&. در سیستم‌های OS/2، \fBscons\fR به ترتیب به دنبال کامپایلر OS/2، زنجیره ابزار GCC و ابزارهای Microsoft Visual C++ می‌گردد\&. در سیستم‌های SGI IRIX، IBM AIX، Hewlett Packard HP\-UX و Oracle Solaris، \fBscons\fR به دنبال ابزارهای کامپایلر بومی (به ترتیب ابزارهای MIPSpro، Visual Age، aCC و Forte) و زنجیره ابزار GCC می‌گردد\&. در FreeBSD و OpenBSD، \fBscons\fR به ترتیب به دنبال ابزارهای LLVM/clang، زنجیره ابزار GCC و ابزارهای کامپایلر Intel می‌گردد\&. در تمامی پلتفرم‌های دیگر، شامل پلتفرم‌های POSIX (Linux و UNIX) و macOS، \fBscons\fR به ترتیب به دنبال زنجیره ابزار GCC، ابزارهای LLVM/clang و ابزارهای کامپایلر Intel می‌گردد\&. انتخاب پیش‌فرض ابزارها می‌تواند با استفاده از آرگومان \fItools\fR در متدهای ایجاد construction environment، فراخوانی صریح بارگذار \fBTool\fR، یا از طریق تنظیم متغیرهای مختلف construction variables نادیده گرفته و جایگزین شود\&. .SS "انتخاب هدف (Target Selection)" .PP SCons بر روی هدف‌های انتخاب‌شده عمل می‌کند، صرف‌نظر از اینکه عملیات درخواستی ساخت (build)، بدون‌اجرا (no\-exec) یا پاک‌سازی (clean) باشد\&. هدف‌ها به روش زیر انتخاب می‌شوند: .sp .RS 4 .ie n \{\ \h'-04' 1.\h'+01'\c .\} .el \{\ .sp -1 .IP " 1." 4.2 .\} هدف‌های مشخص‌شده در خط فرمان\&. این‌ها می‌توانند فایل‌ها، دایرکتوری‌ها، یا هدف‌های ساختگی (phony) تعریف‌شده با استفاده از تابع \fBAlias\fR باشند\&. هدف‌های دایرکتوری توسط \fBscons\fR برای یافتن هر هدفی که مقصدی درون آن دایرکتوری یا زیرشاخه‌های آن دارد پویش می‌شوند\&. هدف‌های فهرست‌شده در خط فرمان، در فهرست \fICOMMAND_LINE_TARGETS\fR در دسترس قرار می‌گیرند\&. .RE .sp .RS 4 .ie n \{\ \h'-04' 2.\h'+01'\c .\} .el \{\ .sp -1 .IP " 2." 4.2 .\} اگر هیچ هدفی در خط فرمان مشخص نشده باشد، \fBscons\fR هدف‌های مشخص‌شده در فایل‌های SConscript را از طریق فراخوانی‌های تابع \fBDefault\fR انتخاب خواهد کرد\&. این‌ها به عنوان هدف‌های پیش‌فرض شناخته می‌شوند و در فهرست \fIDEFAULT_TARGETS\fR در دسترس قرار می‌گیرند\&. .RE .sp .RS 4 .ie n \{\ \h'-04' 3.\h'+01'\c .\} .el \{\ .sp -1 .IP " 3." 4.2 .\} اگر در مراحل قبلی هیچ هدفی انتخاب نشود، \fBscons\fR دایرکتوری جاری را برای پویش انتخاب می‌کند، مگر اینکه گزینه‌های خط فرمانی که بر دایرکتوری پویش هدف تأثیر می‌گذارند مشخص شده باشند (\fB\-C\fR، \fB\-D\fR، \fB\-u\fR، \fB\-U\fR)\&. از آنجا که هدف‌های انتخاب‌شده در این حالت نتیجهٔ دستور مستقیم کاربر نبوده‌اند، این فهرست هدف برای بررسی مستقیم در دسترس قرار نمی‌گیرد؛ در صورت نیاز به بررسی آن‌ها، از گزینهٔ \fB\-\-debug=explain\fR استفاده کنید\&. .RE .sp .RS 4 .ie n \{\ \h'-04' 4.\h'+01'\c .\} .el \{\ .sp -1 .IP " 4." 4.2 .\} \fBscons\fR همیشه هدف‌های واسطی را که برای ساخت هدف‌های مشخص‌شده لازم هستند، به هدف‌های انتخاب‌شده اضافه می‌کند\&. برای مثال، هنگام ساخت یک کتابخانهٔ مشترک یا dll از فایل‌های منبع C، \fBscons\fR فایل‌های شیء (object files) را نیز که کتابخانه را تشکیل می‌دهند خواهد ساخت\&. .RE .PP برای نادیده‌گرفتن هدف‌های پیش‌فرضی که از طریق فراخوانی‌های \fBDefault\fR مشخص شده‌اند و در عوض ساخت تمام فایل‌های هدف در دایرکتوری جاری یا زیرشاخه‌های آن، دایرکتوری جاری (\&.) را به عنوان یک هدف در خط فرمان مشخص کنید: .sp .if n \{\ .RS 4 .\} .nf \fBscons \&.\fR .fi .if n \{\ .RE .\} .PP برای ساخت تمام فایل‌های هدف، از جمله هر فایلی خارج از دایرکتوری جاری، دایرکتوری ریشه (root) را به عنوان هدف خط فرمان تعیین کنید (در سیستم‌های POSIX): .sp .if n \{\ .RS 4 .\} .nf \fBscons /\fR .fi .if n \{\ .RE .\} .PP یا نام مسیر درایو(هایی) که تمام هدف‌ها باید در آن ساخته شوند (در سیستم‌های Windows): .sp .if n \{\ .RS 4 .\} .nf \fBscons C:\e D:\e\fR .fi .if n \{\ .RE .\} .PP می‌توان زیرمجموعه‌ای از یک ساختار درختی سلسله‌مراتبی را با ماندن در دایرکتوری اصلی پروژه و مشخص کردن زیردایرکتوری به عنوان هدفِ ساخت، ایجاد کرد: .sp .if n \{\ .RS 4 .\} .nf \fBscons src/subdir\fR .fi .if n \{\ .RE .\} .PP یا با تغییر دایرکتوری و اجرای scons با گزینهٔ \fB\-u\fR که ساختار سلسله‌مراتبی دایرکتوری را به سمت بالا پیمایش می‌کند تا زمانی که فایل SConstruct را بیابد، و سپس هدف‌ها را نسبت به زیردایرکتوری جاری می‌سازد (همچنین گزینه‌های مرتبط \fB\-D\fR و \fB\-U\fR را ببینید): .sp .if n \{\ .RS 4 .\} .nf \fBcd src/subdir\fR \fBscons \-u \&.\fR .fi .if n \{\ .RE .\} .PP در تمام موارد، ممکن است فایل‌های بیشتری نسبت به آنچه درخواست شده ساخته شوند، زیرا \fBscons\fR باید اطمینان حاصل کند که تمام فایل‌های وابسته ساخته شده‌اند\&. .PP مشخص کردن اهداف «پاک‌سازی» در فایل‌های SConscript معمولاً ضروری نیست\&. پرچم \fB\-c\fR تمام اهداف انتخاب‌شده را حذف می‌کند: .sp .if n \{\ .RS 4 .\} .nf \fBscons \-c \&.\fR .fi .if n \{\ .RE .\} .PP برای حذف تمام فایل‌های هدف درون یا زیر دایرکتوری جاری، یا: .sp .if n \{\ .RS 4 .\} .nf \fBscons \-c build export\fR .fi .if n \{\ .RE .\} .PP برای حذف فایل‌های هدف زیر build و export\&. .PP فایل‌ها یا دایرکتوری‌های اضافی برای حذف را می‌توان با استفاده از تابع \fBClean\fR در فایل‌های SConscript مشخص کرد\&. در مقابل، اهدافی که به‌طور معمول با فراخوانی \fB\-c\fR حذف می‌شوند را می‌توان با فراخوانی تابع \fBNoClean\fR به همراه آن اهداف، نگه داشت\&. .PP \fBscons\fR از ساخت چندین هدف به‌صورت موازی از طریق گزینهٔ \fB\-j\fR پشتیبانی می‌کند که تعداد وظایف همزمانی که می‌توانند ایجاد شوند را به عنوان آرگومان خود می‌پذیرد: .sp .if n \{\ .RS 4 .\} .nf \fBscons \-j 4\fR .fi .if n \{\ .RE .\} .PP برای نمونه، چهار هدف را به‌صورت موازی می‌سازد\&. .SH "گزینه‌ها (OPTIONS)" .PP به‌طور کلی، \fBscons\fR از همان گزینه‌های خط فرمان گنو Make و بسیاری از گزینه‌های پشتیبانی‌شده توسط cons پشتیبانی می‌کند\&. .PP \fB\-b\fR .RS 4 برای سازگاری با نسخه‌های غیر گنو از Make نادیده گرفته می‌شود\&. .RE .PP \fB\-c\fR, \fB\-\-clean\fR, \fB\-\-remove\fR .RS 4 حالت پاک‌سازی (clean) را تنظیم می‌کند\&. با حذف اهداف انتخاب‌شده و همچنین هر فایل یا دایرکتوری مرتبط با یک هدف انتخاب‌شده از طریق فراخوانی‌های تابع \fBClean\fR پاک‌سازی را انجام می‌دهد\&. هیچ‌یک از اهدافی را که از طریق فراخوانی‌های تابع \fBNoClean\fR برای نگهداری علامت‌گذاری شده‌اند، حذف نخواهد کرد\&. .sp در حالی که حالت پاک‌سازی به جای ساخت اهداف آن‌ها را حذف می‌کند، کارهایی که مستقیماً در کد Python درون فایل‌های SConscript انجام می‌شوند همچنان اجرا خواهند شد\&. اگر مهم است که از انجام برخی از این کارها در حالت پاک‌سازی جلوگیری شود، باید از آن‌ها محافظت شود\&. یک فایل SConscript می‌تواند با پرس‌وجو از \fBGetOption\fR، مانند فراخوانی if GetOption("clean"): تشخیص دهد که کدام حالت فعال است\&. .RE .PP \fB\-\-cache\-debug=\fR\fB\fIfile\fR\fR .RS 4 اطلاعات اشکال‌زدایی مربوط به کَش فایل‌های مشتق‌شده (derived\-file) را در \fIfile\fR مشخص‌شده می‌نویسد\&. اگر \fIfile\fR یک خط تیره (\-) باشد، اطلاعات اشکال‌زدایی در خروجی استاندارد چاپ می‌شود\&. این پیام‌ها عملیات کَش را توصیف می‌کنند؛ مانند اینکه کدام امضای ساخت (build signature) مورد جستجو، بازیابی یا ذخیره در کَش مشخص‌شده توسط \fBCacheDir\fR قرار گرفته است\&. .RE .PP \fB\-\-cache\-disable\fR, \fB\-\-no\-cache\fR .RS 4 کَش فایل‌های مشتق‌شده را غیرفعال می‌کند\&. \fBscons\fR نه فایلی را از کَش بازیابی می‌کند و نه فایلی را در کَش کپی می‌کند\&. این گزینه امکان غیرفعال‌سازی موقت کَش را بدون دستکاری اسکریپت‌های ساخت فراهم می‌آورد\&. .RE .PP \fB\-\-cache\-force\fR, \fB\-\-cache\-populate\fR .RS 4 هنگام استفاده از \fBCacheDir\fR، با کپی کردن هر فایل مشتق‌شده موجود و به‌روز علاوه بر فایل‌های ساخته‌شده در طول این فراخوانی، کَش فایل‌های مشتق‌شده را پر می‌کند\&. این ویژگی برای مقداردهی اولیه یک کَش جدید با فایل‌های مشتق‌شده فعلی یا افزودن فایل‌هایی که اخیراً با غیرفعال بودن کَش (از طریق گزینه \fB\-\-cache\-disable\fR) ساخته شده‌اند مفید است\&. .RE .PP \fB\-\-cache\-readonly\fR .RS 4 از کَش فایل‌های مشتق‌شده، در صورت فعال بودن، برای بازیابی فایل‌ها استفاده می‌کند، اما کَش را با هیچ فایلی که در طول این فراخوانی ساخته می‌شود به‌روزرسانی نمی‌کند\&. .RE .PP \fB\-\-cache\-show\fR .RS 4 هنگام استفاده از کَش فایل‌های مشتق‌شده، دستوری را که برای ساخت فایل اجرا می‌شد (یا در صورت تعیین، محتوای مربوط به *COMSTR) نمایش می‌دهد، حتی اگر فایل از کَش بازیابی شده باشد\&. بدون این گزینه، \fBscons\fR پیام بازیابی از کَش را نمایش می‌دهد\&. این امر خروجی یکدستی را در گزارش‌های ساخت، صرف‌نظر از اینکه فایل مجدداً ساخته شده یا از کَش بازیابی شده باشد، تضمین می‌کند\&. .RE .PP \fB\-\-config=\fR\fB\fImode\fR\fR .RS 4 نحوه استفاده یا تولید نتایج آزمایش‌های پیکربندی توسط فراخوانی \fBConfigure\fR را کنترل می‌کند\&. \fImode\fR باید یکی از گزینه‌های زیر باشد: .PP \fBauto\fR .RS 4 برنامه SCons از سازوکارهای وابستگی معمول خود برای تصمیم‌گیری در مورد اینکه آیا یک آزمایش باید مجدداً ساخته شود یا خیر استفاده می‌کند\&. این کار با عدم اجرای آزمایش‌های پیکربندی تکراری در هر بار فراخوانی scons، در زمان صرفه‌جویی می‌کند، اما تغییرات در فایل‌های سرایند سیستم یا دستورهای خارجی (مانند کامپایلرها) را در صورتی که آن وابستگی‌ها را به صراحت مشخص نکرده باشید، نادیده خواهد گرفت\&. این رفتار پیش‌فرض است\&. .RE .PP \fBforce\fR .RS 4 اگر این حالت مشخص شود، تمام آزمایش‌های پیکربندی صرف‌نظر از اینکه نتایج کَش‌شده منسوخ شده‌اند یا خیر، مجدداً اجرا خواهند شد\&. این حالت می‌تواند برای اجبار صریح به به‌روزرسانی آزمایش‌های پیکربندی در پاسخ به یک تغییر اعمال‌شده در فایل سرایند سیستم یا کامپایلر که در پیکربندی لحاظ نشده است، استفاده شود\&. .RE .PP \fBcache\fR .RS 4 اگر این حالت مشخص شود، هیچ آزمایش پیکربندی مجدداً اجرا نخواهد شد و تمام نتایج از کَش گرفته می‌شوند\&. در صورتی که \fB\-\-config=cache\fR مشخص شده باشد و یک آزمایش ضروری هیچ نتیجه‌ای در کَش نداشته باشد، \fBscons\fR یک خطا گزارش خواهد داد\&. .RE .sp .RE .PP \fB\-C \fR\fB\fIdirectory\fR\fR, \fB\-\-directory=\fR\fB\fIdirectory\fR\fR .RS 4 به گونه‌ای اجرا می‌شود که گویی \fBscons\fR به جای دایرکتوری کاری فعلی، در \fIdirectory\fR آغاز به کار کرده است\&. یعنی پیش از جستجو برای فایل‌های SConstruct، Sconstruct، sconstruct، SConstruct\&.py، Sconstruct\&.py یا sconstruct\&.py یا انجام هر کار دیگری، دایرکتوری را تغییر می‌دهد\&. هنگامی که چندین گزینه \fB\-C\fR داده شود، هر \fB\-C\fR \fIdirectory\fR غیرمطلق بعدی نسبت به دایرکتوری قبلی تفسیر می‌شود\&. همچنین گزینه‌های \fB\-u\fR، \fB\-U\fR و \fB\-D\fR را برای تغییر رفتار جستجوی SConstruct هنگام استفاده از این گزینه ببینید\&. .RE .PP \fB\-D\fR .RS 4 دقیقاً مانند گزینه \fB\-u\fR عمل می‌کند، به جز در نحوه مدیریت اهداف پیش‌فرض\&. هنگامی که از این گزینه استفاده می‌شود و هیچ هدفی در خط فرمان مشخص نشده باشد، تمام اهداف پیش‌فرض ساخته می‌شوند، صرف‌نظر از اینکه در زیر دایرکتوری فعلی باشند یا خیر\&. .RE .PP \fB\-\-debug=\fR\fB\fItype\fR\fR\fB[\fR\fB\fI,type\fR\fR\fB\&.\&.\&.]\fR .RS 4 فرایند ساخت را اشکال‌زدایی می‌کند\&. \fItype\fR نوع اطلاعات اشکال‌زدایی ارائه‌شده را مشخص می‌کند\&. چندین نوع را می‌توان با کاما از یکدیگر جدا کرد\&. انواع زیر شناخته شده هستند: .PP \fBaction\-timestamps\fR .RS 4 اطلاعات تکمیلی نمایه‌سازی زمانی (time profiling) را چاپ می‌کند\&. برای هر دستور، زمان‌های شروع و پایان مطلق را نمایش می‌دهد\&. این قابلیت ممکن است در اشکال‌زدایی ساخت‌های موازی مفید باشد\&. مستلزم گزینه \fB\-\-debug=time\fR است\&. .sp \fIجدید در نسخه 3\&.1\&.\fR .RE .PP \fBcount\fR .RS 4 تعداد اشیای ساخته‌شده از کلاس‌های گوناگونی که به‌صورت داخلی توسط SCons به کار می‌روند را قبل و بعد از خواندن فایل‌های SConscript و قبل و بعد از ساخت هدف‌ها چاپ می‌کند\&. این قابلیت هنگامی که SCons با گزینهٔ \fB\-O\fR (بهینه‌شده) در Python اجرا شود یا ماژول‌های SCons با بهینه‌سازی کامپایل شده باشند (یعنی هنگام اجرا از فایل‌های *\&.pyo)، پشتیبانی نمی‌شود\&. .RE .PP \fBduplicate\fR .RS 4 یک خط به ازای هر لغو پیوند/پیوند دوباره (یا رونوشت) یک فایل در دایرکتوری متغیر (variant directory) از روی فایل منبع آن چاپ می‌کند\&. شامل اطلاعات اشکال‌زدایی برای لغو پیوند فایل‌های قدیمی دایرکتوری متغیر و همچنین لغو پیوند هدف‌های قدیمی پیش از ساخت آن‌ها است\&. .RE .PP \fBexplain\fR .RS 4 توضیحی دربارهٔ چرایی تصمیم \fBscons\fR برای ساخت (یا ساخت مجدد) هدف‌های انتخاب‌شده چاپ می‌کند\&. .RE .PP \fBfindlibs\fR .RS 4 به پویشگری که به دنبال کتابخانه‌ها می‌گردد دستور می‌دهد تا پیامی دربارهٔ هر نام کتابخانهٔ بالقوه‌ای که جستجو می‌کند و کتابخانه‌های واقعی که پیدا می‌کند، چاپ کند\&. .RE .PP \fBincludes\fR .RS 4 درخت include را پس از ساخت هر هدف سطح بالا چاپ می‌کند\&. این گزینه معمولاً برای بررسی اینکه چه فایل‌هایی توسط منابع یک فایل اشتقاقی خاص گنجانده شده‌اند (include شده‌اند)، به کار می‌رود: .sp .if n \{\ .RS 4 .\} .nf $ \fBscons \-\-debug=includes foo\&.o\fR .fi .if n \{\ .RE .\} .RE .PP \fBjson\fR .RS 4 در صورت فعال بودن هر یک از گزینه‌های اشکال‌زدایی زیر، اطلاعات را در یک فایل JSON می‌نویسد: \fImemory\fR، \fIcount\fR، \fItime\fR، \fIaction\-timestamps\fR .sp فایل خروجی پیش‌فرض عبارت است از scons_stats\&.json .sp نام یا مسیر فایل را می‌توان با استفاده از \fBDebugOptions\fR تغییر داد؛ برای نمونه: DebugOptions(json=\*(Aqpath/to/file\&.json\*(Aq) .sp .if n \{\ .RS 4 .\} .nf $ \fBscons \-\-debug=memory,json foo\&.o\fR .fi .if n \{\ .RE .\} .RE .PP \fBmemoizer\fR .RS 4 خلاصه‌ای از برخوردها (hits) و عدم برخوردها (misses) را با استفاده از Memoizer چاپ می‌کند؛ زیرسیستمی داخلی که تعداد دفعاتی را که SCons به جای محاسبهٔ مجدد مقادیر در هر بار نیاز، از مقادیر حافظهٔ موقت (کش) در حافظه استفاده می‌کند، شمارش می‌نماید\&. .RE .PP \fBmemory\fR .RS 4 میزان حافظه‌ای را که SCons قبل و بعد از خواندن فایل‌های SConscript و قبل و بعد از ساخت هدف‌ها مصرف می‌کند، چاپ می‌کند\&. .RE .PP \fBobjects\fR .RS 4 فهرستی از اشیای گوناگون از کلاس‌های مختلفی که به‌طور داخلی توسط SCons استفاده می‌شوند را چاپ می‌کند\&. .RE .PP \fBpdb\fR .RS 4 اجرای \fBscons\fR تحت کنترل اشکال‌زدای pdb در Python\&. .sp .if n \{\ .RS 4 .\} .nf $ \fBscons \-\-debug=pdb\fR > /usr/lib/python3\&.11/site\-packages/SCons/Script/Main\&.py(869)_main() \-> options = parser\&.values (Pdb) .fi .if n \{\ .RE .\} .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBنکته\fR .ps -1 .br ابزار pdb در هنگام راه‌اندازی، در ابتدای روال اصلی (main routine) \fBscons\fR متوقف خواهد شد\&. مسیر جستجو (sys\&.path) در آن نقطه شامل مکان \fBscons\fR در حال اجرا خواهد بود، اما شامل خود پروژه نخواهد بود\&. اگر نیاز به تنظیم نقاط توقف (breakpoints) در فایل‌های پروژهٔ خود دارید، یا باید آن را به مسیر اضافه کنید، یا هنگام ارجاع به فایل‌های پروژه از مسیرهای مطلق استفاده نمایید\&. می‌توان از یک فایل \&.pdbrc در ریشهٔ پروژه برای افزودن دایرکتوری جاری به مسیر جستجو استفاده کرد تا از وارد کردن دستی آن جلوگیری شود؛ مانند زیر: .sp .if n \{\ .RS 4 .\} .nf sys\&.path\&.append(\*(Aq\&.\*(Aq) .fi .if n \{\ .RE .\} .sp به دلیل نحوهٔ پیاده‌سازی ماژول pdb، دستورهای \fBbreak\fR، \fBtbreak\fR و \fBclear\fR تنها ارجاع به نام فایل‌هایی را متوجه می‌شوند که دارای پسوند \&.py باشند (اگرچه خود پسوند را می‌توان نادیده گرفت)، \fIمگر\fR اینکه از یک مسیر مطلق استفاده کنید\&. به عنوان یک استثنای ویژه برای این قاعده، نام‌های SConstruct و SConscript بدون نیاز به پسوند \&.py شناخته می‌شوند\&. .sp \fIتغییریافته در نسخهٔ 4\&.6\&.0\fR: نام‌های SConstruct و SConscript اکنون بدون نیاز به پسوند \&.py شناخته می‌شوند\&. .sp \fIتغییریافته در نسخهٔ 4\&.8\&.0\fR: نام SCsub اکنون بدون نیاز به پسوند \&.py شناخته می‌شود\&. .sp .5v .RE .RE .PP \fBprepare\fR .RS 4 هر بار که هدفی (داخلی یا خارجی) برای ساخت آماده می‌شود، یک خط چاپ می‌کند\&. \fBscons\fR این را برای هر هدفی که بررسی می‌کند چاپ می‌نماید، حتی اگر آن هدف به‌روز باشد (همچنین ببینید \fB\-\-debug=explain\fR)\&. این می‌تواند به اشکال‌زدایی مشکلات مربوط به اهدافی که ساخته نمی‌شوند کمک کند؛ این گزینه نشان می‌دهد که آیا \fBscons\fR دست‌کم آن‌ها را در نظر می‌گیرد یا خیر\&. .RE .PP \fBpresub\fR .RS 4 خط فرمان خام استفاده‌شده برای ساخت هر هدف را پیش از جایگزینی متغیرهای محیط ساخت چاپ می‌کند\&. همچنین نشان می‌دهد کدام اهداف توسط این فرمان ساخته می‌شوند\&. خروجی چیزی شبیه به این خواهد بود: .sp .if n \{\ .RS 4 .\} .nf $ \fBscons \-\-debug=presub\fR Building myprog\&.o with action(s): $SHCC $SHCFLAGS $SHCCFLAGS $CPPFLAGS $_CPPINCFLAGS \-c \-o $TARGET $SOURCES \&.\&.\&. .fi .if n \{\ .RE .\} .RE .PP \fBstacktrace\fR .RS 4 هنگام مواجهه با خطایی که در غیر این صورت توضیح داده‌نشده است، یک رد پشته (stack trace) داخلی Python را چاپ می‌کند\&. .RE .PP \fBtime\fR .RS 4 اطلاعات مختلف سنجش زمان (time profiling) را چاپ می‌کند: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} زمان صرف‌شده برای اجرای هر فرمان ساخت به صورت جداگانه .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} زمان کل ساخت (مدت زمانی که SCons از ابتدا تا انتها اجرا شد) .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} زمان کل صرف‌شده برای خواندن و اجرای فایل‌های SConscript .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} زمان کل صرف‌شده برای اجرای خود SCons (یعنی بدون احتساب خواندن و اجرای فایل‌های SConscript\fR) .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} زمان کل صرف‌شده برای اجرای همه فرمان‌های ساخت .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} زمان واقعی سپری‌شده (wall\-clock time) برای اجرای آن فرمان‌های ساخت .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} زمان صرف‌شده برای پردازش هر فایل ارائه‌شده به تابع \fBSConscript\fR .RE .sp (هنگامی که \fBscons\fR بدون گزینه \fB\-j\fR اجرا می‌شود، زمان واقعی سپری‌شده معمولاً به دلیل پردازش‌های SCons که در بین اجرای هر فرمان انجام می‌شود، اندکی طولانی‌تر از زمان کل صرف‌شده برای اجرای همه فرمان‌های ساخت خواهد بود\&. هنگامی که \fBscons\fR \fIهمراه با\fR گزینه \fB\-j\fR اجرا شود، و پیکربندی ساخت شما امکان موازی‌سازی مناسب را بدهد، زمان واقعی سپری‌شده باید به طور قابل توجهی کمتر از کل زمان صرف‌شده برای اجرای همه فرمان‌های ساخت باشد، زیرا چندین فرمان ساخت و پردازش‌های میانی SCons باید به طور هم‌روند انجام شوند\&.) .RE .PP \fBsconscript\fR .RS 4 خروجی نشان‌دهنده ورود و خروج به هر فایل SConscript را فعال می‌کند\&. .RE .sp .RE .PP \fB\-\-diskcheck=\fR\fB\fItype\fR\fR .RS 4 هنگام جستجوی فایل‌های منبع و include، بررسی‌های خاصی را برای اینکه آیا در جایی که پیکربندی SCons انتظار یک دایرکتوری دارد فایلی روی دیسک قرار گرفته است یا خیر (یا برعکس)، فعال می‌کند\&. \fItype\fR می‌تواند یکی از انواع موجود diskcheck یا توکن‌های ویژه all یا none باشد\&. می‌توان از یک رشته جداشده با ویرگول برای انتخاب چندین بررسی استفاده کرد\&. مقدار پیش‌فرض all است\&. .sp بررسی‌های موجود فعلی عبارتند از: .PP \fBmatch\fR .RS 4 برای بررسی اینکه آیا فایل‌ها و دایرکتوری‌های روی دیسک با پیکربندی مورد انتظار SCons تطابق دارند یا خیر\&. .RE .sp غیرفعال کردن برخی یا همهٔ این بررسی‌ها می‌تواند کارایی را در پیکربندی‌های بزرگ، یا زمانی که پیکربندیْ فایل‌ها و/یا دایرکتوری‌ها را در سیستم‌های فایل شبکه‌ای یا اشتراکی بررسی می‌کند، افزایش دهد؛ البته با افزایش اندک خطر یک ساخت نادرست یا عدم مدیریت مناسب خطاها\&. .RE .PP \fB\-\-duplicate=\fR\fB\fIORDER\fR\fR .RS 4 سه روش برای تکثیر فایل‌ها در یک درخت ساخت وجود دارد: پیوندهای سخت (hard links)، پیوندهای نرم یا نمادین (soft/symbolic links) و کپی‌ها\&. سیاست پیش‌فرض، ترجیح دادن پیوندهای سخت به پیوندهای نرم و سپس به کپی‌ها است\&. می‌توانید با این گزینه سیاست متفاوتی را مشخص کنید\&. \fIORDER\fR باید یکی از مقادیر \fIhard\-soft\-copy\fR (پیش‌فرض)، \fIsoft\-hard\-copy\fR، \fIhard\-copy\fR، \fIsoft\-copy\fR یا \fIcopy\fR باشد\&. SCons تلاش خواهد کرد تا فایل‌ها را با استفاده از این سازوکارها و با ترتیب مشخص‌شده تکثیر کند\&. .RE .PP \fB\-\-enable\-virtualenv\fR .RS 4 وارد کردن متغیرهای مرتبط با virtualenv به SCons\&. .RE .PP \fB\-\-experimental=\fR\fB\fIfeature\fR\fR .RS 4 فعال‌سازی ویژگی‌ها و/یا ابزارهای آزمایشی\&. \fIfeature\fR می‌تواند نام یک ویژگیِ موجود یا نشانه‌های خاص all یا none باشد\&. یک رشتهٔ جداشده با کاما می‌تواند برای انتخاب چندین ویژگی استفاده شود\&. تنظیم پیش‌فرض none است\&. .sp ویژگی‌های موجود فعلی عبارتند از ninja (\fIجدید در نسخه 4\&.2\fR) و legacy_sched_deprecated (\fIجدید در، و منسوخ‌شده از نسخه 4\&.11\&.0\fR)\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBنکته\fR .ps -1 .br زمان‌بند قدیمی (legacy scheduler) دقیقاً یک ویژگی آزمایشی نیست\&. این پرچم ویژگی، زمان‌بند کارهایی را انتخاب می‌کند که پیش از نسخه 4\&.7 در SCons پیش‌فرض بوده است\&. این پرچم ویژگی به عنوان legacy_sched در نسخه 4\&.7 معرفی شد\&. زمان‌بند قدیمی قرار است در یک انتشار آینده حذف شود، بنابراین این پرچم ویژگی اکنون منسوخ شده است\&. در نسخه 4\&.11\&.0، نام آن به legacy_sched_deprecated تغییر یافت تا کاربران فعلی هشداری دریافت کنند \- به دلیل ماهیت پرچم‌های ویژگی‌های آزمایشی، استفاده از سازوکار استاندارد هشدار منسوخ‌سازی SCons در اینجا امکان‌پذیر نیست\&. .sp .5v .RE .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBاحتیاط\fR .ps -1 .br ویژگی‌های آزمایشی فاقد هرگونه تعهد در زمینهٔ سازگاری هستند \- یک ویژگی معین ممکن است در نسخه‌های بعدی تغییرات چشمگیری داشته باشد یا به طور کامل حذف شود\&. .sp .5v .RE \fIگزینه در نسخه 4\&.2 افزوده شد\&.\fR .RE .PP \fB\-f \fR\fB\fIfile\fR\fR, \fB\-\-file=\fR\fB\fIfile\fR\fR, \fB\-\-makefile=\fR\fB\fIfile\fR\fR, \fB\-\-sconstruct=\fR\fB\fIfile\fR\fR .RS 4 استفاده از \fIfile\fR به عنوان فایل SConscript اولیه\&. چندین گزینهٔ \fB\-f\fR می‌تواند مشخص شود، که در این صورت \fBscons\fR تمام فایل‌های مشخص‌شده را خواهد خواند\&. .RE .PP \fB\-h\fR, \fB\-\-help\fR .RS 4 چاپ یک پیام راهنمای محلی برای این پروژه، در صورتی که در فایل‌های SConscript تعریف شده باشد (تابع \fBHelp\fR را ببینید)، به همراه خطی که به پیام راهنمای استاندارد SCons ارجاع می‌دهد\&. اگر هیچ پیام راهنمای محلی تعریف نشده باشد، پیام راهنمای استاندارد SCons (مانند گزینهٔ \fB\-H\fR) به همراه راهنما برای هرگونه گزینهٔ محلی تعریف‌شده از طریق \fBAddOption\fR را چاپ می‌کند\&. پس از نمایش پیام مناسب خارج می‌شود\&. .sp توجه داشته باشید که استفاده از این گزینه مستلزم آن است که SCons فایل‌های SConscript را پردازش کند، بنابراین خطاهای نحوی ممکن است مانع از نمایش پیام راهنما شوند\&. .RE .PP \fB\-\-hash\-chunksize=\fR\fB\fIKILOBYTES\fR\fR .RS 4 تنظیم اندازهٔ بلوک مورد استفاده در هنگام محاسبهٔ content signatures به \fIKILOBYTES\fR\&. این مقدار، اندازهٔ تکه‌هایی را تعیین می‌کند که هنگام محاسبهٔ هش‌های امضا به صورت یکجا خوانده می‌شوند\&. فایل‌های کوچکتر از این اندازه، پیش از انجام محاسبهٔ امضا به طور کامل در حافظه ذخیره می‌شوند، در حالی که فایل‌های بزرگتر به صورت بلوک به بلوک خوانده می‌شوند\&. اندازهٔ بلوک بسیار بزرگ منجر به مصرف بالای حافظه می‌شود، در حالی که اندازهٔ بلوک بسیار کوچک روند ساخت را به میزان قابل توجهی کند می‌کند\&. .sp مقدار پیش‌فرض استفاده از تکه‌های ۶۴ کیلوبایتی است که باید برای اغلب کاربردها مناسب باشد\&. .sp \fIجدید در نسخه 4\&.1\&.\fR .RE .PP \fB\-\-hash\-format=\fR\fB\fIALGORITHM\fR\fR .RS 4 تنظیم الگوریتم هش مورد استفادهٔ SCons به \fIALGORITHM\fR\&. این مقدار، الگوریتم هش مورد استفاده در تولید content signatures، build signatures و کلیدهای \fBCacheDir\fR را تعیین می‌کند\&. .sp فهرست مقادیر پشتیبانی‌شده عبارتند از: \fImd5\fR، \fIsha1\fR و \fIsha256\fR\&. با این حال، مفسر Python استفاده‌شده برای اجرای \fBscons\fR باید پشتیبانی متناظر را در ماژول hashlib داشته باشد تا بتواند از الگوریتم مشخص‌شده استفاده کند\&. .sp اگر این گزینه مشخص نشود، نخستین قالب هش پشتیبانی‌شدهٔ یافت‌شده انتخاب می‌شود\&. معمولاً این قالب MD5 است، اما در یک سیستم منطبق با FIPS با نسخه‌ای از Python قدیمی‌تر از 3\&.9، به طور پیش‌فرض SHA1 یا SHA256 انتخاب می‌شود\&. کلاینت‌های Python نسخهٔ 3\&.9 به بعد همواره به صورت پیش‌فرض از MD5 استفاده می‌کنند، حتی در حالت FIPS\&. .sp مشخص کردن این گزینه نام پایگاه‌دادهٔ SConsign را تغییر می‌دهد\&. پایگاه‌دادهٔ پیش‌فرض \&.sconsign\&.dblite است\&. در صورت وجود این گزینه، \fIALGORITHM\fR برای نشان دادن تفاوت در نام گنجانده می‌شود، حتی اگر آرگومان \fImd5\fR باشد\&. برای نمونه، \fB\-\-hash\-format=sha256\fR از یک پایگاه‌دادهٔ SConsign به نام \&.sconsign_sha256\&.dblite استفاده می‌کند\&. .sp \fIجدید در نسخه 4\&.1\&.\fR .RE .PP \fB\-H\fR, \fB\-\-help\-options\fR .RS 4 پیام راهنمای استاندارد دربارهٔ گزینه‌های خط فرمان SCons را چاپ کرده و خارج می‌شود\&. .RE .PP \fB\-i\fR, \fB\-\-ignore\-errors\fR .RS 4 از تمامی خطاهای ناشی از دستورات اجراشده برای بازسازی فایل‌ها چشم‌پوشی می‌کند\&. .RE .PP \fB\-I \fR\fB\fIdirectory\fR\fR, \fB\-\-include\-dir=\fR\fB\fIdirectory\fR\fR .RS 4 یک \fIdirectory\fR را برای جستجوی ماژول‌های واردشدهٔ Python مشخص می‌کند\&. اگر از چندین گزینهٔ \fB\-I\fR استفاده شود، دایرکتوری‌ها به ترتیب مشخص‌شده جستجو می‌شوند\&. .RE .PP \fB\-\-ignore\-virtualenv\fR .RS 4 از وارد کردن متغیرهای مرتبط با virtualenv به SCons جلوگیری می‌کند\&. .RE .PP \fB\-\-implicit\-cache\fR .RS 4 وابستگی‌های ضمنی را کش می‌کند\&. این کار باعث می‌شود \fBscons\fR به‌جای پویش فایل‌ها برای یافتن وابستگی‌های ضمنی، از وابستگی‌های ضمنی (پویش‌شدهٔ) آخرین باری که اجرا شده بود استفاده کند\&. این کار می‌تواند سرعت SCons را به میزان چشمگیری افزایش دهد، اما با محدودیت‌های زیر همراه است: .sp \fBscons\fR تغییرات در مسیرهای جستجوی وابستگی ضمنی (مانند \fB$CPPPATH\fR، \fB$LIBPATH\fR) را که معمولاً باعث استفاده از نسخه‌های متفاوتی از فایل‌های هم‌نام می‌شوند، تشخیص نخواهد داد\&. .sp \fBscons\fR تغییرات در وابستگی‌های ضمنی را در مواردی که یک وابستگی ضمنیِ جدید در مسیر جستجوی وابستگی‌های ضمنی (مانند \fB$CPPPATH\fR، \fB$LIBPATH\fR) پیش از یک وابستگی ضمنیِ هم‌نامِ فعلی اضافه شود، متوجه نخواهد شد\&. .RE .PP \fB\-\-implicit\-deps\-changed\fR .RS 4 ابزار SCons را وادار می‌کند تا وابستگی‌های ضمنی کش‌شده را نادیده بگیرد\&. این امر موجب می‌شود وابستگی‌های ضمنی دوباره پویش و مجدداً کش شوند\&. این گزینه مستلزم \fB\-\-implicit\-cache\fR است\&. .RE .PP \fB\-\-implicit\-deps\-unchanged\fR .RS 4 ابزار SCons را وادار می‌کند تا از تغییرات در وابستگی‌های ضمنی چشم‌پوشی کند\&. این امر موجب می‌شود همیشه از وابستگی‌های ضمنی کش‌شده استفاده شود\&. این گزینه مستلزم \fB\-\-implicit\-cache\fR است\&. .RE .PP \fB\-\-install\-sandbox=\fR\fB\fIsandbox_path\fR\fR .RS 4 هنگام استفاده از سازنده‌های \fBInstall\fR، مسیر \fIsandbox_path\fR را به ابتدای مسیرهای نصب اضافه می‌کند به‌گونه‌ای که تمام فایل‌های نصب‌شده در آن دایرکتوری قرار گیرند\&. اگر هیچ‌یک از \fBInstall\fR، \fBInstallAs\fR یا \fBInstallVersionedLib\fR در فایل‌های SConscript استفاده نشده باشد، این گزینه در دسترس نخواهد بود\&. .RE .PP \fB\-\-interactive\fR .RS 4 ابزار SCons را در حالت تعاملی راه‌اندازی می‌کند\&. فایل‌های SConscript تنها یک‌بار خوانده شده و اعلان scons>>> چاپ می‌شود\&. اکنون می‌توان هدف‌ها را با وارد کردن دستورات در اعلان تعاملی، بدون نیاز به خواندن دوبارهٔ فایل‌های SConscript و مقداردهی اولیهٔ مجدد گراف وابستگی از ابتدا، بازسازی کرد\&. .sp حالت تعاملی SCons از دستورات زیر پشتیبانی می‌کند: .PP \fBbuild \fR\fB\fI[OPTIONS] [TARGETS] \&.\&.\&.\fR\fR .RS 4 هدف‌های (\fITARGETS\fR) مشخص‌شده (و وابستگی‌های آن‌ها) را با گزینه‌های (\fIOPTIONS\fR) خط فرمان مشخص‌شدهٔ SCons می‌سازد\&. \fBb\fR و \fBscons\fR مترادف‌هایی برای \fBbuild\fR هستند\&. .sp گزینه‌های خط فرمان زیر در SCons بر دستور \fBbuild\fR تأثیر می‌گذارند: .sp .if n \{\ .RS 4 .\} .nf \-\-cache\-debug=FILE \-\-cache\-disable, \-\-no\-cache \-\-cache\-force, \-\-cache\-populate \-\-cache\-readonly \-\-cache\-show \-\-debug=TYPE \-i, \-\-ignore\-errors \-j N, \-\-jobs=N \-k, \-\-keep\-going \-n, \-\-no\-exec, \-\-just\-print, \-\-dry\-run, \-\-recon \-Q \-s, \-\-silent, \-\-quiet \-\-taskmastertrace=FILE \-\-tree=OPTIONS .fi .if n \{\ .RE .\} .sp هر گزینهٔ خط فرمان دیگری از SCons که مشخص شود، باعث خطا نخواهد شد اما هیچ تأثیری بر دستور \fBbuild\fR نخواهد داشت (عمدتاً به این دلیل که آن‌ها بر نحوهٔ خوانده شدن فایل‌های SConscript تأثیر می‌گذارند، که تنها یک‌بار در ابتدای حالت تعاملی رخ می‌دهد)\&. .RE .PP \fBclean \fR\fB\fI[OPTIONS] [TARGETS] \&.\&.\&.\fR\fR .RS 4 هدف‌های (\fITARGETS\fR) مشخص‌شده (و وابستگی‌های آن‌ها) را با گزینه‌های (\fIOPTIONS\fR) مشخص‌شده پاک‌سازی می‌کند\&. \fBc\fR یک مترادف است\&. این دستور خود مترادفی برای \fBbuild \-\-clean\fR است\&. .RE .PP \fBexit\fR .RS 4 از حالت تعاملی SCons خارج می‌شود\&. شما همچنین می‌توانید با پایان دادن به ورودی (Ctrl+D در سیستم‌های UNIX یا Linux، و Ctrl+Z در سیستم‌های Windows) خارج شوید\&. .RE .PP \fBhelp \fR\fB\fI[COMMAND]\fR\fR .RS 4 پیام راهنمایی دربارهٔ دستورات موجود در حالت تعاملی SCons ارائه می‌دهد\&. در صورتی که \fICOMMAND\fR مشخص شود، \fBh\fR و \fB?\fR مترادف هستند\&. .RE .PP \fBshell \fR\fB\fI[COMMANDLINE]\fR\fR .RS 4 دستور مشخص‌شده در \fICOMMANDLINE\fR را در یک زیرپوسته اجرا می‌کند\&. اگر هیچ \fICOMMANDLINE\fR مشخص نشده باشد، مفسر تعاملی فرمان تعیین‌شده در متغیر محیطی \fBSHELL\fR (در سیستم‌های UNIX و Linux) یا متغیر محیطی \fBCOMSPEC\fR (در سیستم‌های Windows) را اجرا می‌کند\&. \fBsh\fR و \fB!\fR مترادف هستند\&. .RE .PP \fBversion\fR .RS 4 اطلاعات نسخه SCons را چاپ می‌کند\&. .RE .sp یک خط خالی آخرین دستور تایپ‌شده را تکرار می‌کند\&. اگر ماژول \fBreadline\fR در دسترس باشد، می‌توان از ویرایش خط فرمان استفاده کرد\&. .sp .if n \{\ .RS 4 .\} .nf $ \fBscons \-\-interactive\fR scons: Reading SConscript files \&.\&.\&. scons: done reading SConscript files\&. scons>>> build \-n prog scons>>> exit .fi .if n \{\ .RE .\} .RE .PP \fB\-j \fR\fB\fIN\fR\fR, \fB\-\-jobs=\fR\fB\fIN\fR\fR .RS 4 حداکثر تعداد کارهای (دستورات) هم‌زمان برای اجرا را مشخص می‌کند\&. اگر بیش از یک گزینه \fB\-j\fR وجود داشته باشد، آخرین مورد اعمال می‌شود\&. .RE .PP \fB\-k\fR, \fB\-\-keep\-going\fR .RS 4 پس از بروز خطا، تا حد امکان ادامه می‌دهد\&. هدفی که شکست خورده و اهدافی که به آن وابسته‌اند بازسازی نخواهند شد، اما سایر اهداف مشخص‌شده در خط فرمان همچنان پردازش خواهند شد\&. .RE .PP \fB\-m\fR .RS 4 برای سازگاری با نسخه‌های غیر GNU از Make نادیده گرفته می‌شود\&. .RE .PP \fB\-\-max\-drift=\fR\fB\fISECONDS\fR\fR .RS 4 حداکثر انحراف مورد انتظار در زمان تغییر فایل‌ها را بر حسب \fISECONDS\fR تنظیم می‌کند\&. این مقدار تعیین می‌کند که یک فایل چه مدت باید بدون تغییر بماند تا امضای محتوای (content signature) کش‌شده آن به جای محاسبه مجدد امضای محتوای جدید (هش) از محتویات فایل استفاده شود\&. مقدار پیش‌فرض ۲ روز است، به این معنی که زمان تغییر فایل باید دست‌کم مربوط به دو روز قبل باشد تا از امضای محتوای کش‌شده آن استفاده شود\&. یک مقدار منفی یعنی امضای محتوا هرگز کش نشود و در صورت وجود، مقدار کش‌شده نادیده گرفته شود\&. مقدار ۰ به معنای استفاده همیشگی از امضای کش‌شده است، صرف‌نظر از اینکه فایل چقدر قدیمی باشد\&. .RE .PP \fB\-\-md5\-chunksize=\fR\fB\fIKILOBYTES\fR\fR .RS 4 یک مترادف منسوخ‌شده برای \fB\-\-hash\-chunksize\fR\&. .sp \fIتغییریافته در نسخه 4\&.2:\fR منسوخ شد\&. .RE .PP \fB\-n\fR, \fB\-\-no\-exec\fR, \fB\-\-just\-print\fR, \fB\-\-dry\-run\fR, \fB\-\-recon\fR .RS 4 حالت no\-exec را تنظیم می‌کند\&. دستوراتی را که برای ساخت هر یک از اهداف قدیمی اجرا می‌شدند چاپ می‌کند، اما آن دستورات را اجرا نمی‌کند\&. .sp تنها ساخت اهداف متوقف می‌شود \- هر کاری در سامانه ساخت که به طور مستقیم (در کد معمولی Python) انجام می‌شود، همچنان اجرا خواهد شد\&. می‌توانید کدهایی را که نباید در حالت no\-exec اجرا شوند، با بررسی مقدار گزینه در زمان اجرا توسط \fBGetOption\fR محافظت کنید: .sp .if n \{\ .RS 4 .\} .nf if not GetOption("no_exec"): # run regular instructions .fi .if n \{\ .RE .\} .sp خروجی در حد بیشترین تلاش است، زیرا SCons همیشه نمی‌تواند با دقت تعیین کند که چه چیزی ساخته خواهد شد\&. برای نمونه، اگر فایلی که توسط کنش یک سازنده (builder action) تولید شده به عنوان منبع نیز در ساخت به کار رود، آن فایل در یک درخت ساخته‌نشده اصلاً برای بررسی وابستگی‌ها در دسترس نیست و ممکن است در درختی که قبلاً ساخته شده شامل اطلاعات قدیمی باشد\&. .sp SCons نمی‌تواند بررسی‌های \fBConfigure\fR را در حالت no\-exec انجام دهد، زیرا آن‌ها تغییراتی در سامانه فایل ایجاد می‌کنند (به \fB$CONFIGUREDIR\fR و \fB$CONFIGURELOG\fR مراجعه کنید)\&. در صورتی که اطلاعات ذخیره‌شده از ساخت قبلی قدیمی نشده باشند، می‌تواند از آن‌ها استفاده کند، بنابراین یک ساخت «آماده‌سازی» (priming) ممکن است اجراهای بعدی no\-exec را کارآمدتر کند\&. .RE .PP \fB\-\-no\-site\-dir\fR .RS 4 دایرکتوری‌های site را نمی‌خواند\&. نه دایرکتوری‌های استاندارد site (یعنی site_scons) و نه مسیر مشخص‌شده توسط گزینه قبلی \fB\-\-site\-dir\fR به مسیر جستجوی ماژول \fIsys\&.path\fR اضافه می‌شوند، نه برای یافتن فایل site_init\&.py جستجو می‌شوند و نه دایرکتوری site_tools آن‌ها در مسیر جستجوی ابزار گنجانده می‌شود\&. می‌تواند توسط یک گزینه بعدی \fB\-\-site\-dir\fR لغو شود\&. .RE .PP \fB\-\-package\-type=\fR\fB\fItype\fR\fR .RS 4 نوع بسته‌ای که هنگام استفاده از سازنده \fBPackage\fR ایجاد می‌شود\&. می‌توان چندین نوع را با استفاده از یک رشته جداشده با ویرگول مشخص کرد، که در این حالت SCons تلاش خواهد کرد برای تمامی آن انواع بسته فرآیند ساخت را انجام دهد\&. توجه داشته باشید این گزینه تنها در صورتی در دسترس است که ابزار packaging فعال شده باشد\&. .RE .PP \fB\-\-profile=\fR\fB\fIfile\fR\fR .RS 4 ابزار SCons را تحت نمایه‌ساز (profiler) Python اجرا کرده و نتایج را در \fIfile\fR ذخیره می‌کند\&. نتایج را می‌توان با استفاده از ماژول pstats در Python تجزیه و تحلیل کرد\&. .RE .PP \fB\-q\fR, \fB\-\-question\fR .RS 4 هیچ دستوری را اجرا نکرده و چیزی چاپ نمی‌کند\&. تنها در صورتی که هدف‌های مشخص‌شده از پیش به‌روز باشند، وضعیت خروج صفر و در غیر این صورت مقداری غیرصفر برمی‌گرداند\&. .RE .PP \fB\-Q\fR .RS 4 پیام‌های وضعیت درباره خواندن فایل‌های SConscript، ساخت هدف‌ها و ورود به دایرکتوری‌ها را پنهان می‌کند\&. دستوراتی که برای بازسازی فایل‌های هدف اجرا می‌شوند همچنان چاپ خواهند شد\&. .RE .PP \fB\-\-random\fR .RS 4 وابستگی‌ها را با ترتیبی تصادفی می‌سازد\&. این ویژگی هنگام ساخت هم‌زمان چندین درخت با حافظه موقت (caching) فعال سودمند است، تا از تلاش هم‌زمان فرایندهای ساخت چندگانه برای ساخت یا واکشی فایل‌های هدف یکسان جلوگیری شود\&. .RE .PP \fB\-s\fR, \fB\-\-silent\fR, \fB\-\-quiet\fR .RS 4 بی‌صدا\&. دستوراتی را که برای بازسازی فایل‌های هدف اجرا می‌شوند چاپ نمی‌کند\&. همچنین پیام‌های وضعیت SCons را پنهان می‌کند\&. .RE .PP \fB\-S\fR, \fB\-\-no\-keep\-going\fR, \fB\-\-stop\fR .RS 4 برای سازگاری با GNU Make نادیده گرفته می‌شود\&. .RE .PP \fB\-\-site\-dir=\fR\fB\fIpath\fR\fR .RS 4 از \fIpath\fR به عنوان دایرکتوری سایت به‌جای جستجو در فهرست دایرکتوری‌های پیش‌فرض سایت استفاده می‌کند\&. این دایرکتوری به ابتدای \fIsys\&.path\fR افزوده می‌شود، ماژول \fIpath\fR/site_init\&.py در صورت وجود بارگذاری خواهد شد، و \fIpath\fR/site_tools در مسیر جستجوی ابزارها قرار می‌گیرد\&. این گزینه افزایشی نیست \- در صورت مشخص شدن بیش از یک بار، آخرین \fIpath\fR اعمال می‌شود\&. .sp مجموعه پیش‌فرض دایرکتوری‌های سایتی که هنگام مشخص نشدن \fB\-\-site\-dir\fR جستجو می‌شوند، بسته به بستر سیستم به شرح زیر است\&. کاربران یا مدیران سیستم می‌توانند رفتار خاص سایت یا پروژه را در SCons با برپایی یک دایرکتوری سایت در یک یا چند مورد از این مکان‌ها تنظیم کنند\&. دایرکتوری‌ها به ترتیبی که داده شده‌اند، از عمومی‌ترین (دایرکتوری‌های «سیستمی») تا خاص‌ترین (در پروژه جاری) بررسی می‌شوند؛ بنابراین آخرین فایل site_init\&.py اجراشده خاص‌ترین فایل است و امکان بازنویسی همه موارد دیگر را دارد، و دایرکتوری‌ها به ابتدای مسیرها اضافه می‌شوند تا باز هم آخرین دایرکتوری بررسی‌شده، در ابتدای مسیر حاصل قرار گیرد\&. .PP Windows: .RS 4 .sp .if n \{\ .RS 4 .\} .nf %ALLUSERSPROFILE%/scons/site_scons %LOCALAPPDATA%/scons/site_scons %APPDATA%/scons/site_scons %USERPROFILE%/\&.scons/site_scons \&./site_scons .fi .if n \{\ .RE .\} .sp توجه داشته باشید که نسخه‌های پیشین مستندات، مسیر متفاوتی را برای دایرکتوری سایت «سیستمی» فهرست کرده بودند؛ این مسیر همچنان بررسی می‌شود اما استفاده از آن توصیه نمی‌گردد: .sp .if n \{\ .RS 4 .\} .nf %ALLUSERSPROFILE%/Application Data/scons/site_scons .fi .if n \{\ .RE .\} .RE .PP Mac OS X: .RS 4 .sp .if n \{\ .RS 4 .\} .nf /Library/Application Support/SCons/site_scons /opt/local/share/scons/site_scons (for MacPorts) /sw/share/scons/site_scons (for Fink) $HOME/Library/Application Support/SCons/site_scons $HOME/\&.scons/site_scons \&./site_scons .fi .if n \{\ .RE .\} .RE .PP Solaris: .RS 4 .sp .if n \{\ .RS 4 .\} .nf /opt/sfw/scons/site_scons /usr/share/scons/site_scons $HOME/\&.scons/site_scons \&./site_scons .fi .if n \{\ .RE .\} .RE .PP Linux، HPUX و دیگر سیستم‌های شبه\-Posix: .RS 4 .sp .if n \{\ .RS 4 .\} .nf /usr/share/scons/site_scons $HOME/\&.scons/site_scons \&./site_scons .fi .if n \{\ .RE .\} .RE .RE .PP \fB\-\-stack\-size=\fR\fB\fIKILOBYTES\fR\fR .RS 4 اندازه پشته مورد استفاده برای اجرای نخ‌ها را بر حسب \fIKILOBYTES\fR تنظیم می‌کند\&. این مقدار، اندازه پشته نخ‌های مورد استفاده برای اجرای کارها را مشخص می‌کند\&. این نخ‌ها اقدامات سازنده‌ها (builders) را برای گره‌هایی که قدیمی (out\-of\-date) هستند اجرا می‌کنند\&. این گزینه هیچ اثری ندارد مگر اینکه تعداد کارهای هم‌زمان ساخت بیشتر از یک باشد (همان‌گونه که با \fB\-j N\fR یا \fB\-\-jobs=N\fR در خط فرمان یا \fBSetOption\fR در یک اسکریپت تعیین می‌شود)\&. .sp استفاده از اندازه پشته بسیار کوچک ممکن است سبب خطاهای سرریز پشته (stack overflow) شود\&. این حالت معمولاً به صورت خطاهای دسترسی به حافظه (segmentation fault) بروز می‌کند که باعث خاتمه نابهنگام scons پیش از ساخت هر چیزی می‌شود\&. استفاده از اندازه پشته بسیار بزرگ باعث مصرف حافظه بیش از حد نیاز توسط scons شده و ممکن است کل فرایند ساخت را کُند کند\&. مقدار پیش‌فرض، استفاده از اندازه پشته ۲۵۶ کیلوبایت است که باید برای بیشتر کاربردها مناسب باشد\&. نیازی به افزایش این مقدار نخواهید داشت مگر اینکه با خطاهای سرریز پشته مواجه شوید\&. .RE .PP \fB\-t\fR, \fB\-\-touch\fR .RS 4 برای سازگاری با GNU Make نادیده گرفته می‌شود\&. (دست‌کاری زمان فایل [touching] برای اینکه به‌روز به نظر برسد، در هنگام استفاده از \fBscons\fR غیرضروری است\&.) .RE .PP \fB\-\-taskmastertrace=\fR\fB\fIfile\fR\fR .RS 4 اطلاعات ردگیری (trace) را دربارهٔ نحوهٔ ارزیابی و کنترل ترتیب ساخت گره‌ها (Nodeها) توسط شیء داخلی Taskmaster در \fIfile\fR مشخص‌شده چاپ می‌کند\&. نام فایل \fB\-\fR می‌تواند برای مشخص کردن خروجی استاندارد به کار رود\&. .RE .PP \fB\-\-tree=\fR\fB\fItype\fR\fR\fB[\fR\fB\fI,type\fR\fR\fB\&.\&.\&.]\fR .RS 4 درختی از وابستگی‌ها را پس از ساخته شدن هر هدف سطح بالا (top\-level target) چاپ می‌کند\&. این گزینه بسته به \fItype\fR مشخص‌شده، بخشی از درخت یا تمام آن را در قالب‌های گوناگون چاپ می‌کند: .PP \fBall\fR .RS 4 چاپ کل درخت وابستگی پس از ساخته شدن هر هدف سطح بالا\&. این کار کل درخت وابستگی، شامل وابستگی‌های ضمنی (implicit) و وابستگی‌های نادیده‌گرفته‌شده را چاپ می‌کند\&. .RE .PP \fBderived\fR .RS 4 خروجی درخت را تنها به فایل‌های مشتق‌شده (هدف)، و نه فایل‌های منبع، محدود می‌کند\&. .RE .PP \fBlinedraw\fR .RS 4 رسم خروجی درخت با استفاده از نویسه‌های رسم خط یونیکد (Unicode line\-drawing) به جای متن سادهٔ ASCII\&. این گزینه به عنوان یک تغییردهنده برای \fItype\fR(های) انتخاب‌شده عمل می‌کند\&. اگر به تنهایی و بدون هیچ \fItype\fR دیگری مشخص شود، همانند این رفتار می‌کند که \fBall\fR مشخص شده است\&. .sp \fIجدید در نسخهٔ 4\&.0\&.\fR .RE .PP \fBstatus\fR .RS 4 اطلاعات وضعیت را برای هر گره نمایش‌داده‌شده چاپ می‌کند\&. .RE .PP \fBprune\fR .RS 4 درخت را هرس می‌کند تا از تکرار اطلاعات وابستگی برای گره‌هایی که پیش‌تر نمایش داده شده‌اند جلوگیری شود\&. هر گره‌ای که قبلاً نمایش داده شده باشد، نامش در \fB[قلاب]\fR چاپ خواهد شد، به عنوان نشانه‌ای مبنی بر اینکه وابستگی‌های آن گره را می‌توان با جستجوی خروجی مربوطه در سطوح بالاتر درخت یافت\&. .RE .sp می‌توان چندین گزینه برای \fItype\fR را با کاما از یکدیگر جدا و مشخص کرد: .sp .if n \{\ .RS 4 .\} .nf # تنها فایل‌های مشتق‌شده را همراه با اطلاعات وضعیت چاپ می‌کند: \fBscons \-\-tree=derived,status\fR # تمام وابستگی‌های هدف را با اطلاعات وضعیت و هرس کردن # وابستگی‌های گره‌های قبلاً دیده‌شده چاپ می‌کند: \fBscons \-\-tree=all,prune,status target\fR .fi .if n \{\ .RE .\} .RE .PP \fB\-u\fR, \fB\-\-up\fR, \fB\-\-search\-up\fR .RS 4 ساختار دایرکتوری را به سمت بالا پیمایش می‌کند تا زمانی که یکی از فایل‌های SConstruct، Sconstruct، sconstruct، SConstruct\&.py، Sconstruct\&.py یا sconstruct\&.py پیدا شود، و از آن به عنوان دایرکتوری سطح بالای پروژه استفاده می‌کند\&. اگر هیچ هدفی در خط فرمان مشخص نشده باشد، تنها اهداف موجود در دایرکتوری جاری یا زیرمجموعهٔ آن ساخته خواهند شد\&. .RE .PP \fB\-U\fR .RS 4 دقیقاً مانند گزینهٔ \fB\-u\fR عمل می‌کند به جز نحوهٔ رسیدگی به اهداف پیش‌فرض\&. هنگامی که از این گزینه استفاده شود و هیچ هدفی در خط فرمان مشخص نشده باشد، تمام اهداف پیش‌فرضی که در فایل(های) SConscript در دایرکتوری جاری تعریف شده‌اند ساخته می‌شوند، بدون توجه به اینکه اهداف حاصل در چه دایرکتوری‌ای قرار می‌گیرند\&. .RE .PP \fB\-v\fR, \fB\-\-version\fR .RS 4 نسخهٔ \fBscons\fR، اطلاعات حق نشر، فهرست نویسندگان و هر اطلاعات مرتبط دیگری را چاپ می‌کند؛ سپس خارج می‌شود\&. .RE .PP \fB\-w\fR, \fB\-\-print\-directory\fR .RS 4 پیامی حاوی دایرکتوری کاری را پیش و پس از پردازش‌های دیگر چاپ می‌کند\&. .RE .PP \fB\-\-no\-print\-directory\fR .RS 4 گزینهٔ \-w را غیرفعال می‌کند، حتی اگر به صورت ضمنی فعال شده باشد\&. .RE .PP \fB\-\-warn=\fR\fB\fItype\fR\fR, \fB\-\-warn=no\-\fR\fB\fItype\fR\fR .RS 4 هشدارها را فعال یا غیرفعال (با پیشوند "no\-") می‌کند (\fB\-\-warning\fR یک مترادف است)\&. \fItype\fR نوع هشدارهایی که باید فعال یا غیرفعال شوند را مشخص می‌کند: .PP \fBall\fR .RS 4 همهٔ هشدارها\&. .RE .PP \fBcache\-version\fR .RS 4 هشدارهایی درباره اینکه دایرکتوری حافظهٔ موقت (cache) فایل‌های مشتق‌شده که توسط \fBCacheDir\fR مشخص شده است، از آخرین اطلاعات پیکربندی استفاده نمی‌کند\&. این هشدارها به طور پیش‌فرض فعال هستند\&. .RE .PP \fBcache\-write\-error\fR .RS 4 هشدارهایی درباره خطاها هنگام تلاش برای نوشتن یک رونوشت از فایل ساخته‌شده در حافظهٔ موقت فایل‌های مشتق‌شده مشخص‌شده توسط \fBCacheDir\fR\&. این هشدارها به طور پیش‌فرض غیرفعال هستند\&. .RE .PP \fBcache\-cleanup\-error\fR .RS 4 هشدارهایی درباره خطاها هنگامی که فایلی بازیابی‌شده از حافظهٔ موقت فایل‌های مشتق‌شده نتواند حذف شود\&. .RE .PP \fBcorrupt\-sconsign\fR .RS 4 هشدارهایی درباره داده‌های امضای ناآشنا در فایل‌های \&.sconsign\&. این هشدارها به طور پیش‌فرض فعال هستند\&. .RE .PP \fBdependency\fR .RS 4 هشدارهایی درباره وابستگی‌ها\&. این هشدارها به طور پیش‌فرض غیرفعال هستند\&. .RE .PP \fBdeprecated\fR .RS 4 هشدارهایی درباره استفاده از قابلیت‌های منسوخ‌شدهٔ کنونی\&. این هشدارها به طور پیش‌فرض فعال هستند\&. همهٔ هشدارهای منسوخ‌شدگی را نمی‌توان با گزینهٔ \fB\-\-warn=no\-deprecated\fR غیرفعال کرد، زیرا برخی از قابلیت‌های منسوخ‌شده که در مراحل پایانی چرخهٔ منسوخ‌شدگی قرار دارند ممکن است به عنوان هشدارهای اجباری تعیین شده باشند و همچنان نمایش داده خواهند شد\&. هشدارهای مربوط به برخی از قابلیت‌های منسوخ‌شده را نیز می‌توان به صورت جداگانه فعال یا غیرفعال کرد؛ بخش‌های زیر را ببینید\&. .RE .PP \fBduplicate\-environment\fR .RS 4 هشدارها درباره تلاش برای مشخص کردن ساخت یک هدف با دو محیط ساخت متفاوت که از یک اکشن یکسان استفاده می‌کنند\&. این هشدارها به‌صورت پیش‌فرض فعال هستند\&. .RE .PP \fBfortran\-cxx\-mix\fR .RS 4 هشدارها درباره پیوند دادن فایل‌های شیء Fortran و C++ در یک فایل اجرایی واحد، که می‌تواند با برخی از کامپایلرها به رفتاری غیرقابل پیش‌بینی منجر شود\&. .RE .PP \fBfuture\-reserved\-variable\fR .RS 4 هشدارها درباره متغیرهای ساختی که در حال حاضر مجاز هستند، اما در نگارش‌های آینده به متغیرهای رزروشده تبدیل خواهند شد\&. .RE .PP \fBfuture\-deprecated\fR .RS 4 هشدارها درباره قابلیت‌هایی که در آینده منسوخ خواهند شد\&. این‌گونه هشدارها به‌صورت پیش‌فرض غیرفعال هستند\&. فعال کردن هشدارهای منسوخ‌شدن در آینده برای پروژه‌هایی توصیه می‌شود که پیکربندی‌های SCons را برای ساخت توسط کاربران دیگر بازتوزیع می‌کنند، تا پروژه بتواند در سریع‌ترین زمان ممکن از قابلیت‌های در شرف منسوخ‌شدن که ممکن است نیازمند تغییراتی در پیکربندی باشند، مطلع شود\&. .RE .PP \fBlink\fR .RS 4 هشدارها درباره مراحل پیوند (link)\&. .RE .PP \fBmisleading\-keywords\fR .RS 4 هشدارها درباره استفاده از دو کلیدواژه با املای معمولاً نادرست \fItargets\fR و \fIsources\fR در فراخوانی‌های \fBBuilder\fR\&. املای صحیح شکل مفرد است، اگرچه خود \fItarget\fR و \fIsource\fR می‌توانند به فهرست‌هایی از نام‌ها یا گره‌ها ارجاع داشته باشند\&. .RE .PP \fBno\-object\-count\fR .RS 4 هشدارها درباره کار نکردن قابلیت \fB\-\-debug=object\fR هنگامی که \fBscons\fR با گزینه \fB\-O\fR مربوط به Python یا از طریق ماژول‌های بهینه‌شده Python (\&.pyo) اجرا می‌شود\&. .sp توجه داشته باشید که پیشوند "no\-" بخشی از نام این هشدار است\&. برای غیرفعال کردن، یک "\-no" دیگر بیفزایید\&. .RE .PP \fBno\-parallel\-support\fR .RS 4 هشدارها درباره ناتوانی نسخه Python در پشتیبانی از ساخت‌های موازی هنگام استفاده از گزینه \fB\-j\fR\&. این هشدارها به‌صورت پیش‌فرض فعال هستند\&. .sp توجه داشته باشید که پیشوند "no\-" بخشی از نام این هشدار است\&. برای غیرفعال کردن، یک "\-no" دیگر بیفزایید\&. .RE .PP \fBpython\-version\fR .RS 4 هشدارها درباره اجرای SCons با استفاده از نسخه‌ای از Python که منسوخ شده است\&. این هشدارها به‌صورت پیش‌فرض فعال هستند\&. .RE .PP \fBreserved\-variable\fR .RS 4 هشدارها درباره تلاش برای مقداردهی نام‌های رزروشده متغیر ساخت \fB$CHANGED_SOURCES\fR، \fB$CHANGED_TARGETS\fR، \fB$TARGET\fR، \fB$TARGETS\fR، \fB$SOURCE\fR، \fB$SOURCES\fR، \fB$UNCHANGED_SOURCES\fR یا \fB$UNCHANGED_TARGETS\fR\&. این هشدارها به‌صورت پیش‌فرض غیرفعال هستند\&. .RE .PP \fBstack\-size\fR .RS 4 هشدارها درباره درخواست‌های تنظیم اندازه پشته که برآورده نشده‌اند\&. این هشدارها به‌صورت پیش‌فرض فعال هستند\&. .RE .PP \fBtarget\-not\-built\fR .RS 4 هشدارها درباره این که یک قاعده ساخت، هدف‌های مورد انتظار را نمی‌سازد\&. این هشدارها به‌صورت پیش‌فرض غیرفعال هستند\&. .RE .sp .RE .PP \fB\-Y \fR\fB\fIrepository\fR\fR، \fB\-\-repository=\fR\fB\fIrepository\fR\fR، \fB\-\-srcdir=\fR\fB\fIrepository\fR\fR .RS 4 جستجوی \fIrepository\fR برای هر فایل ورودی و هدفی که در سلسله‌مراتب دایرکتوری محلی یافت نشود\&. گزینه‌های چندگانه \fB\-Y\fR می‌توانند مشخص شوند، که در این صورت مخازن به همان ترتیب مشخص‌شده جستجو می‌شوند\&. برای اطلاعات بیشتر \fBRepository\fR را ببینید\&. .RE .SH "مرجع فایل‌های SCONSCRIPT (SCONSCRIPT FILE REFERENCE)" .SS "فایل‌های SConscript (SConscript Files)" .PP پیکربندی ساخت با یک یا چند فایل توصیف می‌شود که با نام فایل‌های SConscript شناخته می‌شوند\&. برای یک ساخت معتبر باید حداقل یک فایل وجود داشته باشد (\fBscons\fR در صورتی که چنین فایلی پیدا نکند خارج خواهد شد)\&. \fBscons\fR به‌طور پیش‌فرض به دنبال این فایل با نام SConstruct در دایرکتوری‌ای که \fBscons\fR را از آن اجرا می‌کنید می‌گردد، هرچند در صورت لزوم، به ترتیب به دنبال نام‌های جایگزین Sconstruct، sconstruct، SConstruct\&.py، Sconstruct\&.py و sconstruct\&.py نیز می‌گردد\&. نام فایل متفاوتی (که می‌تواند شامل بخشی از مسیر باشد) را می‌توان از طریق گزینهٔ \fB\-f\fR مشخص کرد\&. به‌جز فایل SConstruct، این فایل‌ها به‌طور خودکار جستجو نمی‌شوند؛ شما فایل‌های پیکربندی اضافی را با فراخوانی تابع \fBSConscript\fR به فرایند ساخت اضافه می‌کنید\&. این ویژگی اجازه می‌دهد تا بخش‌هایی از ساخت، بسته به نحوهٔ فراخوانی \fBscons\fR، در زمان اجرا به‌طور شرطی گنجانده یا حذف شوند\&. .PP هر فایل SConscript در یک پیکربندی ساخت، به‌طور مستقل در یک زمینه (context) جداگانه فراخوانی می‌شود\&. این کار جداسازی لازم را فراهم می‌کند تا بخش‌های مختلف ساخت تصادفاً با یکدیگر تداخل پیدا نکنند\&. برای به‌اشتراک‌گذاری اطلاعات باید صریح عمل کنید؛ این کار با استفاده از تابع \fBExport\fR یا آرگومان \fIexports\fR در تابع \fBSConscript\fR، و همچنین تابع \fBReturn\fR در فایل SConscript فراخوانی‌شده، و مصرف اطلاعات به‌اشتراک‌گذاشته‌شده با استفاده از تابع \fBImport\fR انجام می‌پذیرد\&. .PP بخش‌های زیر امکانات مختلف SCons را که می‌توان در فایل‌های SConscript استفاده کرد شرح می‌دهند\&. پیوندهای سریع: .RS 4 محیط‌های ساخت (Construction Environments) .RE .RS 4 ابزارها (Tools) .RE .RS 4 متدهای سازنده (Builder Methods) .RE .RS 4 توابع و متدهای محیط (Functions and Environment Methods) .RE .RS 4 متغیرهای SConscript (SConscript Variables) .RE .RS 4 متغیرهای ساخت (Construction Variables) .RE .RS 4 زمینه‌های پیکربندی (Configure Contexts) .RE .RS 4 متغیرهای ساخت خط فرمان (Command\-Line Construction Variables) .RE .RS 4 اشیاء گره (Node Objects) .RE .SS "محیط‌های ساخت (Construction Environments)" .PP یک محیط ساخت (Construction Environment) ابزار پایه‌ای است که از طریق آن اطلاعات ساخت را به SCons\& منتقل می‌کنید\&. یک محیط ساخت جدید با استفاده از تابع \fBEnvironment\fR ایجاد می‌شود: .sp .if n \{\ .RS 4 .\} .nf env = Environment() .fi .if n \{\ .RE .\} .PP ویژگی‌های محیط ساخت که متغیرهای ساخت (Construction Variables) نامیده می‌شوند، می‌توانند با تعیین آن‌ها به عنوان آرگومان‌های کلیدواژه‌ای هنگام ساخت شیء یا با انتساب مقدار به آن‌ها پس از ایجاد شیء تنظیم شوند\&. این دو شیوه اسماً معادل یکدیگر هستند: .sp .if n \{\ .RS 4 .\} .nf env = Environment(FOO=\*(Aqfoo\*(Aq) env[\*(AqFOO\*(Aq] = \*(Aqfoo\*(Aq .fi .if n \{\ .RE .\} .PP توجه داشته باشید که برخی از تنظیمات مؤثر بر شناسایی ابزارها، تنها زمانی که ابزارها مقداردهی اولیه می‌شوند مورد ارجاع قرار می‌گیرند؛ بنابراین باید آن‌ها را یا به عنوان بخشی از فراخوانی \fBEnvironment\fR ارائه دهید، یا مقداردهی اولیه ابزار را به تعویق بیندازید\&. برای مثال، مقداردهی اولیه نسخه Microsoft Visual C++ که قصد استفاده از آن را دارید: .sp .if n \{\ .RS 4 .\} .nf # initializes msvc to v14\&.1 env = Environment(MSVC_VERSION="14\&.1") env = Environment() # msvc tool was initialized to default, does not reinitialize env[\*(AqMSVC_VERSION\*(Aq] = "14\&.1" env = Environment(tools=[]) env[\*(AqMSVC_VERSION\*(Aq] = "14\&.1" # msvc tool initialization was deferred, so will pick up new value env\&.Tool(\*(Aqdefault\*(Aq) .fi .if n \{\ .RE .\} .PP برای سهولت، متغیرهای ساخت می‌توانند توسط آرگومان کلیدواژه‌ای \fIparse_flags\fR در حین ساخت شیء نیز تنظیم یا اصلاح شوند؛ این کار اثری مشابه اعمال متد \fBenv\&.MergeFlags\fR روی مقدار آرگومان پس از تکمیل تمام پردازش‌های دیگر دارد\&. این قابلیت در صورتی مفید است که محتوای دقیق پرچم‌ها نامشخص باشد (برای مثال، از یک فایل کنترلی خوانده شود) یا اگر لازم باشد پرچم‌ها بین چندین متغیر ساخت توزیع شوند\&. \fBenv\&.ParseFlags\fR نحوه توزیع این آرگومان‌ها بین متغیرهای ساخت را شرح می‌دهد\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(parse_flags=\*(Aq\-Iinclude \-DEBUG \-lm\*(Aq) .fi .if n \{\ .RE .\} .PP این مثال \*(Aqinclude\*(Aq را به متغیر ساخت \fB$CPPPATH\fR، مقدار \*(AqEBUG\*(Aq را به \fB$CPPDEFINES\fR و \*(Aqm\*(Aq را به \fB$LIBS\fR اضافه می‌کند\&. .PP یک محیط ساخت موجود را می‌توان با فراخوانی متد \fBenv\&.Clone\fR تکثیر کرد\&. بدون آرگومان، این متد یک کپی با همان تنظیمات ایجاد می‌کند\&. در غیر این صورت، \fBenv\&.Clone\fR همان آرگومان‌های \fBEnvironment\fR را می‌پذیرد و از آن‌ها برای ایجاد یک رونوشت اصلاح‌شده استفاده می‌کند\&. .PP SCons یک محیط ساخت ویژه به نام محیط پیش‌فرض (Default Environment) فراهم می‌کند\&. محیط پیش‌فرض تنها برای توابع عمومی استفاده می‌شود، یعنی درخواست‌های ساختی که بدون بستر یک محیط ساخت معمولی فراخوانی شده‌اند\&. برای اطلاعات بیشتر \fBDefaultEnvironment\fR را ببینید\&. .PP به‌طور پیش‌فرض، یک محیط ساخت جدید با مجموعه‌ای از متدهای سازنده (builder methods) و متغیرهای ساخت که متناسب با بستر (platform) جاری هستند مقداردهی اولیه می‌شود\&. از آرگومان کلیدواژه‌ای اختیاری \fIplatform\fR می‌توان برای تعیین اینکه محیط ساخت باید برای یک بستر متفاوت مقداردهی اولیه شود، استفاده کرد: .sp .if n \{\ .RS 4 .\} .nf env = Environment(platform=\*(Aqcygwin\*(Aq) .fi .if n \{\ .RE .\} .PP مشخص کردن یک بستر (platform)، متغیرهای ساخت مناسب را در محیط مقداردهی اولیه می‌کند تا از نام‌های فایل با پیشوندها و پسوندهای مناسب آن بستر استفاده کرده و آن‌ها را تولید نماید\&. .PP توجه داشته باشید که بستر win32 متغیرهای \fISystemDrive\fR و \fISystemRoot\fR را از محیط خارجی کاربر به دیکشنری \fIENV\fR در محیط ساخت اضافه می‌کند\&. این امر بدان دلیل است که هر دستور اجرایی که از سوکت‌ها برای اتصال با سایر سیستم‌ها استفاده می‌کند، در سیستم‌های ویندوز به درستی کار کند\&. .PP آرگومان \fIplatform\fR می‌تواند یک مقدار رشته‌ای به نشانه یکی از بسترهای از پیش تعریف‌شده (aix، cygwin، darwin، hpux، irix، os2، posix، sunos یا win32)، یا یک شیء بستر قابل فراخوانی (callable) برگردانده‌شده توسط فراخوانی \fBPlatform\fR برای انتخاب یک بستر از پیش تعریف‌شده باشد، یا می‌تواند یک شیء قابل فراخوانی ارائه‌شده توسط کاربر باشد که در این صورت متد \fBEnvironment\fR آن را برای به‌روزرسانی محیط ساخت جدید فراخوانی خواهد کرد: .sp .if n \{\ .RS 4 .\} .nf def my_platform(env): env[\*(AqVAR\*(Aq] = \*(Aqxyzzy\*(Aq env = Environment(platform=my_platform) .fi .if n \{\ .RE .\} .PP توجه داشته باشید که تعیین یک platform غیرپیش‌فرض یا تابع سفارشی برای مقداردهی اولیه ممکن است تنظیماتی را که باید برای سیستم میزبان انجام شوند دور بزند و باید با احتیاط استفاده شود\&. این کار بیش از همه در مواردی کاربرد دارد که platform جایگزینی برای موردی باشد که به‌طور خودکار شناسایی می‌شد؛ مانند platform="cygwin" در سیستمی که در غیر این صورت به عنوان win32 شناسایی می‌شد\&. .PP آرگومان‌های کلیدواژه‌ای اختیاری \fItools\fR و \fItoolpath\fR بر نحوه مقداردهی اولیه ابزارهای در دسترس محیط تأثیر می‌گذارند\&. برای جزئیات، به بخش \(lqTools\(rq مراجعه کنید\&. .PP آرگومان کلیدواژه‌ای اختیاری \fIvariables\fR امکان ارسال یک شیء Variables را فراهم می‌کند که در مقداردهی اولیه محیط ساخت استفاده خواهد شد\&. برای جزئیات، به بخش \(lqCommand-Line Construction Variables\(rq مراجعه کنید\&. .SS "ابزارها (Tools)" .PP SCons دارای ماژول‌های ابزار درونی متعددی است (به‌طور دقیق‌تر، ماژول‌های مشخصات ابزار) که برای کمک به مقداردهی اولیه محیط ساخت پیش از ساخت به‌کار می‌روند؛ همچنین می‌توان ماژول‌های بیشتری را برای اهداف خاص نوشت، یا از منابع خارجی اضافه کرد (مخزنی از ابزارهای ارائه‌شده توسط کاربران در دسترس است)\&. اطلاعات بیشتر درباره نوشتن ابزارهای سفارشی را می‌توانید در بخش Extending SCons و به‌ویژه Tool Modules بیابید\&. .PP یک ابزار SCons تنها مسئول برپاسازی است\&. برای نمونه، اگر یک فایل SConscript با فراخوانی سازنده (builder) \fBObject\fR، نیاز به ساخت یک فایل هدف (object file) از یک فایل مبدأ زبان C را اعلام کند، ابتدا باید ماژول ابزاری که نشان‌دهنده یک کامپایلر C موجود است اجرا شده باشد تا آن builder و تمام متغیرهای ساخت مورد نیازش را در محیط ساخت مربوطه برپا سازد\&. خود ابزار در فرایند ساخت فراخوانی نمی‌شود\&. برپاسازی ابزار هنگام ایجاد یک محیط ساخت رخ می‌دهد و در حالت عادی نیازی به مداخله ندارد \- فهرست ابزارهای پیش‌فرض وابسته به هر platform برای بررسی قابلیت‌های خاص آن platform و پیکربندی محیط استفاده می‌شوند و از ابزارهایی که قابل اعمال نیستند صرف‌نظر می‌شود\&. .PP در صورت نیاز، می‌توان مجموعه خاصی از ابزارها را برای مقداردهی اولیه در یک محیط در حین ایجاد آن، با استفاده از آرگومان اختیاری \fItools\fR مشخص کرد\&. \fItools\fR باید یک لیست (list) باشد، حتی اگر شامل یک (یا صفر) ابزار باشد\&. این قابلیت برای بازنویسی پیش‌فرض‌ها، تعیین ابزارهای توکارِ غیرپیش‌فرض، و فراخوانی ابزارهای اضافه‌شده مفید است: .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqmsvc\*(Aq, \*(Aqlex\*(Aq]) .fi .if n \{\ .RE .\} .PP آرگومان \fItools\fR فهرست ابزارهای پیش‌فرض را بازنویسی می‌کند و به آن اضافه نمی‌شود؛ بنابراین حتماً تمام ابزارهای مورد نیاز خود را درج کنید\&. برای مثال، اگر در حال ساخت یک برنامه C/C++ هستید، باید دست‌کم یک ابزار برای کامپایلر و پیونددهنده (linker) تعیین کنید، مانند: tools=[\*(Aqclang\*(Aq, \*(Aqlink\*(Aq]\&. .PP اگر آرگومان \fItools\fR حذف شود، یا اگر \fItools\fR شامل نام رزروشده \*(Aqdefault\*(Aq باشد، آنگاه SCons ابزارهای قابل استفاده را با به‌کارگیری مسیر جستجو در محیط اجرا (یعنی \fI\fIenv\fR\fR\fI[\*(AqENV\*(Aq][\*(AqPATH\*(Aq]\fR) برای یافتن برنامه‌های خارجی، و نام پلتفرم فعال برای تعیین ابزارهای پیش‌فرض آن پلتفرم، به‌طور خودکار شناسایی می‌کند\&. توجه داشته باشید که محتویات \fBPATH\fR از محیط خارجی \fIos\&.environ\fR استفاده \fIنمی‌شود\fR\&. تغییر دادن \fIPATH\fR در محیط اجرا پس از ایجاد محیط ساخت، باعث شناسایی مجدد ابزارها نخواهد شد\&. .PP ابزارها را می‌توان مستقیماً با استفاده از متد \fBTool\fR نیز فراخوانی کرد (به بخش زیر مراجعه کنید)\&. .PP SCons به‌صورت پیش‌فرض از مشخصات ابزار زیر پشتیبانی می‌کند: .PP 386asm .RS 4 متغیرهای ساخت را برای اسمبلر 386ASM در سیستم‌عامل تعبیه‌شده Phar Lap ETS تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$AS\fR, \fB$ASCOM\fR, \fB$ASFLAGS\fR, \fB$ASPPCOM\fR, \fB$ASPPFLAGS\fR\&. .sp استفاده می‌کند: \fB$CC\fR, \fB$CPPFLAGS\fR, \fB$_CPPDEFFLAGS\fR, \fB$_CPPINCFLAGS\fR\&. .RE .PP aixc++ .RS 4 متغیرهای ساخت را برای کامپایلر IMB xlc / Visual Age C++ تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$CXX\fR, \fB$CXXVERSION\fR, \fB$SHCXX\fR, \fB$SHOBJSUFFIX\fR\&. .RE .PP aixcc .RS 4 متغیرهای ساخت را برای کامپایلر IBM xlc / Visual Age C تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$CC\fR, \fB$CCVERSION\fR, \fB$SHCC\fR\&. .RE .PP aixf77 .RS 4 متغیرهای ساخت را برای کامپایلر IBM Visual Age f77 Fortran تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$F77\fR, \fB$SHF77\fR\&. .RE .PP aixlink .RS 4 متغیرهای ساخت را برای پیونددهنده IBM Visual Age تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$LINKFLAGS\fR, \fB$SHLIBSUFFIX\fR, \fB$SHLINKFLAGS\fR\&. .RE .PP applelink .RS 4 متغیرهای ساخت را برای پیونددهنده Apple (مشابه پیونددهنده GNU) تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$APPLELINK_COMPATIBILITY_VERSION\fR, \fB$APPLELINK_CURRENT_VERSION\fR, \fB$APPLELINK_NO_COMPATIBILITY_VERSION\fR, \fB$APPLELINK_NO_CURRENT_VERSION\fR, \fB$FRAMEWORKPATHPREFIX\fR, \fB$LDMODULECOM\fR, \fB$LDMODULEFLAGS\fR, \fB$LDMODULEPREFIX\fR, \fB$LDMODULESUFFIX\fR, \fB$LINKCOM\fR, \fB$SHLINKCOM\fR, \fB$SHLINKFLAGS\fR, \fB$_APPLELINK_COMPATIBILITY_VERSION\fR, \fB$_APPLELINK_CURRENT_VERSION\fR, \fB$_FRAMEWORKPATH\fR, \fB$_FRAMEWORKS\fR\&. .sp استفاده می‌کند از: \fB$FRAMEWORKSFLAGS\fR\&. .RE .PP ar .RS 4 متغیرهای ساخت را برای بایگان کتابخانه ar تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$AR\fR, \fB$ARCOM\fR, \fB$ARFLAGS\fR, \fB$LIBPREFIX\fR, \fB$LIBSUFFIX\fR, \fB$RANLIB\fR, \fB$RANLIBCOM\fR, \fB$RANLIBFLAGS\fR\&. .RE .PP as .RS 4 متغیرهای ساخت را برای اسمبلر as تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$AS\fR, \fB$ASCOM\fR, \fB$ASFLAGS\fR, \fB$ASPPCOM\fR, \fB$ASPPFLAGS\fR\&. .sp استفاده می‌کند از: \fB$CC\fR, \fB$CPPFLAGS\fR, \fB$_CPPDEFFLAGS\fR, \fB$_CPPINCFLAGS\fR\&. .RE .PP bcc32 .RS 4 متغیرهای ساخت را برای کامپایلر bcc32 تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$CC\fR, \fB$CCCOM\fR, \fB$CCFLAGS\fR, \fB$CFILESUFFIX\fR, \fB$CFLAGS\fR, \fB$CPPDEFPREFIX\fR, \fB$CPPDEFSUFFIX\fR, \fB$INCPREFIX\fR, \fB$INCSUFFIX\fR, \fB$SHCC\fR, \fB$SHCCCOM\fR, \fB$SHCCFLAGS\fR, \fB$SHCFLAGS\fR, \fB$SHOBJSUFFIX\fR\&. .sp استفاده می‌کند از: \fB$_CPPDEFFLAGS\fR, \fB$_CPPINCFLAGS\fR\&. .RE .PP cc .RS 4 متغیرهای ساخت را برای کامپایلرهای عمومی C سازگار با POSIX تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$CC\fR, \fB$CCCOM\fR, \fB$CCDEPFLAGS\fR, \fB$CCFLAGS\fR, \fB$CFILESUFFIX\fR, \fB$CFLAGS\fR, \fB$CPPDEFPREFIX\fR, \fB$CPPDEFSUFFIX\fR, \fB$FRAMEWORKPATH\fR, \fB$FRAMEWORKS\fR, \fB$INCPREFIX\fR, \fB$INCSUFFIX\fR, \fB$SHCC\fR, \fB$SHCCCOM\fR, \fB$SHCCFLAGS\fR, \fB$SHCFLAGS\fR, \fB$SHOBJSUFFIX\fR\&. .sp استفاده می‌کند از: \fB$CCCOMSTR\fR, \fB$PLATFORM\fR, \fB$SHCCCOMSTR\fR\&. .RE .PP clang .RS 4 متغیرهای ساخت را برای کامپایلر Clang C تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$CC\fR, \fB$CCDEPFLAGS\fR, \fB$CCVERSION\fR, \fB$SHCCFLAGS\fR\&. .RE .PP clangxx .RS 4 متغیرهای ساخت را برای کامپایلر Clang C++ تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$CXX\fR, \fB$CXXVERSION\fR, \fB$SHCXXFLAGS\fR, \fB$SHOBJSUFFIX\fR, \fB$STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME\fR\&. .RE .PP compilation_db .RS 4 سازنده \fBCompilationDatabase\fR را راه‌اندازی می‌کند که یک پایگاه‌داده ترجمه سازگار با ابزارهای clang تولید می‌کند\&. .sp تنظیم می‌کند: \fB$COMPILATIONDB_COMSTR\fR, \fB$COMPILATIONDB_PATH_FILTER\fR, \fB$COMPILATIONDB_USE_ABSPATH\fR\&. .RE .PP cvf .RS 4 متغیرهای ساخت را برای کامپایلر Compaq Visual Fortran تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$FORTRAN\fR, \fB$FORTRANCOM\fR, \fB$FORTRANMODDIR\fR, \fB$FORTRANMODDIRPREFIX\fR, \fB$FORTRANMODDIRSUFFIX\fR, \fB$FORTRANPPCOM\fR, \fB$OBJSUFFIX\fR, \fB$SHFORTRANCOM\fR, \fB$SHFORTRANPPCOM\fR\&. .sp استفاده می‌کند از: \fB$CPPFLAGS\fR, \fB$FORTRANFLAGS\fR, \fB$SHFORTRANFLAGS\fR, \fB$_CPPDEFFLAGS\fR, \fB$_FORTRANINCFLAGS\fR, \fB$_FORTRANMODFLAG\fR\&. .RE .PP cXX .RS 4 متغیرهای ساخت را برای کامپایلرهای عمومی C++ در POSIX تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$CPPDEFPREFIX\fR, \fB$CPPDEFSUFFIX\fR, \fB$CXX\fR, \fB$CXXCOM\fR, \fB$CXXFILESUFFIX\fR, \fB$CXXFLAGS\fR, \fB$INCPREFIX\fR, \fB$INCSUFFIX\fR, \fB$OBJSUFFIX\fR, \fB$SHCXX\fR, \fB$SHCXXCOM\fR, \fB$SHCXXFLAGS\fR, \fB$SHOBJSUFFIX\fR\&. .sp استفاده می‌کند از: \fB$CXXCOMSTR\fR, \fB$SHCXXCOMSTR\fR\&. .RE .PP cyglink .RS 4 متغیرهای ساخت را برای پیونددهنده/بارگذار cygwin تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$IMPLIBPREFIX\fR, \fB$IMPLIBSUFFIX\fR, \fB$LDMODULEVERSIONFLAGS\fR, \fB$LINKFLAGS\fR, \fB$RPATHPREFIX\fR, \fB$RPATHSUFFIX\fR, \fB$SHLIBPREFIX\fR, \fB$SHLIBSUFFIX\fR, \fB$SHLIBVERSIONFLAGS\fR, \fB$SHLINKCOM\fR, \fB$SHLINKFLAGS\fR, \fB$_LDMODULEVERSIONFLAGS\fR, \fB$_SHLIBVERSIONFLAGS\fR\&. .RE .PP default .RS 4 متغیرهای ساخت را برای یک فهرست پیش‌فرض از ماژول‌های Tool تنظیم می‌کند\&. برای حفظ مقادیر پیش‌فرض اولیه، از \fBdefault\fR در فهرست ابزارها استفاده کنید، چرا که پارامتر \fItools\fR به عنوان بیانی صریح از ابزارهایی تلقی می‌شود که باید در آن محیط ساخت در دسترس قرار گیرند، نه یک افزونه به آن‌ها\&. .sp فهرست ابزارهای انتخاب‌شده به صورت پیش‌فرض ایستا نیست، بلکه هم به پلتفرم و هم به نرم‌افزارهای نصب‌شده روی آن پلتفرم وابسته است\&. برخی از ابزارها در صورتی که دستور زیربنایی مربوطه‌شان یافت نشود مقداردهی اولیه نمی‌شوند، و برخی ابزارها از یک فهرست گزینه‌ها بر مبنای «نخستین موردِ یافت‌شده» انتخاب می‌شوند\&. فهرست نهایی ابزارها را می‌توان با بررسی متغیر ساخت \fB$TOOLS\fR در محیط ساخت مشاهده کرد\&. .sp در تمامی پلتفرم‌ها، ابزارهای فهرست زیر در صورت برآورده شدن شرایط مربوطه‌شان انتخاب می‌شوند: filesystem;, wix, lex, yacc, rpcgen, swig, jar, javac, javah, rmic, dvipdf, dvips, gs, tex, latex, pdflatex, pdftex, tar, zip, textfile\&. .sp در سیستم‌های لینوکس، فهرست ابزارهای پیش‌فرض این موارد را (بر اساس نخستین مورد یافت‌شده) انتخاب می‌کند: یک کامپایلر C از میان gcc, intelc, icc, cc; یک کامپایلر C++ از میان g++, intelc, icc, cXX; یک اسمبلر از میان gas, nasm, masm; یک پیونددهنده از میان gnulink, ilink; یک کامپایلر Fortran از میان gfortran, g77, ifort, ifl, f95, f90, f77; و یک آرشیوکننده ایستا ar\&. همچنین تمام موارد یافت‌شده از فهرست زیر را انتخاب می‌کند: m4 rpm\&. .sp در سیستم‌های ویندوز، فهرست ابزارهای پیش‌فرض این موارد را (بر اساس نخستین مورد یافت‌شده) انتخاب می‌کند: یک کامپایلر C از میان msvc, mingw, gcc, intelc, icl, icc, cc, bcc32; یک کامپایلر C++ از میان msvc, intelc, icc, g++, cXX, bcc32; یک اسمبلر از میان masm, nasm, gas, 386asm; یک پیونددهنده از میان mslink, gnulink, ilink, linkloc, ilink32; یک کامپایلر Fortran از میان gfortran, g77, ifl, cvf, f95, f90, fortran; و یک آرشیوکننده ایستا از میان mslib, ar, tlib; همچنین تمام موارد یافت‌شده از فهرست زیر را انتخاب می‌کند: msvs, midl\&. .sp در سیستم‌های مک‌او‌اس (MacOS)، فهرست ابزارهای پیش‌فرض این موارد را (بر اساس نخستین مورد یافت‌شده) انتخاب می‌کند: یک کامپایلر C از میان gcc, cc; یک کامپایلر C++ از میان g++, cXX; یک اسمبلر as; یک پیونددهنده از میان applelink, gnulink; یک کامپایلر Fortran از میان gfortran, f95, f90, g77; و یک آرشیوکننده ایستا ar\&. همچنین تمام موارد یافت‌شده از فهرست زیر را انتخاب می‌کند: m4, rpm\&. .sp در سیستم‌های BSD که کامپایلر پایه آن‌ها LLVM/clang است (FreeBSD و OpenBSD)، فهرست ابزارهای پیش‌فرض با لینوکس یکسان است، با این تفاوت که کامپایلر C (بر اساس نخستین مورد یافت‌شده) از میان clang, gcc, intelc, icc, cc و کامپایلر C++ از میان clangxx, g++, intelc, icc, cXX انتخاب می‌شود\&. .sp فهرست‌های پیش‌فرض برای سایر پلتفرم‌ها را می‌توان با بررسی کد منبع \fBscons\fR یافت (ببینید: SCons/Tool/__init__\&.py)\&. .RE .PP dmd .RS 4 متغیرهای ساخت را برای کامپایلر زبان D یعنی DMD تنظیم می‌کند\&. .sp مقادیر زیر را تنظیم می‌کند: \fB$DC\fR, \fB$DCOM\fR, \fB$DDEBUG\fR, \fB$DDEBUGPREFIX\fR, \fB$DDEBUGSUFFIX\fR, \fB$DFILESUFFIX\fR, \fB$DFLAGPREFIX\fR, \fB$DFLAGS\fR, \fB$DFLAGSUFFIX\fR, \fB$DINCPREFIX\fR, \fB$DINCSUFFIX\fR, \fB$DLIB\fR, \fB$DLIBCOM\fR, \fB$DLIBDIRPREFIX\fR, \fB$DLIBDIRSUFFIX\fR, \fB$DLIBFLAGPREFIX\fR, \fB$DLIBFLAGSUFFIX\fR, \fB$DLIBLINKPREFIX\fR, \fB$DLIBLINKSUFFIX\fR, \fB$DLINK\fR, \fB$DLINKCOM\fR, \fB$DLINKFLAGPREFIX\fR, \fB$DLINKFLAGS\fR, \fB$DLINKFLAGSUFFIX\fR, \fB$DPATH\fR, \fB$DRPATHPREFIX\fR, \fB$DRPATHSUFFIX\fR, \fB$DVERPREFIX\fR, \fB$DVERSIONS\fR, \fB$DVERSUFFIX\fR, \fB$SHDC\fR, \fB$SHDCOM\fR, \fB$SHDLIBVERSIONFLAGS\fR, \fB$SHDLINK\fR, \fB$SHDLINKCOM\fR, \fB$SHDLINKFLAGS\fR\&. .RE .PP docbook .RS 4 این ابزار تلاش می‌کند تا کار با Docbook را در SCons کمی آسان‌تر کند\&. این ابزار چندین زنجیره ابزار (toolchain) را برای ایجاد قالب‌های خروجی گوناگون مانند HTML یا PDF فراهم می‌سازد\&. درون این بسته، توزیعی از شیوه‌نامه‌های Docbook XSL از نسخهٔ 1\&.76\&.1 گنجانده شده است\&. تا زمانی که شیوه‌نامه‌های سفارشی خود را تعیین نکنید، این نسخه‌های رسمی به عنوان پیش‌فرض انتخاب می‌شوند\&.\&.\&. که باید از دردسرهای اجتناب‌ناپذیر راه‌اندازی برای شما بکاهد\&. .sp وابستگی‌های ضمنی به تصاویر و XIncludeها در صورت برآورده کردن پیش‌نیازهای HTML به‌طور خودکار شناسایی می‌شوند\&. بدین منظور از شیوه‌نامهٔ کمکی utils/xmldepend\&.xsl اثر Paul DuBois استفاده می‌شود\&. .sp توجه داشته باشید که هیچ پشتیبانی‌ای برای تفکیک کاتالوگ XML ارائه نمی‌شود! این ابزار پردازنده‌های XSLT و رندرکننده‌های PDF را با شیوه‌نامه‌های مشخص‌شده توسط شما فراخوانی می‌کند، همین و بس\&. باقی کارها بر عهدهٔ شماست و هنگام تفکیک نام‌ها از طریق یک کاتالوگ، همچنان باید بدانید چه کاری انجام می‌دهید\&. .sp برای فعال‌سازی ابزار "docbook"، باید نام آن را به سازندهٔ Environment اضافه کنید، مانند این: .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) .fi .if n \{\ .RE .\} .sp ابزار docbook هنگام راه‌اندازی، تلاش می‌کند پردازندهٔ مورد نیاز xsltproc و یک رندرکنندهٔ PDF، مانند fop را پیدا کند\&. بنابراین مطمئن شوید که این موارد به متغیر محیطی \fBPATH\fR سیستم شما اضافه شده‌اند و می‌توان آن‌ها را بدون تعیین مسیر کامل، مستقیماً فراخوانی کرد\&. .sp برای پایه‌ای‌ترین پردازش Docbook به HTML، باید این موارد را نصب داشته باشید: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} اتصال پایتونی lxml به libxml2، یا .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} یک پردازندهٔ مستقل XSLT؛ در حال حاضر xsltproc، saxon، saxon\-xslt و xalan شناسایی می‌شوند\&. .RE .sp رندر گرفتن به PDF مستلزم نصب یکی از برنامه‌های fop یا xep است\&. .sp ایجاد یک سند HTML یا PDF بسیار ساده و سرراست است\&. عبارت: .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) env\&.DocbookHtml(\*(Aqmanual\&.html\*(Aq, \*(Aqmanual\&.xml\*(Aq) env\&.DocbookPdf(\*(Aqmanual\&.pdf\*(Aq, \*(Aqmanual\&.xml\*(Aq) .fi .if n \{\ .RE .\} .sp را بنویسید تا هر دو خروجی را از منبع XML خود یعنی manual\&.xml به دست آورید\&. به عنوان یک میانبر، می‌توانید تنها ریشهٔ نام فایل‌ها را تعیین کنید، مانند این: .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) env\&.DocbookHtml(\*(Aqmanual\*(Aq) env\&.DocbookPdf(\*(Aqmanual\*(Aq) .fi .if n \{\ .RE .\} .sp و همان نتیجه را دریافت کنید\&. فهرست‌های هدف و منبع نیز پشتیبانی می‌شوند: .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) env\&.DocbookHtml([\*(Aqmanual\&.html\*(Aq,\*(Aqreference\&.html\*(Aq], [\*(Aqmanual\&.xml\*(Aq,\*(Aqreference\&.xml\*(Aq]) .fi .if n \{\ .RE .\} .sp یا حتی: .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) env\&.DocbookHtml([\*(Aqmanual\*(Aq,\*(Aqreference\*(Aq]) .fi .if n \{\ .RE .\} .sp .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBمهم\fR .ps -1 .br هر زمان که فهرست منابع را حذف کنید، نباید پسوند فایل را مشخص نمایید! این ابزار از نام‌های داده‌شده به عنوان ریشهٔ نام فایل استفاده می‌کند و پسوندهای مربوط به فایل‌های هدف و منبع را بر همین اساس اضافه می‌نماید\&. .sp .5v .RE قواعد ذکرشده در بالا برای سازنده‌های \fBDocbookHtml\fR، \fBDocbookPdf\fR، \fBDocbookEpub\fR، \fBDocbookSlidesPdf\fR و \fBDocbookXInclude\fR معتبر هستند\&. برای تبدیل \fBDocbookMan\fR می‌توانید نام هدف را مشخص کنید، اما نام‌های خروجی واقعی به‌طور خودکار از مدخل‌های refname در منبع XML شما تنظیم می‌شوند\&. .sp سازنده‌های \fBDocbookHtmlChunked\fR، \fBDocbookHtmlhelp\fR و \fBDocbookSlidesHtml\fR خاص هستند، از این جهت که: .sp .RS 4 .ie n \{\ \h'-04' 1.\h'+01'\c .\} .el \{\ .sp -1 .IP " 1." 4.2 .\} آن‌ها مجموعهٔ بزرگی از فایل‌ها را ایجاد می‌کنند، که در آن نام دقیق و تعداد آن‌ها به محتوای فایل منبع بستگی دارد، و .RE .sp .RS 4 .ie n \{\ \h'-04' 2.\h'+01'\c .\} .el \{\ .sp -1 .IP " 2." 4.2 .\} هدف اصلی همواره index\&.html نام‌گذاری می‌شود؛ یعنی نام خروجی برای تبدیل XSL توسط شیوه‌نامه‌ها دریافت نمی‌شود\&. .RE .sp در نتیجه، مشخص کردن نام هدف HTML عملاً کاربردی ندارد\&. بنابراین نحو پایه برای این سازنده‌ها همواره بدین صورت است: .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) env\&.DocbookHtmlhelp(\*(Aqmanual\*(Aq) .fi .if n \{\ .RE .\} .sp اگر می‌خواهید از یک فایل XSL خاص استفاده کنید، می‌توانید پارامتر اضافی \fIxsl\fR را در فراخوانی سازندهٔ خود به‌صورت زیر تعیین کنید: .sp .if n \{\ .RS 4 .\} .nf env\&.DocbookHtml(\*(Aqother\&.html\*(Aq, \*(Aqmanual\&.xml\*(Aq, xsl=\*(Aqhtml\&.xsl\*(Aq) .fi .if n \{\ .RE .\} .sp از آنجا که در صورت استفادهٔ مداوم از یک نام‌گذاری محلی یکسان برای فایل‌های XSL سفارشی‌تان، مثلاً html\&.xsl برای HTML و pdf\&.xsl برای خروجی PDF، این کار ممکن است خسته‌کننده شود، مجموعه‌ای از متغیرها برای تنظیم نام پیش‌فرض XSL در نظر گرفته شده است\&. این متغیرها عبارتند از: .sp .if n \{\ .RS 4 .\} .nf DOCBOOK_DEFAULT_XSL_HTML DOCBOOK_DEFAULT_XSL_HTMLCHUNKED DOCBOOK_DEFAULT_XSL_HTMLHELP DOCBOOK_DEFAULT_XSL_PDF DOCBOOK_DEFAULT_XSL_EPUB DOCBOOK_DEFAULT_XSL_MAN DOCBOOK_DEFAULT_XSL_SLIDESPDF DOCBOOK_DEFAULT_XSL_SLIDESHTML .fi .if n \{\ .RE .\} .sp و می‌توانید هنگام ساخت محیط خود، آن‌ها را تنظیم کنید: .sp .if n \{\ .RS 4 .\} .nf env = Environment( tools=[\*(Aqdocbook\*(Aq], DOCBOOK_DEFAULT_XSL_HTML=\*(Aqhtml\&.xsl\*(Aq, DOCBOOK_DEFAULT_XSL_PDF=\*(Aqpdf\&.xsl\*(Aq, ) env\&.DocbookHtml(\*(Aqmanual\*(Aq) # now uses html\&.xsl .fi .if n \{\ .RE .\} .sp تنظیم می‌کند: \fB$DOCBOOK_DEFAULT_XSL_EPUB\fR، \fB$DOCBOOK_DEFAULT_XSL_HTML\fR، \fB$DOCBOOK_DEFAULT_XSL_HTMLCHUNKED\fR، \fB$DOCBOOK_DEFAULT_XSL_HTMLHELP\fR، \fB$DOCBOOK_DEFAULT_XSL_MAN\fR، \fB$DOCBOOK_DEFAULT_XSL_PDF\fR، \fB$DOCBOOK_DEFAULT_XSL_SLIDESHTML\fR، \fB$DOCBOOK_DEFAULT_XSL_SLIDESPDF\fR، \fB$DOCBOOK_FOP\fR، \fB$DOCBOOK_FOPCOM\fR، \fB$DOCBOOK_FOPFLAGS\fR، \fB$DOCBOOK_XMLLINT\fR، \fB$DOCBOOK_XMLLINTCOM\fR، \fB$DOCBOOK_XMLLINTFLAGS\fR، \fB$DOCBOOK_XSLTPROC\fR، \fB$DOCBOOK_XSLTPROCCOM\fR، \fB$DOCBOOK_XSLTPROCFLAGS\fR، \fB$DOCBOOK_XSLTPROCPARAMS\fR\&. .sp استفاده می‌کند: \fB$DOCBOOK_FOPCOMSTR\fR، \fB$DOCBOOK_XMLLINTCOMSTR\fR، \fB$DOCBOOK_XSLTPROCCOMSTR\fR\&. .RE .PP dvi .RS 4 سازندهٔ \fBDVI\fR را به محیط ساخت ضمیمه می‌کند\&. .RE .PP dvipdf .RS 4 متغیرهای ساخت را برای ابزار dvipdf تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$DVIPDF\fR، \fB$DVIPDFCOM\fR، \fB$DVIPDFFLAGS\fR\&. .sp استفاده می‌کند: \fB$DVIPDFCOMSTR\fR\&. .RE .PP dvips .RS 4 متغیرهای ساخت را برای ابزار dvips تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$DVIPS\fR، \fB$DVIPSFLAGS\fR، \fB$PSCOM\fR، \fB$PSPREFIX\fR، \fB$PSSUFFIX\fR\&. .sp استفاده می‌کند: \fB$PSCOMSTR\fR\&. .RE .PP f03 .RS 4 متغیرهای ساخت را برای کامپایلرهای عمومی POSIX Fortran 03 تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$F03\fR، \fB$F03COM\fR، \fB$F03FLAGS\fR، \fB$F03PPCOM\fR، \fB$SHF03\fR، \fB$SHF03COM\fR، \fB$SHF03FLAGS\fR، \fB$SHF03PPCOM\fR، \fB$_F03INCFLAGS\fR\&. .sp استفاده می‌کند: \fB$F03COMSTR\fR، \fB$F03PPCOMSTR\fR، \fB$FORTRANCOMMONFLAGS\fR، \fB$SHF03COMSTR\fR، \fB$SHF03PPCOMSTR\fR\&. .RE .PP f08 .RS 4 تنظیم متغیرهای ساخت برای کامپایلرهای عمومی POSIX Fortran 08\&. .sp تنظیم می‌کند: \fB$F08\fR, \fB$F08COM\fR, \fB$F08FLAGS\fR, \fB$F08PPCOM\fR, \fB$SHF08\fR, \fB$SHF08COM\fR, \fB$SHF08FLAGS\fR, \fB$SHF08PPCOM\fR, \fB$_F08INCFLAGS\fR\&. .sp استفاده می‌کند: \fB$F08COMSTR\fR, \fB$F08PPCOMSTR\fR, \fB$FORTRANCOMMONFLAGS\fR, \fB$SHF08COMSTR\fR, \fB$SHF08PPCOMSTR\fR\&. .RE .PP f77 .RS 4 تنظیم متغیرهای ساخت برای کامپایلرهای عمومی POSIX Fortran 77\&. .sp تنظیم می‌کند: \fB$F77\fR, \fB$F77COM\fR, \fB$F77FILESUFFIXES\fR, \fB$F77FLAGS\fR, \fB$F77PPCOM\fR, \fB$F77PPFILESUFFIXES\fR, \fB$FORTRAN\fR, \fB$FORTRANCOM\fR, \fB$FORTRANFLAGS\fR, \fB$SHF77\fR, \fB$SHF77COM\fR, \fB$SHF77FLAGS\fR, \fB$SHF77PPCOM\fR, \fB$SHFORTRAN\fR, \fB$SHFORTRANCOM\fR, \fB$SHFORTRANFLAGS\fR, \fB$SHFORTRANPPCOM\fR, \fB$_F77INCFLAGS\fR\&. .sp استفاده می‌کند: \fB$F77COMSTR\fR, \fB$F77PPCOMSTR\fR, \fB$FORTRANCOMMONFLAGS\fR, \fB$FORTRANCOMSTR\fR, \fB$FORTRANFLAGS\fR, \fB$FORTRANPPCOMSTR\fR, \fB$SHF77COMSTR\fR, \fB$SHF77PPCOMSTR\fR, \fB$SHFORTRANCOMSTR\fR, \fB$SHFORTRANFLAGS\fR, \fB$SHFORTRANPPCOMSTR\fR\&. .RE .PP f90 .RS 4 تنظیم متغیرهای ساخت برای کامپایلرهای عمومی POSIX Fortran 90\&. .sp تنظیم می‌کند: \fB$F90\fR, \fB$F90COM\fR, \fB$F90FLAGS\fR, \fB$F90PPCOM\fR, \fB$SHF90\fR, \fB$SHF90COM\fR, \fB$SHF90FLAGS\fR, \fB$SHF90PPCOM\fR, \fB$_F90INCFLAGS\fR\&. .sp استفاده می‌کند: \fB$F90COMSTR\fR, \fB$F90PPCOMSTR\fR, \fB$FORTRANCOMMONFLAGS\fR, \fB$SHF90COMSTR\fR, \fB$SHF90PPCOMSTR\fR\&. .RE .PP f95 .RS 4 تنظیم متغیرهای ساخت برای کامپایلرهای عمومی POSIX Fortran 95\&. .sp تنظیم می‌کند: \fB$F95\fR, \fB$F95COM\fR, \fB$F95FLAGS\fR, \fB$F95PPCOM\fR, \fB$SHF95\fR, \fB$SHF95COM\fR, \fB$SHF95FLAGS\fR, \fB$SHF95PPCOM\fR, \fB$_F95INCFLAGS\fR\&. .sp استفاده می‌کند: \fB$F95COMSTR\fR, \fB$F95PPCOMSTR\fR, \fB$FORTRANCOMMONFLAGS\fR, \fB$SHF95COMSTR\fR, \fB$SHF95PPCOMSTR\fR\&. .RE .PP fortran .RS 4 تنظیم متغیرهای ساخت برای کامپایلرهای عمومی POSIX Fortran\&. .sp تنظیم می‌کند: \fB$FORTRAN\fR, \fB$FORTRANCOM\fR, \fB$FORTRANFLAGS\fR, \fB$SHFORTRAN\fR, \fB$SHFORTRANCOM\fR, \fB$SHFORTRANFLAGS\fR, \fB$SHFORTRANPPCOM\fR\&. .sp استفاده می‌کند: \fB$CPPFLAGS\fR, \fB$FORTRANCOMSTR\fR, \fB$FORTRANPPCOMSTR\fR, \fB$SHFORTRANCOMSTR\fR, \fB$SHFORTRANPPCOMSTR\fR, \fB$_CPPDEFFLAGS\fR\&. .RE .PP g++ .RS 4 تنظیم متغیرهای ساخت برای کامپایلر C++ g++\&. .sp تنظیم می‌کند: \fB$CXX\fR, \fB$CXXVERSION\fR, \fB$SHCXXFLAGS\fR, \fB$SHOBJSUFFIX\fR\&. .RE .PP g77 .RS 4 تنظیم متغیرهای ساخت برای کامپایلر Fortran g77\&. .sp تنظیم می‌کند: \fB$F77\fR, \fB$F77COM\fR, \fB$F77FILESUFFIXES\fR, \fB$F77PPCOM\fR, \fB$F77PPFILESUFFIXES\fR, \fB$FORTRAN\fR, \fB$FORTRANCOM\fR, \fB$FORTRANPPCOM\fR, \fB$SHF77\fR, \fB$SHF77COM\fR, \fB$SHF77FLAGS\fR, \fB$SHF77PPCOM\fR, \fB$SHFORTRAN\fR, \fB$SHFORTRANCOM\fR, \fB$SHFORTRANFLAGS\fR, \fB$SHFORTRANPPCOM\fR\&. .sp استفاده می‌کند: \fB$F77FLAGS\fR, \fB$FORTRANCOMMONFLAGS\fR, \fB$FORTRANFLAGS\fR\&. .RE .PP gas .RS 4 متغیرهای ساخت را برای اسمبلر gas تنظیم می‌کند\&. ابزار as را فراخوانی می‌کند\&. .sp تنظیم می‌کند: \fB$AS\fR\&. .RE .PP gcc .RS 4 متغیرهای ساخت را برای کامپایلر C یعنی gcc تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$CC\fR, \fB$CCDEPFLAGS\fR, \fB$CCVERSION\fR, \fB$SHCCFLAGS\fR\&. .RE .PP gdc .RS 4 متغیرهای ساخت را برای کامپایلر زبان D با عنوان GDC تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$DC\fR, \fB$DCOM\fR, \fB$DDEBUG\fR, \fB$DDEBUGPREFIX\fR, \fB$DDEBUGSUFFIX\fR, \fB$DFILESUFFIX\fR, \fB$DFLAGPREFIX\fR, \fB$DFLAGS\fR, \fB$DFLAGSUFFIX\fR, \fB$DINCPREFIX\fR, \fB$DINCSUFFIX\fR, \fB$DLIB\fR, \fB$DLIBCOM\fR, \fB$DLIBDIRPREFIX\fR, \fB$DLIBDIRSUFFIX\fR, \fB$DLIBFLAGPREFIX\fR, \fB$DLIBFLAGSUFFIX\fR, \fB$DLIBLINKPREFIX\fR, \fB$DLIBLINKSUFFIX\fR, \fB$DLINK\fR, \fB$DLINKCOM\fR, \fB$DLINKFLAGPREFIX\fR, \fB$DLINKFLAGS\fR, \fB$DLINKFLAGSUFFIX\fR, \fB$DPATH\fR, \fB$DRPATHPREFIX\fR, \fB$DRPATHSUFFIX\fR, \fB$DVERPREFIX\fR, \fB$DVERSIONS\fR, \fB$DVERSUFFIX\fR, \fB$SHDC\fR, \fB$SHDCOM\fR, \fB$SHDLIBVERSIONFLAGS\fR, \fB$SHDLINK\fR, \fB$SHDLINKCOM\fR, \fB$SHDLINKFLAGS\fR\&. .RE .PP gettext .RS 4 مجموعه ابزاری که از بین‌المللی‌سازی و بومی‌سازی نرم‌افزارهای در حال ساخت با SCons پشتیبانی می‌کند\&. این مجموعه ابزار، ابزارهای زیر را بارگذاری می‌کند: .sp .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} xgettext \- استخراج پیام‌های بین‌المللی‌شده از کد منبع به فایل(های) POT\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} msginit \- مقداردهی اولیه فایل‌های PO در طول ترجمه اولیه یک پروژه\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} msgmerge \- به‌روزرسانی فایل‌های PO که از قبل حاوی پیام‌های ترجمه‌شده هستند، .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} msgfmt \- کامپایل فایل‌های متنی PO به فایل‌های دودویی قابل نصب MO\&. .RE .sp هنگامی که gettext را فعال می‌کنید، به صورت داخلی تمام ابزارهای یادشده را بارگذاری می‌کند، بنابراین توصیه می‌شود مستندات اختصاصی هر یک را ببینید\&. .sp هر یک از ابزارهای فوق سازنده(های) اختصاصی خود را ارائه می‌دهند که می‌توان از آن‌ها برای انجام فعالیت‌های ویژه مربوط به بین‌المللی‌سازی نرم‌افزار استفاده کرد\&. با این حال ممکن است به سازنده \fIسطح‌بالای\fR \fBTranslate\fR علاقه‌مند باشید\&. .sp برای استفاده از ابزارهای gettext، ابزار \*(Aqgettext\*(Aq را به محیط ساخت خود اضافه کنید: .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdefault\*(Aq, \*(Aqgettext\*(Aq]) .fi .if n \{\ .RE .\} .RE .PP gfortran .RS 4 متغیرهای ساخت را برای کامپایلر GNU Fortran تنظیم می‌کند\&. ماژول ابزار fortran را برای تنظیم متغیرها فراخوانی می‌کند\&. .sp تنظیم می‌کند: \fB$F77\fR, \fB$F90\fR, \fB$F95\fR, \fB$FORTRAN\fR, \fB$SHF77\fR, \fB$SHF77FLAGS\fR, \fB$SHF90\fR, \fB$SHF90FLAGS\fR, \fB$SHF95\fR, \fB$SHF95FLAGS\fR, \fB$SHFORTRAN\fR, \fB$SHFORTRANFLAGS\fR\&. .RE .PP gnulink .RS 4 متغیرهای ساخت را برای پیونددهنده/بارگذار GNU تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$LDMODULEVERSIONFLAGS\fR, \fB$RPATHPREFIX\fR, \fB$RPATHSUFFIX\fR, \fB$SHLIBVERSIONFLAGS\fR, \fB$SHLINKFLAGS\fR, \fB$_LDMODULESONAME\fR, \fB$_SHLIBSONAME\fR\&. .RE .PP gs .RS 4 این \fBTool\fR متغیرهای ساخت لازم را برای کار با نرم‌افزار Ghostscript تنظیم می‌کند\&. همچنین یک Action مناسب را در سازنده \fBPDF\fR ثبت می‌کند، به‌گونه‌ای که تبدیل از PS/EPS به PDF به‌طور خودکار برای زنجیره ابزار TeX/LaTeX رخ دهد\&. در نهایت، یک سازنده صریح \fBGs\fR را برای Ghostscript به محیط می‌افزاید\&. .sp تنظیم می‌کند: \fB$GS\fR, \fB$GSCOM\fR, \fB$GSFLAGS\fR\&. .sp استفاده می‌کند: \fB$GSCOMSTR\fR\&. .RE .PP hpc++ .RS 4 متغیرهای ساخت را برای کامپایلرهای aCC در سیستم‌های HP/UX تنظیم می‌کند\&. .RE .PP hpcc .RS 4 متغیرهای ساخت را برای کامپایلرهای aCC در سیستم‌های HP/UX تنظیم می‌کند\&. ابزار cXX را برای دریافت متغیرهای اضافی فراخوانی می‌کند\&. .sp تنظیم می‌کند: \fB$CXX\fR, \fB$CXXVERSION\fR, \fB$SHCXXFLAGS\fR\&. .RE .PP hplink .RS 4 متغیرهای ساخت را برای پیونددهنده در سیستم‌های HP/UX تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$LINKFLAGS\fR, \fB$SHLIBSUFFIX\fR, \fB$SHLINKFLAGS\fR\&. .RE .PP icc .RS 4 متغیرهای ساخت را برای کامپایلر icc در سیستم‌های OS/2 تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$CC\fR, \fB$CCCOM\fR, \fB$CFILESUFFIX\fR, \fB$CPPDEFPREFIX\fR, \fB$CPPDEFSUFFIX\fR, \fB$CXXCOM\fR, \fB$CXXFILESUFFIX\fR, \fB$INCPREFIX\fR, \fB$INCSUFFIX\fR\&. .sp استفاده می‌کند: \fB$CCFLAGS\fR, \fB$CFLAGS\fR, \fB$CPPFLAGS\fR, \fB$_CPPDEFFLAGS\fR, \fB$_CPPINCFLAGS\fR\&. .RE .PP icl .RS 4 متغیرهای ساخت را برای کامپایلر Intel C/C++ تنظیم می‌کند\&. ماژول ابزار intelc را برای تنظیم متغیرهای آن فراخوانی می‌کند\&. .RE .PP ifl .RS 4 متغیرهای ساخت را برای کامپایلر Intel Fortran تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$FORTRAN\fR, \fB$FORTRANCOM\fR, \fB$FORTRANPPCOM\fR, \fB$SHFORTRANCOM\fR, \fB$SHFORTRANPPCOM\fR\&. .sp استفاده می‌کند: \fB$CPPFLAGS\fR, \fB$FORTRANFLAGS\fR, \fB$_CPPDEFFLAGS\fR, \fB$_FORTRANINCFLAGS\fR\&. .RE .PP ifort .RS 4 متغیرهای ساخت را برای نسخه‌های جدیدتر کامپایلر Intel Fortran برای Linux تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$F77\fR, \fB$F90\fR, \fB$F95\fR, \fB$FORTRAN\fR, \fB$SHF77\fR, \fB$SHF77FLAGS\fR, \fB$SHF90\fR, \fB$SHF90FLAGS\fR, \fB$SHF95\fR, \fB$SHF95FLAGS\fR, \fB$SHFORTRAN\fR, \fB$SHFORTRANFLAGS\fR\&. .RE .PP ilink .RS 4 متغیرهای ساخت را برای پیونددهنده ilink در سیستم‌های OS/2 تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$LIBDIRPREFIX\fR, \fB$LIBDIRSUFFIX\fR, \fB$LIBLINKPREFIX\fR, \fB$LIBLINKSUFFIX\fR, \fB$LINK\fR, \fB$LINKCOM\fR, \fB$LINKFLAGS\fR\&. .RE .PP ilink32 .RS 4 متغیرهای ساخت را برای پیونددهنده ilink32 محصول Borland تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$LIBDIRPREFIX\fR, \fB$LIBDIRSUFFIX\fR, \fB$LIBLINKPREFIX\fR, \fB$LIBLINKSUFFIX\fR, \fB$LINK\fR, \fB$LINKCOM\fR, \fB$LINKFLAGS\fR\&. .RE .PP install .RS 4 متغیرهای ساخت را برای نصب فایل و دایرکتوری تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$INSTALL\fR, \fB$INSTALLSTR\fR\&. .RE .PP intelc .RS 4 متغیرهای ساخت را برای کامپایلر Intel C/C++ (در Linux و Windows، نسخه ۷ و بالاتر) تنظیم می‌کند\&. ابزار gcc یا msvc را (به‌ترتیب در Linux و Windows) برای مقداردهی متغیرهای پایه‌ای فراخوانی می‌کند\&. .sp تنظیم می‌کند: \fB$AR\fR, \fB$CC\fR, \fB$CXX\fR, \fB$INTEL_C_COMPILER_VERSION\fR, \fB$LINK\fR\&. .RE .PP jar .RS 4 متغیرهای ساخت را برای ابزار کمکی jar تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$JAR\fR, \fB$JARCOM\fR, \fB$JARFLAGS\fR, \fB$JARSUFFIX\fR\&. .sp استفاده می‌کند: \fB$JARCOMSTR\fR\&. .RE .PP javac .RS 4 متغیرهای ساخت را برای کامپایلر javac تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$JAVABOOTCLASSPATH\fR, \fB$JAVAC\fR, \fB$JAVACCOM\fR, \fB$JAVACFLAGS\fR, \fB$JAVACLASSPATH\fR, \fB$JAVACLASSSUFFIX\fR, \fB$JAVAINCLUDES\fR, \fB$JAVASOURCEPATH\fR, \fB$JAVASUFFIX\fR\&. .sp استفاده می‌کند: \fB$JAVACCOMSTR\fR\&. .RE .PP javah .RS 4 متغیرهای ساخت را برای ابزار javah تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$JAVACLASSSUFFIX\fR, \fB$JAVAH\fR, \fB$JAVAHCOM\fR, \fB$JAVAHFLAGS\fR\&. .sp استفاده می‌کند: \fB$JAVACLASSPATH\fR, \fB$JAVAHCOMSTR\fR\&. .RE .PP latex .RS 4 متغیرهای ساخت را برای ابزار کمکی latex تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$LATEX\fR, \fB$LATEXCOM\fR, \fB$LATEXFLAGS\fR\&. .sp استفاده می‌کند: \fB$LATEXCOMSTR\fR\&. .RE .PP ldc .RS 4 متغیرهای ساخت را برای کامپایلر زبان D یعنی LDC2 تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$DC\fR, \fB$DCOM\fR, \fB$DDEBUG\fR, \fB$DDEBUGPREFIX\fR, \fB$DDEBUGSUFFIX\fR, \fB$DFILESUFFIX\fR, \fB$DFLAGPREFIX\fR, \fB$DFLAGS\fR, \fB$DFLAGSUFFIX\fR, \fB$DINCPREFIX\fR, \fB$DINCSUFFIX\fR, \fB$DLIB\fR, \fB$DLIBCOM\fR, \fB$DLIBDIRPREFIX\fR, \fB$DLIBDIRSUFFIX\fR, \fB$DLIBFLAGPREFIX\fR, \fB$DLIBFLAGSUFFIX\fR, \fB$DLIBLINKPREFIX\fR, \fB$DLIBLINKSUFFIX\fR, \fB$DLINK\fR, \fB$DLINKCOM\fR, \fB$DLINKFLAGPREFIX\fR, \fB$DLINKFLAGS\fR, \fB$DLINKFLAGSUFFIX\fR, \fB$DPATH\fR, \fB$DRPATHPREFIX\fR, \fB$DRPATHSUFFIX\fR, \fB$DVERPREFIX\fR, \fB$DVERSIONS\fR, \fB$DVERSUFFIX\fR, \fB$SHDC\fR, \fB$SHDCOM\fR, \fB$SHDLIBVERSIONFLAGS\fR, \fB$SHDLINK\fR, \fB$SHDLINKCOM\fR, \fB$SHDLINKFLAGS\fR\&. .RE .PP lex .RS 4 متغیرهای ساخت را برای تحلیل‌گر لغوی lex تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$LEX\fR, \fB$LEXCOM\fR, \fB$LEXFLAGS\fR, \fB$LEXUNISTD\fR\&. .sp استفاده می‌کند: \fB$LEXCOMSTR\fR, \fB$LEXFLAGS\fR, \fB$LEX_HEADER_FILE\fR, \fB$LEX_TABLES_FILE\fR\&. .RE .PP link .RS 4 متغیرهای ساخت را برای پیونددهنده‌های عمومی POSIX تنظیم می‌کند\&. این یک ابزار پیونددهندهٔ «هوشمند» است که کامپایلر مناسب را بر اساس انواع فایل‌های منبع جهت تکمیل فرایند پیوند انتخاب می‌کند\&. .sp تنظیم می‌کند: \fB$LDMODULE\fR, \fB$LDMODULECOM\fR, \fB$LDMODULEFLAGS\fR, \fB$LDMODULENOVERSIONSYMLINKS\fR, \fB$LDMODULEPREFIX\fR, \fB$LDMODULESUFFIX\fR, \fB$LDMODULEVERSION\fR, \fB$LDMODULEVERSIONFLAGS\fR, \fB$LIBDIRPREFIX\fR, \fB$LIBDIRSUFFIX\fR, \fB$LIBLINKPREFIX\fR, \fB$LIBLINKSUFFIX\fR, \fB$LINK\fR, \fB$LINKCOM\fR, \fB$LINKFLAGS\fR, \fB$SHLIBSUFFIX\fR, \fB$SHLINK\fR, \fB$SHLINKCOM\fR, \fB$SHLINKFLAGS\fR, \fB$__LDMODULEVERSIONFLAGS\fR, \fB$__SHLIBVERSIONFLAGS\fR\&. .sp استفاده می‌کند: \fB$LDMODULECOMSTR\fR, \fB$LINKCOMSTR\fR, \fB$SHLINKCOMSTR\fR\&. .RE .PP linkloc .RS 4 متغیرهای ساخت را برای پیونددهندهٔ LinkLoc مربوط به سیستم‌عامل تعبیه‌شدهٔ Phar Lap ETS تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$LIBDIRPREFIX\fR, \fB$LIBDIRSUFFIX\fR, \fB$LIBLINKPREFIX\fR, \fB$LIBLINKSUFFIX\fR, \fB$LINK\fR, \fB$LINKCOM\fR, \fB$LINKFLAGS\fR, \fB$SHLINK\fR, \fB$SHLINKCOM\fR, \fB$SHLINKFLAGS\fR\&. .sp استفاده می‌کند: \fB$LINKCOMSTR\fR, \fB$SHLINKCOMSTR\fR\&. .RE .PP m4 .RS 4 متغیرهای ساخت را برای پردازندهٔ ماکروی m4 تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$M4\fR, \fB$M4COM\fR, \fB$M4FLAGS\fR\&. .sp استفاده می‌کند: \fB$M4COMSTR\fR\&. .RE .PP masm .RS 4 متغیرهای ساخت را برای اسمبلر Microsoft تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$AS\fR, \fB$ASCOM\fR, \fB$ASFLAGS\fR, \fB$ASPPCOM\fR, \fB$ASPPFLAGS\fR\&. .sp استفاده می‌کند: \fB$ASCOMSTR\fR, \fB$ASPPCOMSTR\fR, \fB$CPPFLAGS\fR, \fB$_CPPDEFFLAGS\fR, \fB$_CPPINCFLAGS\fR\&. .RE .PP midl .RS 4 متغیرهای ساخت را برای کامپایلر Microsoft IDL تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$MIDL\fR, \fB$MIDLCOM\fR, \fB$MIDLFLAGS\fR\&. .sp استفاده می‌کند: \fB$MIDLCOMSTR\fR\&. .RE .PP mingw .RS 4 متغیرهای ساخت را برای MinGW (Minimal Gnu on Windows) تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$AS\fR, \fB$CC\fR, \fB$CXX\fR, \fB$LDMODULECOM\fR, \fB$LIBPREFIX\fR, \fB$LIBSUFFIX\fR, \fB$OBJSUFFIX\fR, \fB$RC\fR, \fB$RCCOM\fR, \fB$RCFLAGS\fR, \fB$RCINCFLAGS\fR, \fB$RCINCPREFIX\fR, \fB$RCINCSUFFIX\fR, \fB$SHCCFLAGS\fR, \fB$SHCXXFLAGS\fR, \fB$SHLINKCOM\fR, \fB$SHLINKFLAGS\fR, \fB$SHOBJSUFFIX\fR, \fB$WINDOWSDEFPREFIX\fR, \fB$WINDOWSDEFSUFFIX\fR\&. .sp استفاده می‌کند: \fB$RCCOMSTR\fR, \fB$SHLINKCOMSTR\fR\&. .RE .PP msgfmt .RS 4 این ابزار بخشی از مجموعه ابزار gettext است\&. این ابزار از طریق برپاسازی سازندهٔ \fBMOFiles\fR که فایل‌های دودویی کاتالوگ پیام (MO) را از توصیف متنی ترجمه (فایل‌های PO) تولید می‌کند، یک رابط به دستور \fBmsgfmt(1)\fR برای SCons فراهم می‌آورد\&. .sp تنظیم می‌کند: \fB$MOSUFFIX\fR, \fB$MSGFMT\fR, \fB$MSGFMTCOM\fR, \fB$MSGFMTCOMSTR\fR, \fB$MSGFMTFLAGS\fR, \fB$POSUFFIX\fR\&. .sp استفاده می‌کند: \fB$LINGUAS_FILE\fR\&. .RE .PP msginit .RS 4 این ابزار بخشی از مجموعه ابزار gettext در scons است\&. این ابزار از طریق برپاسازی سازندهٔ \fBPOInit\fR که یک فایل PO جدید ایجاد کرده و اطلاعات فراداده را با مقادیر برگرفته از محیط ساخت (یا گزینه‌ها) مقداردهی اولیه می‌کند، یک رابط به برنامهٔ \fBmsginit(1)\fR برای SCons فراهم می‌آورد\&. .sp تنظیم می‌کند: \fB$MSGINIT\fR, \fB$MSGINITCOM\fR, \fB$MSGINITCOMSTR\fR, \fB$MSGINITFLAGS\fR, \fB$POAUTOINIT\fR, \fB$POCREATE_ALIAS\fR, \fB$POSUFFIX\fR, \fB$POTSUFFIX\fR, \fB$_MSGINITLOCALE\fR\&. .sp استفاده می‌کند: \fB$LINGUAS_FILE\fR, \fB$POAUTOINIT\fR, \fB$POTDOMAIN\fR\&. .RE .PP msgmerge .RS 4 این ابزار بخشی از مجموعه ابزار gettext در scons است\&. این ابزار با برپاسازی سازندهٔ \fBPOUpdate\fR که دو فایل \&.po به سبک یکنواخت (Uniform) را با یکدیگر ادغام می‌کند، یک رابط به دستور \fBmsgmerge(1)\fR برای SCons فراهم می‌آورد\&. .sp تنظیم می‌کند: \fB$MSGMERGE\fR, \fB$MSGMERGECOM\fR, \fB$MSGMERGECOMSTR\fR, \fB$MSGMERGEFLAGS\fR, \fB$POSUFFIX\fR, \fB$POTSUFFIX\fR, \fB$POUPDATE_ALIAS\fR\&. .sp استفاده می‌کند: \fB$LINGUAS_FILE\fR, \fB$POAUTOINIT\fR, \fB$POTDOMAIN\fR\&. .RE .PP mslib .RS 4 متغیرهای ساخت را برای آرشیوکنندهٔ کتابخانهٔ Microsoft mslib تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$AR\fR, \fB$ARCOM\fR, \fB$ARFLAGS\fR, \fB$LIBPREFIX\fR, \fB$LIBSUFFIX\fR\&. .sp استفاده می‌کند: \fB$ARCOMSTR\fR\&. .RE .PP mslink .RS 4 متغیرهای ساخت را برای پیونددهندهٔ Microsoft تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$LDMODULE\fR, \fB$LDMODULECOM\fR, \fB$LDMODULEFLAGS\fR, \fB$LDMODULEPREFIX\fR, \fB$LDMODULESUFFIX\fR, \fB$LIBDIRPREFIX\fR, \fB$LIBDIRSUFFIX\fR, \fB$LIBLINKPREFIX\fR, \fB$LIBLINKSUFFIX\fR, \fB$LINK\fR, \fB$LINKCOM\fR, \fB$LINKFLAGS\fR, \fB$REGSVR\fR, \fB$REGSVRCOM\fR, \fB$REGSVRFLAGS\fR, \fB$SHLINK\fR, \fB$SHLINKCOM\fR, \fB$SHLINKFLAGS\fR, \fB$WINDOWSDEFPREFIX\fR, \fB$WINDOWSDEFSUFFIX\fR, \fB$WINDOWSEXPPREFIX\fR, \fB$WINDOWSEXPSUFFIX\fR, \fB$WINDOWSPROGMANIFESTPREFIX\fR, \fB$WINDOWSPROGMANIFESTSUFFIX\fR, \fB$WINDOWSSHLIBMANIFESTPREFIX\fR, \fB$WINDOWSSHLIBMANIFESTSUFFIX\fR, \fB$WINDOWS_INSERT_DEF\fR\&. .sp استفاده می‌کند: \fB$LDMODULECOMSTR\fR, \fB$LINKCOMSTR\fR, \fB$REGSVRCOMSTR\fR, \fB$SHLINKCOMSTR\fR\&. .RE .PP mssdk .RS 4 متغیرها را برای Microsoft Platform SDK و/یا Windows SDK تنظیم می‌کند\&. توجه داشته باشید که برخلاف بیشتر پودمان‌های دیگر Tool، ابزار mssdk متغیرهای ساخت را تنظیم نمی‌کند، بلکه \fIمتغیرهای محیطی\fR را در محیطی که SCons برای اجرای زنجیره ابزار Microsoft استفاده می‌کند، تنظیم می‌نماید: %INCLUDE%, %LIB%, %LIBPATH% و %PATH%\&. .sp استفاده می‌کند: \fB$MSSDK_DIR\fR, \fB$MSSDK_VERSION\fR, \fB$MSVS_VERSION\fR\&. .RE .PP msvc .RS 4 متغیرهای ساخت را برای کامپایلر Microsoft Visual C++ تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$BUILDERS\fR, \fB$CC\fR, \fB$CCCOM\fR, \fB$CCDEPFLAGS\fR, \fB$CCFLAGS\fR, \fB$CCPCHFLAGS\fR, \fB$CCPDBFLAGS\fR, \fB$CFILESUFFIX\fR, \fB$CFLAGS\fR, \fB$CPPDEFPREFIX\fR, \fB$CPPDEFSUFFIX\fR, \fB$CXX\fR, \fB$CXXCOM\fR, \fB$CXXFILESUFFIX\fR, \fB$CXXFLAGS\fR, \fB$INCPREFIX\fR, \fB$INCSUFFIX\fR, \fB$OBJPREFIX\fR, \fB$OBJSUFFIX\fR, \fB$PCHCOM\fR, \fB$PCHPDBFLAGS\fR, \fB$RC\fR, \fB$RCCOM\fR, \fB$RCFLAGS\fR, \fB$SHCC\fR, \fB$SHCCCOM\fR, \fB$SHCCFLAGS\fR, \fB$SHCFLAGS\fR, \fB$SHCXX\fR, \fB$SHCXXCOM\fR, \fB$SHCXXFLAGS\fR, \fB$SHOBJPREFIX\fR, \fB$SHOBJSUFFIX\fR\&. .sp استفاده می‌کند از: \fB$CCCOMSTR\fR, \fB$CXXCOMSTR\fR, \fB$MSVC_NOTFOUND_POLICY\fR, \fB$MSVC_SCRIPTERROR_POLICY\fR, \fB$MSVC_SCRIPT_ARGS\fR, \fB$MSVC_SDK_VERSION\fR, \fB$MSVC_SPECTRE_LIBS\fR, \fB$MSVC_TOOLSET_VERSION\fR, \fB$MSVC_USE_SCRIPT\fR, \fB$MSVC_USE_SCRIPT_ARGS\fR, \fB$MSVC_USE_SETTINGS\fR, \fB$MSVC_VERSION\fR, \fB$PCH\fR, \fB$PCHSTOP\fR, \fB$PDB\fR, \fB$SHCCCOMSTR\fR, \fB$SHCXXCOMSTR\fR\&. .RE .PP msvs .RS 4 متغیرهای ساخت را برای Microsoft Visual Studio تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$MSVSBUILDCOM\fR, \fB$MSVSCLEANCOM\fR, \fB$MSVSENCODING\fR, \fB$MSVSPROJECTCOM\fR, \fB$MSVSREBUILDCOM\fR, \fB$MSVSSCONS\fR, \fB$MSVSSCONSCOM\fR, \fB$MSVSSCONSCRIPT\fR, \fB$MSVSSCONSFLAGS\fR, \fB$MSVSSOLUTIONCOM\fR\&. .RE .PP mwcc .RS 4 متغیرهای ساخت را برای کامپایلر Metrowerks CodeWarrior تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$CC\fR, \fB$CCCOM\fR, \fB$CFILESUFFIX\fR, \fB$CPPDEFPREFIX\fR, \fB$CPPDEFSUFFIX\fR, \fB$CXX\fR, \fB$CXXCOM\fR, \fB$CXXFILESUFFIX\fR, \fB$INCPREFIX\fR, \fB$INCSUFFIX\fR, \fB$MWCW_VERSION\fR, \fB$MWCW_VERSIONS\fR, \fB$SHCC\fR, \fB$SHCCCOM\fR, \fB$SHCCFLAGS\fR, \fB$SHCFLAGS\fR, \fB$SHCXX\fR, \fB$SHCXXCOM\fR, \fB$SHCXXFLAGS\fR\&. .sp استفاده می‌کند از: \fB$CCCOMSTR\fR, \fB$CXXCOMSTR\fR, \fB$SHCCCOMSTR\fR, \fB$SHCXXCOMSTR\fR\&. .RE .PP mwld .RS 4 متغیرهای ساخت را برای پیونددهنده Metrowerks CodeWarrior تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$AR\fR, \fB$ARCOM\fR, \fB$LIBDIRPREFIX\fR, \fB$LIBDIRSUFFIX\fR, \fB$LIBLINKPREFIX\fR, \fB$LIBLINKSUFFIX\fR, \fB$LINK\fR, \fB$LINKCOM\fR, \fB$SHLINK\fR, \fB$SHLINKCOM\fR, \fB$SHLINKFLAGS\fR\&. .RE .PP nasm .RS 4 متغیرهای ساخت را برای اسمبلر nasm Netwide Assembler تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$AS\fR, \fB$ASCOM\fR, \fB$ASFLAGS\fR, \fB$ASPPCOM\fR, \fB$ASPPFLAGS\fR\&. .sp استفاده می‌کند از: \fB$ASCOMSTR\fR, \fB$ASPPCOMSTR\fR\&. .RE .PP ninja .RS 4 سازنده \fBNinja\fR را برپا می‌کند، که یک فایل ساخت ninja تولید کرده و سپس در صورت تمایل ninja را اجرا می‌کند\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBنکته\fR .ps -1 .br این یک قابلیت آزمایشی است\&. این عملکرد ممکن است بدون طی چرخه منسوخ‌سازی دستخوش تغییر و/یا حذف شود\&. .sp .5v .RE تنظیم می‌کند: \fB$IMPLICIT_COMMAND_DEPENDENCIES\fR, \fB$NINJA_ALIAS_NAME\fR, \fB$NINJA_CMD_ARGS\fR, \fB$NINJA_COMPDB_EXPAND\fR, \fB$NINJA_DEPFILE_PARSE_FORMAT\fR, \fB$NINJA_DIR\fR, \fB$NINJA_DISABLE_AUTO_RUN\fR, \fB$NINJA_ENV_VAR_CACHE\fR, \fB$NINJA_FILE_NAME\fR, \fB$NINJA_FORCE_SCONS_BUILD\fR, \fB$NINJA_GENERATED_SOURCE_ALIAS_NAME\fR, \fB$NINJA_GENERATED_SOURCE_SUFFIXES\fR, \fB$NINJA_MSVC_DEPS_PREFIX\fR, \fB$NINJA_POOL\fR, \fB$NINJA_REGENERATE_DEPS\fR, \fB$NINJA_SCONS_DAEMON_KEEP_ALIVE\fR, \fB$NINJA_SCONS_DAEMON_PORT\fR, \fB$NINJA_SYNTAX\fR, \fB$_NINJA_REGENERATE_DEPS_FUNC\fR\&. .sp استفاده می‌کند: \fB$AR\fR, \fB$ARCOM\fR, \fB$ARFLAGS\fR, \fB$CC\fR, \fB$CCCOM\fR, \fB$CCDEPFLAGS\fR, \fB$CCFLAGS\fR, \fB$CXX\fR, \fB$CXXCOM\fR, \fB$ESCAPE\fR, \fB$LINK\fR, \fB$LINKCOM\fR, \fB$PLATFORM\fR, \fB$PRINT_CMD_LINE_FUNC\fR, \fB$PROGSUFFIX\fR, \fB$RANLIB\fR, \fB$RANLIBCOM\fR, \fB$SHCCCOM\fR, \fB$SHCXXCOM\fR, \fB$SHLINK\fR, \fB$SHLINKCOM\fR\&. .RE .PP packaging .RS 4 متغیرهای ساخت را برای سازنده \fBPackage\fR مقداردهی می‌کند\&. در صورت فعال بودن این ابزار، گزینه خط فرمان \fB\-\-package\-type\fR در دسترس قرار می‌گیرد\&. .RE .PP pdf .RS 4 متغیرهای ساخت را برای سازنده Portable Document Format مقداردهی می‌کند\&. .sp تنظیم می‌کند: \fB$PDFPREFIX\fR, \fB$PDFSUFFIX\fR\&. .RE .PP pdflatex .RS 4 متغیرهای ساخت را برای ابزار pdflatex مقداردهی می‌کند\&. .sp تنظیم می‌کند: \fB$LATEXRETRIES\fR, \fB$PDFLATEX\fR, \fB$PDFLATEXCOM\fR, \fB$PDFLATEXFLAGS\fR\&. .sp استفاده می‌کند: \fB$PDFLATEXCOMSTR\fR\&. .RE .PP pdftex .RS 4 متغیرهای ساخت را برای ابزار pdftex مقداردهی می‌کند\&. .sp تنظیم می‌کند: \fB$LATEXRETRIES\fR, \fB$PDFLATEX\fR, \fB$PDFLATEXCOM\fR, \fB$PDFLATEXFLAGS\fR, \fB$PDFTEX\fR, \fB$PDFTEXCOM\fR, \fB$PDFTEXFLAGS\fR\&. .sp استفاده می‌کند: \fB$PDFLATEXCOMSTR\fR, \fB$PDFTEXCOMSTR\fR\&. .RE .PP python .RS 4 پویشگر منبع Python را در محیط فراخواننده بارگذاری می‌کند\&. پس از بارگذاری، این پویشگر تلاش خواهد کرد تا وابستگی‌های ضمنی را برای هر یک از فایل‌های منبع Python موجود در فهرست منابع ارائه‌شده به یک Action که از این محیط استفاده می‌کند، بیابد\&. .sp \fIدر دسترس از \fR\fI\fBscons\fR\fR\fI 4\&.0 به بعد\&.\fR\&. .RE .PP rmic .RS 4 متغیرهای ساخت را برای ابزار rmic مقداردهی می‌کند\&. .sp تنظیم می‌کند: \fB$JAVACLASSSUFFIX\fR, \fB$RMIC\fR, \fB$RMICCOM\fR, \fB$RMICFLAGS\fR\&. .sp استفاده می‌کند: \fB$RMICCOMSTR\fR\&. .RE .PP rpcgen .RS 4 متغیرهای ساخت را برای ساخت با RPCGEN مقداردهی می‌کند\&. .sp تنظیم می‌کند: \fB$RPCGEN\fR, \fB$RPCGENCLIENTFLAGS\fR, \fB$RPCGENFLAGS\fR, \fB$RPCGENHEADERFLAGS\fR, \fB$RPCGENSERVICEFLAGS\fR, \fB$RPCGENXDRFLAGS\fR\&. .RE .PP sgiar .RS 4 متغیرهای ساخت را برای بایگان کتابخانه SGI تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$AR\fR, \fB$ARCOMSTR\fR, \fB$ARFLAGS\fR, \fB$LIBPREFIX\fR, \fB$LIBSUFFIX\fR, \fB$SHLINK\fR, \fB$SHLINKFLAGS\fR\&. .sp استفاده می‌کند: \fB$ARCOMSTR\fR, \fB$SHLINKCOMSTR\fR\&. .RE .PP sgic++ .RS 4 متغیرهای ساخت را برای کامپایلر C++ SGI تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$CXX\fR, \fB$CXXFLAGS\fR, \fB$SHCXX\fR, \fB$SHOBJSUFFIX\fR\&. .RE .PP sgicc .RS 4 متغیرهای ساخت را برای کامپایلر C SGI تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$CXX\fR, \fB$SHOBJSUFFIX\fR\&. .RE .PP sgilink .RS 4 متغیرهای ساخت را برای پیونددهنده SGI تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$LINK\fR, \fB$RPATHPREFIX\fR, \fB$RPATHSUFFIX\fR, \fB$SHLINKFLAGS\fR\&. .RE .PP sunar .RS 4 متغیرهای ساخت را برای بایگان کتابخانه Sun تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$AR\fR, \fB$ARCOM\fR, \fB$ARFLAGS\fR, \fB$LIBPREFIX\fR, \fB$LIBSUFFIX\fR\&. .sp استفاده می‌کند: \fB$ARCOMSTR\fR\&. .RE .PP sunc++ .RS 4 متغیرهای ساخت را برای کامپایلر C++ Sun تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$CXX\fR, \fB$CXXVERSION\fR, \fB$SHCXX\fR, \fB$SHCXXFLAGS\fR, \fB$SHOBJPREFIX\fR, \fB$SHOBJSUFFIX\fR\&. .RE .PP suncc .RS 4 متغیرهای ساخت را برای کامپایلر C Sun تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$CXX\fR, \fB$SHCCFLAGS\fR, \fB$SHOBJPREFIX\fR, \fB$SHOBJSUFFIX\fR\&. .RE .PP sunf77 .RS 4 متغیرهای ساخت را برای کامپایلر Fortran f77 Sun تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$F77\fR, \fB$FORTRAN\fR, \fB$SHF77\fR, \fB$SHF77FLAGS\fR, \fB$SHFORTRAN\fR, \fB$SHFORTRANFLAGS\fR\&. .RE .PP sunf90 .RS 4 متغیرهای ساخت را برای کامپایلر Fortran f90 Sun تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$F90\fR, \fB$FORTRAN\fR, \fB$SHF90\fR, \fB$SHF90FLAGS\fR, \fB$SHFORTRAN\fR, \fB$SHFORTRANFLAGS\fR\&. .RE .PP sunf95 .RS 4 متغیرهای ساخت را برای کامپایلر Fortran f95 Sun تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$F95\fR, \fB$FORTRAN\fR, \fB$SHF95\fR, \fB$SHF95FLAGS\fR, \fB$SHFORTRAN\fR, \fB$SHFORTRANFLAGS\fR\&. .RE .PP sunlink .RS 4 متغیرهای ساخت را برای پیونددهنده Sun تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$RPATHPREFIX\fR, \fB$RPATHSUFFIX\fR, \fB$SHLINKFLAGS\fR\&. .RE .PP swig .RS 4 متغیرهای ساخت را برای کامپایلر رابط SWIG تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$SWIG\fR, \fB$SWIGCFILESUFFIX\fR, \fB$SWIGCOM\fR, \fB$SWIGCXXFILESUFFIX\fR, \fB$SWIGDIRECTORSUFFIX\fR, \fB$SWIGFLAGS\fR, \fB$SWIGINCPREFIX\fR, \fB$SWIGINCSUFFIX\fR, \fB$SWIGPATH\fR, \fB$SWIGVERSION\fR, \fB$_SWIGINCFLAGS\fR\&. .sp استفاده می‌کند: \fB$SWIGCOMSTR\fR\&. .RE .PP tar .RS 4 متغیرهای ساخت را برای آرشیوگر tar تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$TAR\fR, \fB$TARCOM\fR, \fB$TARFLAGS\fR, \fB$TARSUFFIX\fR\&. .sp استفاده می‌کند: \fB$TARCOMSTR\fR\&. .RE .PP tex .RS 4 متغیرهای ساخت را برای قالب‌بند و حروف‌چین TeX تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$BIBTEX\fR, \fB$BIBTEXCOM\fR, \fB$BIBTEXFLAGS\fR, \fB$LATEX\fR, \fB$LATEXCOM\fR, \fB$LATEXFLAGS\fR, \fB$MAKEINDEX\fR, \fB$MAKEINDEXCOM\fR, \fB$MAKEINDEXFLAGS\fR, \fB$TEX\fR, \fB$TEXCOM\fR, \fB$TEXFLAGS\fR\&. .sp استفاده می‌کند: \fB$BIBTEXCOMSTR\fR, \fB$LATEXCOMSTR\fR, \fB$MAKEINDEXCOMSTR\fR, \fB$TEXCOMSTR\fR\&. .RE .PP textfile .RS 4 متغیرهای ساخت را برای سازنده‌های \fBTextfile\fR و \fBSubstfile\fR تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$FILE_ENCODING\fR, \fB$LINESEPARATOR\fR, \fB$SUBSTFILEPREFIX\fR, \fB$SUBSTFILESUFFIX\fR, \fB$TEXTFILEPREFIX\fR, \fB$TEXTFILESUFFIX\fR\&. .sp استفاده می‌کند: \fB$SUBST_DICT\fR\&. .RE .PP tlib .RS 4 متغیرهای ساخت را برای آرشیوگر کتابخانه tlib متعلق به Borland تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$AR\fR, \fB$ARCOM\fR, \fB$ARFLAGS\fR, \fB$LIBPREFIX\fR, \fB$LIBSUFFIX\fR\&. .sp استفاده می‌کند: \fB$ARCOMSTR\fR\&. .RE .PP xgettext .RS 4 این ابزار بخشی از مجموعه ابزار gettext است\&. این ابزار رابطی بین SCons و برنامه \fBxgettext(1)\fR فراهم می‌کند که پیام‌های بین‌المللی‌سازی‌شده را از کد منبع استخراج می‌نماید\&. این ابزار سازنده \fBPOTUpdate\fR را جهت ساخت فایل‌های \fITemplate\fR (الگو) PO برپا می‌کند\&. .sp تنظیم می‌کند: \fB$POTSUFFIX\fR, \fB$POTUPDATE_ALIAS\fR, \fB$XGETTEXTCOM\fR, \fB$XGETTEXTCOMSTR\fR, \fB$XGETTEXTFLAGS\fR, \fB$XGETTEXTFROM\fR, \fB$XGETTEXTFROMPREFIX\fR, \fB$XGETTEXTFROMSUFFIX\fR, \fB$XGETTEXTPATH\fR, \fB$XGETTEXTPATHPREFIX\fR, \fB$XGETTEXTPATHSUFFIX\fR, \fB$_XGETTEXTDOMAIN\fR, \fB$_XGETTEXTFROMFLAGS\fR, \fB$_XGETTEXTPATHFLAGS\fR\&. .sp استفاده می‌کند: \fB$POTDOMAIN\fR\&. .RE .PP yacc .RS 4 متغیرهای ساخت را برای مولد تجزیه‌کننده yacc تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$YACC\fR, \fB$YACCCOM\fR, \fB$YACCFLAGS\fR, \fB$YACCHFILESUFFIX\fR, \fB$YACCHXXFILESUFFIX\fR, \fB$YACCVCGFILESUFFIX\fR, \fB$YACC_GRAPH_FILE_SUFFIX\fR\&. .sp استفاده می‌کند: \fB$YACCCOMSTR\fR, \fB$YACCFLAGS\fR, \fB$YACC_GRAPH_FILE\fR, \fB$YACC_HEADER_FILE\fR\&. .RE .PP zip .RS 4 متغیرهای ساخت را برای آرشیوگر zip تنظیم می‌کند\&. .sp تنظیم می‌کند: \fB$ZIP\fR, \fB$ZIPCOM\fR, \fB$ZIPCOMPRESSION\fR, \fB$ZIPFLAGS\fR, \fB$ZIPSUFFIX\fR\&. .sp استفاده می‌کند: \fB$ZIPCOMSTR\fR\&. .RE .SS "متدهای سازنده (Builder Methods)" .PP متدهای سازنده (Builder methods) توابع ویژه‌ای هستند که برای اعلان روابط در گراف وابستگی ساخت استفاده می‌شوند\&. فراخوانی یک Builder مستقیماً چیزی را نمی‌سازد، بلکه هدف یا اهداف (آنچه می‌خواهید ساخته شود)، منابع (آنچه هدف از آن ساخته می‌شود) و محیط ساخت (construction environment) مورد استفاده برای تنظیمات ساخت را ثبت می‌کند\&. خود سازنده نیز معمولاً اطلاعاتی در مورد نحوه تولید اهداف دارد که مورد استفاده قرار می‌گیرد، به جز \fBCommand\fR که در آن فراخواننده مسئول تعیین عمل (action) است\&. مجری کارهای SCons بعداً با استفاده از این اطلاعات تصمیم می‌گیرد که آیا و چه زمانی ساخت را آغاز کند\&. .PP تمام متدهای واقعی Builder از قواعد نحوی یکسانی برای فراخوانی تابع استفاده می‌کنند\&. به منظور اختصار، این امضای مشترک در فهرست Builders گنجانده نشده است\&. شبه‌سازنده‌ها (Pseudo\-Builders) انعطاف‌پذیری بیشتری در نحوه فراخوانی دارند و لزوماً از این قاعده پیروی نمی‌کنند، همان‌طور که در متن مدخل‌های مربوط به آن‌ها شرح داده شده است\&. .sp .if n \{\ .RS 4 .\} .nf \fBBuildername\fR(\fItarget, source, [key=val, \&.\&.\&.]\fR) .fi .if n \{\ .RE .\} .PP آرگومان‌های \fItarget\fR و \fIsource\fR می‌توانند به صورت آرگومان‌های مکانی یا کلیدواژه‌ای مشخص شوند\&. برخی آرگومان‌های کلیدواژه‌ای اضافی برای همه سازنده‌ها شناخته شده هستند، و هر آرگومان کلیدواژه‌ای ناشناخته به عنوان تخصیص موقت متغیر ساخت (construction variable) در نظر گرفته می‌شود\&. شما می‌توانید منابع و اهداف را به صورت یک اسکالر یا یک لیست، متشکل از رشته‌ها یا Nodeها مشخص کنید\&. برای راحتی، متد \fBSplit\fR می‌تواند برای تقسیم یک رشته جدا شده با فاصله‌های سفید (whitespace) به یک لیست استفاده شود\&. .PP SCons می‌تواند مسیرهای منابع و اهداف مشخص‌شده را در چندین قالب مختلف حل (resolve) کند\&. آرگومان‌های \fItarget\fR و \fIsource\fR می‌توانند اسکالر (رشته یا Node) یا مجموعه‌ای (از رشته‌ها یا Nodeها) باشند\&. .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Nodeها همیشه کار می‌کنند، زیرا نتیجه یک تفکیک مسیر موفق قبلی هستند؛ اگر یک رشته مسیر به درستی حل شود، به صورت داخلی به عنوان یک Node در گراف وابستگی ذخیره می‌شود\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} نام‌های ساده فایل (بدون جداکننده‌های مسیر) در دایرکتوری جاری جستجو می‌شوند\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} مسیرهای مطلق (که با یک جداکننده مسیر آغاز می‌شوند) با پیمایش اجزای مسیر با شروع از ریشه سیستم‌فایل یا درایو (volume) جاری حل می‌شوند\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} مسیرهای نسبی (بدون جداکننده مسیر در ابتدا) با پیمایش اجزای مسیر با شروع از دایرکتوری جاری حل می‌شوند\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} مسیرهای نسبی به شاخه اصلی (Top\-relative paths) مسیرهای نسبی‌ای هستند که نویسه اول آن‌ها \fB#\fR است\&. آن‌ها با شروع از دایرکتوری سطح بالای پروژه (معمولاً دایرکتوری که فایل SConstruct در آن یافت می‌شود) پیمایش می‌شوند\&. این مسیرها همواره مسیرهایی نسبی هستند، بنابراین نویسه اولیه می‌تواند با یک جداکننده مسیر دنبال شود، که البته نادیده گرفته می‌شود و تاثیری بر حل مسیر ندارد\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} مسیرهای UNC (در Windows) دقیقاً با دو جداکننده مسیر آغاز می‌شوند\&. آن‌ها ساختاری به شکل \e\eserver_name\eshare_name\efile_path دارند\&. بخش \fIfile_path\fR به عنوان یک مسیر مطلق با شروع از ریشه منبع توصیف‌شده توسط \e\eserver_name\eshare_name جستجو می‌شود\&. از آنجا که مسیرهای UNC هرگز نسبی نیستند، قالب مسیرهای نسبی به شاخه اصلی روی آن‌ها اعمال نمی‌شود\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} رشته‌های به سبک URL و شیء‌های pathlib در Python شناسایی نمی‌شوند\&. .RE .PP «دایرکتوری جاری» برای تفکیک مسیر نسبی دارای گزینه‌هایی است\&. SCons به طور پیش‌فرض به دایرکتوری حاوی فایل SConscript (شامل SConstruct) که در حال حاضر مشغول پردازش آن است تغییر مکان می‌دهد\&. استفاده از تابع \fBSConscriptChdir\fR این رفتار پیش‌فرض را فعال یا غیرفعال می‌کند\&. آرگومان \fIsrcdir\fR در سازنده بر محلی که مسیرهای فایل مبدأ در آن جستجو می‌شوند تاثیر می‌گذارد (جزئیات را در ادامه ببینید)\&. تعیین یک یا چند مخزن کد منبع از طریق تابع \fBRepository\fR یا گزینه \fB\-Y/\-\-repository\fR به SCons اعلام می‌کند که پس از دایرکتوری جاری واقعی، مکان‌های دیگری را نیز جستجو کند\&. مفهوم دایرکتوری جاری برای اهداف (و در برخی موارد منابع) تغییر می‌کند اگر یک دایرکتوری متغیر با استفاده از تابع \fBVariantDir\fR یا پارامتر \fIvariant_dir=\fR در تابع \fBSConscript\fR تنظیم شده باشد\&. این گزینه‌ها روی مسیرهای نسبی به شاخه اصلی تاثیری ندارند\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBنکته\fR .ps -1 .br .PP در Windows، مسیرهای DOS ممکن است با یک شناسهٔ بخش (volume) یا حرف درایو و به دنبال آن جداکنندهٔ بخش (:) آغاز شوند\&. ادامهٔ مسیر مطلق یا نسبی است؛ اگر مشخص‌کنندهٔ بخش وجود داشته باشد، تفکیک برای مسیرهای مطلق از ریشهٔ درایو مشخص‌شده و برای مسیرهای نسبی از دایرکتوری جاری در درایو مشخص‌شده آغاز می‌شود\&. اگر حرف درایو مشخص‌شده با درایو جاری متفاوت باشد، مسیر نسبی فاقد زمینه (context) خواهد بود: از آنجا که SCons یک برنامهٔ کنسولی (خط فرمانی) است، ممکن است وضعیت را از ترمینالی که در آن اجرا شده به ارث ببرد، از جمله دایرکتوری‌های جاری ذخیره‌شده برای سایر درایوها؛ SCons هیچ راهی برای دانستن آن‌ها ندارد\&. استفاده از حرف درایو در مسیر همچنین مانع از استفاده از شکل وابسته به ریشه (top\-relative) می‌شود\&. .sp .5v .RE .PP موارد زیر نمونه‌های معادل از فراخوانی متد سازندهٔ \fBProgram\fR هستند: .sp .if n \{\ .RS 4 .\} .nf env\&.Program(\*(Aqbar\*(Aq, [\*(Aqbar\&.c\*(Aq, \*(Aqfoo\&.c\*(Aq]) env\&.Program(\*(Aqbar\*(Aq, Split(\*(Aqbar\&.c foo\&.c\*(Aq)) env\&.Program(\*(Aqbar\*(Aq, env\&.Split(\*(Aqbar\&.c foo\&.c\*(Aq)) env\&.Program(source=[\*(Aqbar\&.c\*(Aq, \*(Aqfoo\&.c\*(Aq], target=\*(Aqbar\*(Aq) env\&.Program(target=\*(Aqbar\*(Aq, source=Split(\*(Aqbar\&.c foo\&.c\*(Aq)) env\&.Program(target=\*(Aqbar\*(Aq, source=env\&.Split(\*(Aqbar\&.c foo\&.c\*(Aq)) env\&.Program(\*(Aqbar\*(Aq, source=\*(Aqbar\&.c foo\&.c\*(Aq\&.split()) .fi .if n \{\ .RE .\} .PP نمونه‌های دیگری از مسیرهای مبدأ و هدف: .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBنکته\fR .ps -1 .br .PP مسیرهای وابسته به ریشه فقط در جاهایی کار می‌کنند که SCons مسیر را تفسیر کند (به نمونه‌ها رجوع کنید)\&. این رشته برای استفاده در زمینه‌های دیگر (مانند کد خالص Python که شامل فراخوانی API متعلق به SCons نمی‌شود)، ابتدا باید به یک مسیر نسبی یا مطلق تبدیل شود؛ یک رشتهٔ مناسب را می‌توان از Node ایجادشده از یک مسیر وابسته به ریشه استخراج کرد\&. علاوه بر این، برخی مسیرها توسط SCons مدیریت می‌شوند اما مستقیماً در ساخت مشارکت ندارند، بنابراین به دلیل عدم ایجاد Node، برای # ارزیابی نمی‌شوند\&. می‌توانید صراحتاً یک گرهٔ \fBFile\fR یا \fBDir\fR برای اجبار به ارزیابی ایجاد کنید، مانند هنگام تعیین مسیری برای حافظهٔ نهان فایل‌های مشتق‌شده: CacheDir(Dir(\*(Aq#cache\*(Aq))\&. .sp .5v .RE .sp .if n \{\ .RS 4 .\} .nf # The comments describing the targets that will be built # assume these calls are in a SConscript file in the # a subdirectory named "subdir"\&. # Builds the program "subdir/foo" from "subdir/foo\&.c": env\&.Program(\*(Aqfoo\*(Aq, \*(Aqfoo\&.c\*(Aq) # Builds the program "/tmp/bar" from "subdir/bar\&.c": env\&.Program(\*(Aq/tmp/bar\*(Aq, \*(Aqbar\&.c\*(Aq) # An initial \*(Aq#\*(Aq or \*(Aq#/\*(Aq are equivalent; the following # calls build the programs "foo" and "bar" (in the # top\-level SConstruct directory) from "subdir/foo\&.c" and # "subdir/bar\&.c", respectively: env\&.Program(\*(Aq#foo\*(Aq, \*(Aqfoo\&.c\*(Aq) env\&.Program(\*(Aq#/bar\*(Aq, \*(Aqbar\&.c\*(Aq) # Builds the program "other/foo" (relative to the top\-level # SConstruct directory) from "subdir/foo\&.c": env\&.Program(\*(Aq#other/foo\*(Aq, \*(Aqfoo\&.c\*(Aq) # os\&.path\&.exists() is pure Python, so this fails: if os\&.path\&.exists(\*(Aq#inc/foo\&.h\*(Aq): env\&.Append(CPPPATH=\*(Aq#inc\*(Aq) # create a Node to make it work: if os\&.path\&.exists(File(\*(Aq#inc/foo\&.h\*(Aq)): env\&.Append(CPPPATH=\*(Aq#inc\*(Aq) .fi .if n \{\ .RE .\} .PP اگر SCons بتواند نام هدف را از مبدأ (یا مبدأها) استنتاج کند، آرگومان \fItarget\fR می‌تواند حذف شود\&. اگر سازنده (Builder) از آن پشتیبانی کند، SCons نام پایهٔ نخستین فایل مبدأ را گرفته و از آن به عنوان نام پایهٔ هدف استفاده می‌کند و پیشوند/پسوند مناسب را می‌افزاید\&. برای سازنده‌هایی که به عنوان تک‌مبدأ (single\-source) تعیین شده‌اند، یک هدف جداگانه برای هر فایل مبدأ ساخته می‌شود\&. اگر چندین مبدأ به یک سازندهٔ تک‌مبدأ ارسال شوند، آرگومان هدف \fIباید\fR حذف شود، و به هر هدف نامی استنتاج‌شده از فایل مبدأ متناظر اختصاص داده خواهد شد\&. .PP آرگومان کلیدی و اختیاری \fIsrcdir\fR مشخص می‌کند رشته‌های فایل مبدأ که مسیرهای مطلق یا وابسته به ریشه نیستند، به‌صورت نسبی نسبت به مقدار \fIsrcdir\fR تفسیر شوند\&. نمونهٔ زیر برنامهٔ build/prog (یا build/prog\&.exe در Windows) را از فایل‌های src/f1\&.c و src/f2\&.c می‌سازد، به‌جای اینکه آن‌ها را در دایرکتوریِ فایل SConscript در حال ارزیابی جستجو کند\&. .sp .if n \{\ .RS 4 .\} .nf env\&.Program(\*(Aqbuild/prog\*(Aq, [\*(Aqf1\&.c\*(Aq, \*(Aqf2\&.c\*(Aq], srcdir=\*(Aqsrc\*(Aq) .fi .if n \{\ .RE .\} .PP آرگومان کلیدی و اختیاری \fIparse_flags\fR رفتاری مشابه متد \fBenv\&.MergeFlags\fR ایجاد می‌کند، که در آن مقدار آرگومان به تنظیمات جداگانه تقسیم شده و در متغیرهای ساخت مربوطه ادغام می‌شود\&. نمونهٔ زیر \*(Aqinclude\*(Aq را به متغیر ساخت \fB$CPPPATH\fR، \*(AqEBUG\*(Aq را به \fB$CPPDEFINES\fR و \*(Aqm\*(Aq را به \fB$LIBS\fR اضافه می‌کند: .sp .if n \{\ .RS 4 .\} .nf env\&.Program(\*(Aqhello\*(Aq, \*(Aqhello\&.c\*(Aq, parse_flags=\*(Aq\-Iinclude \-DEBUG \-lm\*(Aq) .fi .if n \{\ .RE .\} .PP آرگومان کلیدواژه‌ای اختیاری \fIchdir\fR مشخص می‌کند که کنش(های) سازنده (Builder) باید پس از تغییر دایرکتوری اجرا شوند\&. اگر آرگومان \fIchdir\fR یک رشتهٔ مسیر یا یک Node دایرکتوری باشد، scons به دایرکتوری مشخص‌شده تغییر مکان خواهد داد\&. اگر \fIchdir\fR یک رشته یا Node نبوده و مقدار آن درست (true) ارزیابی شود، آن‌گاه \fBscons\fR به دایرکتوری فایل هدف تغییر مکان می‌دهد\&. پس از اتمام کنش، دایرکتوری اولیه بازیابی می‌شود\&. .sp .if n \{\ .RS 4 .\} .nf # scons پیش از اجرای تابع کنش Copy، به زیردایرکتوری "sub/dir" # تغییر مکان خواهد داد env\&.Command( target=\*(Aqsub/dir/foo\&.out\*(Aq, source=\*(Aqsub/dir/foo\&.in\*(Aq, action=Copy(\*(Aq${TARGET\&.file}\*(Aq, \*(Aq${SOURCE\&.file}\*(Aq), chdir=\*(Aqsub/dir\*(Aq, ) # در اینجا chdir رشته نیست، بنابراین scons برای اجرای کنش # به دایرکتوری هدف ("sub/dir") تغییر مکان خواهد داد\&. env\&.Command(\*(Aq target=\*(Aqsub/dir/foo\&.out\*(Aq, source=\*(Aqsub/dir/foo\&.in\*(Aq, action=Copy(\*(Aq${TARGET\&.file}\*(Aq, \*(Aq${SOURCE\&.file}\*(Aq), chdir=True ) .fi .if n \{\ .RE .\} .sp .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBهشدار\fR .ps -1 .br .PP Python تنها یک مکان دایرکتوری جاری را دنبال می‌کند، حتی اگر چندین ریسهٔ در حال اجرا وجود داشته باشد\&. این بدان معناست که استفاده از آرگومان \fIchdir\fR با SCons در حالت چندریسه‌ای (گزینهٔ \fB\-j\fR) کار \fIنخواهد\fR کرد، زیرا ریسه‌های کاری (worker threads) مجزایی که توسط SCons ایجاد می‌شوند، هنگام شروع به تغییر دایرکتوری با یکدیگر تداخل پیدا می‌کنند\&. .sp .5v .RE .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBنکته\fR .ps -1 .br .PP SCons هنگام بسط دادن متغیرهای ساخت (construction variables) مانند \fB$TARGET\fR و \fB$SOURCE\fR، \fIchdir\fR را در نظر نمی‌گیرد، بنابراین آن‌ها نسبت به دایرکتوری chdir نادرست خواهند بود\&. اگر از آرگومان کلیدواژه‌ای \fIchdir\fR استفاده کنید، معمولاً نیاز خواهید داشت که با استفاده از بسط‌هایی مانند ${TARGET\&.file} و ${SOURCE\&.file} که به بخش نام فایلِ هدف و منبع بسط می‌یابند، یک خط فرمان متفاوت مشخص کنید\&. .sp .5v .RE .PP آرگومان‌های کلیدواژه‌ای که به‌طور مشخص شناخته نشده‌اند، به عنوان جایگزین‌های متغیر ساخت (construction variable overrides) در نظر گرفته می‌شوند که آن متغیرها را به‌صورت محدود جایگزین کرده یا اضافه می‌کنند\&. این جایگزینی‌ها تنها هنگام ساخت هدفِ فراخوانی سازنده اِعمال خواهند شد و بر سایر بخش‌های ساخت تأثیری نخواهند داشت\&. برای نمونه، اگر می‌خواهید کتابخانه‌هایی را مشخص کنید که تنها مورد نیاز یک برنامه هستند: .sp .if n \{\ .RS 4 .\} .nf env\&.Program(\*(Aqhello\*(Aq, \*(Aqhello\&.c\*(Aq, LIBS=[\*(Aqgl\*(Aq, \*(Aqglut\*(Aq]) .fi .if n \{\ .RE .\} .PP یا تولید یک کتابخانهٔ اشتراکی با یک پسوند غیراستاندارد: .sp .if n \{\ .RS 4 .\} .nf env\&.SharedLibrary( target=\*(Aqword\*(Aq, source=\*(Aqword\&.cpp\*(Aq, SHLIBSUFFIX=\*(Aq\&.ocx\*(Aq, LIBSUFFIXES=[\*(Aq\&.ocx\*(Aq], ) .fi .if n \{\ .RE .\} .PP توجه داشته باشید که اگر می‌خواهید \fBscons\fR به‌طور خودکار وابستگی‌ها را برای نام‌های غیراستاندارد کتابخانه جستجو کند، باید هر دو متغیر ساخت \fB$SHLIBSUFFIX\fR و \fB$LIBSUFFIXES\fR تنظیم شده باشند؛ برای اطلاعات بیشتر، توضیحات این متغیرها را ببینید\&. .PP اگرچه متدهای سازندهٔ تعریف‌شده توسط \fBscons\fR در واقع متدهای یک شیء محیط ساخت (construction environment) هستند، اما بسیاری از آن‌ها را می‌توان بدون یک محیط صریح نیز فراخوانی کرد: .sp .if n \{\ .RS 4 .\} .nf Program(\*(Aqhello\*(Aq, \*(Aqhello\&.c\*(Aq) SharedLibrary(\*(Aqword\*(Aq, \*(Aqword\&.cpp\*(Aq) .fi .if n \{\ .RE .\} .PP اگر به این شیوه فراخوانی شود، سازنده (builder) به صورت داخلی از «محیط پیش‌فرض» (Default Environment) استفاده خواهد کرد که متشکل از ابزارها و مقادیری است که \fBscons\fR آن‌ها را برای سیستم محلی مناسب تشخیص داده است\&. .PP متدهای سازنده‌ای که می‌توانند بدون یک محیط صریح فراخوانی شوند (که در فهرست سازنده‌های زیر بدون پیشوند \fIenv\&.\fR مشخص شده‌اند) را می‌توان از ماژول‌های سفارشی Python که در یک فایل SConscript وارد (import) می‌کنید، با افزودن خطوط زیر به ماژول Python فراخوانی کرد: .sp .if n \{\ .RS 4 .\} .nf from SCons\&.Script import * .fi .if n \{\ .RE .\} .PP یک سازنده \fIممکن است\fR در صورتی که یک Emitter متصل تصمیم به این کار بگیرد، اهدافی اضافه بر اهداف درخواست‌شده بیافزاید (برای اطلاعات بیشتر بخش موسوم به \(lqBuilder Objects\(rq را ببینید؛ \fB$PROGEMITTER\fR یک نمونه است)\&. برای نمونه، پیونددهندهٔ GNU آرگومان خط فرمان \fB\-Map=\fR\fB\fImapfile\fR\fR را می‌پذیرد که باعث می‌شود علاوه بر فایل اجرایی در حال پیوند، یک فایل نگاشت پیونددهنده (linker map file) نیز تولید کند\&. اگر emitter سازندهٔ \fBProgram\fR به گونه‌ای پیکربندی شده باشد که در صورت تنظیم این گزینه، این mapfile را اضافه کند، آن‌گاه در حالی که شما تنها یک هدف مشخص کرده بودید، دو هدف بازگردانده خواهند شد\&. .PP به همین دلیل، متدهای سازنده همواره یک NodeList بازمی‌گردانند؛ شیئی شبیه به لیست که عناصر آن Nodeها هستند\&. گره‌ها (Nodes) بازنمایی داخلی اهداف ساخت یا منابع هستند (برای اطلاعات بیشتر بخش موسوم به \(lqNode Objects\(rq را ببینید)\&. شیء NodeList بازگردانده‌شده را می‌توان به‌عنوان منبع (source) به دیگر متدهای سازنده، یا به دیگر توابع یا متدهای SCons که در حالت عادی یک رشتهٔ مسیر می‌پذیرند، ارسال کرد\&. .PP برای نمونه، جهت افزودن یک تعریف پیش‌پردازندهٔ خاص هنگام کامپایل یک فایل شیء (object file) مشخص، اما نه فایل‌های دیگر: .sp .if n \{\ .RS 4 .\} .nf bar_obj_list = env\&.StaticObject(\*(Aqbar\&.c\*(Aq, CPPDEFINES=\*(Aq\-DBAR\*(Aq) env\&.Program("prog", [\*(Aqfoo\&.c\*(Aq, bar_obj_list, \*(Aqmain\&.c\*(Aq]) .fi .if n \{\ .RE .\} .PP استفاده از یک Node مانند این نمونه، با اجتناب از الزام به تعیین پسوند شیء وابسته به پلتفرم هنگام فراخوانی متد سازندهٔ \fBProgram\fR، موجب ساخت چندسکویی‌تر و قابل‌حمل‌تری می‌شود\&. .PP شیء NodeList همچنین برای ارسال به تابع \fBDefault\fR، به همان دلیلِ اجتناب از نام‌های وابسته به پلتفرم، بسیار مناسب است: .sp .if n \{\ .RS 4 .\} .nf tgt = env\&.Program("prog", ["foo\&.c", "bar\&.c", "main\&.c"]) Default(tgt) .fi .if n \{\ .RE .\} .PP گره (Node) نشان‌دهندهٔ هدف صراحتاً درخواست‌شده، همواره نخستین عنصر از NodeList بازگردانده‌شده است و می‌توان آن را از طریق نمایه‌سازی لیست دریافت کرد (مانند bar_obj_list[0])\&. نام مسیر فایل یک Node را می‌توان با استفاده از سازندهٔ رشتهٔ Python یعنی \fBstr\fR به دست آورد (مانند str(bar_obj_list[0]))\&. .PP فراخوانی‌های سازنده به‌طور خودکار لیست‌های ارائه‌شده به‌عنوان منبع و هدف را «تخت» (flatten) می‌کنند، بنابراین آن‌ها می‌توانند آزادانه حاوی عناصری باشند که خود لیست هستند، مانند \fIbar_obj_list\fR که توسط فراخوانی \fBStaticObject\fR بازگردانده شده است\&. اگر لازم است لیستی از لیست‌های بازگردانده‌شده توسط سازنده‌ها را مستقیماً در کد Python دستکاری کنید، می‌توانید یا به صورت دستی یک لیست جدید بسازید: .sp .if n \{\ .RS 4 .\} .nf foo = Object(\*(Aqfoo\&.c\*(Aq) bar = Object(\*(Aqbar\&.c\*(Aq) objects = [\*(Aqbegin\&.o\*(Aq] + foo + [\*(Aqmiddle\&.o\*(Aq] + bar + [\*(Aqend\&.o\*(Aq] for obj in objects: print(str(obj)) .fi .if n \{\ .RE .\} .PP یا می‌توانید از تابع \fBFlatten\fR ارائه‌شده توسط SCons برای ایجاد لیستی استفاده کنید که تنها شامل Nodeها باشد، که ممکن است راحت‌تر باشد: .sp .if n \{\ .RS 4 .\} .nf foo = Object(\*(Aqfoo\&.c\*(Aq) bar = Object(\*(Aqbar\&.c\*(Aq) objects = Flatten([\*(Aqbegin\&.o\*(Aq, foo, \*(Aqmiddle\&.o\*(Aq, bar, \*(Aqend\&.o\*(Aq]) for obj in objects: print(str(obj)) .fi .if n \{\ .RE .\} .sp .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBنکته\fR .ps -1 .br .PP از آن‌جا که فراخوانی‌های سازنده یک شیء شبیه لیست بازمی‌گردانند و نه یک لیست واقعی Python، مناسب نیست که از عملگر جمع Python (+ یا +=) برای الحاق نتایج سازنده به یک لیست Python استفاده شود\&. زیرا لیست و شیء از انواع متفاوتی هستند، و Python لیست اصلی را درجا به‌روزرسانی نخواهد کرد، بلکه در عوض یک شیء جدید از نوع NodeList حاوی پیوند عناصر لیست و نتایج سازنده ایجاد خواهد کرد\&. این امر برای هر متغیر دیگر Python در پیکربندی SCons شما که همچنان ارجاعی به لیست اصلی دارد، مشکل‌ساز خواهد شد\&. در عوض، از متد \fBextend\fR لیست در Python استفاده کنید تا اطمینان یابید لیست به‌صورت درجا (in\-place) به‌روزرسانی می‌شود\&. مثال: .sp .if n \{\ .RS 4 .\} .nf object_files = [] # Do NOT use += here: # object_files += Object(\*(Aqbar\&.c\*(Aq) # # It will not update the object_files list in place\&. # # Instead, use the list extend method: object_files\&.extend(Object(\*(Aqbar\&.c\*(Aq)) .fi .if n \{\ .RE .\} .sp .5v .RE .sp .if n \{\ .RS 4 .\} .nf bar_obj_list = env\&.StaticObject(\*(Aqbar\&.c\*(Aq, CPPDEFINES=\*(Aq\-DBAR\*(Aq) print("The path to bar_obj is:", str(bar_obj_list[0])) .fi .if n \{\ .RE .\} .PP تمام هدف‌های متدهای سازنده به‌طور خودکار به سورس‌هایشان وابسته هستند\&. SCons فایل‌های سورس را در زبان‌های مختلف برنامه‌نویسی برای نشانه‌های شناخته‌شدهٔ وابستگی (مثلاً دستورات #include برای سورس‌هایی که به پیش‌پردازندهٔ C فرستاده می‌شوند) اسکن می‌کند، که این امر تا حد زیادی نیاز به مشخص کردن صریح وابستگی را از بین می‌برد\&. همچنین می‌توانید با استفاده از متد \fBenv\&.Depends\fR یک محیط ساخت (construction environment)، یک وابستگی صریح مشخص کنید، هرچند که این کار توصیه نمی‌شود مگر اینکه وابستگی نتواند به‌طور قابل اعتمادی توسط اسکنرهای موجود شناسایی شود\&. .PP به‌طور پیش‌فرض، SCons می‌تواند فایل‌های سورس C، فایل‌های سورس C++، فایل‌های سورس Fortran با پسوندهای مشخص (\&.F (فقط در سیستم‌های POSIX)، \&.fpp، یا \&.FPP) و فایل‌های زبان اسمبلی با پسوندهای مشخص (\&.S (فقط در سیستم‌های POSIX)، \&.spp، یا \&.SPP) را برای وابستگی‌های پیش‌پردازندهٔ C اسکن کند\&. همچنین SCons دارای پشتیبانی پیش‌فرض برای اسکن فایل‌های سورس D، Java، SWIG و LaTeX است\&. .PP سازنده‌ها (Builders) برای کارایی بیشتر در زمان اجرا ایجاد شده و به عنوان متد به محیط ساخت اضافه می‌شوند\&. SCons الگوهایی را برای بسیاری از Builderها برای انواع ساخت شناخته‌شده فراهم می‌کند، و همچنین می‌توان Builderهای دیگری نوشت و به پروژه اضافه کرد\&. این الگوها معمولاً در ماژول‌های مشخصات ابزار (Tool specification modules) وجود دارند که هنگام اجرا، پیش از نمونه‌سازی Builder، می‌توانند حضور ابزارهای خارجی مورد نیاز، مانند باینری کامپایلر، و سایر شرایط لازم را بررسی کنند\&. بنابراین Builderهای موجود در یک محیط ساخت با توجه به نوع پلتفرم، نحوهٔ پیکربندی پلتفرم و ابزارهای انتخاب‌شده برای بارگذاری تفاوت دارند\&. متدهای سازندهٔ موجود به صورت جفت‌های کلید\-مقدار در صفت \fB$BUILDERS\fR محیط ساخت ثبت می‌شوند\&. اگرچه یک Builder به عنوان متدی از یک محیط ساخت ایجاد می‌شود، اما می‌توان آن‌ها را به عنوان یک تابع سراسری نیز فراخوانی کرد\&. یک Builder که به این روش فراخوانی شود، به صورت داخلی از محیط پیش‌فرض (Default Environment) برای جستجوی متغیرهای ساخت استفاده خواهد کرد: .sp .if n \{\ .RS 4 .\} .nf Program(\*(Aqhello\*(Aq, \*(Aqhello\&.c\*(Aq) SharedLibrary(\*(Aqword\*(Aq, \*(Aqword\&.cpp\*(Aq) .fi .if n \{\ .RE .\} .PP Builderهایی که به سبک تابع سراسری فراخوانی می‌شوند، به‌طور خودکار درون فایل‌های SConscript در دسترس (در scope) هستند\&. آن‌ها درون ماژول‌های Python خاص پروژه که آن‌ها را از طریق دستور import در Python از یک فایل SConscript وارد می‌کنید، در دسترس نیستند و باید آن‌ها را صریحاً به scope سراسری آن ماژول اضافه کنید\&. می‌توانید این کار را با افزودن import زیر به ماژول Python انجام دهید: \fBfrom SCons\&.Script import *\fR\&. .PP متدهای سازندهٔ زیر در توزیع هستهٔ نرم‌افزاری SCons دارای الگو هستند\&. .PP \fBCFile\fR(), \fIenv\fR\&.CFile() .RS 4 با داشتن یک فایل ورودی lex (\&.l) یا yacc (\&.y)، یک فایل سورس C می‌سازد\&. پسوند مشخص‌شده توسط متغیر ساخت \fB$CFILESUFFIX\fR (به‌طور پیش‌فرض \&.c) در صورتی که از قبل وجود نداشته باشد، به‌طور خودکار به هدف اضافه می‌شود\&. مثال: .sp .if n \{\ .RS 4 .\} .nf # builds foo\&.c env\&.CFile(target=\*(Aqfoo\&.c\*(Aq, source=\*(Aqfoo\&.l\*(Aq) # builds bar\&.c env\&.CFile(target=\*(Aqbar\*(Aq, source=\*(Aqbar\&.y\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fBCommand\fR(), \fIenv\fR\&.Command() .RS 4 در واقع هیچ Builderای با نام \fBCommand\fR وجود ندارد، بلکه اصطلاح «Command Builder» به تابعی اشاره دارد که در هر فراخوانی، یک Builder ناشناس ساخته و فراخوانی می‌کند\&. این ویژگی برای ساخت‌های «یک‌باره» (one\-off) که به یک Builder کامل نیاز نیست، مفید است\&. از آن‌جا که Builder ناشناس هرگز به چارچوب استاندارد Builder متصل نمی‌شود، همیشه باید یک Action مشخص شود\&. برای نحو فراخوانی و جزئیات، شرح تابع \fBCommand\fR را ببینید\&. .RE .PP \fBCompilationDatabase\fR(), \fIenv\fR\&.CompilationDatabase() .RS 4 \fBCompilationDatabase\fR یک سازندهٔ ویژه است که هدفی را برای ایجاد یک پایگاه دادهٔ کامپایل با قالب JSON و سازگار با ابزارهای clang اضافه می‌کند (به \m[blue]\fBمشخصات LLVM\fR\m[]\&\s-2\u[1]\d\s+2 مراجعه کنید)\&. این پایگاه داده برای استفاده توسط ابزارها و ویرایشگرهای مختلف مناسب است که می‌توانند از آن برای به‌دست آوردن اطلاعات ساخت و وابستگی‌ها استفاده کنند که در غیر این صورت برای SCons درونی می‌بود\&. این سازنده نیازی به مشخص کردن هیچ فایل سورسی ندارد، بلکه ترتیبی می‌دهد تا اطلاعات مربوط به تمام جفت‌های سورس/خروجی C، C++ و اسمبلی شناسایی‌شده در ساخت را که توسط فیلتر اختیاری \fB$COMPILATIONDB_PATH_FILTER\fR مستثنی نشده‌اند، خروجی دهد\&. این هدف مشمول قواعد معمول انتخاب هدف در SCons است\&. .sp اگر بدون آرگومان فراخوانی شود، نام هدف سازنده به‌طور پیش‌فرض compile_commands\&.json خواهد بود\&. .sp اگر با یک آرگومان موضعی تکی فراخوانی شود، \fBscons\fR نام هدف را از آن آرگومان سورس «استنتاج» می‌کند، همان نام را به آن می‌دهد و سپس سورس را نادیده می‌گیرد\&. این روش معمول برای فراخوانی سازنده در حالتی است که نام هدفی غیر از پیش‌فرض مورد نظر باشد\&. .sp اگر با هر یک از آرگومان‌های کلیدواژه‌ای \fItarget=\fR یا \fIsource=\fR فراخوانی شود، مقدار آن آرگومان به عنوان نام هدف در نظر گرفته می‌شود\&. اگر با هر دو فراخوانی شود، مقدار \fItarget=\fR استفاده شده و \fIsource=\fR نادیده گرفته می‌شود\&. اگر با چند سورس فراخوانی شود، فهرست سورس‌ها نادیده گرفته خواهد شد، زیرا راهی برای استنتاج قصد مورد نظر وجود ندارد؛ در این حالت از نام هدف پیش‌فرض استفاده خواهد شد\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBنکته\fR .ps -1 .br باید ابزار compilation_db را پیش از مشخص کردن هر بخشی از ساخت خود بارگذاری کنید، در غیر این صورت برخی از فایل‌های سورس/خروجی در پایگاه دادهٔ کامپایل ظاهر نخواهند شد\&. .sp .5v .RE \fIدر دسترس از \fR\fI\fBscons\fR\fR\fI 4\&.0 به بعد\&.\fR .RE .PP \fBCXXFile\fR(), \fIenv\fR\&.CXXFile() .RS 4 با داشتن یک فایل ورودی lex (\&.ll) یا yacc (\&.yy)، یک فایل سورس C++ می‌سازد\&. پسوند مشخص‌شده توسط متغیر ساخت \fB$CXXFILESUFFIX\fR (به‌طور پیش‌فرض \&.cc) در صورتی که از قبل وجود نداشته باشد، به‌طور خودکار به هدف اضافه می‌شود\&. مثال: .sp .if n \{\ .RS 4 .\} .nf # builds foo\&.cc env\&.CXXFile(target=\*(Aqfoo\&.cc\*(Aq, source=\*(Aqfoo\&.ll\*(Aq) # builds bar\&.cc env\&.CXXFile(target=\*(Aqbar\*(Aq, source=\*(Aqbar\&.yy\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fBDocbookEpub\fR(), \fIenv\fR\&.DocbookEpub() .RS 4 یک شبه‌سازنده (pseudo\-Builder) که زنجیره‌ابزار Docbook را برای خروجی EPUB فراهم می‌کند\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) env\&.DocbookEpub(\*(Aqmanual\&.epub\*(Aq, \*(Aqmanual\&.xml\*(Aq) .fi .if n \{\ .RE .\} .sp یا به سادگی .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) env\&.DocbookEpub(\*(Aqmanual\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fBDocbookHtml\fR(), \fIenv\fR\&.DocbookHtml() .RS 4 یک شبه‌سازنده که زنجیره‌ابزار Docbook را برای خروجی HTML فراهم می‌کند\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) env\&.DocbookHtml(\*(Aqmanual\&.html\*(Aq, \*(Aqmanual\&.xml\*(Aq) .fi .if n \{\ .RE .\} .sp یا به سادگی .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) env\&.DocbookHtml(\*(Aqmanual\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fBDocbookHtmlChunked\fR(), \fIenv\fR\&.DocbookHtmlChunked() .RS 4 یک شبه‌سازنده که زنجیره‌ابزار Docbook را برای خروجی چندبخشی HTML (chunked HTML) فراهم می‌کند\&. این شبه‌سازنده از پارامتر \fIbase\&.dir\fR پشتیبانی می‌کند\&. فایل chunkfast\&.xsl (نیازمند \(lqEXSLT\(rq) به عنوان شیوه‌نامه پیش‌فرض استفاده می‌شود\&. نحو پایه: .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) env\&.DocbookHtmlChunked(\*(Aqmanual\*(Aq) .fi .if n \{\ .RE .\} .sp که در آن manual\&.xml فایل ورودی است\&. .sp اگر از پارامتر \fIroot\&.filename\fR در شیوه‌نامه‌های سفارشی خود استفاده می‌کنید، باید نام هدف جدید را مشخص کنید\&. این کار تضمین می‌کند که وابستگی‌ها به درستی تنظیم شوند، به‌ویژه برای پاک‌سازی از طریق \(lqscons \-c\(rq: .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) env\&.DocbookHtmlChunked(\*(Aqmymanual\&.html\*(Aq, \*(Aqmanual\*(Aq, xsl=\*(Aqhtmlchunk\&.xsl\*(Aq) .fi .if n \{\ .RE .\} .sp پشتیبانی اولیه‌ای برای پارامتر \fIbase\&.dir\fR فراهم شده است\&. می‌توانید کلمه کلیدی \fIbase_dir\fR را به فراخوانی Builder خود اضافه کنید، و پیشوند داده‌شده به ابتدای تمام نام‌های فایل ایجاد شده افزوده می‌شود: .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) env\&.DocbookHtmlChunked(\*(Aqmanual\*(Aq, xsl=\*(Aqhtmlchunk\&.xsl\*(Aq, base_dir=\*(Aqoutput/\*(Aq) .fi .if n \{\ .RE .\} .sp مطمئن شوید که اسلش پایانی را برای پوشه پایه فراموش نکنید، در غیر این صورت فایل‌های شما فقط تغییر نام خواهند یافت! .RE .PP \fBDocbookHtmlhelp\fR(), \fIenv\fR\&.DocbookHtmlhelp() .RS 4 یک شبه‌سازنده که زنجیره‌ابزار Docbook را برای خروجی HTMLHELP فراهم می‌کند\&. نحو پایه آن چنین است: .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) env\&.DocbookHtmlhelp(\*(Aqmanual\*(Aq) .fi .if n \{\ .RE .\} .sp که در آن manual\&.xml فایل ورودی است\&. .sp اگر از پارامتر \fIroot\&.filename\fR در شیوه‌نامه‌های سفارشی خود استفاده می‌کنید، باید نام هدف جدید را مشخص کنید\&. این کار تضمین می‌کند که وابستگی‌ها به درستی تعیین شوند، به‌ویژه برای پاک‌سازی از طریق \(lq\fBscons \-c\fR\(rq: .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) env\&.DocbookHtmlhelp(\*(Aqmymanual\&.html\*(Aq, \*(Aqmanual\*(Aq, xsl=\*(Aqhtmlhelp\&.xsl\*(Aq) .fi .if n \{\ .RE .\} .sp پشتیبانی اولیه‌ای برای پارامتر \fIbase\&.dir\fR فراهم شده است\&. می‌توانید کلمه کلیدی \fIbase_dir\fR را به فراخوانی Builder خود اضافه کنید، و پیشوند داده‌شده به ابتدای تمام نام‌های فایل ایجاد شده افزوده می‌شود: .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) env\&.DocbookHtmlhelp(\*(Aqmanual\*(Aq, xsl=\*(Aqhtmlhelp\&.xsl\*(Aq, base_dir=\*(Aqoutput/\*(Aq) .fi .if n \{\ .RE .\} .sp مطمئن شوید که اسلش پایانی را برای پوشه پایه فراموش نکنید، در غیر این صورت فایل‌های شما فقط تغییر نام خواهند یافت! .RE .PP \fBDocbookMan\fR(), \fIenv\fR\&.DocbookMan() .RS 4 یک pseudo\-Builder که زنجیره‌ابزار Docbook را برای خروجی صفحه راهنما (Man page) ارائه می‌دهد\&. نحو پایه آن عبارت است از: .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) env\&.DocbookMan(\*(Aqmanual\*(Aq) .fi .if n \{\ .RE .\} .sp که در آن manual\&.xml فایل ورودی است\&. توجه داشته باشید که می‌توانید یک نام هدف تعیین کنید، اما نام‌های خروجی واقعی به‌طور خودکار از مدخل‌های refname در منبع XML شما تنظیم می‌شوند\&. .RE .PP \fBDocbookPdf\fR(), \fIenv\fR\&.DocbookPdf() .RS 4 یک pseudo\-Builder که زنجیره‌ابزار Docbook را برای خروجی PDF ارائه می‌دهد\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) env\&.DocbookPdf(\*(Aqmanual\&.pdf\*(Aq, \*(Aqmanual\&.xml\*(Aq) .fi .if n \{\ .RE .\} .sp یا صرفاً: .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) env\&.DocbookPdf(\*(Aqmanual\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fBDocbookSlidesHtml\fR(), \fIenv\fR\&.DocbookSlidesHtml() .RS 4 یک pseudo\-Builder که زنجیره‌ابزار Docbook را برای خروجی اسلایدهای HTML ارائه می‌دهد\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) env\&.DocbookSlidesHtml(\*(Aqmanual\*(Aq) .fi .if n \{\ .RE .\} .sp اگر از پارامتر \fItitlefoil\&.html\fR در شیوه‌نامه‌های خود استفاده می‌کنید، باید نام هدف جدید را تعیین کنید\&. این کار تضمین می‌کند که وابستگی‌ها به‌درستی برقرار شوند، به‌ویژه برای پاک‌سازی از طریق \(lq\fBscons \-c\fR\(rq: .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) env\&.DocbookSlidesHtml(\*(Aqmymanual\&.html\*(Aq,\*(Aqmanual\*(Aq, xsl=\*(Aqslideshtml\&.xsl\*(Aq) .fi .if n \{\ .RE .\} .sp پشتیبانی اولیه‌ای از پارامتر \fIbase\&.dir\fR فراهم شده است\&. می‌توانید کلیدواژهٔ \fIbase_dir\fR را به فراخوانی سازندهٔ خود اضافه کنید، و پیشوند داده‌شده به ابتدای تمام نام‌های فایل‌های ایجادشده افزوده می‌شود: .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) env\&.DocbookSlidesHtml(\*(Aqmanual\*(Aq, xsl=\*(Aqslideshtml\&.xsl\*(Aq, base_dir=\*(Aqoutput/\*(Aq) .fi .if n \{\ .RE .\} .sp مطمئن شوید که ممیز پایانی (trailing slash) را برای پوشه پایه فراموش نکنید، وگرنه فایل‌های شما فقط تغییر نام می‌یابند! .RE .PP \fBDocbookSlidesPdf\fR(), \fIenv\fR\&.DocbookSlidesPdf() .RS 4 یک pseudo\-Builder که زنجیره‌ابزار Docbook را برای خروجی اسلایدهای PDF ارائه می‌دهد\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) env\&.DocbookSlidesPdf(\*(Aqmanual\&.pdf\*(Aq, \*(Aqmanual\&.xml\*(Aq) .fi .if n \{\ .RE .\} .sp یا صرفاً: .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) env\&.DocbookSlidesPdf(\*(Aqmanual\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fBDocbookXInclude\fR(), \fIenv\fR\&.DocbookXInclude() .RS 4 یک pseudo\-Builder برای حل XIncludes در یک مرحلهٔ پردازشی مجزا\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) env\&.DocbookXInclude(\*(Aqmanual_xincluded\&.xml\*(Aq, \*(Aqmanual\&.xml\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fBDocbookXslt\fR(), \fIenv\fR\&.DocbookXslt() .RS 4 یک pseudo\-Builder که تبدیل XSL داده‌شده را روی فایل ورودی اعمال می‌کند\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdocbook\*(Aq]) env\&.DocbookXslt(\*(Aqmanual_transformed\&.xml\*(Aq, \*(Aqmanual\&.xml\*(Aq, xsl=\*(Aqtransform\&.xslt\*(Aq) .fi .if n \{\ .RE .\} .sp توجه داشته باشید که این سازنده نیازمند تنظیم پارامتر \fIxsl\fR است\&. .RE .PP \fBDVI\fR(), \fIenv\fR\&.DVI() .RS 4 یک فایل \&.dvi را از یک فایل ورودی \&.tex، \&.ltx یا \&.latex می‌سازد\&. اگر پسوند فایل مبدأ \&.tex باشد، \fBscons\fR محتویات فایل را بررسی خواهد کرد؛ اگر رشته‌ی \edocumentclass یا \edocumentstyle یافت شود، فرض می‌شود فایل یک فایل LaTeX است و هدف با فراخوانی خط فرمان \fB$LATEXCOM\fR ساخته می‌شود؛ در غیر این صورت، از خط فرمان \fB$TEXCOM\fR استفاده می‌شود\&. اگر فایل یک فایل LaTeX باشد، متد سازنده‌ی \fBDVI\fR همچنین محتویات فایل \&.aux را بررسی کرده و در صورت یافتن رشته‌ی bibdata، خط فرمان \fB$BIBTEX\fR را فراخوانی می‌کند، در صورت یافتن فایل \&.ind برنامه‌ی \fB$MAKEINDEX\fR را برای تولید نمایه آغاز می‌کند و محتویات فایل \&.log را بررسی کرده و در صورتی که فایل گزارش بگوید لازم است، فرمان \fB$LATEXCOM\fR را مجدداً اجرا می‌نماید\&. .sp پسوند \&.dvi (که به صورت سخت‌کدشده درون خود TeX قرار دارد) در صورتی که از قبل وجود نداشته باشد، به طور خودکار به هدف افزوده می‌شود\&. مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf # builds from aaa\&.tex env\&.DVI(target = \*(Aqaaa\&.dvi\*(Aq, source = \*(Aqaaa\&.tex\*(Aq) # builds bbb\&.dvi env\&.DVI(target = \*(Aqbbb\*(Aq, source = \*(Aqbbb\&.ltx\*(Aq) # builds from ccc\&.latex env\&.DVI(target = \*(Aqccc\&.dvi\*(Aq, source = \*(Aqccc\&.latex\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fBGs\fR(), \fIenv\fR\&.Gs() .RS 4 سازنده‌ای برای فراخوانی صریح فایل اجرایی gs\&. بسته به سیستم‌عامل زیربنایی، نام‌های مختلف gs، gsos2 و gswin32c امتحان می‌شوند\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqgs\*(Aq]) env\&.Gs( \*(Aqcover\&.jpg\*(Aq, \*(Aqscons\-scons\&.pdf\*(Aq, GSFLAGS=\*(Aq\-dNOPAUSE \-dBATCH \-sDEVICE=jpeg \-dFirstPage=1 \-dLastPage=1 \-q\*(Aq, ) .fi .if n \{\ .RE .\} .RE .PP \fBInstall\fR(), \fIenv\fR\&.Install() .RS 4 یک یا چند فایل یا دایرکتوری مبدأ را در هدف مشخص‌شده که باید یک دایرکتوری باشد، نصب می‌کند\&. نام فایل‌ها یا دایرکتوری‌های مبدأ مشخص‌شده درون دایرکتوری مقصد یکسان باقی می‌ماند\&. مبدأها ممکن است به صورت یک رشته یا به عنوان گره‌ای بازگردانده‌شده از یک سازنده مشخص شوند\&. .sp .if n \{\ .RS 4 .\} .nf env\&.Install(target=\*(Aq/usr/local/bin\*(Aq, source=[\*(Aqfoo\*(Aq, \*(Aqbar\*(Aq]) .fi .if n \{\ .RE .\} .sp توجه داشته باشید که اگر مسیرهای هدف انتخاب‌شده برای سازنده‌ی \fBInstall\fR (و سازندگان مرتبط \fBInstallAs\fR و \fBInstallVersionedLib\fR) خارج از درخت پروژه باشند، مانند مثال بالا، ممکن است به طور پیش‌فرض برای «ساخت» انتخاب نشوند، زیرا در صورت نبود دستورالعمل‌های دیگر، \fBscons\fR اهدافی را می‌سازد که در زیر دایرکتوری سطح بالا (دایرکتوری حاوی فایل SConstruct، معمولاً دایرکتوری جاری) قرار دارند\&. در این حالت از اهداف خط فرمان یا تابع \fBDefault\fR استفاده کنید\&. .sp اگر گزینه‌ی \fB\-\-install\-sandbox\fR داده شود، مسیر دایرکتوری مشخص‌شده به عنوان پیشوند به دایرکتوری هدف اضافه خواهد شد\&. این قابلیت برای آزمایش رفتار نصب بدون نصب در یک مکان «فعال» در سیستم مفید است\&. .sp همچنین ببینید \fBFindInstalledFiles\fR\&. برای توضیحات و نکات بیشتر در مورد نصب، راهنمای کاربر را ببینید (به‌ویژه بخش اهداف خط فرمان (Command\-Line Targets) و فصل‌های مربوط به نصب فایل‌ها (Installing Files) و اهداف نام مستعار (Alias Targets))\&. .RE .PP \fBInstallAs\fR(), \fIenv\fR\&.InstallAs() .RS 4 یک یا چند فایل یا دایرکتوری مبدأ را با نام‌های مشخصی نصب می‌کند که امکان تغییر نام یک فایل یا دایرکتوری را به عنوان بخشی از فرایند نصب فراهم می‌سازد\&. اگر تعداد فایل‌ها یا دایرکتوری‌های فهرست‌شده در آرگومان‌های هدف و مبدأ متفاوت باشد، خطا خواهد بود\&. .sp .if n \{\ .RS 4 .\} .nf env\&.InstallAs(target=\*(Aq/usr/local/bin/foo\*(Aq, source=\*(Aqfoo_debug\*(Aq) env\&.InstallAs(target=[\*(Aq\&.\&./lib/libfoo\&.a\*(Aq, \*(Aq\&.\&./lib/libbar\&.a\*(Aq], source=[\*(AqlibFOO\&.a\*(Aq, \*(AqlibBAR\&.a\*(Aq]) .fi .if n \{\ .RE .\} .sp یادداشت زیر \fBInstall\fR را ببینید\&. .RE .PP \fBInstallVersionedLib\fR(), \fIenv\fR\&.InstallVersionedLib() .RS 4 یک کتابخانه‌ی اشتراکی دارای نسخه را نصب می‌کند\&. پیوندهای نمادین متناسب با معماری بر اساس پیوندهای نمادین کتابخانه‌ی مبدأ تولید خواهند شد\&. .sp .if n \{\ .RS 4 .\} .nf env\&.InstallVersionedLib(target=\*(Aq/usr/local/bin/foo\*(Aq, source=\*(Aqlibxyz\&.1\&.5\&.2\&.so\*(Aq) .fi .if n \{\ .RE .\} .sp یادداشت زیر \fBInstall\fR را ببینید\&. .RE .PP \fBJar\fR(), \fIenv\fR\&.Jar() .RS 4 یک فایل آرشیو جاوا (\&.jar) را از فهرست مشخص‌شده‌ای از منابع می‌سازد\&. هر پوشه‌ای در فهرست منابع برای یافتن فایل‌های \&.class جستجو خواهد شد\&. هر فایل \&.java در فهرست منابع با فراخوانی سازندهٔ \fBJava\fR به فایل‌های \&.class کامپایل خواهد شد\&. .sp اگر مقدار \fB$JARCHDIR\fR تنظیم شده باشد، دستور jar با استفاده از گزینهٔ \fB\-C\fR به پوشهٔ مشخص‌شده تغییر مسیر می‌دهد\&. اگر \fB$JARCHDIR\fR به‌طور صریح تنظیم نشده باشد، SCons از بالاترین سطح هر زیردرخت پوشه‌ای که فایل‌های \&.class جاوا در آن توسط سازندهٔ \fBJava\fR ساخته شده‌اند استفاده خواهد کرد\&. .sp اگر محتویات هر یک از فایل‌های منبع با رشتهٔ Manifest\-Version آغاز شود، آن فایل یک مانیفست در نظر گرفته می‌شود و همراه با تنظیم گزینهٔ \fBm\fR به دستور jar ارسال می‌گردد\&. .sp .if n \{\ .RS 4 .\} .nf env\&.Jar(target = \*(Aqfoo\&.jar\*(Aq, source = \*(Aqclasses\*(Aq) env\&.Jar(target = \*(Aqbar\&.jar\*(Aq, source = [\*(Aqbar1\&.java\*(Aq, \*(Aqbar2\&.java\*(Aq]) .fi .if n \{\ .RE .\} .RE .PP \fBJava\fR(), \fIenv\fR\&.Java() .RS 4 یک یا چند فایل کلاس جاوا را می‌سازد\&. منابع می‌توانند هر ترکیبی از فایل‌های صریح \&.java یا درخت‌های پوشه‌ای باشند که برای یافتن فایل‌های \&.java پویش می‌شوند\&. .sp ابزار SCons هر فایل منبع \&.java را برای یافتن کلاس‌های تعریف‌شده درون آن (از جمله کلاس‌های درونی) تجزیه می‌کند و از روی آن، فایل‌های هدف \&.class را که ایجاد خواهند شد تشخیص می‌دهد\&. فایل‌های کلاس زیر پوشهٔ هدفِ مشخص‌شده قرار خواهند گرفت\&. .sp همچنین SCons هر فایل جاوا را برای یافتن نام بسته‌بندی (package) جاوا جستجو می‌کند، با این فرض که این نام در خطی که با رشتهٔ package در ستون اول آغاز می‌شود یافت می‌شود؛ فایل‌های \&.class حاصل در پوشه‌ای متناسب با نام بستهٔ مشخص‌شده قرار داده می‌شوند\&. برای نمونه، فایل Foo\&.java که یک کلاس عمومی یکتای Foo را تعریف می‌کند و شامل نام بستهٔ sub\&.dir است، یک فایل کلاس متناظر sub/dir/Foo\&.class تولید خواهد کرد\&. .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf env\&.Java(target=\*(Aqclasses\*(Aq, source=\*(Aqsrc\*(Aq) env\&.Java(target=\*(Aqclasses\*(Aq, source=[\*(Aqsrc1\*(Aq, \*(Aqsrc2\*(Aq]) env\&.Java(target=\*(Aqclasses\*(Aq, source=[\*(AqFile1\&.java\*(Aq, \*(AqFile2\&.java\*(Aq]) .fi .if n \{\ .RE .\} .sp فایل‌های منبع جاوا می‌توانند از کدگذاری بومی سیستم‌عامل زیربنایی استفاده کنند\&. از آنجا که SCons به‌طور پیش‌فرض در حالت سادهٔ ASCII کامپایل می‌کند، کامپایلر هشدارهایی دربارهٔ نویسه‌های غیرقابل نگاشت تولید خواهد کرد که ممکن است در ادامهٔ پردازش فایل به خطا بیانجامد\&. در این حالت، کاربر باید متغیر محیطی LANG را مشخص کند تا به کامپایلر اعلام شود چه کدگذاری استفاده شده است\&. برای سازگاری و قابلیت حمل، بهتر است کدگذاری به‌صورت صریح تعیین (hard\-code) شود تا کامپایل هنگام اجرا بر روی سیستمی با کدگذاری دیگر نیز کار کند\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment() env[\*(AqENV\*(Aq][\*(AqLANG\*(Aq] = \*(Aqen_GB\&.UTF\-8\*(Aq .fi .if n \{\ .RE .\} .RE .PP \fBJavaH\fR(), \fIenv\fR\&.JavaH() .RS 4 فایل‌های هدر و منبع C را برای پیاده‌سازی متدهای بومی (native) جاوا می‌سازد\&. هدف می‌تواند پوشه‌ای باشد که فایل‌های هدر در آن نوشته خواهند شد، یا نام فایل هدری باشد که تمام تعاریف را دربرمی‌گیرد\&. منبع می‌تواند نام‌های فایل‌های \&.class، نام‌های فایل‌های \&.java که باید با فراخوانی متد سازندهٔ \fBJava\fR به فایل‌های \&.class کامپایل شوند، یا اشیای بازگردانده‌شده از متد سازندهٔ \fBJava\fR باشد\&. .sp اگر متغیر ساخت \fB$JAVACLASSDIR\fR چه در محیط و چه در فراخوانی خودِ متد سازندهٔ \fBJavaH\fR تنظیم شده باشد، آن‌گاه مقدار این متغیر از ابتدای هر نام فایل \&.class حذف خواهد شد\&. .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf # builds java_native\&.h classes = env\&.Java(target="classdir", source="src") env\&.JavaH(target="java_native\&.h", source=classes) # builds include/package_foo\&.h and include/package_bar\&.h env\&.JavaH(target="include", source=["package/foo\&.class", "package/bar\&.class"]) # builds export/foo\&.h and export/bar\&.h env\&.JavaH( target="export", source=["classes/foo\&.class", "classes/bar\&.class"], JAVACLASSDIR="classes", ) .fi .if n \{\ .RE .\} .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBنکته\fR .ps -1 .br نسخه‌های جاوا از 10\&.0 به بعد دیگر از دستور \fBjavah\fR برای تولید هدرها/منابع JNI استفاده نمی‌کنند، و در واقع این دستور را به‌طور کامل حذف کرده‌اند (ببینید پیشنهاد بهبود جاوا \m[blue]\fBJEP 313\fR\m[]\&\s-2\u[2]\d\s+2)، که این امر استفاده از این ابزار را برای این منظور دشوارتر می‌سازد\&. اگر چندین نسخهٔ جاوا روی سیستم وجود داشته باشد، ممکن است SCons به‌طور خودکار یک \fBjavah\fR متعلق به نسخه‌ای قدیمی‌تر را پیدا کند که این امر به نتایج نادرست منجر خواهد شد\&. برای استفاده با نسخهٔ جدیدتر جاوا، مقادیر پیش‌فرض \fB$JAVAH\fR (برای شامل شدن مسیر به \fBjavac\fR) و \fB$JAVAHFLAGS\fR (برای دربرداشتن دست‌کم یک پرچم \fB\-h\fR) را بازنویسی کنید، و توجه داشته باشید که تولید هدرها با \fBjavac\fR تنها نیازمند فراهم کردن فایل‌های منبع \&.java است، نه فایل‌های \&.class\&. .sp .5v .RE .RE .PP \fBLibrary\fR(), \fIenv\fR\&.Library() .RS 4 مترادفی برای متد سازنده‌ی \fBStaticLibrary\fR\&. .RE .PP \fBLoadableModule\fR(), \fIenv\fR\&.LoadableModule() .RS 4 در بیشتر سیستم‌ها، این معادل \fBSharedLibrary\fR است\&. در پلتفرم‌های Mac OS X (Darwin)، یک بسته‌ی ماژول بارگذاری‌پذیر (loadable module bundle) ایجاد می‌کند\&. .RE .PP \fBM4\fR(), \fIenv\fR\&.M4() .RS 4 یک فایل خروجی را از یک فایل ورودی M4 می‌سازد\&. این متد از مقدار پیش‌فرض \fB\-E\fR برای \fB$M4FLAGS\fR استفاده می‌کند، که در هنگام استفاده از نسخه‌ی گنو m4 تمام هشدارها را مهلک دانسته و با مشاهده‌ی اولین هشدار متوقف می‌شود\&. مثال: .sp .if n \{\ .RS 4 .\} .nf env\&.M4(target = \*(Aqfoo\&.c\*(Aq, source = \*(Aqfoo\&.c\&.m4\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fBMOFiles\fR(), \fIenv\fR\&.MOFiles() .RS 4 این سازنده توسط ابزار msgfmt آماده‌سازی می‌شود\&. این سازنده فایل‌های PO را به فایل‌های MO کامپایل می‌کند\&. \fBMOFiles\fR یک سازنده‌ی تک‌منبعی است\&. پارامتر \fIsource\fR همچنین در صورت تنظیم بودن \fB$LINGUAS_FILE\fR می‌تواند حذف شود\&. .sp \fIمثال ۱\fR\&. ایجاد pl\&.mo و en\&.mo با کامپایل pl\&.po و en\&.po: .sp .if n \{\ .RS 4 .\} .nf env\&.MOFiles([\*(Aqpl\*(Aq, \*(Aqen\*(Aq]) .fi .if n \{\ .RE .\} .sp \fIمثال ۲\fR\&. کامپایل فایل‌ها برای زبان‌های تعریف‌شده در فایل LINGUAS: .sp .if n \{\ .RS 4 .\} .nf env\&.MOFiles(LINGUAS_FILE=True) .fi .if n \{\ .RE .\} .sp \fIمثال ۳\fR\&. ایجاد pl\&.mo و en\&.mo با کامپایل pl\&.po و en\&.po به‌همراه فایل‌های مربوط به زبان‌های تعریف‌شده در فایل LINGUAS: .sp .if n \{\ .RS 4 .\} .nf env\&.MOFiles([\*(Aqpl\*(Aq, \*(Aqen\*(Aq], LINGUAS_FILE=True) .fi .if n \{\ .RE .\} .sp \fIمثال ۴\fR\&. کامپایل فایل‌ها برای زبان‌های تعریف‌شده در فایل LINGUAS (روشی دیگر): .sp .if n \{\ .RS 4 .\} .nf env[\*(AqLINGUAS_FILE\*(Aq] = True env\&.MOFiles() .fi .if n \{\ .RE .\} .RE .PP \fBMSVSProject\fR(), \fIenv\fR\&.MSVSProject() .RS 4 یک فایل پروژه و فایل راه‌حل (solution) برای Microsoft Visual C++ می‌سازد\&. .sp یک فایل پروژه‌ی Microsoft Visual C++ را بر اساس نسخه‌ی پیکربندی‌شده‌ی Visual Studio (یا دقیق‌تر بگوییم، MSBuild) می‌سازد: یا جدیدترین نسخه‌ی نصب‌شده، یا نسخه‌ی مشخص‌شده توسط \fB$MSVC_VERSION\fR در محیط ساخت فعلی\&. برای Visual Studio 6\&.0 یک فایل \&.dsp تولید می‌شود\&. برای نسخه‌های ۲۰۰۲ تا ۲۰۰۸ ویژوال استودیو، یک فایل \&.vcproj تولید می‌شود\&. برای Visual Studio 2010 و بالاتر یک فایل \&.vcxproj تولید می‌شود\&. توجه داشته باشید که چندین طرح نسخه‌بندی در محیط کامپایل مایکروسافت دخیل هستند \- برای دیدن معادل‌ها، توضیحات \fB$MSVC_VERSION\fR را ببینید\&. توجه داشته باشید که SCons نحوه‌ی ساخت فایل‌های پروژه را برای سایر زبان‌ها نمی‌داند (برای مثال \&.csproj برای #C، \&.vbproj برای Visual Basic یا \&.pyproject برای Python)\&. .sp برای فایل \&.vcxproj، قالب زیربنایی همان شمای اکس‌ام‌ال (XML Schema) مربوط به MSBuild است و جزئیات آن مطابق با این پیوند است: \m[blue]\fBhttps://learn\&.microsoft\&.com/en\-us/cpp/build/reference/vcxproj\-file\-structure\fR\m[]\&\s-2\u[3]\d\s+2\&. فایل راه‌حل تولید‌شده، Visual Studio را قادر می‌سازد ساختار پروژه را درک کند و این امکان را می‌دهد که با استفاده از MSBuild برای فراخوانی مجدد SCons ساخته شود\&. فایل پروژه حاوی نسخه‌ی مجموعه‌ابزاری (toolset) است که همان‌طور که در بالا توضیح داده شد توسط SCons انتخاب شده است\&. از آنجا که نسخه‌های جدید Visual Studio از چندین مجموعه‌ابزار هم‌زمان پشتیبانی می‌کنند، اگر مجموعه‌ابزار مورد نظر با پیش‌فرض SCons مطابقت ندارد، از \fB$MSVC_VERSION\fR برای انتخاب آن استفاده کنید\&. فایل پروژه همچنین شامل مدخل‌هایی است که نحوه‌ی فراخوانی SCons را برای ساخت پروژه از داخل Visual Studio (یا از خط فرمان MSBuild) شرح می‌دهند\&. در برخی شرایط ممکن است SCons این را به اشتباه تولید کند \- به‌ویژه هنگام استفاده از توزیع \fIscons\-local\fR، که به شیوه‌ای متناسب با خط فراخوانی پیش‌فرض نصب نشده است\&. در این صورت، متغیر ساخت \fB$SCONS_HOME\fR می‌تواند برای توصیف روش صحیح تعیین مکان کد SCons به‌منظور درون‌ریزی (import) آن استفاده شود\&. .sp به‌طور پیش‌فرض، یک فایل راه‌حل متناظر نیز برای پروژه تولید می‌شود\&. این رفتار می‌تواند با تعیین \fIauto_build_solution=0\fR برای سازنده‌ی \fBMSVSProject\fR غیرفعال شود\&. فایل راه‌حل همچنین می‌تواند به‌طور مستقل با فراخوانی سازنده‌ی \fBMSVSSolution\fR تولید شود، مانند حالتی که یک راه‌حل باید چندین پروژه را توصیف کند\&. برای اطلاعات بیشتر، توضیحات \fBMSVSSolution\fR را ببینید\&. .sp سازنده‌ی \fBMSVSProject\fR چندین آرگومان کلیدواژه‌ای را می‌پذیرد که فهرست‌هایی از نام‌های فایل را برای قرار گرفتن در فایل پروژه توصیف می‌کنند\&. در حال حاضر، \fIsrcs\fR، \fIincs\fR، \fIlocalincs\fR، \fIresources\fR و \fImisc\fR شناخته می‌شوند\&. این نام‌ها به‌گونه‌ای طراحی شده‌اند که خود‌توضیح باشند، اما توجه داشته باشید که نام‌های فایل باید به صورت رشته مشخص شوند، \fIنه\fR به عنوان گره‌های پرونده (File Nodes) در SCons (برای مثال اگر فایل‌هایی را برای گنجاندن با استفاده از تابع \fBGlob\fR تولید می‌کنید، نتایج باید قبل از ارسال به \fBMSVSProject\fR به فهرستی از رشته‌ها تبدیل شوند)\&. دلیل این امر این است که Visual Studio و MSBuild چیزی درباره‌ی انواع گره‌های SCons نمی‌دانند\&. هر یک از فهرست‌های نام‌های فایل به‌صورت جداگانه اختیاری هستند، اما حداقل یک فهرست باید مشخص شود تا فایل پروژه‌ی حاصل خالی نباشد\&. .sp علاوه بر فهرست‌های مقادیر بالا، مقادیر زیر نیز می‌توانند به عنوان آرگومان‌های کلیدواژه‌ای مشخص شوند: .PP \fItarget\fR .RS 4 نام فایل هدف \&.dsp یا \&.vcproj\&. باید از پسوند درست برای نسخه Visual Studio استفاده شود، اما متغیر ساخت \fB$MSVSPROJECTSUFFIX\fR به مقدار صحیح مقداردهی خواهد شد (مثال زیر را ببینید)\&. .RE .PP \fIvariant\fR .RS 4 نام این گونه‌ی (variant) خاص\&. به‌جز پروژه‌های Visual Studio 6، این می‌تواند فهرستی از نام‌های گونه‌ها نیز باشد\&. این مقادیر معمولاً مواردی مانند "Debug" یا "Release" هستند، اما در واقع می‌توانند هر چیزی باشند که می‌خواهید\&. برای پروژه‌های Visual Studio 7، آن‌ها همچنین می‌توانند یک بستر هدف را که با نویسه | (خط عمودی) از نام گونه جدا شده است مشخص کنند: Debug|Xbox\&. بستر هدف پیش‌فرض Win32 است\&. فراخوانی‌های چندگانه به \fBMSVSProject\fR با گونه‌های مختلف مجاز است؛ همه گونه‌ها با اهداف ساخت و سورس‌های مناسب خود به فایل پروژه اضافه خواهند شد\&. .RE .PP \fIcmdargs\fR .RS 4 آرگومان‌های خط فرمان اضافی برای گونه‌های مختلف\&. تعداد مدخل‌های \fIcmdargs\fR باید با تعداد مدخل‌های \fIvariant\fR برابر باشد، یا خالی باشد (مشخص نشده باشد)\&. اگر فقط یکی را ارائه دهید، به‌طور خودکار به تمام گونه‌ها اعمال خواهد شد\&. .RE .PP \fIcppdefines\fR .RS 4 تعاریف پیش‌پردازنده برای گونه‌های مختلف\&. تعداد مدخل‌های \fIcppdefines\fR باید با تعداد مدخل‌های \fIvariant\fR برابر باشد، یا خالی باشد (مشخص نشده باشد)\&. اگر این پارامتر را تعیین نکنید، SCons از مدخل \fB$CPPDEFINES\fR محیط فراخواننده برای تمام گونه‌ها استفاده خواهد کرد\&. .RE .PP \fIcppflags\fR .RS 4 پرچم‌های کامپایلر برای گونه‌های مختلف\&. اگر یک پرچم \fB/std:c++\fR یافت شود، در صورتی که قبلاً وجود نداشته باشد، \fB/Zc:__cplusplus\fR به پرچم‌ها الحاق می‌شود؛ این امر تضمین می‌کند که Intellisense از سوییچ \fB/std:c++\fR استفاده کند\&. تعداد مدخل‌های \fIcppflags\fR باید با تعداد مدخل‌های \fIvariant\fR برابر باشد، یا خالی باشد (مشخص نشده باشد)\&. اگر فقط یکی را ارائه دهید، به‌طور خودکار به تمام گونه‌ها اعمال خواهد شد\&. اگر این پارامتر را مشخص نکنید، SCons مدخل‌های \fB$CCFLAGS\fR، \fB$CXXFLAGS\fR و \fB$CPPFLAGS\fR محیط فراخواننده را برای تمام گونه‌ها ترکیب خواهد کرد\&. .RE .PP \fIcpppaths\fR .RS 4 مسیرهای include کامپایلر برای گونه‌های مختلف\&. تعداد مدخل‌های \fIcpppaths\fR باید با تعداد مدخل‌های \fIvariant\fR برابر باشد، یا خالی باشد (مشخص نشده باشد)\&. اگر تنها یکی را مشخص کنید، به‌طور خودکار به تمام گونه‌ها اعمال خواهد شد\&. اگر این پارامتر را مشخص نکنید، SCons از مدخل \fB$CPPPATH\fR محیط فراخواننده برای تمام گونه‌ها استفاده خواهد کرد\&. .RE .PP \fIbuildtarget\fR .RS 4 یک رشته، گره (node) یا فهرستی اختیاری از رشته‌ها یا گره‌ها (یکی به ازای هر گونه ساخت)، تا به اشکال‌زدای Visual Studio بگوید از چه هدف خروجی‌ای در کدام گونه ساخت استفاده کند\&. تعداد مدخل‌های \fIbuildtarget\fR باید با تعداد مدخل‌های \fIvariant\fR برابر باشد\&. .RE .PP \fIrunfile\fR .RS 4 نام فایلی که Visual Studio 7 و نسخه‌های پس از آن اجرا و اشکال‌زدایی خواهند کرد\&. این مقدار در فیلد \fIOutput\fR در فایل پروژه نهایی Microsoft Visual C++ ظاهر می‌شود\&. اگر این مورد مشخص نشود، پیش‌فرض همان مقدار تعیین‌شده برای \fIbuildtarget\fR است\&. .RE .sp .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBنکته\fR .ps -1 .br SCons و Microsoft Visual Studio پروژه‌ها را به روش‌های متفاوتی درک می‌کنند و این نگاشت گاهی ناقص است: .sp از آنجا که SCons همیشه دستورات ساخت خود را از دایرکتوری‌ای که فایل SConstruct در آن قرار دارد اجرا می‌کند، اگر یک فایل پروژه را در دایرکتوری‌ای متفاوت از دایرکتوری فایل SConstruct تولید کنید، کاربران قادر نخواهند بود با دوبار کلیک روی نام فایل در پیام‌های خطای کامپایل که در پنجره خروجی کنسول Visual Studio نمایش داده می‌شوند به آن دسترسی یابند\&. این مشکل می‌تواند با افزودن گزینه کامپایلر Microsoft Visual C++ \fB/FC\fR به متغیر \fB$CCFLAGS\fR برطرف شود تا کامپایلر مسیر کامل هر فایلی را که باعث خطای کامپایل می‌شود چاپ کند\&. .sp اگر فایل پروژه فقط برای شناساندن چیدمان فایل‌ها به مرورگر پروژه Visual Studio استفاده شود مشکلی وجود نخواهد داشت؛ با این حال، نباید از Visual Studio برای ایجاد تغییرات در ساختار پروژه، گزینه‌های ساخت و غیره استفاده شود، زیرا این تغییرات (الف) به توصیف SCons از پروژه منتقل نمی‌شوند و (ب) در صورت تولید مجدد فایل پروژه توسط SCons از بین خواهند رفت\&. فایل‌های SConscript باید مرجع اصلی و توصیف نهایی ساخت باقی بمانند\&. .sp اگر از فایل پروژه برای هدایت MSBuild استفاده شود (مانند انتخاب «build» از رابط کاربری Visual Studio)، کنترل مستقیمی را که هنگام اجرای ساخت مستقیماً از طریق SCons بر انتخاب هدف و گزینه‌های خط فرمان داشتید از دست می‌دهید، زیرا این موارد در فایل پروژه بر اساس مقادیر مشخص‌شده در فراخوانی \fBMSVSProject\fR به‌صورت ثابت (hard\-code) ثبت می‌شوند\&. می‌توانید بخشی از این کنترل را با تعریف چندین گونه و استفاده از فراخوانی‌های متعدد \fBMSVSProject\fR برای چیدمان اهداف ساخت، آرگومان‌ها، تعاریف، پرچم‌ها و مسیرهای متفاوت برای گونه‌های مختلف بازیابید\&. .sp اگر ساخت درون یک solution با چندین پروژه MSBuild تقسیم شود، این نگاشت بیش از پیش دچار محدودیت و پیچیدگی می‌شود\&. در این حالت، مهم است که Visual Studio را روی انجام ساخت‌های موازی تنظیم نکنید، زیرا در این صورت ساخت پروژه‌های مجزا را به‌صورت موازی اجرا می‌کند و SCons در صورت فراخوانی به این روش عملکرد مناسبی ندارد\&. در عوض، می‌توانید فرایند ساخت SCons را برای ساخت موازی تنظیم کنید \- برای چگونگی انجام این کار با \fInum_jobs\fR، تابع \fBSetOption\fR را ببینید\&. .sp .5v .RE نمونه کاربرد: .sp .if n \{\ .RS 4 .\} .nf barsrcs = [\*(Aqbar\&.cpp\*(Aq] barincs = [\*(Aqbar\&.h\*(Aq] barlocalincs = [\*(AqStdAfx\&.h\*(Aq] barresources = [\*(Aqbar\&.rc\*(Aq, \*(Aqresource\&.h\*(Aq] barmisc = [\*(Aqbar_readme\&.txt\*(Aq] dll = env\&.SharedLibrary(target=\*(Aqbar\&.dll\*(Aq, source=barsrcs) buildtarget = [s for s in dll if str(s)\&.endswith(\*(Aqdll\*(Aq)] env\&.MSVSProject( target=\*(AqBar\*(Aq + env[\*(AqMSVSPROJECTSUFFIX\*(Aq], srcs=barsrcs, incs=barincs, localincs=barlocalincs, resources=barresources, misc=barmisc, buildtarget=buildtarget, variant=\*(AqRelease\*(Aq, ) .fi .if n \{\ .RE .\} .PP \fIDebugSettings\fR .RS 4 دیکشنری‌ای از تنظیمات اشکال‌زدایی که بسته به نسخهٔ نصب‌شده، در فایل \&.vcproj\&.user یا \&.vcxproj\&.user نوشته می‌شود\&. همانند \fIcmdargs\fR، می‌توانید یک دیکشنری \fIDebugSettings\fR به‌ازای هر گونه مشخص کنید\&. اگر تنها یکی را مشخص کنید، به همهٔ گونه‌ها اعمال خواهد شد\&. .sp \fIتغییر‌یافته در نسخهٔ 2\&.4:\fR پارامتر اختیاری \fIDebugSettings\fR افزوده شد\&. .RE .sp در حال حاضر، تنها Visual Studio نسخهٔ v9\&.0 و Visual Studio نسخهٔ v11 پیاده‌سازی شده‌اند؛ برای سایر نسخه‌ها فایلی تولید نمی‌شود\&. برای تولید فایل کاربر، کافی است یک دیکشنری \fIDebugSettings\fR با پارامترهای مناسب برای نسخهٔ MSVS خود به محیط بیفزایید\&. اگر دیکشنری خالی باشد یا حاوی هیچ مقدار معتبری نباشد، هیچ فایلی تولید نخواهد شد\&. .sp در ادامه مثالی جامع‌تر آورده شده است که شامل راه‌اندازی یک پروژه برای گونه‌ها و DebugSettings می‌شود: .sp .if n \{\ .RS 4 .\} .nf # Assuming you store your defaults in a file vars = Variables(\*(Aqvariables\&.py\*(Aq) msvcver = vars\&.args\&.get(\*(Aqvc\*(Aq, \*(Aq9\*(Aq) # Check command args to force one Microsoft Visual Studio version if msvcver == \*(Aq9\*(Aq or msvcver == \*(Aq11\*(Aq: env = Environment(MSVC_VERSION=msvcver + \*(Aq\&.0\*(Aq, MSVC_BATCH=False) else: env = Environment() AddOption( \*(Aq\-\-userfile\*(Aq, action=\*(Aqstore_true\*(Aq, dest=\*(Aquserfile\*(Aq, default=False, help="Create Visual C++ project file", ) # # 1\&. Configure your Debug Setting dictionary with options you want in the list # of allowed options, for instance if you want to create a user file to launch # a specific application for testing your dll with Microsoft Visual Studio 2008 (v9): # V9DebugSettings = { \*(AqCommand\*(Aq: \*(Aqc:\e\emyapp\e\eusing\e\ethisdll\&.exe\*(Aq, \*(AqWorkingDirectory\*(Aq: \*(Aqc:\e\emyapp\e\eusing\e\e\*(Aq, \*(AqCommandArguments\*(Aq: \*(Aq\-p password\*(Aq, # \*(AqAttach\*(Aq:\*(Aqfalse\*(Aq, # \*(AqDebuggerType\*(Aq:\*(Aq3\*(Aq, # \*(AqRemote\*(Aq:\*(Aq1\*(Aq, # \*(AqRemoteMachine\*(Aq: None, # \*(AqRemoteCommand\*(Aq: None, # \*(AqHttpUrl\*(Aq: None, # \*(AqPDBPath\*(Aq: None, # \*(AqSQLDebugging\*(Aq: None, # \*(AqEnvironment\*(Aq: \*(Aq\*(Aq, # \*(AqEnvironmentMerge\*(Aq:\*(Aqtrue\*(Aq, # \*(AqDebuggerFlavor\*(Aq: None, # \*(AqMPIRunCommand\*(Aq: None, # \*(AqMPIRunArguments\*(Aq: None, # \*(AqMPIRunWorkingDirectory\*(Aq: None, # \*(AqApplicationCommand\*(Aq: None, # \*(AqApplicationArguments\*(Aq: None, # \*(AqShimCommand\*(Aq: None, # \*(AqMPIAcceptMode\*(Aq: None, # \*(AqMPIAcceptFilter\*(Aq: None, } # # 2\&. Because there are a lot of different options depending on the Microsoft # Visual Studio version, if you use more than one version you have to # define a dictionary per version, for instance if you want to create a user # file to launch a specific application for testing your dll with Microsoft # Visual Studio 2012 (v11): # V10DebugSettings = { \*(AqLocalDebuggerCommand\*(Aq: \*(Aqc:\e\emyapp\e\eusing\e\ethisdll\&.exe\*(Aq, \*(AqLocalDebuggerWorkingDirectory\*(Aq: \*(Aqc:\e\emyapp\e\eusing\e\e\*(Aq, \*(AqLocalDebuggerCommandArguments\*(Aq: \*(Aq\-p password\*(Aq, # \*(AqLocalDebuggerEnvironment\*(Aq: None, # \*(AqDebuggerFlavor\*(Aq: \*(AqWindowsLocalDebugger\*(Aq, # \*(AqLocalDebuggerAttach\*(Aq: None, # \*(AqLocalDebuggerDebuggerType\*(Aq: None, # \*(AqLocalDebuggerMergeEnvironment\*(Aq: None, # \*(AqLocalDebuggerSQLDebugging\*(Aq: None, # \*(AqRemoteDebuggerCommand\*(Aq: None, # \*(AqRemoteDebuggerCommandArguments\*(Aq: None, # \*(AqRemoteDebuggerWorkingDirectory\*(Aq: None, # \*(AqRemoteDebuggerServerName\*(Aq: None, # \*(AqRemoteDebuggerConnection\*(Aq: None, # \*(AqRemoteDebuggerDebuggerType\*(Aq: None, # \*(AqRemoteDebuggerAttach\*(Aq: None, # \*(AqRemoteDebuggerSQLDebugging\*(Aq: None, # \*(AqDeploymentDirectory\*(Aq: None, # \*(AqAdditionalFiles\*(Aq: None, # \*(AqRemoteDebuggerDeployDebugCppRuntime\*(Aq: None, # \*(AqWebBrowserDebuggerHttpUrl\*(Aq: None, # \*(AqWebBrowserDebuggerDebuggerType\*(Aq: None, # \*(AqWebServiceDebuggerHttpUrl\*(Aq: None, # \*(AqWebServiceDebuggerDebuggerType\*(Aq: None, # \*(AqWebServiceDebuggerSQLDebugging\*(Aq: None, } # # 3\&. Select the dictionary you want depending on the version of Visual Studio # Files you want to generate\&. # if not env\&.GetOption(\*(Aquserfile\*(Aq): dbgSettings = None elif env\&.get(\*(AqMSVC_VERSION\*(Aq, None) == \*(Aq9\&.0\*(Aq: dbgSettings = V9DebugSettings elif env\&.get(\*(AqMSVC_VERSION\*(Aq, None) == \*(Aq11\&.0\*(Aq: dbgSettings = V10DebugSettings else: dbgSettings = None # # 4\&. Add the dictionary to the DebugSettings keyword\&. # barsrcs = [\*(Aqbar\&.cpp\*(Aq, \*(Aqdllmain\&.cpp\*(Aq, \*(Aqstdafx\&.cpp\*(Aq] barincs = [\*(Aqtargetver\&.h\*(Aq] barlocalincs = [\*(AqStdAfx\&.h\*(Aq] barresources = [\*(Aqbar\&.rc\*(Aq, \*(Aqresource\&.h\*(Aq] barmisc = [\*(AqReadMe\&.txt\*(Aq] dll = env\&.SharedLibrary(target=\*(Aqbar\&.dll\*(Aq, source=barsrcs) env\&.MSVSProject( target=\*(AqBar\*(Aq + env[\*(AqMSVSPROJECTSUFFIX\*(Aq], srcs=barsrcs, incs=barincs, localincs=barlocalincs, resources=barresources, misc=barmisc, buildtarget=[dll[0]] * 2, variant=(\*(AqDebug|Win32\*(Aq, \*(AqRelease|Win32\*(Aq), cmdargs=f\*(Aqvc={msvcver}\*(Aq, DebugSettings=(dbgSettings, {}), ) .fi .if n \{\ .RE .\} .RE .PP \fBMSVSSolution\fR(), \fIenv\fR\&.MSVSSolution() .RS 4 یک فایل راهکار (Solution) نرم‌افزار Microsoft Visual Studio را می‌سازد\&. .sp یک فایل راهکار Visual Studio را بر اساس نسخه پیکربندی‌شده Visual Studio می‌سازد: یا آخرین نسخه نصب‌شده، یا نسخه‌ای که توسط \fB$MSVC_VERSION\fR در محیط ساخت مشخص شده است\&. برای Visual Studio 6، یک فایل \&.dsw تولید می‌شود\&. برای Visual Studio \&.NET 2002 و جدیدتر، یک فایل \&.sln تولید خواهد شد\&. توجه داشته باشید که در محیط ترجمه و کامپایل مایکروسافت چندین طرح نسخه‌بندی دخیل هستند \- برای معادل‌ها به توضیحات \fB$MSVC_VERSION\fR مراجعه کنید\&. .sp فایل راهکار محفظه‌ای برای یک یا چند پروژه است و از قالبی که در \m[blue]\fBhttps://learn\&.microsoft\&.com/en\-us/visualstudio/extensibility/internals/solution\-dot\-sln\-file\fR\m[]\&\s-2\u[4]\d\s+2 توصیف شده، پیروی می‌کند\&. .sp مقادیر زیر باید مشخص شوند: .PP \fItarget\fR .RS 4 نام فایل هدف \&.dsw یا \&.sln\&. باید پسوند مناسب برای نسخه Visual Studio استفاده شود، اما مقدار \fB$MSVSSOLUTIONSUFFIX\fR روی مقدار مناسب تعریف خواهد شد (مثال زیر را ببینید)\&. .RE .PP \fIvariant\fR .RS 4 نام این گونه (variant) خاص، یا فهرستی از نام‌های گونه‌ها (مورد دوم تنها برای راهکارهای MSVS 7 پشتیبانی می‌شود)\&. این‌ها معمولاً مواردی مانند \(lqDebug\(rq یا \(lqRelease\(rq هستند، اما در واقع می‌توانند هر چیزی که می‌خواهید باشند\&. برای MSVS 7 آن‌ها همچنین ممکن است پلتفرم هدف را مشخص کنند، مانند \(lqDebug|Xbox\(rq\&. پلتفرم پیش‌فرض Win32 است\&. .RE .PP \fIprojects\fR .RS 4 فهرستی از نام‌های فایل پروژه، یا گره‌های Project بازگردانده‌شده توسط فراخوانی‌های سازنده \fBMSVSProject\fR، جهت قرار گرفتن در فایل راهکار\&. توجه داشته باشید که این نام‌های فایل باید به صورت رشته مشخص شوند، نه به عنوان File Node های SCons\&. دلیل این امر این است که فایل راهکار توسط MSBuild و Visual Studio تفسیر خواهد شد، که شناختی از انواع Node در SCons ندارند\&. .RE .sp علاوه بر آرگومان‌های اجباری بالا، مقادیر اختیاری زیر می‌توانند به عنوان آرگومان‌های کلیدواژه‌ای مشخص شوند: .PP \fIauto_filter_projects\fR .RS 4 تحت شرایط خاصی، ممکن است نام‌های فایل راهکار یا گره‌های فایل راهکار در فهرست آرگومان \fIprojects\fR حضور داشته باشند\&. هنگامی که نام‌های فایل راهکار یا گره‌ها در فهرست آرگومان \fIprojects\fR حضور دارند، فایل راهکار تولیدشده ممکن است حاوی رکوردهای نادرست Project باشد که منجر به پیام‌های خطای محیط توسعه Visual Studio (VS IDE) هنگام باز کردن فایل راهکار تولیدشده می‌شود\&. به طور پیش‌فرض، هنگامی که نام فایل راهکار یا گره فایل راهکار در فهرست آرگومان \fIprojects\fR شناسایی شود، یک استثنا (exception) صادر می‌شود\&. .sp مقادیر پذیرفته‌شده برای \fIauto_filter_projects\fR عبارتند از: .PP \fINone\fR .RS 4 هنگامی که نام فایل راهکار یا گره فایل راهکار در فهرست آرگومان \fIprojects\fR شناسایی شود، یک استثنا صادر می‌شود\&. .sp \fINone\fR مقدار پیش‌فرض است\&. .RE .PP \fITrue یا ارزیابی به True\fR .RS 4 نام‌های فایل راهکار و گره‌های فایل راهکار را به طور خودکار از فهرست آرگومان \fIprojects\fR حذف کن\&. .RE .PP \fIFalse یا ارزیابی به False\fR .RS 4 نام‌های فایل راهکار و گره‌های فایل راهکار را در فهرست آرگومان \fIprojects\fR باقی بگذار\&. استثنایی صادر نمی‌شود\&. .sp هنگام باز کردن فایل راهکار تولیدشده با VS IDE، محیط VS IDE احتمالاً گزارش خواهد داد که رکوردهای نادرستی از Project وجود دارند که پشتیبانی نمی‌شوند یا نیاز به اصلاح دارند\&. .RE .RE .sp نمونه کاربرد: .sp .if n \{\ .RS 4 .\} .nf env\&.MSVSSolution( target="Bar" + env["MSVSSOLUTIONSUFFIX"], projects=["bar" + env["MSVSPROJECTSUFFIX"]], variant="Release", ) .fi .if n \{\ .RE .\} .RE .PP \fBNinja\fR(), \fIenv\fR\&.Ninja() .RS 4 یک سازنده ویژه که هدفی را برای ایجاد یک فایل ساخت Ninja اضافه می‌کند\&. این سازنده نیازی به مشخص کردن هیچ فایل منبعی ندارد\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBنکته\fR .ps -1 .br این یک ویژگی آزمایشی است\&. برای فعال‌سازی آن باید از یکی از روش‌های زیر استفاده کنید .sp .if n \{\ .RS 4 .\} .nf # On the command line \-\-experimental=ninja # Or in your SConstruct SetOption(\*(Aqexperimental\*(Aq, \*(Aqninja\*(Aq) .fi .if n \{\ .RE .\} .sp این قابلیت ممکن است بدون چرخه منسوخ‌سازی (deprecation cycle) تغییر یافته و/یا حذف شود\&. .sp برای استفاده از این ابزار باید بسته ninja در Python را نصب کنید، زیرا این ابزار به طور پیش‌فرض به قابلیت import کردن این بسته وابسته است این کار از طریق دستور زیر امکان‌پذیر است: .sp .if n \{\ .RS 4 .\} .nf python \-m pip install ninja .fi .if n \{\ .RE .\} .sp .5v .RE اگر بدون هیچ آرگومانی فراخوانی شود، نام هدف پیش‌فرض سازنده ninja\&.build خواهد بود\&. .sp اگر با یک تک‌آرگومان موضعی فراخوانی شود، \fBscons\fR نام هدف را از آن آرگومان منبع «استنتاج» کرده، همان نام را به آن اختصاص می‌دهد و سپس منبع را نادیده می‌گیرد\&. در صورتی که نام هدفی غیر از پیش‌فرض خواسته شده باشد، این روش معمول فراخوانی سازنده است\&. .sp اگر با هر یک از آرگومان‌های کلیدواژه‌ای \fItarget=\fR یا \fIsource=\fR فراخوانی شود، مقدار آرگومان به عنوان نام هدف در نظر گرفته می‌شود\&. اگر با هر دو فراخوانی شود، مقدار \fItarget=\fR استفاده شده و \fIsource=\fR نادیده گرفته می‌شود\&. اگر با چند منبع فراخوانی شود، فهرست منابع نادیده گرفته خواهد شد، زیرا راهی برای استنتاج هدف مورد نظر وجود ندارد؛ در این حالت نام هدف پیش‌فرض استفاده خواهد شد\&. .sp \fIاز \fR\fI\fBscons\fR\fR\fI 4\&.2 به بعد در دسترس است\&.\fR .RE .PP \fBObject\fR(), \fIenv\fR\&.Object() .RS 4 مترادفی برای متد سازندهٔ \fBStaticObject\fR\&. .RE .PP \fBPackage\fR(), \fIenv\fR\&.Package() .RS 4 بسته‌های توزیع نرم‌افزار را می‌سازد\&. یک بسته (package) قالب ظرفی است که شامل فایل‌هایی برای نصب به همراه فراداده است\&. بسته‌بندی اختیاری است، و باید با مشخص کردن ابزار packaging فعال شود\&. برای مثال: .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdefault\*(Aq, \*(Aqpackaging\*(Aq]) .fi .if n \{\ .RE .\} .sp SCons می‌تواند بسته‌ها را در چندین قالب بسته‌بندی شناخته‌شده بسازد\&. نوع بستهٔ هدف می‌تواند با متغیر ساخت \fB$PACKAGETYPE\fR یا گزینهٔ خط فرمان \fB\-\-package\-type\fR انتخاب شود\&. نوع بسته می‌تواند یک فهرست باشد، که در این صورت SCons تلاش خواهد کرد تا بسته‌ها را برای هر نوع موجود در فهرست بسازد\&. مثال: .sp .if n \{\ .RS 4 .\} .nf env\&.Package(PACKAGETYPE=[\*(Aqsrc_zip\*(Aq, \*(Aqsrc_targz\*(Aq], \fI\&.\&.\&.other args\&.\&.\&.\fR) .fi .if n \{\ .RE .\} .sp بسته‌بندهای پشتیبانی‌شده در حال حاضر عبارتند از: .TS allbox tab(:); l l l l l l l l l l l l l l l l l l l l l l. T{ msi T}:T{ بستهٔ Microsoft Installer T} T{ rpm T}:T{ بستهٔ RPM Package Manager T} T{ ipkg T}:T{ بستهٔ Itsy Package Management T} T{ tarbz2 T}:T{ فایل tar فشرده‌شده با bzip2 T} T{ targz T}:T{ فایل tar فشرده‌شده با gzip T} T{ tarxz T}:T{ فایل tar فشرده‌شده با xz T} T{ zip T}:T{ فایل zip T} T{ src_tarbz2 T}:T{ فایل tar فشرده‌شده با bzip2 مناسب به عنوان منبع برای بسته‌بند دیگر T} T{ src_targz T}:T{ فایل tar فشرده‌شده با gzip مناسب به عنوان منبع برای بسته‌بند دیگر T} T{ src_tarxz T}:T{ فایل tar فشرده‌شده با xz مناسب به عنوان منبع برای بسته‌بند دیگر T} T{ src_zip T}:T{ فایل zip مناسب به عنوان منبع برای بسته‌بند دیگر T} .TE .sp 1 فهرست فایل‌هایی که باید در بسته گنجانده شوند را می‌توان با آرگومان کلیدواژه‌ای \fIsource\fR مشخص کرد\&. در صورت حذف، تابع \fBFindInstalledFiles\fR در پشت صحنه فراخوانی می‌شود تا تمام فایل‌هایی را که یک سازندهٔ \fBInstall\fR، \fBInstallAs\fR یا \fBInstallVersionedLib\fR به آن‌ها متصل است، انتخاب کند\&. اگر آرگومان کلیدواژه‌ای \fItarget\fR حذف شود، نام(های) هدف از روی نوع(های) بسته استنتاج خواهد شد\&. .sp فراداده تا حدی از ویژگی‌های فایل‌هایی که باید بسته‌بندی شوند، و تا حدی از برچسب‌های بسته‌بندی به دست می‌آید\&. برچسب‌ها را می‌توان به صورت آرگومان‌های کلیدواژه‌ای به فراخوانی سازندهٔ \fBPackage\fR ارسال کرد، و همچنین می‌توان آن‌ها را با استفاده از تابع \fBTag\fR به فایل‌ها (یا دقیق‌تر، گره‌هایی (Nodes) که نمایانگر فایل‌ها هستند) ضمیمه کرد\&. برخی از برچسب‌های سطح بسته اجباری هستند و در صورت حذف منجر به خطا خواهند شد\&. برچسب‌های اجباری بسته به نوع بسته متفاوت هستند\&. .sp هنگام بسته‌بندی، سازنده از یک مکان موقت مشخص‌شده با مقدار متغیر \fB$PACKAGEROOT\fR استفاده می‌کند \- سورس‌های بسته پیش از بسته‌بندی در آنجا کپی می‌شوند\&. .sp مثال بسته‌بندی: .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=["default", "packaging"]) env\&.Install("/bin/", "my_program") env\&.Package( NAME="foo", VERSION="1\&.2\&.3", PACKAGEVERSION=0, PACKAGETYPE="rpm", LICENSE="gpl", SUMMARY="balalalalal", DESCRIPTION="this should be really really long", X_RPM_GROUP="Application/fu", SOURCE_URL="https://foo\&.org/foo\-1\&.2\&.3\&.tar\&.gz", ) .fi .if n \{\ .RE .\} .sp در این مثال، هدف /bin/my_program ایجاد شده توسط فراخوانی \fBInstall\fR به طور پیش‌فرض ساخته نخواهد شد زیرا زیر دایرکتوری اصلی پروژه قرار ندارد\&. با این حال، از آنجا که هیچ \fIsource\fR مشخصی برای سازندهٔ \fBPackage\fR تعیین نشده است، بر اساس قاعدهٔ سورس‌های پیش‌فرض برای بسته‌بندی انتخاب می‌شود\&. از آنجا که بسته‌بندی با استفاده از \fB$PACKAGEROOT\fR انجام می‌شود، در واقع هیچ نوشتنی در دایرکتوری /bin سیستم رخ نمی‌دهد، و هدف \fIحتماً\fR انتخاب خواهد شد، چرا که پس از تغییر مبنا به زیر \fB$PACKAGEROOT\fR اکنون زیر دایرکتوری اصلی پروژه قرار می‌گیرد\&. .RE .PP \fBPCH\fR(), \fIenv\fR\&.PCH() .RS 4 یک هدر از پیش کامپایل‌شده‌ی Microsoft Visual C++ می‌سازد\&. فراخوانی این سازنده فهرستی از دو گره هدف را برمی‌گرداند: PCH به عنوان عنصر اول، و فایل شیء به عنوان عنصر دوم\&. به طور معمول فایل شیء نادیده گرفته می‌شود\&. سازنده \fBPCH\fR عموماً در ترکیب با متغیر ساخت \fB$PCH\fR برای وادار کردن فایل‌های شیء به استفاده از هدر از پیش کامپایل‌شده به کار می‌رود: .sp .if n \{\ .RS 4 .\} .nf env[\*(AqPCH\*(Aq] = env\&.PCH(\*(AqStdAfx\&.cpp\*(Aq)[0] .fi .if n \{\ .RE .\} .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBنکته\fR .ps -1 .br این سازنده مختص پیاده‌سازی PCH در Microsoft Visual C++ است\&. سایر زنجیره‌های کامپایلر نیز پشتیبانی از هدر از پیش کامپایل‌شده را پیاده‌سازی می‌کنند، اما \fBPCH\fR در حال حاضر با آن‌ها کار نمی‌کند\&. در نتیجه، این سازنده تنها زمانی در محیط ساخت ایجاد می‌شود که Microsoft Visual C++ به عنوان کامپایلر استفاده شود\&. .sp این سازنده تنها در یک پروژه ++C به درستی کار می‌کند\&. پیاده‌سازی مایکروسافت بین هدرهای از پیش کامپایل‌شده‌ی C و ++C تمایز قائل می‌شود\&. استفاده از این سازنده باعث می‌شود تولید PCH با پرچمی انجام شود که به cl\&.exe اعلام می‌کند تمام فایل‌ها، فایل‌های ++C هستند؛ اگر سپس آن فایل PCH هنگام کامپایل یک فایل منبع C داده شود، cl\&.exe ساخت را به دلیل نقض سازگاری با خطا مواجه خواهد کرد\&. .sp در صورت امکان، پروژه را طوری ساماندهی کنید که فایل منبع ++C ارسال‌شده به سازنده \fBPCH\fR، در فهرست سورس‌هایی که باید به صورت دیگر در پروژه کامپایل شوند قرار نگیرد\&. SCons در نتیجه فراخوانی \fBPCH\fR، آن فایل را به درستی در درخت وابستگی ردیابی کرده و (برای MSVC 11\&.0 و بالاتر) فایل شیء متناظر را به طور خودکار به خط پیوند اضافه می‌کند\&. اگر فهرست منابع به طور خودکار تولید می‌شود، برای مثال با استفاده از تابع \fBGlob\fR، ممکن است حذف آن فایل از فهرست ضروری باشد\&. .sp .5v .RE .RE .PP \fBPDF\fR(), \fIenv\fR\&.PDF() .RS 4 یک فایل \&.pdf را از یک فایل ورودی \&.dvi (یا بر اساس پسوند، یک فایل ورودی \&.tex، \&.ltx یا \&.latex) می‌سازد\&. پسوند مشخص‌شده توسط متغیر ساخت \fB$PDFSUFFIX\fR (به طور پیش‌فرض \&.pdf) در صورتی که از قبل موجود نباشد، به طور خودکار به هدف اضافه می‌شود\&. \fBPDF\fR یک سازنده تک‌منبعی است\&. مثال: .sp .if n \{\ .RS 4 .\} .nf # builds from aaa\&.tex env\&.PDF(target = \*(Aqaaa\&.pdf\*(Aq, source = \*(Aqaaa\&.tex\*(Aq) # builds bbb\&.pdf from bbb\&.dvi env\&.PDF(target = \*(Aqbbb\*(Aq, source = \*(Aqbbb\&.dvi\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fBPOInit\fR(), \fIenv\fR\&.POInit() .RS 4 این سازنده توسط ابزار msginit برپا می‌شود\&. این سازنده در صورت تنظیم بودن \fB$POAUTOINIT\fR، فایل(های) PO ناموجود را مقداردهی اولیه می‌کند\&. اگر \fB$POAUTOINIT\fR تنظیم نشده باشد (حالت پیش‌فرض)، \fBPOInit\fR دستورالعمل‌هایی را برای کاربر (مانند یک مترجم) چاپ می‌کند و توضیح می‌دهد که فایل PO چگونه باید مقداردهی اولیه شود\&. در پروژه‌های معمولی \fIنباید از \fR\fI\fBPOInit\fR\fR\fI استفاده کنید، بلکه باید از \fR\fI\fBPOUpdate\fR\fR\fI استفاده نمایید\fR\&. \fBPOUpdate\fR به صورت هوشمندانه بین \fBmsgmerge(1)\fR و \fBmsginit(1)\fR انتخاب می‌کند\&. \fBPOInit\fR همواره از \fBmsginit(1)\fR استفاده می‌کند و باید به عنوان سازنده‌ای برای اهداف ویژه یا استفاده موقت (مثلاً برای مقداردهی اولیه سریع و یک‌باره‌ی دسته‌ای از فایل‌های PO) یا برای آزمون‌ها در نظر گرفته شود\&. \fBPOInit\fR یک سازنده تک‌منبعی است\&. همچنین در صورت تنظیم بودن \fB$LINGUAS_FILE\fR، می‌توان از پارامتر \fIsource\fR صرف‌نظر کرد\&. .sp گره‌های هدف تعریف‌شده از طریق \fBPOInit\fR به طور پیش‌فرض ساخته نمی‌شوند (آن‌ها از گره \*(Aq\&.\*(Aq نادیده گرفته می‌شوند) اما به یک \fBAlias\fR ویژه (به طور پیش‌فرض \*(Aqpo\-create\*(Aq) افزوده می‌گردند\&. نام مستعار را می‌توان از طریق متغیر ساخت \fB$POCREATE_ALIAS\fR تغییر داد\&. تمام فایل‌های PO تعریف‌شده از طریق \fBPOInit\fR را می‌توان به راحتی با دستور \fBscons po\-create\fR مقداردهی اولیه کرد\&. .sp \fIمثال ۱\fR\&. مقداردهی اولیه en\&.po و pl\&.po از messages\&.pot: .sp .if n \{\ .RS 4 .\} .nf env\&.POInit([\*(Aqen\*(Aq, \*(Aqpl\*(Aq]) # messages\&.pot \-\-> [en\&.po, pl\&.po] .fi .if n \{\ .RE .\} .sp \fIمثال ۲\fR\&. مقداردهی اولیه en\&.po و pl\&.po از foo\&.pot: .sp .if n \{\ .RS 4 .\} .nf env\&.POInit([\*(Aqen\*(Aq, \*(Aqpl\*(Aq], [\*(Aqfoo\*(Aq]) # foo\&.pot \-\-> [en\&.po, pl\&.po] .fi .if n \{\ .RE .\} .sp \fIمثال ۳\fR\&. مقداردهی اولیه en\&.po و pl\&.po از foo\&.pot اما با استفاده از متغیر ساخت \fB$POTDOMAIN\fR: .sp .if n \{\ .RS 4 .\} .nf env\&.POInit([\*(Aqen\*(Aq, \*(Aqpl\*(Aq], POTDOMAIN=\*(Aqfoo\*(Aq) # foo\&.pot \-\-> [en\&.po, pl\&.po] .fi .if n \{\ .RE .\} .sp \fIمثال ۴\fR\&. مقداردهی اولیه فایل‌های PO برای زبان‌های تعریف‌شده در فایل LINGUAS\&. فایل‌ها از قالب messages\&.pot مقداردهی اولیه خواهند شد: .sp .if n \{\ .RS 4 .\} .nf env\&.POInit(LINGUAS_FILE=True) # needs \*(AqLINGUAS\*(Aq file .fi .if n \{\ .RE .\} .sp \fIمثال ۵\fR\&. مقداردهی اولیه فایل‌های PO en\&.po و pl\&.pl به علاوه فایل‌های مربوط به زبان‌های تعریف‌شده در فایل LINGUAS\&. فایل‌ها از قالب messages\&.pot مقداردهی اولیه خواهند شد: .sp .if n \{\ .RS 4 .\} .nf env\&.POInit([\*(Aqen\*(Aq, \*(Aqpl\*(Aq], LINGUAS_FILE=True) .fi .if n \{\ .RE .\} .sp \fIمثال ۶\fR\&. می‌توانید ابتدا محیط خود را از پیش پیکربندی کنید، و سپس فایل‌های PO را مقداردهی اولیه نمایید: .sp .if n \{\ .RS 4 .\} .nf env[\*(AqPOAUTOINIT\*(Aq] = True env[\*(AqLINGUAS_FILE\*(Aq] = True env[\*(AqPOTDOMAIN\*(Aq] = \*(Aqfoo\*(Aq env\&.POInit() .fi .if n \{\ .RE .\} .sp که همان اثری را دارد که: .sp .if n \{\ .RS 4 .\} .nf env\&.POInit(POAUTOINIT=True, LINGUAS_FILE=True, POTDOMAIN=\*(Aqfoo\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fBPostScript\fR(), \fIenv\fR\&.PostScript() .RS 4 یک فایل \&.ps را از یک فایل ورودی \&.dvi (یا بر حسب تعمیم، یک فایل ورودی \&.tex، \&.ltx یا \&.latex) می‌سازد\&. پسوند مشخص‌شده توسط متغیر ساخت \fB$PSSUFFIX\fR (به‌طور پیش‌فرض \&.ps) در صورتی که از پیش وجود نداشته باشد، به‌طور خودکار به هدف افزوده می‌شود\&. \fBPostScript\fR یک سازندهٔ تک‌منبعی است\&. مثال: .sp .if n \{\ .RS 4 .\} .nf # builds from aaa\&.tex env\&.PostScript(target = \*(Aqaaa\&.ps\*(Aq, source = \*(Aqaaa\&.tex\*(Aq) # builds bbb\&.ps from bbb\&.dvi env\&.PostScript(target = \*(Aqbbb\*(Aq, source = \*(Aqbbb\&.dvi\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fBPOTUpdate\fR(), \fIenv\fR\&.POTUpdate() .RS 4 این سازنده توسط ابزار xgettext، بخشی از مجموعه ابزار gettext برپا می‌شود\&. سازنده در صورت وجود داشتن فایل POT هدف، آن را به‌روزرسانی کرده و در غیر این صورت آن را ایجاد می‌کند\&. گره هدف به‌طور پیش‌فرض برای ساخت انتخاب \fIنمی‌شود\fR (مثلاً \fBscons \&.\fR)، بلکه تنها در صورت درخواست (یعنی زمانی که فایل POT مربوطه مورد نیاز باشد یا نام مستعار خاصی فراخوانی شود) انتخاب می‌گردد\&. این سازنده گره هدف خود را (برای مثال messages\&.pot) به یک نام مستعار ویژه اضافه می‌کند (به‌طور پیش‌فرض pot\-update، \fB$POTUPDATE_ALIAS\fR را ببینید) تا بتوانید آن‌ها را به‌راحتی با \fBscons pot\-update\fR به‌روزرسانی/ایجاد کنید\&. فایل تا زمانی که هیچ تغییر واقعی در پیام‌های بین‌المللی‌سازی‌شده (یا در توضیحاتی که وارد فایل POT می‌شوند) رخ نداده باشد، بازنویسی نمی‌شود\&. .sp .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBنکته\fR .ps -1 .br ممکن است ببینید که \fBxgettext(1)\fR توسط ابزار xgettext فراخوانی می‌شود، حتی اگر هیچ تغییر واقعی در پیام‌های بین‌المللی‌سازی‌شده رخ نداده باشد (بنابراین فایل POT به‌روزرسانی نمی‌شود)\&. این رویداد هر بار که یک فایل منبع تغییر کند رخ می‌دهد\&. در چنین حالتی ما \fBxgettext(1)\fR را فراخوانی کرده و خروجی آن را با محتوای فایل POT مقایسه می‌کنیم تا تصمیم بگیریم آیا فایل باید به‌روزرسانی شود یا خیر\&. .sp .5v .RE .sp \fIمثال ۱\&.\fR بیایید دایرکتوری po/ را ایجاد کرده و اسکریپت SConstruct زیر را در آن قرار دهیم: .sp .if n \{\ .RS 4 .\} .nf # SConstruct in \*(Aqpo/\*(Aq subdir env = Environment(tools=[\*(Aqdefault\*(Aq, \*(Aqxgettext\*(Aq]) env\&.POTUpdate([\*(Aqfoo\*(Aq], [\*(Aq\&.\&./a\&.cpp\*(Aq, \*(Aq\&.\&./b\&.cpp\*(Aq]) env\&.POTUpdate([\*(Aqbar\*(Aq], [\*(Aq\&.\&./c\&.cpp\*(Aq, \*(Aq\&.\&./d\&.cpp\*(Aq]) .fi .if n \{\ .RE .\} .sp سپس scons را چند بار فراخوانی کنید: .sp .if n \{\ .RS 4 .\} .nf $ scons # Does not create foo\&.pot nor bar\&.pot $ scons foo\&.pot # Updates or creates foo\&.pot $ scons pot\-update # Updates or creates foo\&.pot and bar\&.pot $ scons \-c # Does not clean foo\&.pot nor bar\&.pot\&. .fi .if n \{\ .RE .\} .sp نتایج همان‌گونه خواهند بود که در توضیحات بالا آمده است\&. .sp \fIمثال ۲\&.\fR آرگومان \fItarget\fR می‌تواند حذف شود، که در این حالت نام هدف پیش‌فرض messages\&.pot استفاده می‌شود\&. هدف همچنین می‌تواند با تنظیم متغیر ساخت \fB$POTDOMAIN\fR یا ارائهٔ آن به عنوان یک جایگزین به سازندهٔ \fBPOTUpdate\fR بازنویسی شود: .sp .if n \{\ .RS 4 .\} .nf # SConstruct script env = Environment(tools=[\*(Aqdefault\*(Aq, \*(Aqxgettext\*(Aq]) env[\*(AqPOTDOMAIN\*(Aq] = "foo" env\&.POTUpdate(source=["a\&.cpp", "b\&.cpp"]) # Creates foo\&.pot \&.\&.\&. env\&.POTUpdate(POTDOMAIN="bar", source=["c\&.cpp", "d\&.cpp"]) # and bar\&.pot .fi .if n \{\ .RE .\} .sp \fIمثال ۳\&.\fR پارامتر \fIsource\fR نیز در صورتی که در یک فایل جداگانه، برای مثال POTFILES\&.in مشخص شده باشد، می‌تواند حذف شود: .sp .if n \{\ .RS 4 .\} .nf # POTFILES\&.in in \*(Aqpo/\*(Aq subdirectory \&.\&./a\&.cpp \&.\&./b\&.cpp # end of file .fi .if n \{\ .RE .\} .sp نام فایلی (POTFILES\&.in) که حاوی فهرست منابع است از طریق \fB$XGETTEXTFROM\fR ارائه می‌شود: .sp .if n \{\ .RS 4 .\} .nf # SConstruct file in \*(Aqpo/\*(Aq subdirectory env = Environment(tools=[\*(Aqdefault\*(Aq, \*(Aqxgettext\*(Aq]) env\&.POTUpdate(XGETTEXTFROM=\*(AqPOTFILES\&.in\*(Aq) .fi .if n \{\ .RE .\} .sp \fIمثال ۴\&.\fR می‌توانید از \fB$XGETTEXTPATH\fR برای تعریف مسیر جستجوی منبع استفاده کنید\&. برای مثال فرض کنید فایل‌های a\&.cpp، b\&.cpp، po/SConstruct، po/POTFILES\&.in را دارید\&. در این صورت فایل‌های مرتبط با POT شما می‌توانند به این شکل باشند: .sp .if n \{\ .RS 4 .\} .nf # POTFILES\&.in in \*(Aqpo/\*(Aq subdirectory a\&.cpp b\&.cpp # end of file .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf # SConstruct file in \*(Aqpo/\*(Aq subdirectory env = Environment(tools=[\*(Aqdefault\*(Aq, \*(Aqxgettext\*(Aq]) env\&.POTUpdate(XGETTEXTFROM=\*(AqPOTFILES\&.in\*(Aq, XGETTEXTPATH=\*(Aq\&.\&./\*(Aq) .fi .if n \{\ .RE .\} .sp \fIمثال ۵\&.\fR چندین دایرکتوری جستجو را می‌توان به‌صورت یک لیست تعریف کرد، یعنی XGETTEXTPATH=[\*(Aqdir1\*(Aq, \*(Aqdir2\*(Aq, \&.\&.\&.]\&. ترتیب در لیست، ترتیب جستجوی فایل‌های منبع را مشخص می‌کند\&. مسیر اولین فایل یافت‌شده استفاده می‌شود\&. .sp بیایید اسکریپت 0/1/po/SConstruct را ایجاد کنیم: .sp .if n \{\ .RS 4 .\} .nf # SConstruct file in \*(Aq0/1/po/\*(Aq subdirectory env = Environment(tools=[\*(Aqdefault\*(Aq, \*(Aqxgettext\*(Aq]) env\&.POTUpdate(XGETTEXTFROM=\*(AqPOTFILES\&.in\*(Aq, XGETTEXTPATH=[\*(Aq\&.\&./\*(Aq, \*(Aq\&.\&./\&.\&./\*(Aq]) .fi .if n \{\ .RE .\} .sp و همچنین 0/1/po/POTFILES\&.in: .sp .if n \{\ .RS 4 .\} .nf # POTFILES\&.in in \*(Aq0/1/po/\*(Aq subdirectory a\&.cpp # end of file .fi .if n \{\ .RE .\} .sp دو فایل *\&.cpp بنویسید، اولی 0/a\&.cpp است: .sp .if n \{\ .RS 4 .\} .nf /* 0/a\&.cpp */ gettext("Hello from \&.\&./\&.\&./a\&.cpp") .fi .if n \{\ .RE .\} .sp و دومی 0/1/a\&.cpp است: .sp .if n \{\ .RS 4 .\} .nf /* 0/1/a\&.cpp */ gettext("Hello from \&.\&./a\&.cpp") .fi .if n \{\ .RE .\} .sp سپس scons را اجرا کنید\&. شما 0/1/po/messages\&.pot را با پیام "Hello from \&.\&./a\&.cpp" به دست خواهید آورد\&. زمانی که ترتیب را در \fI$XGETTEXTFOM\fR معکوس کنید، یعنی هنگامی که SConscript را به‌صورت زیر بنویسید: .sp .if n \{\ .RS 4 .\} .nf # SConstruct file in \*(Aq0/1/po/\*(Aq subdirectory env = Environment(tools=[\*(Aqdefault\*(Aq, \*(Aqxgettext\*(Aq]) env\&.POTUpdate(XGETTEXTFROM=\*(AqPOTFILES\&.in\*(Aq, XGETTEXTPATH=[\*(Aq\&.\&./\&.\&./\*(Aq, \*(Aq\&.\&./\*(Aq]) .fi .if n \{\ .RE .\} .sp آنگاه messages\&.pot شامل خط msgid "Hello from \&.\&./\&.\&./a\&.cpp" خواهد بود و نه msgid "Hello from \&.\&./a\&.cpp"\&. .RE .PP \fBPOUpdate\fR(), \fIenv\fR\&.POUpdate() .RS 4 این سازنده توسط ابزار msgmerge که بخشی از مجموعه ابزار gettext است برپا می‌شود\&. سازنده پرونده‌های PO را با \fBmsgmerge(1)\fR به‌روزرسانی می‌کند، یا پرونده‌های مفقود PO را همان‌طور که در مستندات ابزار msginit و سازندهٔ \fBPOInit\fR شرح داده شده مقداردهی اولیه می‌کند (همچنین ببینید \fB$POAUTOINIT\fR)\&. \fBPOUpdate\fR یک سازندهٔ تک‌منبع است\&. پارامتر \fIsource\fR همچنین در صورت تنظیم بودن \fB$LINGUAS_FILE\fR می‌تواند حذف شود\&. .sp گره‌های هدف به‌طور پیش‌فرض برای ساخت انتخاب \fIنمی‌شوند\fR (برای نمونه \fBscons \&.\fR)\&. در عوض، آن‌ها به‌طور خودکار به یک \fBAlias\fR ویژه (به‌طور پیش‌فرض \*(Aqpo\-update\*(Aq) افزوده می‌شوند\&. نام مستعار را می‌توان از طریق متغیر ساخت \fB$POUPDATE_ALIAS\fR تغییر داد\&. می‌توانید به‌سادگی پرونده‌های PO را در پروژهٔ خود با دستور \fBscons po\-update\fR به‌روزرسانی کنید\&. توجه داشته باشید که \fBPOUpdate\fR برخلاف \fBPOInit\fR، هدف‌های خود را به نام مستعار po\-create نمی‌افزاید\&. .sp \fIمثال ۱\&.\fR به‌روزرسانی en\&.po و pl\&.po از قالب messages\&.pot (همچنین ببینید \fB$POTDOMAIN\fR)، با این فرض که مورد دوم وجود دارد یا قانونی برای ساخت آن تعریف شده است (ببینید \fBPOTUpdate\fR): .sp .if n \{\ .RS 4 .\} .nf env\&.POUpdate([\*(Aqen\*(Aq,\*(Aqpl\*(Aq]) # messages\&.pot \-\-> [en\&.po, pl\&.po] .fi .if n \{\ .RE .\} .sp \fIمثال ۲\&.\fR به‌روزرسانی en\&.po و pl\&.po از قالب foo\&.pot: .sp .if n \{\ .RS 4 .\} .nf env\&.POUpdate([\*(Aqen\*(Aq, \*(Aqpl\*(Aq], [\*(Aqfoo\*(Aq]) # foo\&.pot \-\-> [en\&.po, pl\&.pl] .fi .if n \{\ .RE .\} .sp \fIمثال ۳\&.\fR به‌روزرسانی en\&.po و pl\&.po از foo\&.pot (روشی دیگر): .sp .if n \{\ .RS 4 .\} .nf env\&.POUpdate([\*(Aqen\*(Aq, \*(Aqpl\*(Aq], POTDOMAIN=\*(Aqfoo\*(Aq) # foo\&.pot \-\- > [en\&.po, pl\&.pl] .fi .if n \{\ .RE .\} .sp \fIمثال ۴\&.\fR به‌روزرسانی پرونده‌ها برای زبان‌های تعریف‌شده در پروندهٔ LINGUAS\&. پرونده‌ها از قالب messages\&.pot به‌روزرسانی می‌شوند: .sp .if n \{\ .RS 4 .\} .nf env\&.POUpdate(LINGUAS_FILE=True) # needs \*(AqLINGUAS\*(Aq file .fi .if n \{\ .RE .\} .sp \fIمثال ۵\&.\fR مشابه بالا، اما به‌روزرسانی از قالب foo\&.pot: .sp .if n \{\ .RS 4 .\} .nf env\&.POUpdate(LINGUAS_FILE=True, source=[\*(Aqfoo\*(Aq]) .fi .if n \{\ .RE .\} .sp \fIمثال ۶\&.\fR به‌روزرسانی en\&.po و pl\&.po به‌همراه پرونده‌ها برای زبان‌های تعریف‌شده در پروندهٔ LINGUAS\&. پرونده‌ها از قالب messages\&.pot به‌روزرسانی می‌شوند: .sp .if n \{\ .RS 4 .\} .nf # produce \*(Aqen\&.po\*(Aq, \*(Aqpl\&.po\*(Aq + files defined in \*(AqLINGUAS\*(Aq: env\&.POUpdate([\*(Aqen\*(Aq, \*(Aqpl\*(Aq ], LINGUAS_FILE=True) .fi .if n \{\ .RE .\} .sp \fIمثال ۷\&.\fR استفاده از \fB$POAUTOINIT\fR برای مقداردهی اولیهٔ خودکار پروندهٔ PO در صورتی که وجود نداشته باشد: .sp .if n \{\ .RS 4 .\} .nf env\&.POUpdate(LINGUAS_FILE=True, POAUTOINIT=True) .fi .if n \{\ .RE .\} .sp \fIمثال ۸\&.\fR به‌روزرسانی پرونده‌های PO برای زبان‌های تعریف‌شده در پروندهٔ LINGUAS\&. پرونده‌ها از قالب foo\&.pot به‌روزرسانی می‌شوند\&. تمام تنظیمات لازم از پیش از طریق محیط پیکربندی شده‌اند\&. .sp .if n \{\ .RS 4 .\} .nf env[\*(AqPOAUTOINIT\*(Aq] = True env[\*(AqLINGUAS_FILE\*(Aq] = True env[\*(AqPOTDOMAIN\*(Aq] = \*(Aqfoo\*(Aq env\&.POUpdate() .fi .if n \{\ .RE .\} .RE .PP \fBProgram\fR(), \fIenv\fR\&.Program() .RS 4 یک فایل اجرایی را با دریافت یک یا چند فایل شیء یا فایل‌های منبع C، C++، D یا Fortran می‌سازد\&. اگر هرگونه فایل منبع C، C++، D یا Fortran مشخص شده باشد، آنگاه با استفاده از متد سازنده \fBObject\fR به‌طور خودکار به فایل‌های شیء کامپایل خواهند شد؛ برای مشاهده فهرستی از پسوندهای معتبر فایل منبع و نحوه تفسیر آن‌ها، به توضیحات آن متد سازنده مراجعه کنید\&. پیشوند فایل اجرایی هدف، که توسط متغیر ساخت \fB$PROGPREFIX\fR مشخص می‌شود (به‌طور پیش‌فرض خالی)، و پسوند، که توسط متغیر ساخت \fB$PROGSUFFIX\fR تعیین می‌شود (به‌طور پیش‌فرض، \&.exe در سیستم‌های Windows و خالی در سیستم‌های POSIX)، در صورتی که از پیش وجود نداشته باشند، به‌طور خودکار به هدف اضافه می‌شوند\&. مثال: .sp .if n \{\ .RS 4 .\} .nf env\&.Program(target=\*(Aqfoo\*(Aq, source=[\*(Aqfoo\&.o\*(Aq, \*(Aqbar\&.c\*(Aq, \*(Aqbaz\&.f\*(Aq]) .fi .if n \{\ .RE .\} .RE .PP \fBProgramAllAtOnce\fR(), \fIenv\fR\&.ProgramAllAtOnce() .RS 4 یک فایل اجرایی را از منابع D بدون ایجاد اولیه فایل‌های شیء مجزا برای هر فایل می‌سازد\&. .sp کدهای منبع D می‌توانند مانند منابع C و C++ به‌صورت فایل‌به‌فایل کامپایل شوند، و زبان D برای این مدل ساخت با سازنده‌های \fBObject\fR و \fBProgram\fR در \fBscons\fR یکپارچه شده است\&. با این حال، کدهای D می‌توانند فرا\-برنامه‌نویسی روی کل کد منبع (whole source meta\-programming) انجام دهند (برخی از چارچوب‌های آزمون این کار را می‌کنند)\&. برای این منظور ضروری است که تمام منابع در یک فراخوانی واحد به کامپایلر D، کامپایل و پیوند (link) داده شوند\&. این سازنده در خدمت این هدف است\&. .sp .if n \{\ .RS 4 .\} .nf env\&.ProgramAllAtOnce(\*(Aqexecutable\*(Aq, [\*(Aqmod_a\&.d, mod_b\&.d\*(Aq, \*(Aqmod_c\&.d\*(Aq]) .fi .if n \{\ .RE .\} .sp این دستور ماژول‌های mod_a، mod_b و mod_c را در یک فرایند کامپایل واحد بدون ایجاد فایل‌های شیء اولیه برای ماژول‌ها، کامپایل خواهد کرد\&. برخی از کامپایلرهای D فایل executable\&.o را ایجاد خواهند کرد و برخی دیگر ایجاد نخواهند کرد\&. .RE .PP \fBRES\fR(), \fIenv\fR\&.RES() .RS 4 یک فایل منبع (resource file) برای Microsoft Visual C++ می‌سازد\&. این متد سازنده تنها زمانی ارائه می‌شود که Microsoft Visual C++ یا MinGW به عنوان کامپایلر استفاده شوند\&. در صورتی که پسوند دیگری داده نشود، پسوند \&.res (یا \&.o برای MinGW) به نام هدف اضافه می‌شود\&. فایل منبع برای یافتن وابستگی‌های ضمنی درست مانند یک فایل C پویش می‌شود\&. مثال: .sp .if n \{\ .RS 4 .\} .nf env\&.RES(\*(Aqresource\&.rc\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fBRMIC\fR(), \fIenv\fR\&.RMIC() .RS 4 فایل‌های کلاس stub و skeleton را برای اشیاء راه دور از روی فایل‌های \&.class جاوا می‌سازد\&. هدف، دایرکتوری‌ای است که فایل‌های کلاس stub و skeleton نسبت به آن نوشته خواهند شد\&. منبع می‌تواند نام فایل‌های \&.class یا اشیاء بازگردانده شده از متد سازنده \fBJava\fR باشد\&. .sp اگر متغیر ساخت \fB$JAVACLASSDIR\fR تنظیم شده باشد، چه در محیط و چه در فراخوانی خود متد سازنده \fBRMIC\fR، مقدار این متغیر از ابتدای هر نام فایل \&.class حذف خواهد شد\&. .sp .if n \{\ .RS 4 .\} .nf classes = env\&.Java(target=\*(Aqclassdir\*(Aq, source=\*(Aqsrc\*(Aq) env\&.RMIC(target=\*(Aqoutdir1\*(Aq, source=classes) env\&.RMIC( target=\*(Aqoutdir2\*(Aq, source=[\*(Aqpackage/foo\&.class\*(Aq, \*(Aqpackage/bar\&.class\*(Aq], ) env\&.RMIC( target=\*(Aqoutdir3\*(Aq, source=[\*(Aqclasses/foo\&.class\*(Aq, \*(Aqclasses/bar\&.class\*(Aq], JAVACLASSDIR=\*(Aqclasses\*(Aq, ) .fi .if n \{\ .RE .\} .RE .PP \fBRPCGenClient\fR(), \fIenv\fR\&.RPCGenClient() .RS 4 یک فایل stub کلاینت RPC به نام (_clnt\&.c) را از روی یک فایل منبع RPC مشخص‌شده (\&.x) تولید می‌کند\&. از آنجا که rpcgen فایل‌های خروجی را تنها در دایرکتوری محلی می‌سازد، این دستور به‌طور پیش‌فرض در دایرکتوری فایل منبع اجرا خواهد شد\&. .sp .if n \{\ .RS 4 .\} .nf # Builds src/rpcif_clnt\&.c env\&.RPCGenClient(\*(Aqsrc/rpcif\&.x\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fBRPCGenHeader\fR(), \fIenv\fR\&.RPCGenHeader() .RS 4 یک فایل سرایند RPC به نام (\&.h) را از روی یک فایل منبع RPC مشخص‌شده (\&.x) تولید می‌کند\&. از آنجا که rpcgen فایل‌های خروجی را تنها در دایرکتوری محلی می‌سازد، این دستور به‌طور پیش‌فرض در دایرکتوری فایل منبع اجرا خواهد شد\&. .sp .if n \{\ .RS 4 .\} .nf # Builds src/rpcif\&.h env\&.RPCGenHeader(\*(Aqsrc/rpcif\&.x\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fBRPCGenService\fR(), \fIenv\fR\&.RPCGenService() .RS 4 یک فایل اسکلت سرور RPC به نام (_svc\&.c) را از روی یک فایل منبع RPC مشخص‌شده (\&.x) تولید می‌کند\&. از آنجا که rpcgen فایل‌های خروجی را تنها در دایرکتوری محلی می‌سازد، این دستور به‌طور پیش‌فرض در دایرکتوری فایل منبع اجرا خواهد شد\&. .sp .if n \{\ .RS 4 .\} .nf # Builds src/rpcif_svc\&.c env\&.RPCGenClient(\*(Aqsrc/rpcif\&.x\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fBRPCGenXDR\fR(), \fIenv\fR\&.RPCGenXDR() .RS 4 یک فایل روتین RPC XDR (_xdr\&.c) را از روی یک فایل منبع RPC (\&.x) مشخص‌شده تولید می‌کند\&. از آنجا که rpcgen فایل‌های خروجی را تنها در دایرکتوری محلی می‌سازد، دستور به طور پیش‌فرض در دایرکتوری فایل منبع اجرا خواهد شد\&. .sp .if n \{\ .RS 4 .\} .nf # Builds src/rpcif_xdr\&.c env\&.RPCGenClient(\*(Aqsrc/rpcif\&.x\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fBSharedLibrary\fR(), \fIenv\fR\&.SharedLibrary() .RS 4 یک کتابخانه مشترک را با توجه به یک یا چند فایل شیء و/یا فایل‌های منبع C، C++، D یا Fortran می‌سازد\&. هر فایل منبعی که در پارامتر \fIsource\fR فهرست شده باشد، به طور خودکار به فایل‌های شیء مناسب برای استفاده در یک کتابخانه مشترک کامپایل خواهد شد\&. هر فایل شیئی که در پارامتر \fIsource\fR فهرست شده است باید برای یک کتابخانه مشترک ساخته شده باشد (یعنی با استفاده از متد سازنده \fBSharedObject\fR)\&. در صورت وجود هرگونه عدم تطابق، \fBscons\fR خطا صادر خواهد کرد\&. .sp پیشوند فایل کتابخانه هدف، مشخص‌شده توسط متغیر ساخت \fB$SHLIBPREFIX\fR (به طور پیش‌فرض، lib در سیستم‌های POSIX، و بدون مقدار در سیستم‌های Windows)، و پسوند، مشخص‌شده توسط متغیر ساخت \fB$SHLIBSUFFIX\fR (به طور پیش‌فرض، \&.dll در سیستم‌های Windows، و \&.so در سیستم‌های POSIX)، به طور خودکار (اگر از قبل وجود نداشته باشد) به نام هدف اضافه می‌شوند تا نام فایل کتابخانه تشکیل شود\&. در یک سیستم POSIX، اگر متغیر ساخت \fB$SHLIBVERSION\fR تنظیم شده باشد، (پس از یک نقطه) به انتهای نام کتابخانه حاصل اضافه می‌شود\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf env\&.SharedLibrary(target=\*(Aqbar\*(Aq, source=[\*(Aqbar\&.c\*(Aq, \*(Aqfoo\&.o\*(Aq]) .fi .if n \{\ .RE .\} .sp در سیستم‌های Windows، متد سازنده \fBSharedLibrary\fR همیشه علاوه بر کتابخانه مشترک (\&.dll)، یک کتابخانه واردات (\&.lib) نیز خواهد ساخت، و در صورتی که فایلی با پسوند \&.lib به طور صریح در اهداف فهرست نشده باشد، یک کتابخانه \&.lib با همان نام پایه اضافه می‌کند\&. .sp در سیستم‌های Cygwin، متد سازنده \fBSharedLibrary\fR همیشه علاوه بر کتابخانه مشترک (\&.dll)، یک کتابخانه واردات (\&.dll\&.a) نیز خواهد ساخت، و در صورتی که فایلی با پسوند \&.dll\&.a به طور صریح در اهداف فهرست نشده باشد، یک کتابخانه \&.dll\&.a با همان نام پایه اضافه می‌کند\&. .sp در برخی پلتفرم‌ها، میان یک کتابخانه مشترک (که برای حل ارجاعات خارجی به طور خودکار توسط سیستم بارگذاری می‌شود) و یک ماژول قابل بارگذاری (که با اقدام کاربر به طور صریح بارگذاری می‌شود) تمایز وجود دارد\&. برای بیشترین سازگاری و قابلیت حمل، برای مورد دوم از سازنده \fBLoadableModule\fR استفاده کنید\&. .sp اگر \fB$SHLIBVERSION\fR تعریف شده باشد، یک کتابخانه مشترک نسخه‌دار ایجاد می‌شود\&. این کار \fB$SHLINKFLAGS\fR را بر حسب نیاز تغییر می‌دهد، شماره نسخه را به نام کتابخانه اضافه می‌کند و هر پیوند نمادین مورد نیازی را می‌سازد\&. .sp .if n \{\ .RS 4 .\} .nf env\&.SharedLibrary(target=\*(Aqbar\*(Aq, source=[\*(Aqbar\&.c\*(Aq, \*(Aqfoo\&.o\*(Aq], SHLIBVERSION=\*(Aq1\&.5\&.2\*(Aq) .fi .if n \{\ .RE .\} .sp در یک سیستم POSIX، ارائه یک رشته نسخه ساده (بدون نقطه) دقیقاً یک پیوند نمادین ایجاد می‌کند: SHLIBVERSION="1" (به عنوان مثال) کتابخانه libbar\&.so\&.1 و پیوند نمادین libbar\&.so را ایجاد می‌کند\&. ارائه یک رشته نسخه نقطه‌دار دو پیوند نمادین ایجاد خواهد کرد (بدون در نظر گرفتن تعداد بخش‌ها در نسخه): SHLIBVERSION="1\&.5\&.2" برای همان کتابخانه، کتابخانه libbar\&.so\&.1\&.5\&.2 و پیوندهای نمادین libbar\&.so و libbar\&.so\&.1 را ایجاد می‌کند\&. یک سیستم Darwin (OSX) در هر دو حالت یک پیوند نمادین ایجاد می‌کند؛ برای مثال دوم، کتابخانه libbar\&.1\&.5\&.2\&.dylib و پیوند libbar\&.dylib خواهد بود\&. .sp در سیستم‌های Windows، مشخص کردن آرگومان کلیدواژه‌ای \fIregister=1\fR باعث می‌شود که \&.dll پس از ساخته شدن ثبت شود\&. دستوری که اجرا می‌شود توسط متغیر ساخت \fB$REGSVR\fR (به طور پیش‌فرض \fBregsvr32\fR) تعیین شده و پرچم‌های ارسالی توسط \fB$REGSVRFLAGS\fR مشخص می‌شوند\&. به طور پیش‌فرض، \fB$REGSVRFLAGS\fR شامل گزینه \fB/s\fR است تا هنگام اجرا، از باز شدن کادرهای محاوره‌ای و نیاز به توجه کاربر جلوگیری کند\&. اگر \fB$REGSVRFLAGS\fR را تغییر می‌دهید، حتماً گزینه \fB/s\fR را بگنجانید\&. به عنوان مثال، .sp .if n \{\ .RS 4 .\} .nf env\&.SharedLibrary(target=\*(Aqbar\*(Aq, source=[\*(Aqbar\&.cxx\*(Aq, \*(Aqfoo\&.obj\*(Aq], register=1) .fi .if n \{\ .RE .\} .sp پس از پایان پیوند دادن آن، bar\&.dll را به عنوان یک شیء COM ثبت خواهد کرد\&. .RE .PP \fBSharedObject\fR(), \fIenv\fR\&.SharedObject() .RS 4 یک فایل شیء که برای قرار گرفتن در یک کتابخانه مشترک در نظر گرفته شده است را می‌سازد\&. فایل‌های منبع باید یکی از پسوندهای مشخص‌شده برای متد سازنده \fBStaticObject\fR را داشته باشند\&. پیشوند فایل شیء هدف، مشخص‌شده توسط متغیر ساخت \fB$SHOBJPREFIX\fR (به طور پیش‌فرض، همان \fB$OBJPREFIX\fR)، و پسوند، مشخص‌شده توسط متغیر ساخت \fB$SHOBJSUFFIX\fR، در صورت عدم وجود از پیش، به طور خودکار به هدف اضافه می‌شوند\&. \fBSharedObject\fR یک سازنده تک‌منبعی است\&. مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf env\&.SharedObject(target=\*(Aqddd\*(Aq, source=\*(Aqddd\&.c\*(Aq) env\&.SharedObject(target=\*(Aqeee\&.o\*(Aq, source=\*(Aqeee\&.cpp\*(Aq) env\&.SharedObject(target=\*(Aqfff\&.obj\*(Aq, source=\*(Aqfff\&.for\*(Aq) env\&.SharedObject(source=Glob(\*(Aq*\&.c\*(Aq)) .fi .if n \{\ .RE .\} .sp در برخی پلتفرم‌ها، ساخت یک شیء مشترک علاوه بر موارد مورد نیاز برای ساخت یک شیء معمولی (ایستا)، نیازمند گزینه(های) کامپایلر اضافی است (مانند \fB\-fPIC\fR برای \fBgcc\fR)\&. اگر اشیاء مشترک و ایستا تفاوت داشته باشند، SCons تنها اجازه می‌دهد اشیاء مشترک به یک کتابخانه مشترک پیوند داده شوند، و برای کمک به نمایش و ردیابی این تفاوت، از پسوند متفاوتی برای اشیاء مشترک استفاده خواهد کرد\&. .sp فایل‌های منبع بر اساس نگاشت‌های پسوند در شیء SourceFileScanner پویش خواهند شد\&. برای اطلاعات بیشتر به بخش "Scanner Objects" در صفحه راهنما مراجعه کنید\&. .RE .PP \fBStaticLibrary\fR(), \fIenv\fR\&.StaticLibrary() .RS 4 یک کتابخانهٔ ایستا را با استفاده از یک یا چند فایل شیء یا فایل‌های منبع C، C++، D یا Fortran می‌سازد\&. اگر هرگونه فایل منبعی داده شود، به‌طور خودکار به فایل‌های شیء کامپایل خواهند شد\&. پیشوند فایل کتابخانهٔ ایستا، که توسط متغیر ساخت \fB$LIBPREFIX\fR مشخص می‌شود (به‌طور پیش‌فرض، lib در سیستم‌های POSIX و بدون پیشوند در سیستم‌های Windows)، و پسوند آن، که توسط متغیر ساخت \fB$LIBSUFFIX\fR مشخص می‌شود (به‌طور پیش‌فرض، \&.lib در سیستم‌های Windows و \&.a در سیستم‌های POSIX)، در صورتی که از قبل موجود نباشند، به‌طور خودکار به هدف افزوده می‌شوند\&. مثال: .sp .if n \{\ .RS 4 .\} .nf env\&.StaticLibrary(target=\*(Aqbar\*(Aq, source=[\*(Aqbar\&.c\*(Aq, \*(Aqfoo\&.o\*(Aq]) .fi .if n \{\ .RE .\} .sp هر فایل شیء فهرست‌شده در \fIsource\fR باید برای یک کتابخانهٔ ایستا ساخته شده باشد (یعنی با استفاده از متد سازندهٔ \fBStaticObject\fR)\&. در صورت وجود هرگونه عدم تطابق، \fBscons\fR خطایی صادر خواهد کرد\&. .RE .PP \fBStaticObject\fR(), \fIenv\fR\&.StaticObject() .RS 4 یک فایل شیء ایستا را از یک یا چند فایل منبع C، C++، D یا Fortran می‌سازد\&. نگاشت پسوند فایل در جدول زیر نشان داده شده است: .sp .if n \{\ .RS 4 .\} .nf \&.asm فایل زبان اسمبلی \&.ASM فایل زبان اسمبلی \&.c فایل C \&.C Windows: فایل C POSIX: فایل C++ \&.cc فایل C++ \&.cpp فایل C++ \&.cxx فایل C++ \&.cxx فایل C++ \&.c++ فایل C++ \&.C++ فایل C++ \&.d فایل D \&.f فایل Fortran \&.F Windows: فایل Fortran POSIX: فایل Fortran + پیش‌پردازندهٔ C \&.for فایل Fortran \&.FOR فایل Fortran \&.fpp فایل Fortran + پیش‌پردازندهٔ C \&.FPP فایل Fortran + پیش‌پردازندهٔ C \&.m فایل Object C \&.mm فایل Object C++ \&.s فایل زبان اسمبلی \&.S Windows: فایل زبان اسمبلی ARM: CodeSourcery Sourcery Lite \&.sx فایل زبان اسمبلی + پیش‌پردازندهٔ C POSIX: فایل زبان اسمبلی + پیش‌پردازندهٔ C \&.spp فایل زبان اسمبلی + پیش‌پردازندهٔ C \&.SPP فایل زبان اسمبلی + پیش‌پردازندهٔ C .fi .if n \{\ .RE .\} .sp پیشوند فایل شیء هدف، که توسط متغیر ساخت \fB$OBJPREFIX\fR مشخص می‌شود (به‌طور پیش‌فرض رشتهٔ خالی)، و پسوند آن، که توسط متغیر ساخت \fB$OBJSUFFIX\fR مشخص می‌شود (\&.obj در سیستم‌های Windows و \&.o در سیستم‌های POSIX)، در صورتی که از قبل موجود نباشند، به‌طور خودکار به هدف افزوده می‌شوند\&. \fBStaticObject\fR یک سازندهٔ تک‌منبعی است\&. مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf env\&.StaticObject(target=\*(Aqaaa\*(Aq, source=\*(Aqaaa\&.c\*(Aq) env\&.StaticObject(target=\*(Aqbbb\&.o\*(Aq, source=\*(Aqbbb\&.c++\*(Aq) env\&.StaticObject(target=\*(Aqccc\&.obj\*(Aq, source=\*(Aqccc\&.f\*(Aq) env\&.StaticObject(source=Glob(\*(Aq*\&.c\*(Aq)) .fi .if n \{\ .RE .\} .sp فایل‌های منبع مطابق با نگاشت‌های پسوند در شیء SourceFileScanner پویش خواهند شد\&. برای اطلاعات بیشتر بخش \(lqScanner Objects\(rq در صفحهٔ راهنما را ببینید\&. .RE .PP \fBSubstfile\fR(), \fIenv\fR\&.Substfile() .RS 4 سازندهٔ \fBSubstfile\fR یک فایل متنی منفرد را از یک الگو متشکل از یک فایل یا مجموعه‌ای از فایل‌ها (یا گره‌ها) می‌سازد و متن را با استفاده از متغیر ساخت \fB$SUBST_DICT\fR (در صورت تنظیم بودن) جایگزین می‌کند\&. در صورت تعیین مجموعه‌ای از فایل‌ها، آن‌ها با استفاده از مقدار متغیر ساخت \fB$LINESEPARATOR\fR به عنوان جداکننده بین محتواها، درون فایل هدف به یکدیگر الحاق می‌شوند؛ این جداکننده پس از محتوای آخرین فایل درج نمی‌شود\&. فهرست‌های تو در توی فایل‌های منبع تسطیح می‌شوند\&. همچنین \fBTextfile\fR را ببینید\&. .sp به‌طور پیش‌فرض، کدگذاری فایل هدف \(lqutf\-8\(rq است و می‌تواند توسط \fB$FILE_ENCODING\fR تغییر کند\&. مثال‌ها: .sp اگر نام یک فایل منبع تکی مشخص شده باشد و دارای پسوند \&.in باشد، این پسوند حذف شده و باقیماندهٔ نام به عنوان نام هدف پیش‌فرض استفاده می‌شود\&. .sp پیشوند و پسوند مشخص‌شده توسط متغیرهای ساخت \fB$SUBSTFILEPREFIX\fR و \fB$SUBSTFILESUFFIX\fR (در هر دو مورد به‌طور پیش‌فرض یک رشتهٔ خالی)، در صورتی که از قبل موجود نباشند، به‌طور خودکار به هدف افزوده می‌شوند\&. .sp اگر متغیر ساختی به نام \fB$SUBST_DICT\fR وجود داشته باشد، می‌تواند یک دیکشنری Python یا توالی‌ای از چندتایی‌های (\fIkey\fR, \fIvalue\fR) باشد\&. اگر یک دیکشنری باشد، به فهرستی از چندتایی‌ها با ترتیبی نامشخص تبدیل می‌شود؛ بنابراین اگر یک کلید پیشوندی از کلید دیگر باشد یا اگر یک جایگزینی بتواند با جایگزینی دیگر بیشتر بسط یابد، رخ دادن یا ندادن بسط غیرقابل پیش‌بینی خواهد بود\&. .sp هر بار وقوع یک کلید در منبع با مقدار متناظر آن جایگزین می‌شود، که می‌تواند یک تابع قابل فراخوانی در Python یا یک رشته باشد\&. اگر مقدار یک تابع قابل فراخوانی باشد، بدون هیچ آرگومانی فراخوانی می‌شود تا یک رشته به دست آید\&. رشته‌ها با \fIsubst\fR بسط داده می‌شوند و نتیجه جایگزین کلید می‌شود\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdefault\*(Aq]) env[\*(Aqprefix\*(Aq] = \*(Aq/usr/bin\*(Aq script_dict = {\*(Aq@prefix@\*(Aq: \*(Aq/bin\*(Aq, \*(Aq@exec_prefix@\*(Aq: \*(Aq$prefix\*(Aq} env\&.Substfile(\*(Aqscript\&.in\*(Aq, SUBST_DICT=script_dict) conf_dict = {\*(Aq%VERSION%\*(Aq: \*(Aq1\&.2\&.3\*(Aq, \*(Aq%BASE%\*(Aq: \*(AqMyProg\*(Aq} env\&.Substfile(\*(Aqconfig\&.h\&.in\*(Aq, conf_dict, SUBST_DICT=conf_dict) # UNPREDICTABLE \- one key is a prefix of another bad_foo = {\*(Aq$foo\*(Aq: \*(Aq$foo\*(Aq, \*(Aq$foobar\*(Aq: \*(Aq$foobar\*(Aq} env\&.Substfile(\*(Aqfoo\&.in\*(Aq, SUBST_DICT=bad_foo) # PREDICTABLE \- keys are applied longest first good_foo = [(\*(Aq$foobar\*(Aq, \*(Aq$foobar\*(Aq), (\*(Aq$foo\*(Aq, \*(Aq$foo\*(Aq)] env\&.Substfile(\*(Aqfoo\&.in\*(Aq, SUBST_DICT=good_foo) # UNPREDICTABLE \- one substitution could be further expanded bad_bar = {\*(Aq@bar@\*(Aq: \*(Aq@soap@\*(Aq, \*(Aq@soap@\*(Aq: \*(Aqlye\*(Aq} env\&.Substfile(\*(Aqbar\&.in\*(Aq, SUBST_DICT=bad_bar) # PREDICTABLE \- substitutions are expanded in order good_bar = ((\*(Aq@bar@\*(Aq, \*(Aq@soap@\*(Aq), (\*(Aq@soap@\*(Aq, \*(Aqlye\*(Aq)) env\&.Substfile(\*(Aqbar\&.in\*(Aq, SUBST_DICT=good_bar) # the SUBST_DICT may be in common (and not an override) substutions = {} subst = Environment(tools=[\*(Aqtextfile\*(Aq], SUBST_DICT=substitutions) substitutions[\*(Aq@foo@\*(Aq] = \*(Aqfoo\*(Aq subst[\*(AqSUBST_DICT\*(Aq][\*(Aq@bar@\*(Aq] = \*(Aqbar\*(Aq subst\&.Substfile( \*(Aqpgm1\&.c\*(Aq, [Value(\*(Aq#include "@foo@\&.h"\*(Aq), Value(\*(Aq#include "@bar@\&.h"\*(Aq), "common\&.in", "pgm1\&.in"], ) subst\&.Substfile( \*(Aqpgm2\&.c\*(Aq, [Value(\*(Aq#include "@foo@\&.h"\*(Aq), Value(\*(Aq#include "@bar@\&.h"\*(Aq), "common\&.in", "pgm2\&.in"], ) .fi .if n \{\ .RE .\} .RE .PP \fBTar\fR(), \fIenv\fR\&.Tar() .RS 4 یک آرشیو tar از فایل‌ها و/یا دایرکتوری‌های مشخص‌شده می‌سازد\&. بر خلاف اکثر متدهای سازنده، متد سازندهٔ \fBTar\fR می‌تواند برای یک هدف معین چندین بار فراخوانی شود؛ هر فراخوانی اضافی به فهرست مدخل‌هایی که درون آرشیو ساخته خواهند شد می‌افزاید\&. هر دایرکتوری مبدأ، صرف‌نظر از این‌که \fBscons\fR از طریق فراخوانی‌های دیگر سازنده یا توابع از آن‌ها مطلع باشد یا خیر، برای یافتن تغییرات هرگونه فایل روی دیسک پویش خواهد شد\&. .sp .if n \{\ .RS 4 .\} .nf env\&.Tar(\*(Aqsrc\&.tar\*(Aq, \*(Aqsrc\*(Aq) # Create the stuff\&.tar file\&. env\&.Tar(\*(Aqstuff\*(Aq, [\*(Aqsubdir1\*(Aq, \*(Aqsubdir2\*(Aq]) # Also add "another" to the stuff\&.tar file\&. env\&.Tar(\*(Aqstuff\*(Aq, \*(Aqanother\*(Aq) # Set TARFLAGS to create a gzip\-filtered archive\&. env = Environment(TARFLAGS = \*(Aq\-c \-z\*(Aq) env\&.Tar(\*(Aqfoo\&.tar\&.gz\*(Aq, \*(Aqfoo\*(Aq) # Also set the suffix to \&.tgz\&. env = Environment(TARFLAGS = \*(Aq\-c \-z\*(Aq, TARSUFFIX = \*(Aq\&.tgz\*(Aq) env\&.Tar(\*(Aqfoo\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fBTextfile\fR(), \fIenv\fR\&.Textfile() .RS 4 سازندهٔ \fBTextfile\fR یک فایل متنی منفرد را از یک الگو متشکل از فهرستی از رشته‌ها تولید می‌کند و در صورت تنظیم متغیر ساخت \fB$SUBST_DICT\fR متن را با استفاده از آن جایگزین می‌نماید \- برای شرح جایگزینی به \fBSubstfile\fR مراجعه کنید\&. رشته‌ها در فایل هدف با استفاده از مقدار متغیر ساخت \fB$LINESEPARATOR\fR از یکدیگر جدا می‌شوند؛ جداکنندهٔ خط پس از آخرین رشته درج نمی‌شود\&. فهرست‌های تودرتوی رشته‌های مبدأ مسطح می‌شوند\&. رشته‌های مبدأ لزوماً نباید رشته‌های Python باشند: آن‌ها می‌توانند گره‌ها یا اشیاء Python باشند که به‌طور تمیز به گره‌های \fBValue\fR تبدیل می‌شوند\&. .sp پیشوند و پسوند مشخص‌شده توسط متغیرهای ساخت \fB$TEXTFILEPREFIX\fR و \fB$TEXTFILESUFFIX\fR (به‌طور پیش‌فرض به ترتیب یک رشتهٔ خالی و \&.txt) در صورتی که از قبل وجود نداشته باشند، به‌طور خودکار به هدف اضافه می‌شوند\&. .sp به‌طور پیش‌فرض، کدبندی فایل هدف "utf\-8" است و می‌تواند با \fB$FILE_ENCODING\fR تغییر کند\&. مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf # builds/writes foo\&.txt env\&.Textfile(target=\*(Aqfoo\&.txt\*(Aq, source=[\*(AqGoethe\*(Aq, 42, \*(AqSchiller\*(Aq]) # builds/writes bar\&.txt env\&.Textfile(target=\*(Aqbar\*(Aq, source=[\*(Aqlalala\*(Aq, \*(Aqtanteratei\*(Aq], LINESEPARATOR=\*(Aq|*\*(Aq) # nested lists are flattened automatically env\&.Textfile(target=\*(Aqblob\*(Aq, source=[\*(Aqlalala\*(Aq, [\*(AqGoethe\*(Aq, 42, \*(AqSchiller\*(Aq], \*(Aqtanteratei\*(Aq]) # files may be used as input by wrapping them in File() env\&.Textfile( target=\*(Aqconcat\*(Aq, # concatenate files with a marker between source=[File(\*(Aqconcat1\*(Aq), File(\*(Aqconcat2\*(Aq)], LINESEPARATOR=\*(Aq====================\en\*(Aq, ) .fi .if n \{\ .RE .\} .sp نتایج: .sp foo\&.txt .sp .if n \{\ .RS 4 .\} .nf Goethe 42 Schiller .fi .if n \{\ .RE .\} .sp bar\&.txt .sp .if n \{\ .RS 4 .\} .nf lalala|*tanteratei .fi .if n \{\ .RE .\} .sp blob\&.txt .sp .if n \{\ .RS 4 .\} .nf lalala Goethe 42 Schiller tanteratei .fi .if n \{\ .RE .\} .RE .PP \fBTranslate\fR(), \fIenv\fR\&.Translate() .RS 4 این شبه‌سازنده بخشی از مجموعه ابزار gettext است\&. این سازنده پیام‌های بین‌المللی‌شده را از فایل‌های مبدأ استخراج می‌کند، الگوی POT را (در صورت نیاز) به‌روزرسانی می‌کند و سپس ترجمه‌های PO را (در صورت نیاز) به‌روزرسانی می‌نماید\&. اگر \fB$POAUTOINIT\fR تنظیم شده باشد، فایل‌های PO مفقود به‌طور خودکار ایجاد خواهند شد (یعنی بدون دخالت مترجم)\&. متغیرهای \fB$LINGUAS_FILE\fR و \fB$POTDOMAIN\fR نیز در نظر گرفته می‌شوند\&. تمامی متغیرهای ساخت دیگر که توسط \fBPOTUpdate\fR و \fBPOUpdate\fR استفاده می‌شوند نیز در اینجا کار می‌کنند\&. .sp \fIمثال ۱\fR\&. ساده‌ترین راه، تعیین فایل‌های ورودی و زبان‌های خروجی به‌صورت درون‌خطی در یک اسکریپت SCons هنگام فراخوانی \fBTranslate\fR است: .sp .if n \{\ .RS 4 .\} .nf # SConscript in \*(Aqpo/\*(Aq directory env = Environment(tools=["default", "gettext"]) env[\*(AqPOAUTOINIT\*(Aq] = True env\&.Translate([\*(Aqen\*(Aq, \*(Aqpl\*(Aq], [\*(Aq\&.\&./a\&.cpp\*(Aq, \*(Aq\&.\&./b\&.cpp\*(Aq]) .fi .if n \{\ .RE .\} .sp \fIمثال ۲\fR\&. در صورت تمایل، می‌توانید به سبک مرسوم شناخته‌شده از autotools نیز پایبند باشید، یعنی استفاده از فایل‌های POTFILES\&.in و LINGUAS برای مشخص کردن هدف‌ها و مبدأها: .sp .if n \{\ .RS 4 .\} .nf # LINGUAS en pl # end .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf # POTFILES\&.in a\&.cpp b\&.cpp # end .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf # SConscript env = Environment(tools=["default", "gettext"]) env[\*(AqPOAUTOINIT\*(Aq] = True env[\*(AqXGETTEXTPATH\*(Aq] = [\*(Aq\&.\&./\*(Aq] env\&.Translate(LINGUAS_FILE=True, XGETTEXTFROM=\*(AqPOTFILES\&.in\*(Aq) .fi .if n \{\ .RE .\} .sp رویکرد آخر احتمالاً روش توصیه‌شده است\&. این رویکرد امکان تفکیک آسان بین‌المللی‌سازی/محلی‌سازی را در اسکریپت‌های جداگانهٔ SCons فراهم می‌کند؛ به‌گونه‌ای که یک اسکریپت در درخت مبدأ مسئول ترجمه‌ها (از فایل‌های مبدأ به فایل‌های PO) است و اسکریپت(ها) در دایرکتوری‌های متغیر (variant directories) مسئول کامپایل فایل‌های PO به فایل‌های MO و همچنین نصب فایل‌های MO هستند\&. در این حالت «عامل پیونددهنده» که این دو اسکریپت را همگام می‌کند، محتوای فایل LINGUAS است\&. توجه داشته باشید که فایل‌های به‌روزشدهٔ POT و PO معمولاً قرار است به مخزن ثبت (commit) شوند، بنابراین باید در داخل دایرکتوری مبدأ به‌روز شوند (و نه در دایرکتوری‌های متغیر)\&. علاوه بر این، فهرست فایل‌های دایرکتوری po/ شامل فایل LINGUAS است، بنابراین درخت مبدأ برای مترجمان آشنا به نظر می‌رسد و آن‌ها می‌توانند به شیوهٔ معمول خود با پروژه کار کنند\&. .sp \fIمثال ۳\fR\&. بیایید یک درخت توسعه را به‌صورت زیر آماده کنیم: .sp .if n \{\ .RS 4 .\} .nf project/ + SConstruct + build/ + src/ + po/ + SConscript + SConscript\&.i18n + POTFILES\&.in + LINGUAS .fi .if n \{\ .RE .\} .sp که در آن build دایرکتوری متغیر باشد\&. اسکریپت سطح بالای SConstruct را به‌صورت زیر بنویسید: .sp .if n \{\ .RS 4 .\} .nf # SConstruct env = Environment(tools=["default", "gettext"]) VariantDir(\*(Aqbuild\*(Aq, \*(Aqsrc\*(Aq, duplicate=False) env[\*(AqPOAUTOINIT\*(Aq] = True SConscript(\*(Aqsrc/po/SConscript\&.i18n\*(Aq, exports=\*(Aqenv\*(Aq) SConscript(\*(Aqbuild/po/SConscript\*(Aq, exports=\*(Aqenv\*(Aq) .fi .if n \{\ .RE .\} .sp اسکریپت src/po/SConscript\&.i18n به‌صورت: .sp .if n \{\ .RS 4 .\} .nf # src/po/SConscript\&.i18n Import(\*(Aqenv\*(Aq) env\&.Translate(LINGUAS_FILE=True, XGETTEXTFROM=\*(AqPOTFILES\&.in\*(Aq, XGETTEXTPATH=[\*(Aq\&.\&./\*(Aq]) .fi .if n \{\ .RE .\} .sp و اسکریپت src/po/SConscript .sp .if n \{\ .RS 4 .\} .nf # src/po/SConscript Import(\*(Aqenv\*(Aq) env\&.MOFiles(LINGUAS_FILE=True) .fi .if n \{\ .RE .\} .sp چنین پیکربندی‌ای فایل‌های POT و PO را در درخت مبدأ در src/po/ و فایل‌های باینری MO را در درخت متغیر در build/po/\& تولید می‌کند. بدین‌ترتیب فایل‌های POT و PO از سایر فایل‌های خروجی که نباید به مخازن مبدأ بازگردانده (کامیت) شوند (مانند فایل‌های MO) تفکیک می‌شوند\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBنکته\fR .ps -1 .br در مثال بالا، هنگام اجرای دستور \fBscons \&.\fR\&، فایل‌های PO به‌طور خودکار به‌روزرسانی یا ایجاد نمی‌شوند. این فایل‌ها باید به‌صورت دستی از طریق \fBscons po\-update\fR به‌روزرسانی (ایجاد) شوند و سپس می‌توان با اجرای \fBscons \&.\fR فایل‌های MO را کامپایل کرد\&. .sp .5v .RE .RE .PP \fBTypeLibrary\fR(), \fIenv\fR\&.TypeLibrary() .RS 4 یک فایل کتابخانه نوع ویندوز (\&.tlb) را از یک فایل IDL ورودی (\&.idl) می‌سازد\&. علاوه بر این، فایل‌های منبع رابط، استاب (stub) و پروکسی مرتبط را ساخته و آن‌ها را بر اساس نام پایهٔ فایل \&.idl نام‌گذاری می‌کند\&. برای مثال، .sp .if n \{\ .RS 4 .\} .nf env\&.TypeLibrary(source="foo\&.idl") .fi .if n \{\ .RE .\} .sp فایل‌های foo\&.tlb، foo\&.h، foo_i\&.c، foo_p\&.c و foo_data\&.c را ایجاد خواهد کرد\&. .RE .PP \fBZip\fR(), \fIenv\fR\&.Zip() .RS 4 یک بایگانی zip از فایل‌ها و/یا دایرکتوری‌های مشخص‌شده می‌سازد\&. برخلاف بیشتر متدهای سازنده، متد سازندهٔ \fBZip\fR ممکن است چندین بار برای یک هدف معین فراخوانی شود؛ هر فراخوانی اضافی به فهرست مدخل‌هایی که درون بایگانی ساخته خواهند شد، می‌افزاید\&. تمام دایرکتوری‌های مبدأ برای بررسی تغییرات فایل‌های روی دیسک پویش خواهند شد، صرف‌نظر از اینکه \fBscons\fR از طریق دیگر فراخوانی‌های سازنده (Builder) یا توابع از آن‌ها اطلاع داشته باشد یا خیر\&. .sp .if n \{\ .RS 4 .\} .nf env\&.Zip(\*(Aqsrc\&.zip\*(Aq, \*(Aqsrc\*(Aq) # Create the stuff\&.zip file\&. env\&.Zip(\*(Aqstuff\*(Aq, [\*(Aqsubdir1\*(Aq, \*(Aqsubdir2\*(Aq]) # Also add "another" to the stuff\&.tar file\&. env\&.Zip(\*(Aqstuff\*(Aq, \*(Aqanother\*(Aq) .fi .if n \{\ .RE .\} .RE .SS "توابع SCons و متدهای محیط ساخت (SCons Functions and Environment Methods)" .PP SCons مجموعه‌ای از متدهای محیط ساخت و توابع سراسری را برای دستکاری پیکربندی ساخت فراهم می‌کند\&. اغلب برای راحتی کار، یک متد محیط ساخت و یک تابع سراسری با نامی یکسان وجود دارند\&. در این بخش، در صورتی که تابعی بتواند به هر دو صورت فراخوانی شود، هر دو حالت نشان داده شده‌اند\&. سبک مستندسازی برای این موارد به صورت زیر است: .sp .if n \{\ .RS 4 .\} .nf \fBFunction\fR(\fIarguments, [optional arguments, \&.\&.\&.]\fR) # Global function \fIenv\fR\&.Function(\fIarguments, [optional arguments, \&.\&.\&.]\fR) # Environment method .fi .if n \{\ .RE .\} .PP در این امضاهای توابع، آرگومان‌های درون قلاب ([]) اختیاری هستند و علامت سه‌نقطه (\&.\&.\&.) نشان‌دهنده تکرار احتمالی است\&. تفاوت میان آرگومان‌های مکانی (positional) و کلیدواژه‌ای (keyword) معمولاً در متنِ توضیحات شرح داده شده است، نه در خودِ امضا\&. نشانگرهای پایتونیِ فقط-مکانی (/) و فقط-کلیدواژه‌ای (*) در اینجا استفاده نشده‌اند\&. .PP هنگامی که سبک \f(CWkeyword=value\fR پایتون نمایش داده می‌شود، می‌تواند دو معنا داشته باشد\&. اگر آرگومان کلیدواژه‌ای برای تابع شناخته‌شده باشد، مقدار داده‌شده در صورت حذف آرگومان، مقدار پیش‌فرض آن خواهد بود\&. اگر کلیدواژه برای تابع ناشناخته باشد، برخی متدها آن را به عنوان انتساب به یک متغیر ساخت (construction variable) در نظر می‌گیرند؛ در غیر این صورت برای یک آرگومان ناشناخته، استثنا (exception) صادر می‌شود\&. .PP یک تابع سراسری و یک متد محیط ساختِ هم‌نام، کارکرد پایه یکسانی دارند، با دو تفاوت کلیدی: .sp .RS 4 .ie n \{\ \h'-04' 1.\h'+01'\c .\} .el \{\ .sp -1 .IP " 1." 4.2 .\} متدهای محیط ساخت که محیط را می‌خوانند یا آن را تغییر می‌دهند، روی نمونه محیطی عمل می‌کنند که از آن فراخوانی شده‌اند، در حالی که توابع سراسری متناظر از یک محیط ساختِ ویژه و \(lqپنهان\(rq موسوم به Default Environment می‌خوانند\&. در برخی موارد، یک تابع سراسری ممکن است یک آرگومان اولیه اضافی دریافت کند که شیء مورد نظر برای انجام عملیات را مشخص می‌سازد\&. .RE .sp .RS 4 .ie n \{\ \h'-04' 2.\h'+01'\c .\} .el \{\ .sp -1 .IP " 2." 4.2 .\} آرگومان‌های دارای مقادیر رشته‌ای (از جمله رشته‌ها در آرگومان‌های با مقدار فهرستی) در صورت استفاده در شکل متد محیطی، مشمول بسط متغیرهای ساخت (construction variable expansion) می‌شوند؛ اما در تابع سراسری، بسط متغیر بلافاصله انجام نمی‌گیرد\&. برای نمونه، \fBDefault(\*(Aq$MYTARGET\*(Aq)\fR مقدار \*(Aq$MYTARGET\*(Aq را به فهرست هدف‌های پیش‌فرض اضافه می‌کند، در حالی که اگر مقدار MYTARGET در \fIenv\fR برابر با \*(Aqmine\*(Aq باشد، \fBenv\&.Default(\*(Aq$MYTARGET\*(Aq\fR مقدار \*(Aqmine\*(Aq را به هدف‌های پیش‌فرض می‌افزاید\&. برای جزئیات بیشتر درباره بسط متغیرهای ساخت، بخش Construction variables را ببینید\&. .RE .PP توابع سراسری به طور خودکار در حوزه دید (scope) درون فایل‌های SConscript قرار دارند\&. اگر پروژه شما ماژول‌های Python اضافه می‌کند که آن‌ها را از طریق دستور import پایتون در یک فایل SConscript فراخوانی می‌کنید، چنین کدهایی باید این توابع را به طور صریح به حوزه دید سراسری آن ماژول بیفزایند\&. این کار را می‌توانید با افزودن عبارت import زیر به ماژول Python انجام دهید: \fBfrom SCons\&.Script import *\fR\&. .PP SCons متدهای محیط ساخت و توابع سراسری زیر را فراهم می‌کند\&. این فهرست را می‌توان به صورت مجزا برای هر پروژه با استفاده از \fBAddMethod\fR گسترش داد\&. .PP \fBAction\fR(\fIaction, [output, [var, \&.\&.\&.]] [key=value, \&.\&.\&.]\fR), \fIenv\fR\&.Action(\fIaction, [output, [var, \&.\&.\&.]] [key=value, \&.\&.\&.]\fR) .RS 4 یک تابع کارخانه‌ای (factory function) برای ایجاد یک شیء Action برای \fIaction\fR مشخص‌شده\&. برای توضیح کامل آرگومان‌ها و رفتار، بخش \(lqAction Objects\(rq در صفحه راهنما را ببینید\&. .sp توجه داشته باشید که شکل فراخوانی \fBenv\&.Action\fR متغیرهای ساخت را در تمام رشته‌های آرگومان، از جمله آرگومان \fIaction\fR، در هنگام فراخوانی با استفاده از متغیرهای ساخت در همان محیط ساختی که \fBenv\&.Action\fR از طریق آن فراخوانی شده است، بسط می‌دهد\&. شکل تابع سراسری \fBAction\fR تمام بسط‌های متغیر را تا زمانی که شیء Action واقعاً مورد استفاده قرار گیرد به تعویق می‌اندازد\&. .RE .PP \fBAddMethod\fR(\fIobject, function, [name]\fR), \fIenv\fR\&.AddMethod(\fIfunction, [name]\fR) .RS 4 تابع \fIfunction\fR را به عنوان یک متد به یک شیء اضافه می‌کند\&. \fIfunction\fR همانند متدهای دیگر با یک شیء نمونه به عنوان نخستین آرگومان فراخوانی خواهد شد\&. اگر \fIname\fR داده شود، به عنوان نام متد جدید به کار می‌رود، در غیر این صورت از نام \fIfunction\fR استفاده می‌شود\&. .sp هنگامی که تابع سراسری \fBAddMethod\fR فراخوانی می‌شود، شیئی که قرار است متد به آن افزوده شود باید به عنوان نخستین آرگومان ارسال گردد؛ معمولاً این شیء \fBEnvironment\fR خواهد بود تا متدی ایجاد شود که بر تمام محیط‌های ساختی که پس از آن ساخته می‌شوند اعمال گردد\&. هنگامی که با استفاده از شکل \fBenv\&.AddMethod\fR فراخوانی شود، متد فقط به همان محیط ساختِ مشخص‌شده افزوده می‌شود\&. متدهای افزوده شده از طریق فراخوانی‌های \fBenv\&.Clone\fR نیز انتشار می‌یابند\&. .sp نمونه‌های بیشتر: .sp .if n \{\ .RS 4 .\} .nf # Function to add must accept an instance argument\&. # The Python convention is to call this \*(Aqself\*(Aq\&. def my_method(self, arg): print("my_method() got", arg) # Use the global function to add a method to the Environment class: AddMethod(Environment, my_method) env = Environment() env\&.my_method(\*(Aqarg\*(Aq) # Use the optional name argument to set the name of the method: env\&.AddMethod(my_method, \*(Aqother_method_name\*(Aq) env\&.other_method_name(\*(Aqanother arg\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fBAddOption\fR(\fIopt_str, \&.\&.\&., attr=value, \&.\&.\&.\fR) .RS 4 یک گزینهٔ خط فرمان محلی (مخصوص پروژه) اضافه می‌کند\&. یک یا چند مقدار \fIopt_str\fR رشته‌هایی هستند که نحوهٔ فراخوانی گزینه را مشخص می‌کنند، در حالی که آرگومان‌های کلیدواژه‌ای، ویژگی‌های گزینه را تعریف می‌نمایند\&. این ویژگی‌ها در بیشتر موارد مانند متد \fBOptionParser\&.add_option\fR در ماژول کتابخانهٔ استاندارد Python به نام optparse هستند، اما با چند قابلیت اضافی که در زیر آمده است\&. برای بررسی کامل قابلیت‌های پردازش گزینهٔ آن، به \m[blue]\fBمستندات optparse\fR\m[]\&\s-2\u[5]\d\s+2 مراجعه کنید\&. تمام گزینه‌های افزوده‌شده از طریق \fBAddOption\fR در یک گروه گزینهٔ ویژه با نام "Local Options" قرار می‌گیرند\&. .sp علاوه بر آرگومان‌ها و مقادیر پشتیبانی‌شده توسط متد \fBadd_option\fR در optparse، \fBAddOption\fR امکان تنظیم مقدار کلیدواژهٔ \fInargs\fR به یک رشتهٔ \*(Aq?\*(Aq (علامت سوال) را می‌دهد تا نشان دهد که آرگومان گزینه برای آن رشتهٔ گزینه می‌تواند حذف شود\&. اگر رشتهٔ گزینه در خط فرمان وجود داشته باشد اما هیچ آرگومان گزینهٔ منطبقی نداشته باشد، مقدار آرگومان کلیدواژه‌ای \fIconst\fR به‌عنوان مقدار گزینه تولید می‌شود\&. اگر رشتهٔ گزینه از خط فرمان حذف شود، طبق معمول مقدار آرگومان کلیدواژه‌ای \fIdefault\fR تولید می‌شود؛ اگر هیچ آرگومان کلیدواژه‌ای \fIdefault\fR در فراخوانی \fBAddOption\fR وجود نداشته باشد، \fBNone\fR تولید می‌شود\&. .sp optparse مخفف‌های نام‌های گزینه‌های طولانی را تا زمانی که بتوان آن‌ها را به‌طور یکتا و بدون ابهام تشخیص داد، شناسایی می‌کند\&. برای نمونه، اگر \fBadd_option\fR برای تعریف گزینهٔ \fB\-\-devicename\fR فراخوانی شود، \fB\-\-device\fR، \fB\-\-dev\fR و غیره را نیز تا زمانی که هیچ گزینهٔ دیگری نتواند با همان مخفف مطابقت داشته باشد، تشخیص می‌دهد\&. گزینه‌های افزوده‌شده از طریق \fBAddOption\fR از تشخیص خودکار مخفف‌ها پشتیبانی نمی‌کنند\&. در عوض، برای مجاز کردن مخفف‌های خاص، آن‌ها را به عنوان مترادف در خود فراخوانی \fBAddOption\fR بگنجانید\&. .sp پس از اضافه شدن یک گزینهٔ خط فرمان جدید با \fBAddOption\fR، مقدار گزینه را می‌توان با استفاده از \fBGetOption\fR یا \fBenv\&.GetOption\fR دریافت کرد\&. اگر آرگومان \fIsettable=True\fR در فراخوانی \fBAddOption\fR داده شده باشد، در صورتی که شرایط در یک فایل SConscript نیاز به بازنویسی مقدار پیش‌فرض داشته باشد، می‌توان مقدار را بعداً با استفاده از \fBSetOption\fR یا \fBenv\&.SetOption\fR نیز تنظیم کرد\&. با این حال توجه داشته باشید مقداری که در خط فرمان مشخص شده باشد \fIهمیشه\fR مقداری را که در یک فایل SConscript تنظیم شده بازنویسی خواهد کرد\&. .sp \fIتغییر یافته در نسخهٔ 4\&.8\&.0\fR: آرگومان کلیدواژه‌ای \fIsettable\fR اضافه شد تا امکان تنظیم یک گزینهٔ افزوده‌شده از طریق \fBSetOption\fR فراهم شود\&. .sp متن راهنما برای یک گزینه، ترکیبی از رشتهٔ ارائه‌شده در آرگومان کلیدواژه‌ای \fIhelp\fR به \fBAddOption\fR و اطلاعات جمع‌آوری‌شده از سایر آرگومان‌های کلیدواژه‌ای است\&. چنین راهنمایی در صورت استفاده از گزینهٔ خط فرمان \fB\-h\fR نمایش داده می‌شود (اما نه با \fB\-H\fR)\&. راهنمای همهٔ گزینه‌های محلی ذیل عنوان مجزای \fBLocal Options\fR نمایش داده می‌شود\&. گزینه‌ها مرتب‌نشده هستند \- آن‌ها در متن راهنما به همان ترتیبی که فراخوانی‌های \fBAddOption\fR رخ می‌دهند ظاهر خواهند شد\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf AddOption( \*(Aq\-\-prefix\*(Aq, dest=\*(Aqprefix\*(Aq, nargs=1, type=\*(Aqstring\*(Aq, action=\*(Aqstore\*(Aq, metavar=\*(AqDIR\*(Aq, help=\*(Aqinstallation prefix\*(Aq, ) env = Environment(PREFIX=GetOption(\*(Aqprefix\*(Aq)) .fi .if n \{\ .RE .\} .sp برای این مثال، متن راهنمای زیر تولید خواهد شد: .sp .if n \{\ .RS 4 .\} .nf Local Options: \-\-prefix=DIR installation prefix .fi .if n \{\ .RE .\} .sp در صورتی که تابع \fBHelp\fR فراخوانی شده باشد، ممکن است متن راهنما برای گزینه‌های محلی در دسترس نباشد؛ برای جزئیات به مستندات \fBHelp\fR مراجعه کنید\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBنکته\fR .ps -1 .br پیش از نسخهٔ 4\&.11\&.0، رفتار برنامه هنگامی که گزینه‌های اضافه‌شده توسط \fBAddOption\fR با نویسه‌های فاصله (whitespace) مشخص می‌شدند، تعریف‌نشده بود و استفاده از آن توصیه نمی‌شد\&. چنین کاربردی هم شامل استفاده از فاصله به عنوان جداکننده (\-\-opt arg در برابر \-\-opt=arg) و هم مواردی بود که در آن‌ها تعداد آرگومان‌های گزینه (\fInargs\fR) بیشتر از یک مشخص می‌شد\&. اگرچه این مشکل برطرف شده است، توسعه‌دهندگان باید در صورتی که پروژه با نسخهٔ قدیمی‌تر SCons ساخته می‌شود، از آن مطلع باشند\&. .sp .5v .RE .RE .PP \fBAddPostAction\fR(\fItarget, action\fR), \fIenv\fR\&.AddPostAction(\fItarget, action\fR) .RS 4 ترتیبی می‌دهد که \fIaction\fR مشخص‌شده پس از ساخته شدن \fItarget\fR مشخص‌شده اجرا شود\&. \fIaction\fR می‌تواند یک شیء Action یا هر چیزی باشد که قابل تبدیل به یک شیء Action است\&. برای توضیحات کامل به بخش "Action Objects" در این صفحهٔ راهنما مراجعه کنید\&. .sp هنگامی که چند هدف ارائه شود، ممکن است کنش چندین بار فراخوانی شود؛ یک بار پس از هر کنشی که یک یا چند هدف از فهرست را تولید می‌کند\&. .sp .if n \{\ .RS 4 .\} .nf foo = Program(\*(Aqfoo\&.c\*(Aq) # remove execute permission from binary: AddPostAction(foo, Chmod(\*(Aq$TARGET\*(Aq, "a\-x")) .fi .if n \{\ .RE .\} .sp اگر یک \fItarget\fR یک \fBAlias\fR باشد، \fIaction\fR در صورت مشخص بودن، به کنش آن نام مستعار پیوند می‌یابد\&. .RE .PP \fBAddPreAction\fR(\fItarget, action\fR), \fIenv\fR\&.AddPreAction(\fItarget, action\fR) .RS 4 برنامه‌ریزی می‌کند تا \fIaction\fR مشخص‌شده پیش از ساخته شدن \fItarget\fR تعیین‌شده اجرا گردد\&. \fIaction\fR می‌تواند یک شیء Action یا هر چیزی باشد که قابلیت تبدیل به یک شیء Action را دارد\&. برای توضیحات کامل، بخش «Action Objects» در این صفحهٔ راهنما را ببینید\&. .sp هنگامی که چندین هدف مشخص شده باشند، کنش(ها) ممکن است چندین بار فراخوانی شوند؛ یک بار پیش از هر کنشی که یک یا چند هدف از فهرست را تولید می‌کند\&. .sp توجه داشته باشید که اگر هر یک از هدف‌ها در چند مرحله ساخته شوند، کنش درست پیش از مرحله‌ای فراخوانی می‌شود که مشخصاً هدف(های) تعیین‌شده را تولید می‌کند\&. شاید همیشه آشکار نباشد که یک فرایند چندمرحله‌ای است یا خیر \- برای نمونه، اگر از سازندهٔ \fBProgram\fR برای ساخت یک برنامهٔ اجرایی از یک فایل مبدأ \&.c استفاده کنید، \fBscons\fR ابتدا یک فایل شیء واسط می‌سازد؛ پیش‌کنش (pre\-action) پس از این مرحله و درست پیش از دستور پیوند (link) برای تولید دودویی برنامه اجرایی فراخوانی می‌شود\&. مثال: .sp .if n \{\ .RS 4 .\} .nf foo = Program(\*(Aqfoo\&.c\*(Aq) AddPreAction(foo, \*(Aqecho "Running pre\-action"\*(Aq) .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf $ scons \-Q gcc \-o foo\&.o \-c foo\&.c echo "Running pre\-action" Running pre\-action gcc \-o foo foo\&.o .fi .if n \{\ .RE .\} .sp اگر یک \fItarget\fR یک \fBAlias\fR باشد، \fIaction\fR به کنشِ آن نام مستعار (در صورت تعیین شدن) مرتبط می‌شود\&. .RE .PP \fBAlias\fR(\fIalias, [source, [action]]\fR), \fIenv\fR\&.Alias(\fIalias, [source, [action]]\fR) .RS 4 یک گرهٔ Alias می‌سازد که می‌تواند به عنوان مرجعی برای صفر یا چند هدف دیگر استفاده شود، که توسط پارامتر اختیاری \fIsource\fR مشخص می‌شوند\&. نام‌های مستعار روشی را برای اختصاص دادن نامی کوتاه‌تر یا توصیفی‌تر به اهداف مشخص، و گروه‌بندی چندین هدف تحت یک نام واحد فراهم می‌کنند\&. نام مستعار، یا یک شیء Alias Node، می‌تواند به عنوان وابستگی هر هدف دیگری، از جمله یک نام مستعار دیگر، به کار رود\&. .sp \fIalias\fR و \fIsource\fR هر یک می‌توانند یک رشته یا شیء Node، یا فهرستی از رشته‌ها یا اشیاء Node باشند؛ اگر برای \fIalias\fR از شیء Node استفاده شود، باید گره‌های Alias باشند\&. اگر \fIsource\fR حذف شود، نام مستعار ایجاد می‌شود اما مرجعی نخواهد داشت؛ اگر برای ساخت انتخاب شود، این وضعیت به پیام \(lqNothing to be done\&.\(rq منجر خواهد شد\&. یک نام مستعار خالی می‌تواند برای تعریف نام مستعار در مکانی مشخص از پروژه به کار رود؛ سپس می‌توان در یک فایل SConscript فرعی، هدف(های) واقعی را برای ارجاع به آن اضافه کرد\&. پارامتر اختیاری \fIaction\fR یک کنش یا فهرستی از کنش‌ها را تعیین می‌کند که هرگاه هر یک از اهداف نام مستعار قدیمی (out\-of\-date) باشند، اجرا خواهند شد\&. .sp \fBAlias\fR می‌تواند برای یک نام مستعار از پیش موجود فراخوانی شود، که آرگومان‌های \fIalias\fR و/یا \fIaction\fR را به فهرست‌های موجود برای آن نام مستعار اضافه می‌کند\&. .sp فهرستی از اشیاء Alias Node را برمی‌گرداند که بیانگر نام(های) مستعار هستند و خارج از هر سیستم‌فایل فیزیکی وجود دارند\&. فضای نامِ نام‌های مستعار از فضای نام اهداف ملموس جدا است؛ برای جلوگیری از سردرگمی، نام اهداف را مجدداً به عنوان نام مستعار به کار نبرید\&. .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf Alias(\*(Aqinstall\*(Aq) Alias(\*(Aqinstall\*(Aq, \*(Aq/usr/bin\*(Aq) Alias([\*(Aqinstall\*(Aq, \*(Aqinstall\-lib\*(Aq], \*(Aq/usr/local/lib\*(Aq) env\&.Alias(\*(Aqinstall\*(Aq, [\*(Aq/usr/local/bin\*(Aq, \*(Aq/usr/local/lib\*(Aq]) env\&.Alias(\*(Aqinstall\*(Aq, [\*(Aq/usr/local/man\*(Aq]) env\&.Alias(\*(Aqupdate\*(Aq, [\*(Aqfile1\*(Aq, \*(Aqfile2\*(Aq], "update_database $SOURCES") .fi .if n \{\ .RE .\} .RE .PP \fBAllowSubstExceptions\fR(\fI[exception, \&.\&.\&.]\fR) .RS 4 استثناهایی را مشخص می‌کند که هنگام بسط دادن متغیرهای ساخت (construction variables) نادیده گرفته می‌شوند\&. به‌طور پیش‌فرض، هرگونه بسط متغیر ساخت که موجب ایجاد استثنای NameError یا IndexError شود، به \*(Aq\*(Aq (یک رشتهٔ خالی) بسط یافته و موجب شکست \fBscons\fR نمی‌گردد\&. تمام استثناهایی که در فهرست مشخص‌شده قرار ندارند، یک پیام خطا تولید کرده و پردازش را خاتمه می‌دهند\&. .sp اگر \fBAllowSubstExceptions\fR چندین بار فراخوانی شود، هر فراخوانی به‌طور کامل فهرست قبلی استثناهای نادیده‌گرفته‌شده را بازنویسی می‌کند\&. فراخوانی آن بدون هیچ آرگومانی بدان معناست که هیچ استثنایی نادیده گرفته نخواهد شد\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf # Requires that all construction variable names exist\&. # (You may wish to do this if you want to enforce strictly # that all construction variables must be defined before use\&.) AllowSubstExceptions() # Also allow a string containing a zero\-division expansion # like \*(Aq${1 / 0}\*(Aq to evaluate to \*(Aq\*(Aq\&. AllowSubstExceptions(IndexError, NameError, ZeroDivisionError) .fi .if n \{\ .RE .\} .RE .PP \fBAlwaysBuild\fR(\fItarget, \&.\&.\&.\fR), \fIenv\fR\&.AlwaysBuild(\fItarget, \&.\&.\&.\fR) .RS 4 هر \fItarget\fR داده‌شده را به گونه‌ای علامت‌گذاری می‌کند که همیشه قدیمی (out\-of\-date) فرض شود، و در صورت نیاز همواره بازسازی گردد\&. با این حال توجه داشته باشید که \fBAlwaysBuild\fR هدف(های) خود را به فهرست اهداف پیش‌فرض اضافه نمی‌کند؛ بنابراین این هدف‌ها تنها در صورتی ساخته خواهند شد که در خط فرمان مشخص شده باشند، یا وابسته به هدفی باشند که در خط فرمان تعیین شده است \-\- اما در صورت مشخص شدن، \fIهمیشه\fR ساخته خواهند شد\&. چندین هدف را می‌توان در یک فراخوانی واحد به \fBAlwaysBuild\fR ارسال کرد\&. .RE .PP \fIenv\fR\&.Append(\fIkey=val, [\&.\&.\&.]\fR) .RS 4 مقدار(ها) را به‌طور هوشمند به متغیرهای ساخت در \fIenv\fR اضافه می‌کند\&. متغیرهای ساخت و مقادیری که باید به آن‌ها افزوده شوند به صورت جفت‌های \fIkey=val\fR (آرگومان‌های کلیدواژه‌ای Python) ارسال می‌شوند\&. \fBenv\&.Append\fR طوری طراحی شده است که امکان افزودن مقادیر را بدون نیاز به فکر کردن درباره نوع داده یک متغیر ساخت موجود فراهم کند\&. از نحو معمول Python نیز می‌توان برای دستکاری متغیر ساخت استفاده کرد، اما برای آن ممکن است لازم باشد انواع داده درگیر را بشناسید؛ برای نمونه Python خالص به شما اجازه می‌دهد مستقیماً دو فهرست از رشته‌ها را «جمع» کنید، اما افزودن یک رشته به یک فهرست یا یک فهرست به یک رشته نیازمند نحو متفاوتی است \- مواردی که \fBAppend\fR به آن‌ها رسیدگی می‌کند\&. برخی از متغیرهای ساخت از پیش تعریف‌شده بر اساس نحوه استفاده SCons از آن‌ها انتظارات نوعی خاصی دارند: برای مثال \fB$CPPDEFINES\fR اغلب یک رشته یا فهرستی از رشته‌ها است، اما می‌تواند فهرستی از تاپل‌ها یا یک دیکشنری نیز باشد؛ در حالی که انتظار می‌رود \fB$LIBEMITTER\fR یک شیء فراخوان‌پذیر یا فهرستی از فراخوان‌پذیرها باشد، و \fB$BUILDERS\fR انتظار می‌رود یک دیکشنری باشد\&. برای جزئیات بیشتر به مستندات متغیرهای ساخت گوناگون مراجعه کنید\&. .sp توضیحات زیر هم برای متدهای \fBAppend\fR و \fBPrepend\fR و هم برای گونه‌های \fBUnique\fR آن‌ها صدق می‌کند، با این تفاوت که نقطه درج مقادیر افزوده شده و مجاز بودن یا نبودن تکرار با هم تفاوت دارد\&. .sp \fIval\fR تقریباً می‌تواند از هر نوعی باشد\&. اگر \fIenv\fR متغیر ساختی به نام \fIkey\fR نداشته باشد، آن‌گاه \fIkey\fR صرفاً با مقدار \fIval\fR ذخیره می‌شود\&. در غیر این صورت، \fIval\fR با مقدار موجود ترکیب می‌شود، و احتمالاً به نوع مناسبی که بتواند محتوای بسط‌یافته را نگه‌داری کند تبدیل می‌شود\&. چند حالت خاص وجود دارد که باید به آن‌ها توجه کرد\&. در حالت عادی، هنگامی که دو رشته ترکیب می‌شوند، نتیجه یک رشته جدید حاوی الحاق آن‌ها است (و شما مسئول فراهم کردن هرگونه فاصله‌گذاری مورد نیاز هستید)؛ با این حال، محتویات \fB$CPPDEFINES\fR هنگام تولید خط فرمان با افزودن یک پیشوند و/یا پسوند به هر مدخل پس‌پردازش می‌شود، بنابراین SCons آن‌ها را جدا نگه می‌دارد \- افزودن یک رشته منجر به یک مدخل رشته‌ای جداگانه می‌شود، نه یک رشته ترکیب‌شده\&. برای \fB$CPPDEFINES\fR و همچنین \fB$LIBS\fR و متغیرهای گوناگون *PATH، دستور SCons متغیر را با ارائه نحو خاص کامپایلر اصلاح خواهد کرد (برای نمونه با پیشوند قرار دادن \-D یا /D برای \fB$CPPDEFINES\fR)، بنابراین هنگام افزودن مقادیر به این متغیرها باید از ذکر این نحو خودداری کنید\&. مثال‌ها (نحو gcc در بسط \fICPPDEFINES\fR نشان داده شده است): .sp .if n \{\ .RS 4 .\} .nf env = Environment(CXXFLAGS="\-std=c11", CPPDEFINES="RELEASE") print(f"CXXFLAGS = {env[\*(AqCXXFLAGS\*(Aq]}, CPPDEFINES = {env[\*(AqCPPDEFINES\*(Aq]}") # notice including a leading space in CXXFLAGS addition env\&.Append(CXXFLAGS=" \-O", CPPDEFINES="EXTRA") print(f"CXXFLAGS = {env[\*(AqCXXFLAGS\*(Aq]}, CPPDEFINES = {env[\*(AqCPPDEFINES\*(Aq]}") print("CPPDEFINES will expand to", env\&.subst(\*(Aq$_CPPDEFFLAGS\*(Aq)) .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf $ scons \-Q CXXFLAGS = \-std=c11, CPPDEFINES = RELEASE CXXFLAGS = \-std=c11 \-O, CPPDEFINES = deque([\*(AqRELEASE\*(Aq, \*(AqEXTRA\*(Aq]) CPPDEFINES will expand to \-DRELEASE \-DEXTRA scons: `\&.\*(Aq is up to date\&. .fi .if n \{\ .RE .\} .sp از آنجا که \fB$CPPDEFINES\fR برای تعیین ماکروهای پیش‌پردازنده C/C++ در خط فرمان در نظر گرفته شده است، هنگام افزودن به آن نحوهای بیشتری پذیرفته می‌شود\&. پیش‌پردازنده آرگومان‌هایی را برای پیش‌تعریف نام یک ماکرو به تنهایی می‌پذیرد (برای بیشتر کامپایلرها \-DFOO و برای Microsoft C++ به صورت /DFOO) که به آن مقدار ضمنی \fB1\fR می‌دهد، یا می‌تواند همراه با یک مقدار جایگزین ارائه شود (\-DBAR=TEXT)\&. SCons هنگام افزودن به \fB$CPPDEFINES\fR از این قوانین پیروی می‌کند: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} یک رشته بر اساس فاصله‌ها تفکیک می‌شود، که راهی آسان برای وارد کردن چندین ماکرو در یک مرحله فراهم می‌کند\&. برای مشخص کردن یک ماکروی مقداردار از یک = استفاده کنید\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} یک تاپل به عنوان یک ماکروی مقداردار در نظر گرفته می‌شود\&. اگر ماکرو نباید مقداری داشته باشد از مقدار \fBNone\fR استفاده کنید\&. ارائه بیش از دو عنصر در چنین تاپلی یک خطا محسوب می‌شود\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} یک فهرست به ترتیب پردازش می‌شود و هر مورد بدون تفسیر بیشتر افزوده می‌گردد\&. در این حالت، رشته‌های جداشده با فاصله تفکیک نمی‌شوند\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} یک دیکشنری به ترتیب پردازش می‌شود و هر جفت کلید\-مقدار به عنوان یک ماکروی مقداردار اضافه می‌گردد\&. اگر ماکرو نباید مقداری داشته باشد از مقدار \fBNone\fR استفاده کنید\&. .RE .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf env = Environment(CPPDEFINES="FOO") print("CPPDEFINES =", env[\*(AqCPPDEFINES\*(Aq]) env\&.Append(CPPDEFINES="BAR=1") print("CPPDEFINES =", env[\*(AqCPPDEFINES\*(Aq]) env\&.Append(CPPDEFINES=[("OTHER", 2)]) print("CPPDEFINES =", env[\*(AqCPPDEFINES\*(Aq]) env\&.Append(CPPDEFINES={"EXTRA": "arg"}) print("CPPDEFINES =", env[\*(AqCPPDEFINES\*(Aq]) print("CPPDEFINES will expand to", env\&.subst(\*(Aq$_CPPDEFFLAGS\*(Aq)) .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf $ scons \-Q CPPDEFINES = FOO CPPDEFINES = deque([\*(AqFOO\*(Aq, \*(AqBAR=1\*(Aq]) CPPDEFINES = deque([\*(AqFOO\*(Aq, \*(AqBAR=1\*(Aq, (\*(AqOTHER\*(Aq, 2)]) CPPDEFINES = deque([\*(AqFOO\*(Aq, \*(AqBAR=1\*(Aq, (\*(AqOTHER\*(Aq, 2), (\*(AqEXTRA\*(Aq, \*(Aqarg\*(Aq)]) CPPDEFINES will expand to \-DFOO \-DBAR=1 \-DOTHER=2 \-DEXTRA=arg scons: `\&.\*(Aq is up to date\&. .fi .if n \{\ .RE .\} .sp مثال‌هایی از افزودن چندین ماکرو: .sp .if n \{\ .RS 4 .\} .nf env = Environment() env\&.Append(CPPDEFINES=[("ONE", 1), "TWO", ("THREE", )]) print("CPPDEFINES =", env[\*(AqCPPDEFINES\*(Aq]) env\&.Append(CPPDEFINES={"FOUR": 4, "FIVE": None}) print("CPPDEFINES =", env[\*(AqCPPDEFINES\*(Aq]) print("CPPDEFINES will expand to", env\&.subst(\*(Aq$_CPPDEFFLAGS\*(Aq)) .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf $ scons \-Q CPPDEFINES = [(\*(AqONE\*(Aq, 1), \*(AqTWO\*(Aq, (\*(AqTHREE\*(Aq,)] CPPDEFINES = deque([(\*(AqONE\*(Aq, 1), \*(AqTWO\*(Aq, (\*(AqTHREE\*(Aq,), (\*(AqFOUR\*(Aq, 4), (\*(AqFIVE\*(Aq, None)]) CPPDEFINES will expand to \-DONE=1 \-DTWO \-DTHREE \-DFOUR=4 \-DFIVE scons: `\&.\*(Aq is up to date\&. .fi .if n \{\ .RE .\} .sp \fIتغییریافته در نسخه 4\&.5\fR: استفاده از تاپل‌ها در برابر سایر انواع شفاف‌سازی شد، اکنون نحوه رفتار در سراسر چهار تابع سازگار است\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment() env\&.Append(CPPDEFINES=("MACRO1", "MACRO2")) print("CPPDEFINES =", env[\*(AqCPPDEFINES\*(Aq]) env\&.Append(CPPDEFINES=[("MACRO3", "MACRO4")]) print("CPPDEFINES =", env[\*(AqCPPDEFINES\*(Aq]) print("CPPDEFINES will expand to", env\&.subst(\*(Aq$_CPPDEFFLAGS\*(Aq)) .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf $ scons \-Q CPPDEFINES = (\*(AqMACRO1\*(Aq, \*(AqMACRO2\*(Aq) CPPDEFINES = deque([\*(AqMACRO1\*(Aq, \*(AqMACRO2\*(Aq, (\*(AqMACRO3\*(Aq, \*(AqMACRO4\*(Aq)]) CPPDEFINES will expand to \-DMACRO1 \-DMACRO2 \-DMACRO3=MACRO4 scons: `\&.\*(Aq is up to date\&. .fi .if n \{\ .RE .\} .sp برای جزئیات بیشتر \fB$CPPDEFINES\fR را ببینید\&. .sp افزودن یک رشته \fIval\fR به یک متغیر ساخت از نوع دیکشنری، \fIval\fR را به عنوان کلید در دیکشنری و None را به عنوان مقدار آن وارد می‌کند\&. استفاده از نوع تاپل برای فراهم کردن یک جفت کلید\-مقدار تنها برای مورد خاص \fB$CPPDEFINES\fR که در بالا توضیح داده شد کار می‌کند\&. .sp اگرچه بیشتر ترکیب‌های انواع بدون نیاز به دانستن جزئیات کار می‌کنند، برخی ترکیب‌ها معنادار نیستند و Python یک استثنا (exception) ایجاد می‌کند\&. .sp هنگام استفاده از \fBenv\&.Append\fR برای تغییر متغیرهای ساختی که مشخص‌کننده مسیر هستند (طبق قرارداد، نام این متغیرها به PATH ختم می‌شود)، توصیه می‌شود مقادیر را به عنوان فهرستی از رشته‌ها اضافه کنید، حتی اگر فقط یک رشته تکی را اضافه می‌کنید\&. همین موضوع در مورد افزودن نام کتابخانه‌ها به \fB$LIBS\fR نیز صدق می‌کند\&. .sp .if n \{\ .RS 4 .\} .nf env\&.Append(CPPPATH=["#/include"]) .fi .if n \{\ .RE .\} .sp همچنین ببینید: \fBenv\&.AppendUnique\fR، \fBenv\&.Prepend\fR و \fBenv\&.PrependUnique\fR\&. .RE .PP \fIenv\fR\&.AppendENVPath(\fIname, newpath, [envname, sep, delete_existing=False]\fR) .RS 4 افزودن مسیرهای دایرکتوری از \fInewpath\fR به یک مدخل مسیر جستجو با نام \fIname\fR در متغیر ساخت \fIenvname\fR در محیط جاری (\fIenv\fR)\&. اگر \fIenvname\fR مشخص نشده باشد، مقدار پیش‌فرض "ENV" است (ببینید \fB$ENV\fR)\&. انتظار می‌رود \fIenvname\fR به شیئی شبیه به دیکشنری اشاره داشته باشد؛ اگر در \fIenv\fR وجود نداشته باشد، به عنوان یک دیکشنری در ابتدا خالی ایجاد خواهد شد\&. \fInewpath\fR می‌تواند به عنوان یک رشته، یک گره دایرکتوری، یا فهرستی از رشته‌ها مشخص شود\&. اگر رشته باشد، می‌تواند شامل چندین مسیر باشد که با جداکننده مسیر سیستم (os\&.pathsep) یا در صورت تعیین، با مقدار \fIsep\fR از یکدیگر جدا شده‌اند\&. رشته‌های مسیر وابسته به ریشه پروژه (که با # آغاز می‌شوند) شناسایی می‌شوند\&. نوع مقدار موجود \fIname\fR حفظ می‌شود\&. .sp مسیرها تنها یک‌بار ظاهر خواهند شد\&. مسیرهای تکراری در \fInewpath\fR حذف می‌شوند و آخرین مورد برای حفظ ترتیب مسیر نگه‌داشته می‌شود\&. اگر \fIdelete_existing\fR برابر با درست (true) باشد (پیش‌فرض)، موارد تکراری موجود پیش از الحاق حذف می‌شوند، در غیر این صورت، از موارد تکراری جدید صرف‌نظر می‌شود\&. هنگام مقایسه‌ها، مسیرها نرمال‌سازی می‌شوند تا از بروز مشکلات ناشی از تفاوت بزرگی و کوچکی حروف (در فایل‌سیستم‌های غیرحساس به حروف بزرگ و کوچک) و مسیرهای نسبی که ممکن است به همان دایرکتوری بازگردند جلوگیری شود\&. مقادیر ذخیره‌شده توسط این فرآیند تغییر نمی‌کنند\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf print(\*(Aqbefore:\*(Aq, env[\*(AqENV\*(Aq][\*(AqINCLUDE\*(Aq]) include_path = \*(Aq/foo/bar:/foo\*(Aq env\&.AppendENVPath(\*(AqINCLUDE\*(Aq, include_path) print(\*(Aqafter:\*(Aq, env[\*(AqENV\*(Aq][\*(AqINCLUDE\*(Aq]) .fi .if n \{\ .RE .\} .sp خروجی: .sp .if n \{\ .RS 4 .\} .nf before: /foo:/biz after: /biz:/foo/bar:/foo .fi .if n \{\ .RE .\} .sp همچنین ببینید: \fBenv\&.PrependENVPath\fR\&. .RE .PP \fIenv\fR\&.AppendUnique(\fIkey=val, [\&.\&.\&.], [delete_existing=False]\fR) .RS 4 الحاق مقادیر به متغیرهای ساخت در محیط ساخت فعلی، با حفظ یکتایی\&. مانند \fBenv\&.Append\fR عمل می‌کند، به جز اینکه مقادیری که تکراری می‌شوند افزوده نخواهند شد\&. اگر \fIdelete_existing\fR روی یک مقدار درست (true) تنظیم شود، برای هر مورد تکراری، نمونه موجود از \fIval\fR ابتدا حذف شده و سپس \fIval\fR الحاق می‌شود که اثر انتقال آن به انتها را دارد\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf env\&.AppendUnique(CCFLAGS=\*(Aq\-g\*(Aq, FOO=[\*(Aqfoo\&.yyy\*(Aq]) .fi .if n \{\ .RE .\} .sp همچنین ببینید: \fBenv\&.Append\fR، \fBenv\&.Prepend\fR و \fBenv\&.PrependUnique\fR\&. .RE .PP \fBBuilder\fR(\fIaction, [arguments]\fR), \fIenv\fR\&.Builder(\fIaction, [arguments]\fR) .RS 4 یک شیء Builder برای \fIaction\fR مشخص‌شده ایجاد می‌کند\&. برای توضیح کامل آرگومان‌ها و رفتار، بخش "Builder Objects" در این راهنما را ببینید\&. .sp توجه داشته باشید که فرم فراخوانی \fBenv\&.Builder\fR() متغیرهای ساخت را در تمام رشته‌های آرگومان، از جمله آرگومان \fIaction\fR، در زمان فراخوانی با استفاده از متغیرهای ساخت در محیط ساخت \fIenv\fR که \fBenv\&.Builder\fR از طریق آن فراخوانی شده است، بسط می‌دهد\&. فرم \fBBuilder\fR بسط متغیرها را تا پس از فراخوانی واقعی شیء Builder به تعویق می‌اندازد\&. .RE .PP \fBCacheDir\fR(\fIcache_dir, custom_class=None\fR), \fIenv\fR\&.CacheDir(\fIcache_dir, custom_class=None\fR) .RS 4 به \fBscons\fR دستور می‌دهد یک حافظه موقت (cache) فایل‌های مشتق‌شده را در \fIcache_dir\fR نگهداری کند\&. فایل‌های کَش‌شده میان ساخت‌هایی که همان \fIcache_dir\fR را مشخص کرده باشند به اشتراک گذاشته می‌شوند\&. تنظیم \fIcache_dir\fR روی \fBNone\fR کَش کردن را غیرفعال می‌کند\&. .sp متد محیطی \fBenv\&.CacheDir\fR حافظه موقت را تنها برای هدف‌هایی اعمال می‌کند که از طریق آن محیط ساخت خاص ساخته شده باشند\&. تابع سراسری \fBCacheDir\fR یک مقدار پیش‌فرض تعیین می‌کند که بر همه اهداف اعمال می‌شود مگر آنکه با فراخوانی مختص به محیط بازنویسی شود\&. .sp رفتار حافظه موقت را می‌توان با ارسال زیرکلاسی از SCons\&.CacheDir\&.CacheDir به عنوان پارامتر اختیاری \fIcustom_class\fR سفارشی‌سازی کرد\&. اگر حذف شود یا روی \fBNone\fR تنظیم گردد، SCons از کلاس پیش‌فرض استفاده می‌کند\&. .sp هنگامی که حافظه موقت فعال است و \fBscons\fR نیاز دارد یک فایل مشتق‌شده را دوباره بسازد، ابتدا حافظه موقت را برای یک امضای ساخت (build signature) تطبیق‌پذیر بررسی می‌کند (که نشان‌دهنده ورودی‌ها و کنش‌های ساخت یکسان است)\&. در صورت یافتن، فایل از حافظه موقت بازیابی می‌شود\&. در غیر این صورت، \fBscons\fR فایل را می‌سازد و رونوشتی از آن را تحت امضای ساخت خود در حافظه موقت ذخیره می‌کند\&. .sp به طور پیش‌فرض، \fBscons\fR هنگام برخورد موفق در حافظه موقت (cache hits)، عبارت Retrieved `file\*(Aq from cache را گزارش می‌دهد\&. از گزینه \fB\-\-cache\-show\fR برای پنهان کردن دخالت حافظه موقت و نمایش رشته ساخت عادی در عوض آن، جهت یکدستی خروجی لاگ، استفاده کنید\&. .sp کش کردن را برای یک فراخوانی مشخص با گزینه \fB\-\-cache\-disable\fR غیرفعال کنید\&. برای مجاز کردن بازیابی اما جلوگیری از به‌روزرسانی‌ها، از \fB\-\-cache\-readonly\fR استفاده کنید\&. .sp گزینه \fB\-\-cache\-force\fR \fIهمه\fR فایل‌های مشتق‌شده را در حافظه موقت کپی می‌کند، حتی فایل‌هایی که از قبل وجود دارند\&. این کار به پر کردن یک حافظه موقت تازه یا به‌روزرسانی آن پس از ساخت با به‌روزرسانی حافظه موقت غیرفعال شده (\fB\-\-cache\-disable\fR یا \fB\-\-cache\-readonly\fR) کمک می‌کند\&. .sp از \fBNoCache\fR برای مستثنی کردن فایل‌های خاص از قرارگیری در حافظه موقت استفاده کنید، مانند مواردی با ورودی‌ها یا خروجی‌های غیرقابل‌پیش‌بینی، یا فایل‌های خروجی بیش از اندازه بزرگ\&. .sp SCons ابزارهای توکاری برای مدیریت حافظه موقت ارائه نمی‌دهد\&. شما باید پاک‌سازی (pruning)، انقضا، کنترل دسترسی و سایر وظایف نگهداری را به صورت دستی مدیریت کنید\&. .RE .PP \fBClean\fR(\fItargets, files\fR), \fIenv\fR\&.Clean(\fItargets, files\fR) .RS 4 تنظیم \fIfiles\fR اضافی برای حذف هنگامی که هر یک از \fItargets\fR برای پاک‌سازی انتخاب شوند (گزینه خط فرمان \fB\-c\fR)\&. هر یک از \fItargets\fR و \fIfiles\fR می‌توانند یک نام فایل یا گره (node) واحد، یا فهرستی از نام‌های فایل یا گره‌ها باشند\&. این‌ها می‌توانند به فایل‌ها یا دایرکتوری‌ها اشاره کنند\&. فراخوانی مکرر این متد اثر افزایشی دارد\&. .sp متد مرتبط \fBNoClean\fR اولویت بالاتری دارد: هر هدفی که برای \fBNoClean\fR مشخص شود، پاک‌سازی نخواهد شد حتی اگر به عنوان پارامتر \fIfiles\fR به \fBClean\fR داده شده باشد\&. .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf Clean(\*(Aqfoo\*(Aq, [\*(Aqbar\*(Aq, \*(Aqbaz\*(Aq]) Clean(\*(Aqdist\*(Aq, env\&.Program(\*(Aqhello\*(Aq, \*(Aqhello\&.c\*(Aq)) Clean([\*(Aqfoo\*(Aq, \*(Aqbar\*(Aq], \*(Aqsomething_else_to_clean\*(Aq) .fi .if n \{\ .RE .\} .sp ابزار SCons دایرکتوری‌ها را مستقیماً به عنوان هدف ردیابی نمی‌کند \- آن‌ها در صورت نیاز ایجاد می‌شوند و در حالت پاک‌سازی معمولاً حذف نمی‌شوند\&. در این مثال، نصب پروژه یک زیردایرکتوری برای مستندات ایجاد می‌کند\&. فراخوانی \fBClean\fR تضمین می‌کند که در صورت حذف نصب پروژه، این زیردایرکتوری حذف شود\&. .sp .if n \{\ .RS 4 .\} .nf Clean(docdir, os\&.path\&.join(docdir, projectname)) .fi .if n \{\ .RE .\} .RE .PP \fIenv\fR\&.Clone(\fI[key=val, \&.\&.\&.]\fR) .RS 4 یک نسخه مستقل از یک محیط ساخت (construction environment) را برمی‌گرداند\&. اگر آرگومان‌های کلیدواژه‌ای ناشناخته‌ای مشخص شوند، به عنوان متغیرهای ساخت (construction variables) در نسخه کپی اضافه می‌شوند و مقادیر موجود برای آن کلیدواژه‌ها را بازنویسی می‌کنند\&. برای جزئیات بیشتر به بخش «محیط‌های ساخت» (Construction Environments) در صفحه راهنما مراجعه کنید\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf env2 = env\&.Clone() env3 = env\&.Clone(CCFLAGS=\*(Aq\-g\*(Aq) .fi .if n \{\ .RE .\} .sp مشابه سازنده \fBEnvironment\fR، می‌توان فهرستی از \fItools\fR و یک \fItoolpath\fR را مشخص کرد: .sp .if n \{\ .RS 4 .\} .nf def MyTool(env): env[\*(AqFOO\*(Aq] = \*(Aqbar\*(Aq env4 = env\&.Clone(tools=[\*(Aqmsvc\*(Aq, MyTool]) .fi .if n \{\ .RE .\} .sp آرگومان کلیدواژه‌ای \fIparse_flags\fR نیز شناخته می‌شود، تا ادغام آرگومان‌های به سبک خط فرمان در متغیرهای ساخت مربوطه امکان‌پذیر شود (نگاه کنید به \fBenv\&.MergeFlags\fR)\&. .sp .if n \{\ .RS 4 .\} .nf # create an environment for compiling programs that use wxWidgets wx_env = env\&.Clone(parse_flags=\*(Aq!wx\-config \-\-cflags \-\-cxxflags\*(Aq) .fi .if n \{\ .RE .\} .sp آرگومان کلیدواژه‌ای \fIvariables\fR نیز شناخته می‌شود تا امکان مقداردهی (مجدد) متغیرهای ساخت از روی یک شیء Variables فراهم گردد\&. .sp \fIتغییریافته در نسخه 4\&.8\&.0:\fR پارامتر \fIvariables\fR اضافه شد\&. .RE .PP \fBCommand\fR(\fItarget, source, action, [key=val, \&.\&.\&.]\fR), \fIenv\fR\&.Command(\fItarget, source, action, [key=val, \&.\&.\&.]\fR) .RS 4 یک سازنده (builder) بی‌نام ایجاد کرده و آن را فراخوانی می‌کند، و بدین ترتیب \fIaction\fR را برای ساخت \fItarget\fR از \fIsource\fR در درخت وابستگی ثبت می‌کند\&. این کار برای یک ساختِ موردی خاص، می‌تواند راحت‌تر از تعریف و افزودن یک Builder نام‌گذاری‌شده جدید باشد\&. .sp تابع \fBCommand\fR آرگومان‌های کلیدواژه‌ای \fIsource_scanner\fR و \fItarget_scanner\fR را می‌پذیرد که برای تعیین اسکنرهای سفارشی برای مبداها یا اهداف مشخص‌شده به کار می‌روند\&. مقدار باید یک شیء Scanner باشد\&. برای نمونه، می‌توان از شیء سراسری DirScanner استفاده کرد اگر هر یک از مبداها دایرکتوری‌هایی باشند که باید روی دیسک برای تغییرات فایل‌هایی که قبلاً در سایر Builderها یا فراخوانی‌های توابع مشخص نشده‌اند، اسکن شوند\&. .sp تابع \fBCommand\fR همچنین آرگومان‌های کلیدواژه‌ای \fIsource_factory\fR و \fItarget_factory\fR را می‌پذیرد که برای مشخص کردن توابع کارخانه‌ای جهت ساخت گره‌های SCons از هر مبدا یا هدف مشخص‌شده به عنوان رشته استفاده می‌شوند\&. اگر هر مبدا یا هدفی از قبل شیء Node باشد، حتی در صورت تعیین یک کارخانه برای آن‌ها، دگرگونی بیشتری نخواهند یافت\&. پیش‌فرض برای هر کدام، کارخانه \fBEntry\fR است\&. .sp این چهار آرگومان در صورت مشخص شدن، در ایجاد Builder به کار گرفته می‌شوند\&. سایر آرگومان‌های کلیدواژه‌ای مختص Builder به عنوان چنین مواردی شناخته نمی‌شوند\&. برای اطلاعات بیشتر درباره نحوه کار این آرگومان‌ها در یک Builder، به بخش «اشیای سازنده» (Builder Objects) در صفحه راهنما مراجعه کنید\&. .sp هر آرگومان کلیدواژه‌ای باقی‌مانده، هنگام فراخوانی به سازنده ایجادشده منتقل می‌شود و طبق آنچه در بخش «متدهای سازنده» (Builder Methods) در صفحه راهنما توضیح داده شده عمل می‌کند؛ به طور خلاصه: آرگومان‌های شناخته‌شده معانی مشخص خود را دارند، در حالی که باقی آن‌ها برای بازنویسی هر متغیر ساخت هم‌نام موجود از محیط ساخت استفاده می‌شوند\&. .sp پارامتر \fIaction\fR می‌تواند یک دستور خارجی (مشخص‌شده به عنوان یک رشته) یا یک شیء قابل فراخوانی Python باشد؛ برای اطلاعات کامل‌تر به بخش «اشیای اقدام» (Action Objects) در صفحه راهنما مراجعه کنید\&. همچنین توجه داشته باشید که قبل از رشته مشخص‌کننده دستور خارجی می‌تواند یک علامت اتساین (@) برای جلوگیری از چاپ دستور مربوطه، یا یک خط تیره (\-) برای نادیده گرفتن وضعیت خروج (exit status) دستور خارجی قرار گیرد\&. .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf env\&.Command( target=\*(Aqfoo\&.out\*(Aq, source=\*(Aqfoo\&.in\*(Aq, action="$FOO_BUILD < $SOURCES > $TARGET" ) env\&.Command( target=\*(Aqbar\&.out\*(Aq, source=\*(Aqbar\&.in\*(Aq, action=["rm \-f $TARGET", "$BAR_BUILD < $SOURCES > $TARGET"], ENV={\*(AqPATH\*(Aq: \*(Aq/usr/local/bin/\*(Aq}, ) import os def rename(env, target, source): os\&.rename(\*(Aq\&.tmp\*(Aq, target[0]) env\&.Command( target=\*(Aqbaz\&.out\*(Aq, source=\*(Aqbaz\&.in\*(Aq, action=["$BAZ_BUILD < $SOURCES > \&.tmp", rename], ) .fi .if n \{\ .RE .\} .sp توجه داشته باشید که تابع \fBCommand\fR معمولاً به طور پیش‌فرض فرض می‌کند که اهداف و/یا مبداهای مشخص‌شده فایل هستند، اگر بخش دیگری از پیکربندی نوع ورودی‌های آن‌ها را مشخص نکند\&. در صورت نیاز، می‌توانید با استفاده از توابع \fBDir\fR یا \fBenv\&.Dir\fR صراحتاً مشخص کنید که گره‌های هدف یا مبدا باید به عنوان دایرکتوری در نظر گرفته شوند\&. .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf env\&.Command(\*(Aqddd\&.list\*(Aq, Dir(\*(Aqddd\*(Aq), \*(Aqls \-l $SOURCE > $TARGET\*(Aq) env[\*(AqDISTDIR\*(Aq] = \*(Aqdestination/directory\*(Aq env\&.Command(env\&.Dir(\*(Aq$DISTDIR\*(Aq)), None, make_distdir) .fi .if n \{\ .RE .\} .sp همچنین توجه داشته باشید که SCons معمولاً هر دایرکتوری لازم برای نگهداری یک فایل هدف را به طور خودکار ایجاد می‌کند، بنابراین معمولاً نیازی ندارید که دایرکتوری‌ها را به صورت دستی ایجاد کنید\&. .RE .PP \fBConfigure\fR(\fIenv, [custom_tests, conf_dir, log_file, config_h]\fR), \fIenv\fR\&.Configure(\fI[custom_tests, conf_dir, log_file, config_h]\fR) .RS 4 یک شیء \fBConfigure\fR برای قابلیت‌های یکپارچه مشابه با GNU \fBautoconf\fR ایجاد می‌کند\&. برای توضیح کامل آرگومان‌ها و رفتار، بخش «Configure Contexts» در این صفحهٔ راهنما را ببینید\&. .RE .PP \fBDebugOptions\fR(\fI[json]\fR) .RS 4 امکان تعیین مقادیر را برای گزینه‌های اشکال‌زدایی SCons فراهم می‌کند\&. در حال حاضر، تنها مقدار پشتیبانی‌شده \fIjson\fR است که مسیر فایل JSON ایجادشده هنگام ارائهٔ آرگومان \fB\-\-debug=json\fR را تنظیم می‌کند\&. .sp .if n \{\ .RS 4 .\} .nf DebugOptions(json=\*(Aq#/build/output/scons_stats\&.json\*(Aq) .fi .if n \{\ .RE .\} .sp \fIجدید در نسخهٔ 4\&.6\&.0\&.\fR .RE .PP \fBDecider\fR(\fIfunction\fR), \fIenv\fR\&.Decider(\fIfunction\fR) .RS 4 مشخص می‌کند که تمام تصمیم‌گیری‌های به‌روز بودن (up\-to\-date) برای هدف‌های ساخته‌شده از طریق این محیط ساخت، توسط \fIfunction\fR مدیریت خواهد شد\&. \fIfunction\fR می‌تواند نام یک تابع یا یکی از رشته‌های زیر باشد که یک تابع تصمیم‌گیرندهٔ (decider) از پیش تعریف‌شده را مشخص می‌کنند: .PP "content" .RS 4 مشخص می‌کند که یک هدف در صورتی قدیمی (out\-of\-date) در نظر گرفته شده و بازسازی می‌شود که محتوای وابستگی از زمان آخرین ساخت هدف تغییر کرده باشد؛ این موضوع با محاسبهٔ چک‌سام (checksum) روی محتوای وابستگی با استفاده از تابع هش انتخاب‌شده و مقایسهٔ آن با چک‌سام ثبت‌شده در آخرین باری که هدف ساخته شده است، تعیین می‌شود\&. content تصمیم‌گیرندهٔ پیش‌فرض است\&. .sp \fIتغییریافته در نسخهٔ 4\&.1:\fR نام تصمیم‌گیرنده به content تغییر یافت چرا که تابع هش اکنون قابل انتخاب است\&. نام پیشین، MD5، همچنان می‌تواند به عنوان مترادف استفاده شود، اما منسوخ شده است\&. .RE .PP "content\-timestamp" .RS 4 مشخص می‌کند که یک هدف در صورتی قدیمی در نظر گرفته شده و بازسازی می‌شود که محتوای وابستگی از زمان آخرین ساخت هدف تغییر کرده باشد، با این استثنا که وابستگی‌های دارای برچسب زمانی (timestamp) مطابق با زمان آخرین بازسازی هدف، به‌روز فرض شده و بازسازی \fIنمی‌شوند\fR\&. این کار رفتاری بسیار شبیه به رفتار content (محاسبهٔ همیشگی چک‌سام محتوای فایل‌ها) ارائه می‌دهد، همراه با این بهینه‌سازی که محتوای فایل‌هایی که برچسب زمانی آن‌ها تغییر نکرده است بررسی نمی‌شود\&. عیب این روش آن است که SCons تشخیص \fIنخواهد\fR داد که آیا محتوای یک فایل تغییر کرده اما برچسب زمانی آن یکسان مانده است یا خیر؛ اتفاقی که ممکن است در یک اسکریپت خودکار رخ دهد که ساخت را اجرا می‌کند، فایلی را به‌روزرسانی می‌کند و دوباره ساخت را اجرا می‌کند، همگی در کسری از یک ثانیه\&. .sp \fIتغییریافته در نسخهٔ 4\&.1:\fR نام تصمیم‌گیرنده به content\-timestamp تغییر یافت چرا که تابع هش اکنون قابل انتخاب است\&. نام پیشین، MD5\-timestamp، همچنان می‌تواند به عنوان مترادف استفاده شود، اما منسوخ شده است\&. .RE .PP "timestamp\-newer" .RS 4 مشخص می‌کند که یک هدف در صورتی قدیمی در نظر گرفته شده و بازسازی می‌شود که برچسب زمانی وابستگی جدیدتر از برچسب زمانی فایل هدف باشد\&. این همان رفتار ابزار کلاسیک Make است و make می‌تواند به عنوان مترادفی برای timestamp\-newer به کار رود\&. .RE .PP "timestamp\-match" .RS 4 مشخص می‌کند که یک هدف در صورتی قدیمی در نظر گرفته شده و بازسازی می‌شود که برچسب زمانی وابستگی با برچسب زمانی ثبت‌شده در آخرین باری که هدف ساخته شده است متفاوت باشد\&. این گزینه رفتاری بسیار مشابه با ابزار کلاسیک Make ارائه می‌دهد (به‌ویژه اینکه فایل‌ها برای محاسبهٔ چک‌سام محتوایشان باز نمی‌شوند)، با این تفاوت که اگر یک فایل وابستگی به نسخه‌ای با برچسب زمانی \fIقدیمی‌تر\fR بازگردانده شده باشد (مانند آنچه هنگام بازیابی فایل‌ها از آرشیوهای پشتیبان رخ می‌دهد)، هدف بازسازی خواهد شد\&. .RE .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf # Use exact timestamp matches by default\&. Decider(\*(Aqtimestamp\-match\*(Aq) # Use hash content signatures for any targets built # with the attached construction environment\&. env\&.Decider(\*(Aqcontent\*(Aq) .fi .if n \{\ .RE .\} .sp علاوه بر توابع از پیش موجود بالا، آرگومان \fIfunction\fR می‌تواند یک تابع Python باشد که شما ارائه می‌دهید\&. چنین تابعی باید چهار آرگومان زیر را بپذیرد: .PP \fIdependency\fR .RS 4 گره‌ای (فایلی) که در صورت «تغییر» از زمان آخرین ساخت \fItarget\fR، باید باعث بازسازی \fItarget\fR شود\&. .RE .PP \fItarget\fR .RS 4 گره‌ای (فایلی) که در حال ساخت است\&. در حالت عادی، این همان چیزی است که اگر \fIdependency\fR «تغییر کرده باشد»، باید بازسازی شود\&. .RE .PP \fIprev_ni\fR .RS 4 اطلاعات ذخیره‌شده دربارهٔ وضعیت \fIdependency\fR در آخرین باری که \fItarget\fR ساخته شده است\&. این اطلاعات را می‌توان برای تطبیق ویژگی‌های مختلف فایل مانند برچسب زمانی، اندازه یا امضای محتوا بررسی کرد\&. .RE .PP \fIrepo_node\fR .RS 4 در صورت تنظیم، برای تعیین تغییر وابستگی، به جای گره مشخص‌شده توسط \fIdependency\fR از این Node استفاده می‌شود\&. این آرگومان اختیاری است، بنابراین باید به عنوان یک آرگومان پیش‌فرض نوشته شود (معمولاً به صورت \fIrepo_node=None\fR نوشته می‌شود)\&. فراخواننده معمولاً تنها زمانی این مقدار را تنظیم می‌کند که هدف فقط در یک Repository وجود داشته باشد\&. .RE .sp تابع \fIfunction\fR باید در صورتی که \fIdependency\fR از زمان آخرین ساخت \fItarget\fR «تغییر» کرده باشد، مقداری را برگرداند که برابر با \fBTrue\fR ارزیابی شود (که نشان می‌دهد هدف \fIباید\fR بازسازی شود)، و در غیر این صورت مقداری که برابر با \fBFalse\fR ارزیابی شود (که نشان می‌دهد هدف \fIنباید\fR بازسازی شود)\&. توجه داشته باشید که این تصمیم‌گیری می‌تواند با استفاده از هر معیار مناسبی انجام شود\&. نادیده گرفتن برخی یا همهٔ آرگومان‌های تابع کاملاً طبیعی است\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf def my_decider(dependency, target, prev_ni, repo_node=None): return not os\&.path\&.exists(str(target)) env\&.Decider(my_decider) .fi .if n \{\ .RE .\} .RE .PP \fBDefault\fR(\fItarget[, \&.\&.\&.]\fR), \fIenv\fR\&.Default(\fItarget[, \&.\&.\&.]\fR) .RS 4 اهداف پیش‌فرض را برای سازوکار انتخاب هدف SCons تعیین می‌کند\&. هرگونه فراخوانی \fBDefault\fR باعث خواهد شد که SCons به جای الگوریتم توکار خود برای تعیین اهداف پیش‌فرض، از فهرست اهداف پیش‌فرض تعریف‌شده استفاده کند (بخش «انتخاب هدف» (Target Selection) در صفحه‌ی راهنما را ببینید)\&. .sp \fItarget\fR می‌تواند یک یا چند رشته، فهرستی از رشته‌ها، یک NodeList برگشتی از یک Builder، یا \fBNone\fR باشد\&. یک رشته‌ی \fItarget\fR می‌تواند نام یک فایل یا دایرکتوری باشد، یا هدفی که پیش‌تر با فراخوانی \fBAlias\fR تعریف شده است (تعریف نام مستعار پس از آن همچنان نام مستعار را ایجاد می‌کند، اما به عنوان پیش‌فرض شناخته نخواهد شد)\&. فراخوانی‌های \fBDefault\fR تجمیعی هستند\&. مقدار None برای \fItarget\fR هرگونه فهرست اهداف پیش‌فرض موجود را پاک می‌کند؛ فراخوانی‌های بعدی \fBDefault\fR طبق معمول به فهرست اهداف پیش‌فرض (که اکنون خالی است) اضافه خواهند شد\&. .sp هر دو شکل این فراخوانی بر همان فهرست سراسری اهداف پیش‌فرض اثر می‌گذارند؛ متد محیط ساخت، بسط متغیرهای ساخت را روی اهداف اعمال می‌کند\&. .sp فهرست فعلی اهداف اضافه‌شده با استفاده از \fBDefault\fR در فهرست \fIDEFAULT_TARGETS\fR در دسترس است (پایین را ببینید)\&. .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf Default(\*(Aqfoo\*(Aq, \*(Aqbar\*(Aq, \*(Aqbaz\*(Aq) env\&.Default([\*(Aqa\*(Aq, \*(Aqb\*(Aq, \*(Aqc\*(Aq]) hello = env\&.Program(\*(Aqhello\*(Aq, \*(Aqhello\&.c\*(Aq) env\&.Default(hello) .fi .if n \{\ .RE .\} .RE .PP \fBDefaultEnvironment\fR(\fI[key=value, \&.\&.\&.]\fR) .RS 4 شیء سراسری محیط ساخت (construction environment) را نمونه‌سازی کرده و برمی‌گرداند\&. محیط پیش‌فرض (Default Environment) به صورت داخلی توسط SCons هنگام اجرای یک تابع سراسری یا فرم سراسری متد Builder که نیازمند دسترسی به یک محیط ساخت است، استفاده می‌شود\&. .sp در نخستین فراخوانی، آرگومان‌ها مانند تابع \fBEnvironment\fR تفسیر می‌شوند\&. محیط پیش‌فرض یک شیء یگانه (singleton) است؛ فراخوانی‌های بعدی \fBDefaultEnvironment\fR شیء ساخته‌شده‌ی پیشین را برمی‌گردانند، و هرگونه آرگومان کلیدواژه‌ای بدون اعلام نادیده گرفته می‌شود\&. .sp محیط پیش‌فرض را می‌توان پس از نمونه‌سازی، مشابه سایر محیط‌های ساخت تغییر داد، هرچند ممکن است برخی از متدهای محیط ساخت در دسترس نباشند\&. تغییر محیط پیش‌فرض هیچ اثری بر سایر محیط‌های ساخت، چه موجود و چه نوساخته، ندارد\&. .sp نیازی به فراخوانی صریح \fBDefaultEnvironment\fR نیست\&. SCons چنانچه تاکنون انجام نشده باشد، در زمان آغاز فاز ساخت، محیط پیش‌فرض را به طور خودکار نمونه‌سازی می‌کند\&. با این حال، فراخوانی صریح آن این فرصت را فراهم می‌آورد تا محتویات آن را تحت تأثیر قرار داده و بررسی کنید\&. به دلیل استفاده‌های داخلی، نمونه‌سازی حتی اگر به نظر برسد چیزی در سامانه ساخت از آن استفاده نمی‌کند نیز رخ می‌دهد\&. .sp اگر فایل‌های SConscript پروژه از توابع سراسری یا Builderها استفاده نمی‌کنند، ممکن است با فراخوانی \fBDefaultEnvironment\fR با یک فهرست ابزار خالی (\fBDefaultEnvironment(tools=[])\fR)\& سود اندکی در عملکرد حاصل شود\&. این کار از هزینه مقداردهی اولیه‌ی ابزارها برای محیط پیش‌فرض جلوگیری می‌کند، که عمدتاً در مجموعه‌ی آزمون که \fBscons\fR در آن به طور مکرر در یک بازه زمانی کوتاه اجرا می‌شود اهمیت دارد\&. .RE .PP \fBDepends\fR(\fItarget, dependency\fR), \fIenv\fR\&.Depends(\fItarget, dependency\fR) .RS 4 یک وابستگی صریح را تعیین می‌کند؛ \fItarget\fR هر زمان که \fIdependency\fR تغییر کرده باشد مجدداً ساخته خواهد شد\&. هر دو \fItarget\fR و \fIdependency\fR مشخص‌شده می‌توانند یک رشته (معمولاً نام مسیر یک فایل یا دایرکتوری) یا اشیاء Node، یا فهرستی از رشته‌ها یا اشیاء Node باشند (مانند مقداری که توسط فراخوانی یک Builder برگردانده می‌شود)\&. این کار تنها باید برای مواردی ضروری باشد که وابستگی توسط یک Scanner برای آن فایل شناسایی نمی‌شود\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf env\&.Depends(\*(Aqfoo\*(Aq, \*(Aqother\-input\-file\-for\-foo\*(Aq) mylib = env\&.Library(\*(Aqmylib\&.c\*(Aq) installed_lib = env\&.Install(\*(Aqlib\*(Aq, mylib) bar = env\&.Program(\*(Aqbar\&.c\*(Aq) # Arrange for the library to be copied into the installation # directory before trying to build the "bar" program\&. # (Note that this is for example only\&. A "real" library # dependency would normally be configured through the $LIBS # and $LIBPATH variables, not using an env\&.Depends() call\&.) env\&.Depends(bar, installed_lib) .fi .if n \{\ .RE .\} .RE .PP \fIenv\fR\&.Detect(\fIprogs\fR) .RS 4 یک فایل اجرایی را از میان یک یا چند انتخاب پیدا می‌کند: \fIprogs\fR می‌تواند یک رشته یا فهرستی از رشته‌ها باشد\&. نخستین مقدار یافت‌شده از \fIprogs\fR یا \fBNone\fR را برمی‌گرداند\&. فایل اجرایی با بررسی مسیرها در محیط اجرا (\fIenv\fR[\*(AqENV\*(Aq][\*(AqPATH\*(Aq]) جستجو می‌شود\&. در سامانه‌های Windows، علاوه بر این پسوندهای نام فایل موجود در محیط اجرا (\fIenv\fR[\*(AqENV\*(Aq][\*(AqPATHEXT\*(Aq]) را نیز اعمال می‌کند اما هیچ‌یک از این پسوندها را در مقدار بازگشتی لحاظ نخواهد کرد\&. \fBenv\&.Detect\fR پوششی پیرامون \fBenv\&.WhereIs\fR است\&. .RE .PP \fIenv\fR\&.Dictionary(\fI[var, \&.\&.\&.], [as_dict=]\fR) .RS 4 شیئی حاوی متغیرهای ساخت را از \fIenv\fR برمی‌گرداند\&. اگر \fIvar\fR حذف شود، تمام متغیرهای ساخت به همراه مقادیرشان در یک \fBdict\fR بازگردانده می‌شوند\&. اگر \fIvar\fR مشخص شده باشد و \fIas_dict\fR درست (true) باشد، متغیرهای ساختِ مشخص‌شده در یک \fBdict\fR بازگردانده می‌شوند؛ در غیر این صورت (حالت پیش‌فرض، برای سازگاری با گذشته)، تنها مقادیر بازگردانده می‌شوند؛ اگر یک \fIvar\fR داده شده باشد به عنوان یک مقدار اسکالر، و اگر چند مورد باشد به عنوان یک لیست\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf cvars = env\&.Dictionary() cc_values = env\&.Dictionary(\*(AqCC\*(Aq, \*(AqCCFLAGS\*(Aq, \*(AqCCCOM\*(Aq) .fi .if n \{\ .RE .\} .sp .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBنکته\fR .ps -1 .br شیء بازگردانده‌شده توسط \fBenv\&.Dictionary\fR باید به عنوان یک نمای فقط‌خواندنی به متغیرهای ساخت در نظر گرفته شود\&. برخی از متغیرهای ساخت نیازمند رسیدگی داخلی ویژه‌ای هستند، و تغییر آن‌ها از طریق شیء \fBenv\&.Dictionary\fR می‌تواند آن سازوکار را دور زده و باعث ناهماهنگی در داده‌ها شود\&. کاربرد اصلی \fBenv\&.Dictionary\fR برای مقاصد عیب‌یابی است \- این متد به طور گسترده در آزمون‌ها دقیقاً به این دلیل استفاده می‌شود که رسیدگی ویژه را دور می‌زند تا رفتار سامانه قابل راستی‌آزمایی باشد\&. .sp .5v .RE \fIتغییریافته در 4\&.9\&.0\fR: \fIas_dict\fR اضافه شد\&. .RE .PP \fBDir\fR(\fIname, [directory]\fR), \fIenv\fR\&.Dir(\fIname, [directory]\fR) .RS 4 یک یا چند گره دایرکتوری (Directory Node) را برمی‌گرداند\&. گره دایرکتوری شیئی است که یک دایرکتوری را نمایش می‌دهد\&. \fIname\fR می‌تواند یک مسیر نسبی یا مطلق، یا فهرستی از این مسیرها باشد\&. \fIdirectory\fR یک دایرکتوری اختیاری است که به عنوان دایرکتوری والد استفاده خواهد شد\&. اگر هیچ \fIdirectory\fR مشخص نشده باشد، دایرکتوری اسکریپت جاری به عنوان والد استفاده می‌شود\&. .sp اگر \fIname\fR یک مسیر منفرد باشد، گره متناظر بازگردانده می‌شود\&. اگر \fIname\fR یک فهرست باشد، SCons فهرستی از گره‌ها را بازمی‌گرداند\&. متغیرهای ساخت در \fIname\fR بسط داده می‌شوند\&. .sp گره‌های دایرکتوری را می‌توان در هر جایی که یک رشته به عنوان نام دایرکتوری به یک متد سازنده (Builder) یا تابع تحویل داده می‌شود، استفاده کرد\&. گره‌های دایرکتوری دارای مشخصه‌ها و متدهایی هستند که در موقعیت‌های بسیاری کاربردی‌اند؛ برای اطلاعات بیشتر بخش "Filesystem Nodes" در صفحهٔ راهنما را ببینید\&. .RE .PP \fIenv\fR\&.Dump(\fI[var, \&.\&.\&.], [format=TYPE]\fR) .RS 4 متغیرهای ساخت را از \fIenv\fR به یک رشته سریال‌سازی می‌کند\&. اگر \fIvar\fR حذف شود (مشخص نشود)، تمام متغیرهای ساخت سریال‌سازی می‌شوند\&. اگر یک یا چند مقدار \fIvar\fR مشخص شود، تنها آن متغیرها و مقادیرشان سریال‌سازی خواهند شد\&. .sp رشتهٔ اختیاری \fIformat\fR قالب سریال‌سازی را تعیین می‌کند: .PP pretty .RS 4 یک نمایش با فرمت‌بندی خوانا (pretty\-printed) از متغیرهای ساخت برمی‌گرداند \- خروجی شبیه به یک \fBdict\fR در Python خواهد بود (این حالت پیش‌فرض است)\&. .RE .PP json .RS 4 نمایشی با ساختار JSON از متغیرها بازمی‌گرداند\&. متغیرها به عنوان یک شیء لفظی JSON ارائه می‌شوند که معادل JSON یک \fBdict\fR در Python است\&. .RE .sp \fIتغییر یافته در 4\&.9\&.0\fR: بیش از یک \fIkey\fR می‌تواند مشخص شود\&. رشتهٔ بازگردانده‌شده همواره مانند یک \fBdict\fR (یا معادل آن در سایر قالب‌ها) خواهد بود؛ پیش از این، یک کلید تکی فقط مقدار را سریال‌سازی می‌کرد، نه کلید را به همراه مقدار\&. .sp مثال‌ها: این SConstruct .sp .if n \{\ .RS 4 .\} .nf env = Environment() print(env\&.Dump(\*(AqCCCOM\*(Aq)) print(env\&.Dump(\*(AqCC\*(Aq, \*(AqCCFLAGS\*(Aq, format=\*(Aqjson\*(Aq)) .fi .if n \{\ .RE .\} .sp چیزی شبیه به این چاپ خواهد کرد: .sp .if n \{\ .RS 4 .\} .nf {\*(AqCCCOM\*(Aq: \*(Aq$CC \-o $TARGET \-c $CFLAGS $CCFLAGS $_CCCOMCOM $SOURCES\*(Aq} { "CC": "gcc", "CCFLAGS": [] } .fi .if n \{\ .RE .\} .sp در حالی که این SConstruct: .sp .if n \{\ .RS 4 .\} .nf env = Environment() print(env\&.Dump()) .fi .if n \{\ .RE .\} .sp چیزی شبیه به این چاپ خواهد کرد: .sp .if n \{\ .RS 4 .\} .nf { \*(AqAR\*(Aq: \*(Aqar\*(Aq, \*(AqARCOM\*(Aq: \*(Aq$AR $ARFLAGS $TARGET $SOURCES\en$RANLIB $RANLIBFLAGS $TARGET\*(Aq, \*(AqARFLAGS\*(Aq: [\*(Aqr\*(Aq], \*(AqAS\*(Aq: \*(Aqas\*(Aq, \*(AqASCOM\*(Aq: \*(Aq$AS $ASFLAGS \-o $TARGET $SOURCES\*(Aq, \*(AqASFLAGS\*(Aq: [], \&.\&.\&. .fi .if n \{\ .RE .\} .RE .PP \fBEnsurePythonVersion\fR(\fImajor, minor\fR) .RS 4 اطمینان حاصل می‌کند که نسخهٔ Python حداقل \fImajor\fR\&.\fIminor\fR باشد\&. این تابع در صورتی که نسخهٔ واقعی Python به اندازه کافی بالا نباشد، یک پیام خطا چاپ کرده و با یک کد خروج غیرصفر از SCons خارج می‌شود\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf EnsurePythonVersion(2,2) .fi .if n \{\ .RE .\} .RE .PP \fBEnsureSConsVersion\fR(\fImajor, minor, [revision]\fR) .RS 4 اطمینان حاصل می‌کند که نسخهٔ SCons حداقل \fImajor\&.minor\fR، یا در صورت مشخص شدن \fIrevision\fR، حداقل برابر با \fImajor\&.minor\&.revision\fR باشد\&. این تابع در صورتی که نسخهٔ فعلی SCons به اندازه کافی جدید نباشد، پیام خطایی را چاپ کرده و SCons را با یک کد خروج غیرصفر خاتمه می‌دهد\&. .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf EnsureSConsVersion(0,14) EnsureSConsVersion(0,96,90) .fi .if n \{\ .RE .\} .RE .PP \fBEnvironment\fR(\fI[key=value, \&.\&.\&.]\fR), \fIenv\fR\&.Environment(\fI[key=value, \&.\&.\&.]\fR) .RS 4 یک محیط ساخت جدید مقداردهی‌شده با جفت‌های مشخص‌شدهٔ \fIkey\fR=\fIvalue\fR را برمی‌گرداند\&. آرگومان‌های کلیدواژه‌ای \fIparse_flags\fR، \fIplatform\fR، \fItoolpath\fR، \fItools\fR و \fIvariables\fR به‌طور ویژه شناخته می‌شوند و منجر به ایجاد متغیر ساخت نمی‌شوند\&. برای جزئیات بیشتر به بخش «Construction Environments» در صفحهٔ راهنما مراجعه کنید\&. .RE .PP \fBExecute\fR(\fIaction, [actionargs \&.\&.\&.]\fR), \fIenv\fR\&.Execute(\fIaction, [actionargs \&.\&.\&.]\fR) .RS 4 یک Action را اجرا می‌کند\&. \fIaction\fR می‌تواند یک شیء Action یا یک رشتهٔ خط فرمان، فهرستی از دستورها، یا یک تابع اجرایی Python باشد که هر کدام ابتدا به یک شیء Action تبدیل شده و سپس اجرا می‌شوند\&. هرگونه آرگومان اضافی برای \fBExecute\fR به تابع کارخانه‌ای \fBAction\fR که در عمل شیء Action را ایجاد می‌کند تحویل داده می‌شود (برای توضیحات، به بخش Action Objects در صفحهٔ راهنما مراجعه کنید)\&. مثال: .sp .if n \{\ .RS 4 .\} .nf Execute(Copy(\*(Aqfile\&.out\*(Aq, \*(Aqfile\&.in\*(Aq)) .fi .if n \{\ .RE .\} .sp دستور \fBExecute\fR کنش خود را فوراً، به عنوان بخشی از مرحلهٔ خواندن SConscript انجام می‌دهد\&. در فراخوانی \fBExecute\fR هیچ منبع یا هدفی اعلان نمی‌شود، بنابراین هر شیئی که توسط آن دستکاری شود، به عنوان بخشی از گراف وابستگی SCons ردیابی نخواهد شد\&. در مثال بالا، نه file\&.out و نه file\&.in اشیاء ردیابی‌شده نخواهند بود\&. .sp \fBExecute\fR مقدار خروج دستور یا مقدار بازگشتی تابع Python را برمی‌گرداند\&. اگر \fIaction\fR اجراشده ناموفق باشد (با یک مقدار غیرصفر خارج شود یا مقداری غیرصفر برگرداند)، \fBscons\fR پیام خطایی چاپ می‌کند، با این وجود ساخت را برای چنین شکستی به‌طور خودکار متوقف \fIنمی‌کند\fR\&. اگر می‌خواهید فرآیند ساخت در واکنش به شکست فراخوانی \fBExecute\fR متوقف شود، باید صراحتاً مقدار بازگشتی غیرصفر را بررسی کنید: .sp .if n \{\ .RS 4 .\} .nf if Execute("mkdir sub/dir/ectory"): # The mkdir failed, don\*(Aqt try to build\&. Exit(1) .fi .if n \{\ .RE .\} .RE .PP \fBExit\fR(\fI[value]\fR) .RS 4 این تابع به \fBscons\fR می‌گوید که بلافاصله با \fIvalue\fR مشخص‌شده خارج شود\&. در صورتی که هیچ مقداری مشخص نشده باشد، مقدار خروج پیش‌فرض 0 (صفر) به کار می‌رود\&. .RE .PP \fBExport\fR(\fI[vars\&.\&.\&.], [key=value\&.\&.\&.]\fR), \fIenv\fR\&.Export(\fI[vars\&.\&.\&.], [key=value\&.\&.\&.]\fR) .RS 4 متغیرها را جهت هم‌رسانی با سایر فایل‌های SConscript صادر می‌کند\&. متغیرها به یک مجموعهٔ سراسری اضافه می‌شوند که می‌توانند توسط سایر فایل‌های SConscript وارد (import) شوند\&. \fIvars\fR می‌تواند یک یا چند رشته، یا فهرستی از رشته‌ها باشد\&. اگر هر رشته شامل فاصلهٔ خالی باشد، به‌طور خودکار به رشته‌های جداگانه تقسیم می‌شود\&. هر رشته باید با نام متغیری که هنگام ارزیابی فایل SConscript فعلی در دامنه (scope) قرار دارد مطابقت داشته باشد، در غیر این صورت یک استثنا ایجاد می‌شود\&. .sp یک آرگومان \fIvars\fR همچنین می‌تواند یک دیکشنری یا آرگومان‌های کلیدواژه‌ای جداگانه باشد؛ طبق قواعد نحوی Python، آرگومان‌های کلیدواژه‌ای باید پس از هرگونه آرگومان غیرکلیدواژه‌ای بیایند\&. شکل دیکشنری/کلیدواژه‌ای را می‌توان برای نگاشت نام محلی یک متغیر به نامی متفاوت جهت استفاده برای وارد کردن‌ها به کار برد\&. برای نمایشی از این نحو، مثال‌ها را ببینید\&. .sp فراخوانی‌های \fBExport\fR تجمعی هستند\&. مشخص کردن متغیری که پیش‌تر صادر شده است، مقدار قبلی آن را در مجموعه جایگزین خواهد کرد\&. هم متغیرهای محلی و هم متغیرهای سراسری را می‌توان صادر کرد\&. .sp برای استفاده از یک متغیر صادرشده، یک SConscript باید \fBImport\fR را فراخوانی کند تا آن را به دامنهٔ خود وارد کند\&. وارد کردن، یک ارجاع اضافی به شیئی ایجاد می‌کند که در ابتدا صادر شده بود؛ بنابراین اگر آن شیء تغییرپذیر (mutable) باشد، تغییرات اعمال‌شده برای سایر استفاده‌کنندگان آن شیء نمایان خواهد بود\&. .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf env = Environment() # Make env available for all SConscript files to Import()\&. Export("env") package = \*(Aqmy_name\*(Aq # Make env and package available for all SConscript files:\&. Export("env", "package") # Make env and package available for all SConscript files: Export(["env", "package"]) # Make env available using the name debug: Export(debug=env) # Make env available using the name debug: Export({"debug": env}) .fi .if n \{\ .RE .\} .sp توجه داشته باشید که تابع \fBSConscript\fR همچنین از آرگومان \fIexports\fR پشتیبانی می‌کند که امکان صادر کردن یک یا چند متغیر را (تنها) به فایل‌های SConscript فراخوانی‌شده توسط آن فراخوانی فراهم می‌کند\&. برای جزئیات بیشتر به توضیحات آن تابع مراجعه کنید\&. .RE .PP \fBFile\fR(\fIname, [directory]\fR), \fIenv\fR\&.File(\fIname, [directory]\fR) .RS 4 گره(های) فایل (File Node) را برمی‌گرداند\&. یک File Node شیئی است که نمایانگر یک فایل است\&. \fIname\fR می‌تواند یک مسیر نسبی یا مطلق یا فهرستی از چنین مسیرهایی باشد\&. \fIdirectory\fR یک دایرکتوری اختیاری است که به عنوان دایرکتوری والد استفاده خواهد شد\&. اگر هیچ \fIdirectory\fR مشخص نشده باشد، دایرکتوری اسکریپت جاری به عنوان والد استفاده می‌شود\&. .sp اگر \fIname\fR یک نام مسیر تکی باشد، گره متناظر بازگردانده می‌شود\&. اگر \fIname\fR یک فهرست باشد، SCons فهرستی از گره‌ها را بازمی‌گرداند\&. متغیرهای ساخت (Construction variables) در \fIname\fR بسط داده می‌شوند\&. .sp از File Nodeها می‌توان در هر جایی که یک رشته به عنوان نام فایل به یک متد یا تابع Builder داده می‌شود استفاده کرد\&. File Nodeها ویژگی‌ها و متدهایی دارند که در بسیاری از شرایط مفید هستند؛ برای اطلاعات بیشتر بخش "Filesystem Nodes" در این صفحهٔ راهنما را ببینید\&. .RE .PP \fBFindFile\fR(\fIfile, dirs\fR), \fIenv\fR\&.FindFile(\fIfile, dirs\fR) .RS 4 جستجو برای \fIfile\fR در مسیر مشخص‌شده توسط \fIdirs\fR\&. \fIdirs\fR می‌تواند فهرستی از نام‌های دایرکتوری یا یک نام دایرکتوری منفرد باشد\&. علاوه بر جستجوی فایل‌هایی که در فایل‌سیستم وجود دارند، این تابع برای فایل‌های مشتق‌شده‌ای که هنوز ساخته نشده‌اند نیز جستجو می‌کند\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf # Searches for \*(Aqfoo\*(Aq in \*(Aqdir1\*(Aq and \*(Aqdir2\*(Aq, returning the node if found foo = env\&.FindFile(\*(Aqfoo\*(Aq, [\*(Aqdir1\*(Aq, \*(Aqdir2\*(Aq]) .fi .if n \{\ .RE .\} .RE .PP \fBFindInstalledFiles\fR(), \fIenv\fR\&.FindInstalledFiles() .RS 4 فهرست اهداف برپاشده توسط سازنده‌های (Builder) \fBInstall\fR و \fBInstallAs\fR را برمی‌گرداند\&. این تابع به عنوان روشی مناسب برای انتخاب محتویات یک بستهٔ باینری عمل می‌کند\&. این فهرست هم‌گام با اجرای \fBInstall\fR و \fBInstallAs\fR پر می‌شود \- یعنی مقدار بازگشتی، فراخوانی‌های Builder را که تا آن لحظه دیده شده‌اند منعکس می‌کند، نه فراخوانی‌هایی که ممکن است بعداً رخ دهند\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf Install(\*(Aq/bin\*(Aq, [\*(Aqexecutable_a\*(Aq, \*(Aqexecutable_b\*(Aq]) # Returns the file node list # [\*(Aq/bin/executable_a\*(Aq, \*(Aq/bin/executable_b\*(Aq] FindInstalledFiles() Install(\*(Aq/lib\*(Aq, [\*(Aqsome_library\*(Aq]) # Returns the file node list # [\*(Aq/bin/executable_a\*(Aq, \*(Aq/bin/executable_b\*(Aq, \*(Aq/lib/some_library\*(Aq] FindInstalledFiles() .fi .if n \{\ .RE .\} .RE .PP \fBFindPathDirs\fR(\fIvariable\fR) .RS 4 یک شیء قابل فراخوانی را جهت استفاده به عنوان \fIpath_function\fR یک شیء Scanner برمی‌گرداند\&. هنگام فراخوانی، \fIvariable\fR مشخص‌شده را در محیط ساخت (construction environment) جستجو کرده و با مقدار آن مانند فهرستی از مسیرهای دایرکتوری برای جستجو رفتار می‌کند (مانند \fB$CPPPATH\fR یا \fB$LIBPATH\fR)\&. .sp استفاده از \fBFindPathDirs\fR عموماً نسبت به نوشتن \fIpath_function\fR شخصی ترجیح داده می‌شود، زیرا موارد معمول پویش در SCons را به درستی و به طور کارآمد مدیریت می‌کند: (۱) هنگامی که از یک دایرکتوری متغیر (variant directory) استفاده می‌شود تمام دایرکتوری‌های مناسب را از درخت‌های منبع، و هنگامی که \fBRepository\fR یا گزینهٔ \fB\-Y/\-\-repository\fR فعال است از مخازن برمی‌گرداند\&. (۲) تشخیص می‌دهد چه زمانی مقادیر مختلف \fIvariable\fR به فهرست دایرکتوری یکسانی منتهی می‌شوند و به جای پویش مجدد همان دایرکتوری‌ها، از آن نتیجه دوباره استفاده می‌کند که از انجام کارهای تکراری جلوگیری می‌نماید\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf def my_scan(node, env, path, arg): # Code to scan file contents goes here\&.\&.\&. return include_files scanner = Scanner( name=\*(Aqmyscanner\*(Aq, function=my_scan, path_function=FindPathDirs(\*(AqMYPATH\*(Aq) ) .fi .if n \{\ .RE .\} .RE .PP \fBFindSourceFiles\fR(\fI[node]\fR), \fIenv\fR\&.FindSourceFiles(\fI[node]\fR) .RS 4 فهرست گره‌هایی را که نمایانگر منابع فایل‌های ساخته‌شده هستند برمی‌گرداند\&. این کار با بازرسی بازگشتی درخت وابستگی با شروع از آرگومان اختیاری \fInode\fR (که مقدار پیش‌فرض آن دایرکتوری جاری ("\&.") است) انجام می‌شود\&. این تابع تمام گره‌های برگ (فایل‌های بدون وابستگی بیشتر) را از درخت برمی‌گرداند\&. این تابع به عنوان روشی مناسب برای انتخاب محتویات یک بستهٔ سورس عمل می‌کند\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf Program(\*(Aqsrc/main_a\&.c\*(Aq) Program(\*(Aqsrc/main_b\&.c\*(Aq) Program(\*(Aqmain_c\&.c\*(Aq) # returns [\*(Aqmain_c\&.c\*(Aq, \*(Aqsrc/main_a\&.c\*(Aq, \*(AqSConstruct\*(Aq, \*(Aqsrc/main_b\&.c\*(Aq] FindSourceFiles() # returns [\*(Aqsrc/main_b\&.c\*(Aq, \*(Aqsrc/main_a\&.c\*(Aq ] FindSourceFiles(\*(Aqsrc\*(Aq) .fi .if n \{\ .RE .\} .sp توجه داشته باشید که فایل‌های پشتیبان ساخت موجود در درخت (مانند SConstruct در مثال بالا) نیز بازگردانده می‌شوند\&. .RE .PP \fBFlatten\fR(\fIsequence\fR), \fIenv\fR\&.Flatten(\fIsequence\fR) .RS 4 یک توالی (یعنی یک list یا tuple در Python) را که ممکن است شامل توالی‌های تودرتو باشد دریافت کرده و یک لیست مسطح (flattened) حاوی تمام عناصر منفرد در هر توالی برمی‌گرداند\&. این تابع می‌تواند برای جمع‌آوری لیست‌های بازگردانده‌شده توسط فراخوانی‌های سازنده‌ها (Builders) مفید باشد؛ سایر Builderها به طور خودکار لیست‌های مشخص‌شده به عنوان ورودی را مسطح می‌کنند، اما دستکاری مستقیم این لیست‌ها در Python چنین کاری انجام نمی‌دهد\&. .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf foo = Object(\*(Aqfoo\&.c\*(Aq) bar = Object(\*(Aqbar\&.c\*(Aq) # از آنجا که `foo\*(Aq و `bar\*(Aq لیست‌های بازگردانده‌شده توسط سازنده ()Object هستند، # `objects\*(Aq لیستی شامل لیست‌های تودرتو خواهد بود: objects = [\*(Aqf1\&.o\*(Aq, foo, \*(Aqf2\&.o\*(Aq, bar, \*(Aqf3\&.o\*(Aq] # ارسال چنین لیستی به سازنده‌ای دیگر مشکلی ندارد زیرا # سازنده لیست را به طور خودکار مسطح می‌کند: Program(source = objects) # اگر نیاز دارید لیست را مستقیماً با استفاده از Python دستکاری کنید، باید # خودتان ()Flatten را فراخوانی کنید، یا به شکل دیگری لیست‌های تودرتو را مدیریت نمایید: for object in Flatten(objects): print(str(object)) .fi .if n \{\ .RE .\} .RE .PP \fBGetBuildFailures\fR() .RS 4 لیستی از استثناها (exceptions) را برای اقداماتی که در حین تلاش برای ساخت هدف‌ها شکست خورده‌اند، برمی‌گرداند\&. هر عنصر در لیست بازگردانده‌شده یک شیء BuildError با ویژگی‌های زیر است که جنبه‌های مختلف شکست ساخت را ثبت می‌کنند: .sp \&.node گره‌ای که هنگام رخ دادن شکست ساخت، در حال ساخته شدن بود\&. .sp \&.status وضعیت خروج عددی بازگردانده‌شده توسط دستور یا تابع Python که هنگام تلاش برای ساخت Node مشخص‌شده شکست خورد\&. .sp \&.errstr رشته خطای SCons که شکست ساخت را توصیف می‌کند\&. (این اغلب یک پیام عمومی مانند "Error 2" است تا نشان دهد دستور اجرا شده با وضعیت ۲ خارج شده است\&.) .sp \&.filename نام فایل یا دایرکتوری که در واقع باعث بروز شکست شده است\&. این مقدار ممکن است با ویژگی \&.node متفاوت باشد\&. به عنوان مثال، اگر تلاشی برای ساخت هدفی به نام sub/dir/target شکست بخورد زیرا دایرکتوری sub/dir نتوانست ایجاد شود، در این صورت ویژگی \&.node برابر sub/dir/target خواهد بود اما ویژگی \&.filename برابر sub/dir خواهد بود\&. .sp \&.executor شیء Executor در SCons برای Node هدفی که در حال ساخته شدن بود\&. این می‌تواند برای بازیابی محیط ساخت مورد استفاده برای اقدام شکست‌خورده به کار رود\&. .sp \&.action شیء واقعی Action در SCons که شکست خورده است\&. این شیء یک اقدام مشخص از میان فهرست اقدامات ممکنی خواهد بود که قرار بود برای ساخت هدف اجرا شوند\&. .sp \&.command دستور گسترش‌یافته واقعی که اجرا شد و شکست خورد، پس از بسط متغیرهای ساخت \fB$TARGET\fR، \fB$SOURCE\fR و سایر متغیرهای ساخت\&. .sp توجه داشته باشید که تابع \fBGetBuildFailures\fR همواره تا زمانی که هیچ شکست ساختی رخ نداده باشد یک لیست خالی برمی‌گرداند، به این معنی که \fBGetBuildFailures\fR در حین خوانده شدن فایل‌های SConscript همیشه یک لیست خالی برمی‌گرداند\&. کاربرد اصلی در نظر گرفته‌شده برای آن در توابعی است که با ارسال به تابع استاندارد \fBatexit\&.register\fR در Python، پیش از خروج SCons اجرا خواهند شد\&. مثال: .sp .if n \{\ .RS 4 .\} .nf import atexit def print_build_failures(): from SCons\&.Script import GetBuildFailures for bf in GetBuildFailures(): print("%s failed: %s" % (bf\&.node, bf\&.errstr)) atexit\&.register(print_build_failures) .fi .if n \{\ .RE .\} .RE .PP \fBGetBuildPath\fR(\fIfile, [\&.\&.\&.]\fR), \fIenv\fR\&.GetBuildPath(\fIfile, [\&.\&.\&.]\fR) .RS 4 نام (یا نام‌های) مسیر \fBscons\fR را برای \fIfile\fR (یا فایل‌های) مشخص‌شده بازمی‌گرداند\&. \fIfile\fR یا فایل‌های مشخص‌شده می‌توانند Nodeهای \fBscons\fR یا رشته‌های نشان‌دهنده نام‌های مسیر باشند\&. .RE .PP \fBGetLaunchDir\fR() .RS 4 نام مسیر مطلق دایرکتوری را که \fBscons\fR در ابتدا از آن فراخوانی شده بود، بازمی‌گرداند\&. این می‌تواند هنگام استفاده از گزینه‌های \fB\-u\fR، \fB\-U\fR یا \fB\-D\fR مفید باشد، که در داخل به دایرکتوری حاوی فایل SConstruct تغییر مکان می‌دهند\&. .RE .PP \fBGetOption\fR(\fIname\fR), \fIenv\fR\&.GetOption(\fIname\fR) .RS 4 مقدار گزینه قابل تنظیم \fIname\fR را استعلام می‌کند، که ممکن است در خط فرمان، از طریق پیش‌فرض‌های گزینه‌ها، یا با استفاده از تابع \fBSetOption\fR تنظیم شده باشد\&. جدول، آرگومان‌های خط فرمان متناظری را که می‌توانند روی این مقدار تأثیر بگذارند نشان می‌دهد\&. گزینه‌ها با استفاده از نوع مشخص‌شده ذخیره می‌شوند\&. \fIname\fR همچنین می‌تواند نام متغیر مقصد حاصل از یک گزینه مختص به پروژه باشد که با تابع \fBAddOption\fR اضافه شده است، مشروط بر اینکه این افزودن پیش از فراخوانی \fBGetOption\fR در فایل‌های SConscript پردازش شده باشد\&. .TS allbox tab(:); lB lB lB. T{ نام استعلام T}:T{ آرگومان خط فرمان T}:T{ یادداشت‌ها T} .T& l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l. T{ \fIcache_debug\fR T}:T{ \fB\-\-cache\-debug\fR T}:T{ رشته (نام فایل) T} T{ \fIcache_disable\fR T}:T{ \fB\-\-cache\-disable\fR, \fB\-\-no\-cache\fR T}:T{ بولی T} T{ \fIcache_force\fR T}:T{ \fB\-\-cache\-force\fR, \fB\-\-cache\-populate\fR T}:T{ بولی T} T{ \fIcache_readonly\fR T}:T{ \fB\-\-cache\-readonly\fR T}:T{ بولی T} T{ \fIcache_show\fR T}:T{ \fB\-\-cache\-show\fR T}:T{ بولی T} T{ \fIclean\fR T}:T{ \fB\-c\fR, \fB\-\-clean\fR, \fB\-\-remove\fR T}:T{ بولی T} T{ \fIclimb_up\fR T}:T{ \fB\-D\fR, \fB\-U\fR, \fB\-u\fR, \fB\-\-up\fR, \fB\-\-search_up\fR T}:T{ عدد صحیح\&. 1 یعنی \fB\-u\fR داده شده است، 2 یعنی \fB\-D\fR، 3 یعنی \fB\-U\fR است\&. T} T{ \fIconfig\fR T}:T{ \fB\-\-config\fR T}:T{ رشته T} T{ \fIdebug\fR T}:T{ \fB\-\-debug\fR T}:T{ لیست T} T{ \fIdirectory\fR T}:T{ \fB\-C\fR, \fB\-\-directory\fR T}:T{ لیست (مسیرها) T} T{ \fIdiskcheck\fR T}:T{ \fB\-\-diskcheck\fR T}:T{ لیست T} T{ \fIduplicate\fR T}:T{ \fB\-\-duplicate\fR T}:T{ رشته T} T{ \fIenable_virtualenv\fR T}:T{ \fB\-\-enable\-virtualenv\fR T}:T{ بولی T} T{ \fIexperimental\fR T}:T{ \fB\-\-experimental\fR T}:T{ مجموعه\&. \fIاز نسخه 4\&.2\fR\&. T} T{ \fIfile\fR T}:T{ \fB\-f\fR, \fB\-\-file\fR, \fB\-\-makefile\fR, \fB\-\-sconstruct\fR T}:T{ لیست (نام فایل‌ها) T} T{ \fIhash_chunksize\fR T}:T{ \fB\-\-hash\-chunksize\fR T}:T{ عدد صحیح\&. جایگزین \fBmd5_chunksize\fR شده است\&. \fIاز نسخه 4\&.2\fR T} T{ \fIhash_format\fR T}:T{ \fB\-\-hash\-format\fR T}:T{ رشته\&. \fIاز نسخه 4\&.2\fR T} T{ \fIhelp\fR T}:T{ \fB\-h\fR, \fB\-\-help\fR T}:T{ بولی T} T{ \fIignore_errors\fR T}:T{ \fB\-i\fR, \fB\-\-ignore\-errors\fR T}:T{ بولی T} T{ \fIignore_virtualenv\fR T}:T{ \fB\-\-ignore\-virtualenv\fR T}:T{ بولی T} T{ \fIimplicit_cache\fR T}:T{ \fB\-\-implicit\-cache\fR T}:T{ بولی T} T{ \fIimplicit_deps_changed\fR T}:T{ \fB\-\-implicit\-deps\-changed\fR T}:T{ بولی T} T{ \fIimplicit_deps_unchanged\fR T}:T{ \fB\-\-implicit\-deps\-unchanged\fR T}:T{ بولی T} T{ \fIinclude_dir\fR T}:T{ \fB\-I\fR, \fB\-\-include\-dir\fR T}:T{ لیست (مسیرها) T} T{ \fIinstall_sandbox\fR T}:T{ \fB\-\-install\-sandbox\fR T}:T{ رشته (نام فایل)\&. تنها در صورتی در دسترس است که ابزار install فراخوانی شده باشد T} T{ \fIkeep_going\fR T}:T{ \fB\-k\fR, \fB\-\-keep\-going\fR T}:T{ بولی T} T{ \fImax_drift\fR T}:T{ \fB\-\-max\-drift\fR T}:T{ عدد صحیح T} T{ \fImd5_chunksize\fR T}:T{ \fB\-\-hash\-chunksize\fR T}:T{ عدد صحیح\&. با \fBhash_chunksize\fR جایگزین شده است\&. \fIاز نسخه 4\&.2 منسوخ شده است\fR T} T{ \fIno_exec\fR T}:T{ \fB\-n\fR, \fB\-\-no\-exec\fR, \fB\-\-just\-print\fR, \fB\-\-dry\-run\fR, \fB\-\-recon\fR T}:T{ بولی T} T{ \fIno_progress\fR T}:T{ \fB\-Q\fR T}:T{ بولی T} T{ \fInum_jobs\fR T}:T{ \fB\-j\fR, \fB\-\-jobs\fR T}:T{ عدد صحیح T} T{ \fIpackage_type\fR T}:T{ \fB\-\-package\-type\fR T}:T{ رشته\&. تنها در صورتی در دسترس است که ابزار packaging فراخوانی شده باشد T} T{ \fIprofile_file\fR T}:T{ \fB\-\-profile\fR T}:T{ رشته (نام فایل) T} T{ \fIquestion\fR T}:T{ \fB\-q\fR, \fB\-\-question\fR T}:T{ بولی T} T{ \fIrandom\fR T}:T{ \fB\-\-random\fR T}:T{ بولی T} T{ \fIrepository\fR T}:T{ \fB\-Y\fR, \fB\-\-repository\fR, \fB\-\-srcdir\fR T}:T{ لیست (مسیرها) T} T{ \fIsilent\fR T}:T{ \fB\-s\fR, \fB\-\-silent\fR, \fB\-\-quiet\fR T}:T{ بولی T} T{ \fIsite_dir\fR T}:T{ \fB\-\-site\-dir\fR, \fB\-\-no\-site\-dir\fR T}:T{ رشته (مسیر)، False یا None T} T{ \fIstack_size\fR T}:T{ \fB\-\-stack\-size\fR T}:T{ عدد صحیح T} T{ \fItaskmastertrace_file\fR T}:T{ \fB\-\-taskmastertrace\fR T}:T{ رشته (نام فایل) T} T{ \fItree_printers\fR T}:T{ \fB\-\-tree\fR T}:T{ لیست T} T{ \fIwarn\fR T}:T{ \fB\-\-warn\fR, \fB\-\-warning\fR T}:T{ لیست T} .TE .sp 1 .RE .PP \fBGetSConsVersion\fR() .RS 4 نسخهٔ کنونی SCons را در قالب یک Tuple[int, int, int] برمی‌گرداند که به ترتیب نمایانگر مقادیر major، minor، و revision هستند\&. \fIدر نسخهٔ 4\&.8\&.0 افزوده شد\fR\&. .RE .PP \fBGlob\fR(\fIpattern, [ondisk=True, source=False, strings=False, exclude=None]\fR), \fIenv\fR\&.Glob(\fIpattern, [ondisk=True, source=False, strings=False, exclude=None]\fR) .RS 4 فهرستی (که احتمالاً خالی است) از Nodeها (یا رشته‌ها) را برمی‌گرداند که با الگوی مسیر \fIpattern\fR مطابقت دارند\&. \fIpattern\fR می‌تواند مطلق، نسبت به ریشهٔ پروژه (top\-relative)، یا (معمولاً) نسبت به دایرکتوری فایل SConscript جاری باشد\&. \fBGlob\fR هم فایل‌های ذخیره‌شده روی دیسک و هم Nodeهایی را که SCons از قبل دربارهٔ آن‌ها می‌داند، تطبیق می‌دهد؛ حتی اگر فایل متناظر در حال حاضر روی دیسک ذخیره نشده باشد\&. شکل متد محیطی (\fBenv\&.Glob\fR) جایگزینی رشته‌ای را روی \fIpattern\fR انجام می‌دهد و هر آنچه را که با الگوی بسط‌یافتهٔ حاصل مطابقت داشته باشد برمی‌گرداند\&. نتایج برخلاف تابع مشابه glob\&.glob در Python مرتب‌سازی می‌شوند تا پایداری ترتیب ساخت تضمین شود\&. .sp \fIpattern\fR می‌تواند شامل نویسه‌های عام شل با سبک POSIX برای تطابق باشد: .TS allbox tab(:); lB lB. T{ الگو T}:T{ مفهوم T} .T& l l l l l l l l. T{ * T}:T{ با همه‌چیز مطابقت می‌یابد T} T{ ? T}:T{ با هر نویسهٔ تکی مطابقت می‌یابد T} T{ [seq] T}:T{ با هر نویسه‌ای در \fIseq\fR مطابقت می‌یابد (می‌تواند یک فهرست یا یک بازه باشد)\&. T} T{ [!seq] T}:T{ با هر نویسه‌ای خارج از \fIseq\fR مطابقت می‌یابد T} .TE .sp 1 برای یک تطابق دقیق، نویسهٔ عام را در قلاب قرار دهید تا از رفتار عادی آن صرف‌نظر شود\&. برای مثال، \*(Aq[?]\*(Aq با نویسهٔ \*(Aq?\*(Aq مطابقت می‌یابد\&. .sp با نام‌های فایلی که با نقطه شروع می‌شوند به‌طور خاص رفتار می‌شود \- آن‌ها فقط با الگوهایی مطابقت می‌یابند که با یک نقطه آغاز شوند (یا بلافاصله پس از یک نویسهٔ جداکنندهٔ مسیر یا ممیز، یک نقطه داشته باشند)، و توسط نویسه‌های عام مطابقت داده نمی‌شوند\&. تطابق‌های نویسهٔ عام همچنین شامل جداکننده‌های دایرکتوری نمی‌شوند\&. .sp \fBGlob\fR مخازن (به تابع \fBRepository\fR مراجعه کنید) و دایرکتوری‌های منبع (به تابع \fBVariantDir\fR مراجعه کنید) را تشخیص می‌دهد و اگر یک Node منطبق در هر کجای مخزن یا دایرکتوری منبع متناظر پیدا شود، یک Node (یا در صورت پیکربندی، رشته) منطبق در دایرکتوری محلی (SConscript) برمی‌گرداند\&. .sp اگر آرگومان اختیاری \fIondisk\fR نادرست (false) ارزیابی شود، جستجو برای تطابق‌ها روی دیسک غیرفعال می‌شود و تنها تطابق‌های حاصل از Nodeهای File یا Dir که از قبل پیکربندی شده‌اند بازگردانده می‌شوند\&. مقدار پیش‌فرض این است که Nodeهای حاصل از تطابق روی دیسک نیز برگردانده شوند\&. .sp اگر آرگومان اختیاری \fIsource\fR درست (true) ارزیابی شود، و دایرکتوری محلی یک دایرکتوری مشتق (variant directory) باشد، آنگاه \fBGlob\fR به‌جای دایرکتوری محلی، Nodeها را از دایرکتوری منبع متناظر برمی‌گرداند\&. .sp اگر آرگومان اختیاری \fIstrings\fR درست (true) ارزیابی شود، \fBGlob\fR تطابق‌ها را به‌جای Nodeها در قالب رشته برمی‌گرداند\&. رشته‌های برگشتی نسبت به دایرکتوری محلی (SConscript) خواهند بود\&. (توجه داشته باشید که گرچه این امر ممکن است انجام دستکاری‌های دلخواه روی نام‌های فایل را آسان‌تر کند، زمینه‌ای را که SCons در Node نگه می‌داشت از بین می‌برد؛ بنابراین اگر رشته‌های برگشتی به یک فایل SConscript دیگر فرستاده شوند، هرگونه تبدیل Node در آنجا نسبت به دایرکتوری آن SConscript خواهد بود، نه نسبت به دایرکتوری SConscript اصلی\&.) .sp آرگومان اختیاری \fIexclude\fR می‌تواند روی یک الگو یا فهرستی از الگوها تنظیم شود که فایل‌ها یا دایرکتوری‌ها را برای حذف از فهرست تطابق شرح می‌دهند\&. عناصری که حداقل با یکی از الگوهای مشخص‌شده مطابقت داشته باشند حذف خواهند شد\&. این الگوها از همان ساختار نحوی \fIpattern\fR استفاده می‌کنند\&. .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf Program("foo", Glob("*\&.c")) Zip("/tmp/everything", Glob("\&.??*") + Glob("*")) sources = Glob("*\&.cpp", exclude=["os_*_specific_*\&.cpp"]) \e + Glob("os_%s_specific_*\&.cpp" % currentOS) .fi .if n \{\ .RE .\} .RE .PP \fBHelp\fR(\fItext, append=False, local_only=False\fR), \fIenv\fR\&.Help(\fItext, append=False, local_only=False\fR) .RS 4 متن \fItext\fR را به پیام راهنمایی که هنگام فراخوانی \fBscons\fR با آرگومان \fB\-h\fR یا \fB\-\-help\fR نمایش داده می‌شود، اضافه می‌کند\&. .sp در نخستین فراخوانی \fBHelp\fR، اگر \fIappend\fR برابر \fBFalse\fR (پیش‌فرض) باشد، هرگونه متن راهنمای موجود دور ریخته می‌شود\&. متن راهنمای پیش‌فرض شامل راهنمای خودِ دستور \fBscons\fR به‌علاوهٔ راهنماهای جمع‌آوری‌شده از فراخوانی‌های محلی پروژهٔ \fBAddOption\fR است\&. این همان راهنمایی است که اگر \fBHelp\fR هرگز فراخوانی نشده باشد، چاپ می‌شود\&. اگر \fIappend\fR برابر \fBTrue\fR باشد، \fItext\fR به متن راهنمای موجود الحاق می‌شود\&. اگر \fIlocal_only\fR نیز \fBTrue\fR باشد (پیش‌فرض \fBFalse\fR است)، راهنمای محلی پروژه از فراخوانی‌های \fBAddOption\fR در پیام راهنما حفظ می‌شود اما راهنمای دستور \fBscons\fR حذف خواهد شد\&. .sp فراخوانی‌های بعدی \fBHelp\fR آرگومان‌های کلیدواژه‌ای \fIappend\fR و \fIlocal_only\fR را نادیده می‌گیرند و همواره به متن راهنمای موجود اضافه می‌کنند\&. .sp \fIدر نسخهٔ 4\&.6\&.0 تغییر یافت\fR: \fIlocal_only\fR اضافه شد\&. .RE .PP \fBIgnore\fR(\fItarget, dependency\fR), \fIenv\fR\&.Ignore(\fItarget, dependency\fR) .RS 4 هنگام تصمیم‌گیری در مورد این‌که آیا \fItarget\fR نیاز به بازسازی دارد یا خیر، \fIdependency\fR را نادیده می‌گیرد\&. \fItarget\fR و \fIdependency\fR هر یک می‌توانند یک نام فایل منفرد یا Node، یا فهرستی از نام‌های فایل یا Nodeها باشند\&. .sp از \fBIgnore\fR همچنین می‌توان برای حذف یک هدف از ساخت پیش‌فرض استفاده کرد؛ با مشخص کردن دایرکتوری‌ای که هدف در آن ساخته می‌شود به‌عنوان \fItarget\fR و فایلی که می‌خواهید از انتخاب برای ساخت کنار گذاشته شود به‌عنوان \fIdependency\fR\&. توجه داشته باشید که این کار تنها هدف را از الگوریتم انتخاب هدف پیش‌فرض حذف می‌کند: اگر آن فایل وابستگی شیء دیگری باشد که در حال ساخت است، SCons همچنان آن را طبق روال معمول می‌سازد\&. مثال‌های سوم و چهارم در ادامه را ببینید\&. .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf env\&.Ignore(\*(Aqfoo\*(Aq, \*(Aqfoo\&.c\*(Aq) env\&.Ignore(\*(Aqbar\*(Aq, [\*(Aqbar1\&.h\*(Aq, \*(Aqbar2\&.h\*(Aq]) env\&.Ignore(\*(Aq\&.\*(Aq, \*(Aqfoobar\&.obj\*(Aq) env\&.Ignore(\*(Aqbar\*(Aq, \*(Aqbar/foobar\&.obj\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fBImport\fR(\fIvars\&.\&.\&.\fR), \fIenv\fR\&.Import(\fIvars\&.\&.\&.\fR) .RS 4 متغیرها را به حوزهٔ فایل SConscript جاری وارد می‌کند\&. \fIvars\fR باید رشته‌هایی بیانگر نام متغیرهایی باشند که پیش‌تر توسط تابع \fBExport\fR یا توسط آرگومان \fIexports\fR در تابع \fBSConscript\fR صادر شده‌اند\&. متغیرهای صادرشده توسط فراخوانی \fBSConscript\fR اولویت دارند\&. می‌توان چندین نام متغیر را به عنوان آرگومان‌های جداگانه، به صورت فهرستی از رشته‌ها، یا به صورت کلماتی در یک رشتهٔ جداشده با فاصله به \fBImport\fR ارسال کرد\&. نویسهٔ عام "*" می‌تواند برای وارد کردن تمامی متغیرهای موجود استفاده شود\&. .sp اگر متغیرِ واردشده تغییرپذیر باشد، تغییرات اعمال‌شده به صورت محلی در شیئی که متغیر به آن مقید شده است بازتاب خواهد یافت\&. این امر به فایل‌های SConscript فرعی اجازه می‌دهد تا به عنوان مثال در شکل‌دهی یک محیط ساخت مشارکت داشته باشند\&. .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf Import("env") Import("env", "variable") Import(["env", "variable"]) Import("*") .fi .if n \{\ .RE .\} .RE .PP \fBLiteral\fR(\fIstring\fR), \fIenv\fR\&.Literal(\fIstring\fR) .RS 4 رشتهٔ مشخص‌شده در \fIstring\fR به همان صورت اولیه حفظ خواهد شد و متغیرهای ساخت در آن بسط داده نمی‌شوند\&. .RE .PP \fBLocal\fR(\fItargets\fR), \fIenv\fR\&.Local(\fItargets\fR) .RS 4 از \fItargets\fR مشخص‌شده رونوشت‌هایی در درخت محلی تهیه خواهد شد، حتی اگر یک نسخهٔ از قبل به‌روز در یک مخزن وجود داشته باشد\&. فهرستی از Node یا Nodeهای هدف را بازمی‌گرداند\&. .RE .PP \fIenv\fR\&.MergeFlags(\fIarg, [unique]\fR) .RS 4 مقادیر را از \fIarg\fR در متغیرهای ساخت درون \fIenv\fR ادغام می‌کند\&. اگر \fIarg\fR یک دیکشنری باشد، هر جفت کلید\-مقدار نشان‌دهندهٔ نام یک متغیر ساخت و پرچم‌های متناظر برای ادغام است\&. اگر \fIarg\fR دیکشنری نباشد، \fBMergeFlags\fR تلاش می‌کند تا پیش از ادغام مقادیر، آن را به یک دیکشنری تبدیل کند\&. برای این منظور از \fBenv\&.ParseFlags\fR استفاده می‌شود، بنابراین مقادیری که قرار است تبدیل شوند مشمول همان محدودیت‌ها خواهند بود: \fBParseFlags\fR می‌داند که پرچم‌های خاصی باید به کدام متغیرهای ساخت اختصاص یابند، اما نه همهٔ آن‌ها؛ و این آگاهی تنها برای GCC و زنجیره‌های ابزار کامپایلر سازگار با آن است\&. \fIarg\fR باید یک شیء واحد باشد، بنابراین برای ارسال چندین رشته، آن‌ها را در یک فهرست قرار دهید\&. .sp اگر unique برابر با true (پیش‌فرض) باشد، مقادیر تکراری حفظ نمی‌شوند\&. در صورت وجود موارد تکراری، هر نام متغیر ساختی که به PATH ختم شود، چپ‌ترین مقدار را نگه می‌دارد تا ترتیب جستجوی مسیر تغییر نکند\&. همهٔ دیگر متغیرهای ساخت، راست‌ترین مقدار را نگه می‌دارند\&. اگر unique برابر با false باشد، مقادیر حتی در صورت تکراری بودن الحاق می‌شوند\&. .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf # Add an optimization flag to $CCFLAGS\&. env\&.MergeFlags({\*(AqCCFLAGS\*(Aq: \*(Aq\-O3\*(Aq}) # Combine the flags returned from running pkg\-config with an optimization # flag and merge the result into the construction variables\&. env\&.MergeFlags([\*(Aq!pkg\-config gtk+\-2\&.0 \-\-cflags\*(Aq, \*(Aq\-O3\*(Aq]) # Combine an optimization flag with the flags returned from running pkg\-config # for two distinct packages and merge into the construction variables\&. env\&.MergeFlags( [ \*(Aq\-O3\*(Aq, \*(Aq!pkg\-config gtk+\-2\&.0 \-\-cflags \-\-libs\*(Aq, \*(Aq!pkg\-config libpng12 \-\-cflags \-\-libs\*(Aq, ] ) .fi .if n \{\ .RE .\} .RE .PP \fBNoCache\fR(\fItarget, \&.\&.\&.\fR), \fIenv\fR\&.NoCache(\fItarget, \&.\&.\&.\fR) .RS 4 فهرستی از فایل‌هایی را مشخص می‌کند که هرگاه متد \fBCacheDir\fR فعال شده باشد، \fIنباید\fR در حافظه پنهان ذخیره شوند\&. اهداف مشخص‌شده می‌توانند یک لیست یا یک هدف منفرد باشند\&. .sp چندین فایل را می‌توان یا به عنوان آرگومان‌های مجزا برای متد \fBNoCache\fR یا به صورت یک لیست مشخص کرد\&. \fBNoCache\fR همچنین مقدار بازگشتی هر یک از متدهای سازنده (Builder) در محیط ساخت را می‌پذیرد\&. .sp فراخوانی \fBNoCache\fR روی دایرکتوری‌ها و دیگر انواع گره‌های غیرفایلی هیچ اثری ندارد، زیرا تنها گره‌های فایلی در حافظه پنهان ذخیره می‌شوند\&. .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf NoCache(\*(Aqfoo\&.elf\*(Aq) NoCache(env\&.Program(\*(Aqhello\*(Aq, \*(Aqhello\&.c\*(Aq)) .fi .if n \{\ .RE .\} .RE .PP \fBNoClean\fR(\fItargets, \&.\&.\&.\fR), \fIenv\fR\&.NoClean(\fItargets, \&.\&.\&.\fR) .RS 4 فایل‌ها یا دایرکتوری‌هایی را مشخص می‌کند که هرگاه یک \fItarget\fR مشخص (یا وابستگی‌های آن) انتخاب شده باشد و حالت پاک‌سازی فعال باشد (گزینه خط فرمان \fB\-c\fR)، نباید حذف شوند\&. \fItargets\fR می‌تواند یک یا چند نام یا گره فایل یا دایرکتوری، و/یا فهرستی از نام‌ها یا گره‌ها باشد\&. \fBNoClean\fR را می‌توان چندین بار فراخوانی کرد\&. .sp فراخوانی \fBNoClean\fR برای یک هدف، بر فراخوانی \fBClean\fR برای همان هدف اولویت دارد؛ بنابراین هر هدفی که به هر دو تابع داده شود در حالت پاک‌سازی حذف \fIنخواهد\fR شد\&. .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf NoClean(\*(Aqfoo\&.elf\*(Aq) NoClean(env\&.Program(\*(Aqhello\*(Aq, \*(Aqhello\&.c\*(Aq)) .fi .if n \{\ .RE .\} .RE .PP \fIenv\fR\&.ParseConfig(\fIcommand, [function, unique]\fR) .RS 4 محیط ساخت فعلی را با مقادیر استخراج‌شده از خروجی اجرای \fIcommand\fR خارجی، از طریق ارسال آن به یک \fIfunction\fR کمکی، به‌روزرسانی می‌کند\&. \fIcommand\fR می‌تواند یک رشته یا فهرستی از رشته‌ها باشد که نشان‌دهنده دستور و آرگومان‌های آن است\&. اگر \fIfunction\fR حذف شود یا \fBNone\fR باشد، \fBenv\&.MergeFlags\fR استفاده می‌شود\&. به طور پیش‌فرض، مقادیر تکراری به هیچ‌یک از متغیرهای ساخت اضافه نمی‌شوند؛ می‌توانید \fIunique=False\fR را مشخص کنید تا اجازه افزودن مقادیر تکراری داده شود\&. .sp \fIcommand\fR با استفاده از محیط اجرای SCons (یعنی متغیر ساخت \fB$ENV\fR در محیط ساخت فعلی) اجرا می‌شود\&. اگر \fIcommand\fR برای عملکرد صحیح به اطلاعات بیشتری نیاز داشته باشد، آن اطلاعات باید در محیط اجرا تنظیم شوند\&. برای مثال، \fBpkg\-config\fR ممکن است به تنظیم یک مقدار سفارشی در متغیر محیطی \fBPKG_CONFIG_PATH\fR نیاز داشته باشد\&. .sp \fBenv\&.MergeFlags\fR برای توزیع خروجی تولیدشده توسط \fIcommand\fR بین متغیرهای ساخت مناسب، باید ساختار آن را درک کند\&. \fBenv\&.MergeFlags\fR برای انجام این پردازش از تابع مجزایی استفاده می‌کند \- برای جزئیات بیشتر، از جمله جدول گزینه‌ها و متغیرهای ساخت متناظر، به \fBenv\&.ParseFlags\fR مراجعه کنید\&. برای ارائه پردازش سفارشی روی خروجی \fIcommand\fR، می‌توانید یک \fIfunction\fR دلخواه تعریف کنید که باید سه آرگومان را بپذیرد: محیط ساخت برای تغییر، یک آرگومان رشته‌ای حاوی خروجی حاصل از اجرای \fIcommand\fR، و پرچم اختیاری \fIunique\fR\&. .RE .PP \fBParseDepends\fR(\fIfilename, [must_exist, only_one]\fR), \fIenv\fR\&.ParseDepends(\fIfilename, [must_exist, only_one]\fR) .RS 4 محتویات \fIfilename\fR را به عنوان فهرستی از وابستگی‌ها به سبک Make یا mkdep تجزیه کرده و صراحتاً تمام وابستگی‌های فهرست‌شده را برقرار می‌سازد\&. .sp به طور پیش‌فرض، عدم وجود \fIfilename\fR خطا محسوب نمی‌شود\&. آرگومان اختیاری \fImust_exist\fR می‌تواند روی \fBTrue\fR تنظیم شود تا در صورتی که فایل وجود نداشته باشد یا به هر دلیلی غیرقابل دسترسی باشد، SCons یک استثنا صادر کند\&. .sp آرگومان اختیاری \fIonly_one\fR می‌تواند روی \fBTrue\fR تنظیم شود تا در صورتی که فایل حاوی اطلاعات وابستگی برای بیش از یک هدف باشد، SCons یک استثنا صادر کند\&. این قابلیت می‌تواند یک اعتبارسنجی اولیه برای فایل‌هایی فراهم کند که برای نمونه قرار است توسط پرچم gcc \-M تولید شوند؛ پرچمی که معمولاً باید اطلاعات وابستگی را فقط برای یک فایل خروجی در فایل متناظر \&.d بنویسد\&. .sp \fIfilename\fR و تمامی فایل‌های فهرست‌شده در آن نسبت به دایرکتوری فایل SConscript فراخواننده تابع \fBParseDepends\fR تفسیر خواهند شد\&. .RE .PP \fIenv\fR\&.ParseFlags(\fIflags, \&.\&.\&.\fR) .RS 4 یک یا چند رشته شامل پرچم‌های متداول خط فرمان برای زنجیره ابزارهای سبک GCC را تجزیه کرده و دیکشنری‌ای بازمی‌گرداند که مقادیر پرچم‌ها در آن به متغیرهای ساخت SCons مناسب تفکیک شده‌اند\&. این متد به عنوان مکملی برای متد \fBenv\&.MergeFlags\fR طراحی شده است، اما این امکان را فراهم می‌کند که مقادیر درون دیکشنری بازگردانده شده، در صورت لزوم، پیش از ادغام شدن در محیط ساخت دستکاری شوند\&. (توجه داشته باشید که \fBenv\&.MergeFlags\fR در صورتی که آرگومانش دیکشنری نباشد، این متد را فراخوانی خواهد کرد؛ بنابراین معمولاً نیازی به فراخوانی مستقیم \fBenv\&.ParseFlags\fR نیست مگر اینکه بخواهید مقادیر را تغییر دهید\&.) .sp اگر نخستین نویسه در هر رشته یک علامت تعجب (!) باشد، باقی‌مانده رشته به عنوان یک دستور اجرا می‌شود و خروجی حاصل از دستور به عنوان پرچم‌های خط فرمان زنجیره ابزار GCC تجزیه شده و به دیکشنری حاصل افزوده می‌شود\&. این قابلیت می‌تواند برای فراخوانی دستورهای *\-config رایج در محیط برنامه‌نویسی POSIX (برای نمونه، \fBpkg\-config\fR) استفاده شود\&. توجه داشته باشید که چنین دستوری با استفاده از محیط اجرای SCons اجرا می‌شود؛ در صورتی که دستور به اطلاعات بیشتری نیاز داشته باشد، آن اطلاعات باید صریحاً ارائه شود\&. برای جزئیات بیشتر به \fBParseConfig\fR مراجعه کنید\&. .sp مقادیر پرچم‌ها بر اساس پیشوند یافت‌شده ترجمه شده و به متغیرهای ساخت زیر افزوده می‌شوند: .sp .if n \{\ .RS 4 .\} .nf \-arch CCFLAGS, LINKFLAGS \-D CPPDEFINES \-framework FRAMEWORKS \-frameworkdir= FRAMEWORKPATH \-fmerge\-all\-constants CCFLAGS, LINKFLAGS \-fopenmp CCFLAGS, LINKFLAGS \-fsanitize CCFLAGS, LINKFLAGS \-include CCFLAGS \-imacros CCFLAGS \-isysroot CCFLAGS, LINKFLAGS \-isystem CCFLAGS \-iquote CCFLAGS \-idirafter CCFLAGS \-I CPPPATH \-l LIBS \-L LIBPATH \-mno\-cygwin CCFLAGS, LINKFLAGS \-mwindows LINKFLAGS \-openmp CCFLAGS, LINKFLAGS \-pthread CCFLAGS, LINKFLAGS \-std= CFLAGS \-stdlib= CXXFLAGS \-Wa, ASFLAGS, CCFLAGS \-Wl,\-rpath= RPATH \-Wl,\-R, RPATH \-Wl,\-R RPATH \-Wl, LINKFLAGS \-Wp, CPPFLAGS \- CCFLAGS + CCFLAGS, LINKFLAGS .fi .if n \{\ .RE .\} .sp هر رشته دیگری که به گزینه‌ها مرتبط نباشد، به عنوان نام کتابخانه‌ها در نظر گرفته شده و به متغیر ساخت \fB$LIBS\fR اضافه می‌شود\&. .sp مثال‌ها (که همگی نتیجه یکسانی ایجاد می‌کنند): .sp .if n \{\ .RS 4 .\} .nf dict = env\&.ParseFlags(\*(Aq\-O2 \-Dfoo \-Dbar=1\*(Aq) dict = env\&.ParseFlags(\*(Aq\-O2\*(Aq, \*(Aq\-Dfoo\*(Aq, \*(Aq\-Dbar=1\*(Aq) dict = env\&.ParseFlags([\*(Aq\-O2\*(Aq, \*(Aq\-Dfoo \-Dbar=1\*(Aq]) dict = env\&.ParseFlags(\*(Aq\-O2\*(Aq, \*(Aq!echo \-Dfoo \-Dbar=1\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fBPlatform\fR(\fIplat\fR), \fIenv\fR\&.Platform(\fIplat\fR) .RS 4 هنگامی که به عنوان یک تابع سراسری فراخوانی شود، یک شیء پلتفرم قابل فراخوانی که توسط \fIplat\fR انتخاب شده است (پیش‌فرض آن پلتفرم شناسایی‌شده برای سیستم جاری است) بازمی‌گرداند که می‌توان از آن برای مقداردهی اولیه یک محیط ساخت، با ارسال آن به عنوان آرگومان کلیدواژه‌ای \fIplatform\fR به تابع \fBEnvironment\fR، استفاده کرد\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf env = Environment(platform=Platform(\*(Aqwin32\*(Aq)) .fi .if n \{\ .RE .\} .sp هنگامی که به عنوان متدی از یک محیط فراخوانی شود، شیء پلتفرم مشخص‌شده توسط \fIplat\fR را برای به‌روزرسانی آن محیط فراخوانی می‌کند\&. .sp .if n \{\ .RS 4 .\} .nf env\&.Platform(\*(Aqposix\*(Aq) .fi .if n \{\ .RE .\} .sp برای جزئیات بیشتر به بخش "Construction Environments" در صفحه راهنما مراجعه کنید\&. .RE .PP \fBPrecious\fR(\fItarget, \&.\&.\&.\fR), \fIenv\fR\&.Precious(\fItarget, \&.\&.\&.\fR) .RS 4 هدف \fItarget\fR را به عنوان گرانبها (precious) علامت‌گذاری می‌کند تا پیش از ساخت مجدد حذف نشود\&. به طور معمول SCons پیش از ساخت یک هدف، آن را حذف می‌کند\&. چندین هدف را می‌توان در یک فراخوانی ارسال کرد، که می‌توانند رشته‌ها و/یا گره‌ها (nodes) باشند\&. فهرستی از گره‌های هدف تحت تأثیر را بازمی‌گرداند\&. .RE .PP \fIenv\fR\&.Prepend(\fIkey=val, [\&.\&.\&.]\fR) .RS 4 مقادیر را به ابتدای متغیرهای ساخت در محیط ساخت جاری اضافه می‌کند؛ مانند \fBenv\&.Append\fR عمل می‌کند (برای جزئیات به آن مراجعه کنید)، با این تفاوت که مقادیر به جای انتها، به ابتدای هر مقدار موجود از متغیر ساخت اضافه می‌شوند\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf env\&.Prepend(CCFLAGS=\*(Aq\-g \*(Aq, FOO=[\*(Aqfoo\&.yyy\*(Aq]) .fi .if n \{\ .RE .\} .sp همچنین ببینید: \fBenv\&.Append\fR، \fBenv\&.AppendUnique\fR و \fBenv\&.PrependUnique\fR\&. .RE .PP \fIenv\fR\&.PrependENVPath(\fIname, newpath, [envname, sep, delete_existing=True]\fR) .RS 4 مسیرهای دایرکتوری را از \fInewpath\fR به ابتدای یک مدخل مسیر جستجو با نام \fIname\fR در متغیر ساخت \fIenvname\fR در محیط فعلی (\fIenv\fR) اضافه می‌کند\&. اگر \fIenvname\fR داده نشود، مقدار پیش‌فرض "ENV" است (نگاه کنید به \fB$ENV\fR)\&. انتظار می‌رود \fIenvname\fR به یک شیء دیکشنری‌مانند اشاره کند؛ اگر در \fIenv\fR وجود نداشته باشد، در ابتدا به صورت یک dict خالی ایجاد خواهد شد\&. \fInewpath\fR می‌تواند به صورت یک رشته، یک گره دایرکتوری، یا فهرستی از رشته‌ها مشخص شود\&. در صورت رشته بودن، می‌تواند شامل چندین مسیر باشد که با جداکننده مسیر سیستم (os\&.pathsep) یا، در صورت تعیین، با مقدار \fIsep\fR از هم جدا شده‌اند\&. رشته‌های مسیر نسبی به ریشه پروژه (که با # آغاز می‌شوند) شناسایی می‌شوند\&. نوع مقدار موجود \fIname\fR حفظ می‌شود\&. .sp مسیرها تنها یک بار ظاهر خواهند شد\&. مسیرهای تکراری در \fInewpath\fR حذف می‌شوند و نخستین رخداد برای حفظ ترتیب مسیر نگه داشته می‌شود\&. اگر \fIdelete_existing\fR درست باشد (پیش‌فرض)، تکرارهای موجود پیش از افزودن به ابتدا حذف می‌شوند؛ در غیر این صورت، از تکرارهای جدید صرف‌نظر می‌شود\&. در طول مقایسه‌ها، مسیرها نرمال‌سازی می‌شوند تا از بروز مشکل با تفاوت حروف بزرگ و کوچک (در سامانه‌های فایلی غیرحساس به بزرگی و کوچکی حروف) و مسیرهای نسبی که ممکن است به همان دایرکتوری اشاره کنند، جلوگیری شود\&. مقادیر ذخیره‌شده توسط این فرآیند تغییر نمی‌کنند\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf print(\*(Aqbefore:\*(Aq, env[\*(AqENV\*(Aq][\*(AqINCLUDE\*(Aq]) include_path = \*(Aq/foo/bar:/foo\*(Aq env\&.PrependENVPath(\*(AqINCLUDE\*(Aq, include_path) print(\*(Aqafter:\*(Aq, env[\*(AqENV\*(Aq][\*(AqINCLUDE\*(Aq]) .fi .if n \{\ .RE .\} .sp نتیجه می‌دهد: .sp .if n \{\ .RS 4 .\} .nf before: /biz:/foo after: /foo/bar:/foo:/biz .fi .if n \{\ .RE .\} .sp همچنین ببینید \fBenv\&.AppendENVPath\fR\&. .RE .PP \fIenv\fR\&.PrependUnique(\fIkey=val, [\&.\&.\&.], [delete_existing=False]\fR) .RS 4 مقادیر را با حفظ یکتایی، به ابتدای متغیرهای ساخت در محیط ساخت فعلی اضافه می‌کند\&. مانند \fBenv\&.Append\fR عمل می‌کند، با این تفاوت که مقادیر به جای انتهای متغیر ساخت، به ابتدای آن اضافه می‌شوند و مقادیری که تکراری شوند افزوده نمی‌شوند\&. اگر \fIdelete_existing\fR روی یک مقدار درست تنظیم شود، برای هر مورد تکراری، نمونه موجود از \fIval\fR ابتدا حذف شده و سپس \fIval\fR درج می‌شود، که این کار تأثیر انتقال آن به ابتدا را دارد\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf env\&.PrependUnique(CCFLAGS=\*(Aq\-g\*(Aq, FOO=[\*(Aqfoo\&.yyy\*(Aq]) .fi .if n \{\ .RE .\} .sp همچنین ببینید \fBenv\&.Append\fR، \fBenv\&.AppendUnique\fR و \fBenv\&.Prepend\fR\&. .RE .PP \fBProgress\fR(\fIcallable, [interval]\fR), \fBProgress\fR(\fIstring, [interval, file, overwrite]\fR), \fBProgress\fR(\fIlist_of_strings, [interval, file, overwrite]\fR) .RS 4 به SCons امکان می‌دهد تا با نمایش یک رشته یا فراخوانی یک تابع هنگام ارزیابی گره‌ها (Nodes، مانند فایل‌ها)، پیشرفت حاصل‌شده در طول ساخت را نشان دهد\&. .sp اگر نخستین آرگومان تعیین‌شده یک فراخوان‌پذیر (callable) در Python باشد (یک تابع یا شیئی که متد __call__ دارد)، تابع به ازای هر \fIinterval\fR بار ارزیابی یک گره، یک بار فراخوانی می‌شود (پیش‌فرض \fB1\fR است)\&. گره ارزیابی‌شده به عنوان تنها آرگومان به فراخوان‌پذیر ارسال می‌شود\&. (برای سازگاری با آینده، ایده خوبی است که \fI*args\fR و \fI**kwargs\fR را نیز به عنوان آرگومان به امضای تابع یا متد خود اضافه کنید\&. این کار در صورتی که SCons در آینده واسط را برای فراخوانی تابع با آرگومان‌های اضافی تغییر دهد، از شکسته‌شدن کد جلوگیری می‌کند\&.) .sp نمونه‌ای از یک تابع پیشرفت سفارشی ساده که به ازای هر ۱۰ گره، رشته‌ای شامل نام گره را چاپ می‌کند: .sp .if n \{\ .RS 4 .\} .nf def my_progress_function(node, *args, **kwargs): print(\*(AqEvaluating node %s!\*(Aq % node) Progress(my_progress_function, interval=10) .fi .if n \{\ .RE .\} .sp نمونه‌ای پیچیده‌تر از یک شیء سفارشی نمایش پیشرفت که به ازای هر ۱۰۰ گره ارزیابی‌شده، رشته‌ای شامل یک شمارنده را چاپ می‌کند\&. به استفاده از \er (بازگشت به ابتدای سطر) در انتها توجه کنید تا رشته خودش را روی صفحه نمایش بازنویسی کند: .sp .if n \{\ .RS 4 .\} .nf import sys class ProgressCounter(object): count = 0 def __call__(self, node, *args, **kw): self\&.count += 100 sys\&.stderr\&.write(\*(AqEvaluated %s nodes\er\*(Aq % self\&.count) Progress(ProgressCounter(), interval=100) .fi .if n \{\ .RE .\} .sp اگر آرگومان نخست برای \fBProgress\fR یک رشته یا فهرستی از رشته‌ها باشد، به عنوان متنی در نظر گرفته می‌شود که به ازای هر \fIinterval\fR گره ارزیابی‌شده نمایش داده شود\&. اگر آرگومان نخست فهرستی از رشته‌ها باشد، آنگاه هر رشته در فهرست به صورت چرخشی به ازای هر \fIinterval\fR گره ارزیابی‌شده نمایش داده خواهد شد\&. .sp پیش‌فرض، چاپ رشته در خروجی استاندارد است\&. یک جریان خروجی جایگزین را می‌توان با آرگومان کلیدواژه‌ای \fIfile\fR مشخص کرد، که فراخواننده باید آن را از قبل بازشده ارسال کند\&. .sp کد زیر مجموعه‌ای از نقطه‌ها را در خروجی خطا چاپ می‌کند، یک نقطه به ازای هر ۱۰۰ گره ارزیابی‌شده: .sp .if n \{\ .RS 4 .\} .nf import sys Progress(\*(Aq\&.\*(Aq, interval=100, file=sys\&.stderr) .fi .if n \{\ .RE .\} .sp اگر رشته دقیقاً حاوی زیررشته $TARGET; باشد، با گره جایگزین خواهد شد\&. توجه داشته باشید که به دلایل کارایی، این \fInot\fR یک جایگزینی معمول متغیر SCons نیست، بنابراین نمی‌توانید از متغیرهای دیگر یا از آکولادها استفاده کنید\&. مثال زیر نام هر گره ارزیابی‌شده را چاپ می‌کند، با استفاده از بازگشت به ابتدای سطر (\er) تا هر خط توسط خط بعدی بازنویسی شود، و آرگومان کلیدواژه‌ای \fIoverwrite\fR (پیش‌فرض False) برای اطمینان از اینکه نام فایل چاپ‌شدهٔ قبلی با نویسه‌های فاصله بازنویسی شود: .sp .if n \{\ .RS 4 .\} .nf import sys Progress(\*(Aq$TARGET\er\*(Aq, overwrite=True) .fi .if n \{\ .RE .\} .sp می‌توان از فهرستی از رشته‌ها برای پیاده‌سازی یک نشانگر چرخان (spinner) بر روی صفحه نمایش کاربر به شرح زیر استفاده کرد که به ازای هر پنج گره ارزیابی‌شده تغییر می‌کند: .sp .if n \{\ .RS 4 .\} .nf Progress([\*(Aq\-\er\*(Aq, \*(Aq\e\e\er\*(Aq, \*(Aq|\er\*(Aq, \*(Aq/\er\*(Aq], interval=5) .fi .if n \{\ .RE .\} .RE .PP \fBPseudo\fR(\fItarget, \&.\&.\&.\fR), \fIenv\fR\&.Pseudo(\fItarget, \&.\&.\&.\fR) .RS 4 \fItarget\fR را به عنوان یک هدف مجازی (pseudo target) علامت‌گذاری می‌کند، که نشان‌دهنده تولید هیچ فایل هدف فیزیکی نیست\&. اگر هر \fItarget\fR مجازی وجود داشته باشد، SCons فرآیند ساخت را با یک خطا لغو خواهد کرد\&. چندین هدف می‌توانند در یک فراخوانی مشخص شوند، و می‌توانند رشته و/یا گره (Node) باشند\&. فهرستی از گره‌های هدف متأثر را برمی‌گرداند\&. .sp \fBPseudo\fR ممکن است همراه با یک فراخوانی سازنده (مانند \fBCommand\fR) مفید باشد که هیچ هدف فیزیکی تولید نمی‌کند، و اگر هدف به‌طور تصادفی از قبل وجود داشته باشد، رفتار آن نادرست خواهد بود\&. این مفهوم مشابه هدف \&.PHONY در GNU make است\&. همچنین SCons یک قابلیت قدرتمند نام مستعار هدف (به \fBAlias\fR مراجعه کنید) ارائه می‌دهد که ممکن است در بسیاری از موقعیت‌ها هنگام تعریف نام‌های هدفی که مستقیماً ساخته نمی‌شوند، انعطاف‌پذیری بیشتری فراهم کند\&. .RE .PP \fBPyPackageDir\fR(\fImodulename\fR), \fIenv\fR\&.PyPackageDir(\fImodulename\fR) .RS 4 موقعیت \fImodulename\fR را پیدا می‌کند، که می‌تواند یک رشته یا توالی‌ای از رشته‌ها باشد، که هر یک نشان‌دهنده نام یک ماژول Python است\&. متغیرهای ساخت در \fImodulename\fR بسط داده می‌شوند\&. یک گره دایرکتوری (به \fBDir\fR مراجعه کنید)، یا در صورتی که \fImodulename\fR یک توالی باشد، فهرستی از گره‌های دایرکتوری را برمی‌گرداند\&. برای هر ماژولی که یافت نشود، None برگردانده می‌شود\&. .sp هنگامی که یک ماژول ابزار (Tool) که به عنوان یک ماژول Python نصب شده استفاده می‌شود، باید یک آرگومان \fItoolpath\fR را به \fBTool\fR، \fBEnvironment\fR یا \fBClone\fR مشخص کنید، زیرا در غیر این صورت ابزارهای خارج از مکان‌های استاندارد پروژه (site_scons/site_tools) پیدا نخواهند شد\&. استفاده از \fBPyPackageDir\fR اجازه می‌دهد این مسیر به جای درج ثابت در کد (hardcode)، در زمان اجرا کشف شود\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf env = Environment( tools=["default", "ExampleTool"], toolpath=[PyPackageDir("example_tool")] ) .fi .if n \{\ .RE .\} .RE .PP \fIenv\fR\&.Replace(\fIkey=val, [\&.\&.\&.]\fR) .RS 4 متغیرهای ساخت را در Environment با آرگومان‌های کلیدواژه‌ای مشخص‌شده جایگزین می‌کند\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf env\&.Replace(CCFLAGS=\*(Aq\-g\*(Aq, FOO=\*(Aqfoo\&.xxx\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fBRepository\fR(\fIdirectory\fR), \fIenv\fR\&.Repository(\fIdirectory\fR) .RS 4 دایرکتوری \fIdirectory\fR را به عنوان یک مخزن تنظیم می‌کند تا برای یافتن فایل‌های سهیم در فرآیند ساخت جستجو شود\&. فراخوانی‌های مکرر \fBRepository\fR مجاز هستند، و مخازن به همان ترتیب مشخص‌شده جستجو می‌شوند\&. مخازنی که از طریق گزینه‌های خط فرمان تعیین می‌شوند، اولویت بالاتری دارند\&. .sp در \fBscons\fR، یک مخزن، یک نسخه جزئی یا کامل از درخت منبع از بالاترین سطح دایرکتوری به پایین است که شامل فایل‌های منبعی است که می‌توانند برای ساخت اهداف در درخت کاری (worktree) فعلی استفاده شوند\&. مخازن همچنین می‌توانند حاوی فایل‌های اشتقاقی (derived files) باشند\&. یک نمونه می‌تواند درخت منبع رسمی باشد که توسط یک یکپارچه‌ساز نگهداری می‌شود\&. اگر مخزنی حاوی فایل‌های اشتقاقی باشد، آنها باید نتیجه ساخت با SCons باشند، تا پایگاه داده امضا (sconsign) در مخزن وجود داشته باشد و تصمیم‌گیری بهتری در مورد به‌روز بودن یا نبودن آنها امکان‌پذیر شود\&. .sp توجه داشته باشید که اگر یک فایل اشتقاقی به‌روز از قبل در یک مخزن موجود باشد، \fBscons\fR نسخه‌ای از آن را در درخت دایرکتوری محلی ایجاد \fIنخواهد کرد\fR\&. اگر نیاز دارید که یک کپی محلی ساخته شود، از متد \fBLocal\fR استفاده کنید\&. .RE .PP \fBRequires\fR(\fItarget, prerequisite\fR), \fIenv\fR\&.Requires(\fItarget, prerequisite\fR) .RS 4 یک رابطه صرفاً ترتیبی (order\-only) را بین \fItarget\fR و \fIprerequisite\fR تعیین می‌کند\&. پیش‌نیازها در صورت لزوم، \fIپیش از\fR فایل(های) هدف (مجدداً) ساخته خواهند شد، اما فایل(های) هدف در عمل به پیش‌نیازها وابسته نیستند و صرفاً به دلیل تغییر فایل(های) پیش‌نیاز دوباره ساخته نخواهند شد\&. \fItarget\fR و \fIprerequisite\fR هر یک می‌توانند یک رشته یا Node، یا فهرستی از رشته‌ها یا Nodeها باشند\&. اگر چندین مقدار برای \fItarget\fR وجود داشته باشد، پیش‌نیاز(ها) به تک‌تک آنها افزوده می‌شوند\&. فهرستی از گره‌های هدف متأثر را برمی‌گرداند\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf env\&.Requires(\*(Aqfoo\*(Aq, \*(Aqfile\-that\-must\-be\-built\-before\-foo\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fBReturn\fR(\fI[vars\&.\&.\&., stop=True]\fR) .RS 4 به SConscript فراخواننده بازمی‌گردد و در صورت تمایل، مقادیر متغیرهای نام‌برده در \fIvars\fR را برمی‌گرداند\&. چندین رشته حاوی نام متغیرها می‌توانند به \fBReturn\fR ارسال شوند\&. رشته‌ای حاوی فاصله‌های خالی (whitespace) به نام‌های متغیر مجزا تفکیک می‌شود\&. اگر یک متغیر مشخص شده باشد، مقدار آن را برمی‌گرداند، در غیر این صورت یک تاپل (tuple) از مقادیر را بازمی‌گرداند\&. در صورتی که \fIvars\fR ذکر نشود، یک تاپل خالی برگردانده می‌شود\&. .sp به‌طور پیش‌فرض \fBReturn\fR پردازش SConscript فعلی را متوقف کرده و بلافاصله بازمی‌گردد\&. آرگومان کلیدواژه‌ای اختیاری stop می‌تواند روی یک مقدار نادرست (False) تنظیم شود تا پردازش ادامه فایل SConscript پس از فراخوانی \fBReturn\fR ادامه یابد (این رفتار پیش‌فرض قبل از SCons 0\&.98 بود)\&. با این حال، مقادیر بازگردانده‌شده همچنان مقادیر متغیرهای نام‌برده در \fIvars\fR در نقطه فراخوانی \fBReturn\fR هستند\&. .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf # هیچ مقداری برنمی‌گرداند (ارزیابی نادرست / False) Return() # مقدار متغیر پایتونی \*(Aqfoo\*(Aq را برمی‌گرداند\&. Return("foo") # مقادیر متغیرهای پایتونی \*(Aqfoo\*(Aq و \*(Aqbar\*(Aq را برمی‌گرداند\&. Return("foo", "bar") # مقادیر متغیرهای پایتونی \*(Aqval1\*(Aq و \*(Aqval2\*(Aq را برمی‌گرداند\&. Return(\*(Aqval1 val2\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fBScanner\fR(\fIfunction, [name, argument, skeys, path_function, node_class, node_factory, scan_check, recursive]\fR), \fIenv\fR\&.Scanner(\fIfunction, [name, argument, skeys, path_function, node_class, node_factory, scan_check, recursive]\fR) .RS 4 یک شیء Scanner برای \fIfunction\fR مشخص‌شده ایجاد می‌کند\&. برای توضیح کامل آرگومان‌ها و رفتار، به بخش «Scanner Objects» در صفحه راهنما مراجعه کنید\&. .RE .PP \fBSConscript\fR(\fIscriptnames, [exports, variant_dir, duplicate, must_exist]\fR), \fIenv\fR\&.SConscript(\fIscriptnames, [exports, variant_dir, duplicate, must_exist]\fR), \fBSConscript\fR(\fIdirs=subdirs, [name=scriptname, exports, variant_dir, duplicate, must_exist]\fR), \fIenv\fR\&.SConscript(\fIdirs=subdirs, [name=scriptname, exports, variant_dir, duplicate, must_exist]\fR) .RS 4 فایل(های) فرعی SConscript (پیکربندی ساخت) را اجرا می‌کند\&. دو روش برای فراخوانی تابع \fBSConscript\fR وجود دارد\&. .sp روش نخست فراخوانی، ارائه یک یا چند نام فایل SConscript به عنوان اولین آرگومان موضعی است که می‌تواند یک رشته یا فهرستی از رشته‌ها باشد\&. اگر آرگومان موضعی دومی وجود داشته باشد، با آن به گونه‌ای رفتار می‌شود که گویی آرگومان کلیدواژه‌ای \fIexports\fR داده شده است (به ادامه مطلب مراجعه کنید)\&. مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf SConscript(\*(AqSConscript\*(Aq) # run SConscript in the current directory SConscript(\*(Aqsrc/SConscript\*(Aq) # run SConscript in the src directory SConscript([\*(Aqsrc/SConscript\*(Aq, \*(Aqdoc/SConscript\*(Aq]) SConscript(Split(\*(Aqsrc/SConscript doc/SConscript\*(Aq)) config = SConscript(\*(AqMyConfig\&.py\*(Aq) .fi .if n \{\ .RE .\} .sp روش دوم فراخوانی، حذف آرگومان موضعیِ نام‌گذاری اسکریپت و در عوض تعیین نام دایرکتوری‌ها با استفاده از آرگومان کلیدواژه‌ای \fIdirs\fR است\&. مقدار می‌تواند یک رشته یا فهرستی از رشته‌ها باشد\&. در این حالت، \fBscons\fR یک فایل پیکربندی فرعی به نام SConscript (به‌طور پیش‌فرض) را در هر یک از دایرکتوری‌های مشخص‌شده اجرا خواهد کرد\&. می‌توانید با ارائه یک آرگومان کلیدواژه‌ای اختیاری \fIname\fR=\fIscriptname\fR نامی غیر از SConscript را تعیین کنید\&. سه مثال نخست زیر اثری مشابه سه مثال نخست بالا دارند: .sp .if n \{\ .RS 4 .\} .nf SConscript(dirs=\*(Aq\&.\*(Aq) # run SConscript in the current directory SConscript(dirs=\*(Aqsrc\*(Aq) # run SConscript in the src directory SConscript(dirs=[\*(Aqsrc\*(Aq, \*(Aqdoc\*(Aq]) SConscript(dirs=[\*(Aqsub1\*(Aq, \*(Aqsub2\*(Aq], name=\*(AqMySConscript\*(Aq) .fi .if n \{\ .RE .\} .sp آرگومان کلیدواژه‌ای اختیاری \fIexports\fR متغیرهایی را مشخص می‌کند تا برای استفاده در SConscriptهای فراخوانی‌شده در دسترس قرار گیرند؛ این اسکریپت‌ها در محیطی ایزوله ارزیابی می‌شوند و در غیر این صورت به متغیرهای محلی SConscript فراخواننده دسترسی ندارند\&. این مقدار می‌تواند یک رشته یا فهرستی از رشته‌ها شامل نام متغیرها باشد، یا یک دیکشنری که نام‌های محلی را به نام‌هایی نگاشت می‌کند که می‌توانند با آن‌ها وارد شوند\&. در روش فراخوانی نخست (scriptnames)، دومین آرگومان موضعی نیز به عنوان \fIexports\fR تفسیر خواهد شد؛ روش فراخوانی دوم (دایرکتوری) هیچ آرگومان موضعی را نمی‌پذیرد و باید از فرم کلیدواژه‌ای استفاده کند\&. این متغیرها تنها برای فایل(های) SConscript فراخوانی‌شده به‌طور محلی صادر (export) می‌شوند، و نسبت به هر متغیر هم‌نام در مخزن سراسری که توسط تابع \fBExport\fR مدیریت می‌شود، اولویت دارند\&. فایل‌های فرعی SConscript باید از تابع \fBImport\fR برای وارد کردن متغیرها به حوزه محلی خود استفاده کنند\&. مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf foo = SConscript(\*(Aqsub/SConscript\*(Aq, exports=\*(Aqenv\*(Aq) SConscript(\*(Aqdir/SConscript\*(Aq, exports=[\*(Aqenv\*(Aq, \*(Aqvariable\*(Aq]) SConscript(dirs=\*(Aqsubdir\*(Aq, exports=\*(Aqenv variable\*(Aq) SConscript(dirs=[\*(Aqone\*(Aq, \*(Aqtwo\*(Aq, \*(Aqthree\*(Aq], exports=\*(Aqshared_info\*(Aq) .fi .if n \{\ .RE .\} .sp اگر آرگومان اختیاری \fIvariant_dir\fR وجود داشته باشد، اثری معادل با تابع \fBVariantDir\fR ایجاد می‌کند، اما فقط در حوزه فراخوانی \fBSConscript\fR معتبر است\&. آرگومان \fIvariant_dir\fR نسبت به دایرکتوریِ فایل SConscript \fIفراخواننده\fR تفسیر می‌شود\&. دایرکتوری مبدا، دایرکتوری‌ای است که فایل SConscript \fIفراخوانی‌شده\fR در آن قرار دارد و فایل SConscript به گونه‌ای ارزیابی می‌شود که گویی در دایرکتوری \fIvariant_dir\fR قرار دارد\&. بنابراین: .sp .if n \{\ .RS 4 .\} .nf SConscript(\*(Aqsrc/SConscript\*(Aq, variant_dir=\*(Aqbuild\*(Aq) .fi .if n \{\ .RE .\} .sp معادل است با: .sp .if n \{\ .RS 4 .\} .nf VariantDir(\*(Aqbuild\*(Aq, \*(Aqsrc\*(Aq) SConscript(\*(Aqbuild/SConscript\*(Aq) .fi .if n \{\ .RE .\} .sp اگر فایل‌های مبدا در همان دایرکتوریِ SConstruct باشند، .sp .if n \{\ .RS 4 .\} .nf SConscript(\*(AqSConscript\*(Aq, variant_dir=\*(Aqbuild\*(Aq) .fi .if n \{\ .RE .\} .sp معادل است با: .sp .if n \{\ .RS 4 .\} .nf VariantDir(\*(Aqbuild\*(Aq, \*(Aq\&.\*(Aq) SConscript(\*(Aqbuild/SConscript\*(Aq) .fi .if n \{\ .RE .\} .sp آرگومان اختیاری \fIduplicate\fR همانند \fBVariantDir\fR تفسیر می‌شود\&. اگر آرگومان \fIvariant_dir\fR حذف شود، آرگومان \fIduplicate\fR نادیده گرفته خواهد شد\&. برای جزئیات و محدودیت‌های بیشتر، به توضیحات \fBVariantDir\fR مراجعه کنید\&. .sp .sp اگر مقدار اختیاری \fImust_exist\fR برابر \fBTrue\fR باشد (پیش‌فرض)، در صورت پیدا نشدن فایل SConscript درخواستی، یک استثنا ایجاد می‌شود\&. برای نادیده‌گرفتن خاموش اسکریپت‌های ناموجود (رفتار پیش‌فرض پیش از نسخه 3\&.1 SCons)، مقدار must_exist=False را در فراخوانی \fBSConscript\fR پاس دهید\&. .sp \fIتغییریافته در 4\&.6\&.0\fR: اکنون مقدار پیش‌فرض \fImust_exist\fR برابر \fBTrue\fR است\&. .sp در اینجا چند مثال ترکیبی آورده شده است: .sp .if n \{\ .RS 4 .\} .nf # collect the configuration information and use it to build src and doc shared_info = SConscript(\*(AqMyConfig\&.py\*(Aq) SConscript(\*(Aqsrc/SConscript\*(Aq, exports=\*(Aqshared_info\*(Aq) SConscript(\*(Aqdoc/SConscript\*(Aq, exports=\*(Aqshared_info\*(Aq) .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf # build debugging and production versions\&. SConscript # can use Dir(\*(Aq\&.\*(Aq)\&.path to determine variant\&. SConscript(\*(AqSConscript\*(Aq, variant_dir=\*(Aqdebug\*(Aq, duplicate=0) SConscript(\*(AqSConscript\*(Aq, variant_dir=\*(Aqprod\*(Aq, duplicate=0) .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf # build debugging and production versions\&. SConscript # is passed flags to use\&. opts = { \*(AqCPPDEFINES\*(Aq : [\*(AqDEBUG\*(Aq], \*(AqCCFLAGS\*(Aq : \*(Aq\-pgdb\*(Aq } SConscript(\*(AqSConscript\*(Aq, variant_dir=\*(Aqdebug\*(Aq, duplicate=0, exports=opts) opts = { \*(AqCPPDEFINES\*(Aq : [\*(AqNODEBUG\*(Aq], \*(AqCCFLAGS\*(Aq : \*(Aq\-O\*(Aq } SConscript(\*(AqSConscript\*(Aq, variant_dir=\*(Aqprod\*(Aq, duplicate=0, exports=opts) .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf # build common documentation and compile for different architectures SConscript(\*(Aqdoc/SConscript\*(Aq, variant_dir=\*(Aqbuild/doc\*(Aq, duplicate=0) SConscript(\*(Aqsrc/SConscript\*(Aq, variant_dir=\*(Aqbuild/x86\*(Aq, duplicate=0) SConscript(\*(Aqsrc/SConscript\*(Aq, variant_dir=\*(Aqbuild/ppc\*(Aq, duplicate=0) .fi .if n \{\ .RE .\} .sp \fBSConscript\fR مقادیر هر متغیری را که توسط فایل(های) SConscript اجراشده در آرگومان‌های تابع \fBReturn\fR تعیین شده باشد، بازمی‌گرداند\&. اگر یک فراخوانیِ تک‌گانه \fBSConscript\fR باعث اجرای چندین اسکریپت شود، مقدار بازگشتی یک چندتایی (tuple) شامل مقادیر بازگشتی هر یک از اسکریپت‌ها خواهد بود\&. اگر یک اسکریپت اجراشده صراحتاً تابع \fBReturn\fR را فراخوانی نکند، \fBNone\fR بازمی‌گرداند\&. .RE .PP \fBSConscriptChdir\fR(\fIvalue\fR) .RS 4 به‌طور پیش‌فرض، \fBscons\fR هنگام خواندن و پردازش هر اسکریپت فرعی SConscript، دایرکتوری کاری خود را به دایرکتوری حاوی آن اسکریپت تغییر می‌دهد\&. این رفتار را می‌توان با مشخص کردن آرگومانی که به نادرست (false) ارزیابی می‌شود غیرفعال کرد، که در این صورت \fBscons\fR هنگام خواندن تمام فایل‌های SConscript در دایرکتوری سطح بالا (top\-level) باقی خواهد ماند\&. (این امر ممکن است هنگام ساخت از مخازن ضروری باشد، زمانی که تمام دایرکتوری‌های حاوی فایل‌های SConscript لزوماً به‌طور محلی وجود ندارند\&.) شما می‌توانید با چندین بار فراخوانی \fBSConscriptChdir\fR این قابلیت را فعال و غیرفعال کنید\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf SConscriptChdir(False) SConscript(\*(Aqfoo/SConscript\*(Aq) # به foo تغییر دایرکتوری نخواهد داد SConscriptChdir(True) SConscript(\*(Aqbar/SConscript\*(Aq) # به bar تغییر دایرکتوری خواهد داد .fi .if n \{\ .RE .\} .RE .PP \fBSConsignFile\fR(\fI[name, dbm_module]\fR), \fIenv\fR\&.SConsignFile(\fI[name, dbm_module]\fR) .RS 4 محل ذخیره‌سازی پایگاه‌دادهٔ امضای SCons و قالب پایگاه‌دادهٔ مورد استفاده را مشخص می‌کند\&. این ویژگی ممکن است برای تعیین فایل‌های پایگاه‌داده یا مکان‌های فایل جایگزین برای انواع مختلف ساخت کاربردی باشد\&. .sp آرگومان اختیاری \fIname\fR نام پایهٔ فایل(های) پایگاه‌داده است\&. پایگاه‌داده نسبت به دایرکتوری حاوی فایل سطح بالای SConstruct قرار می‌گیرد، مگر اینکه \fIname\fR یک مسیر مطلق باشد\&. مقدار پیش‌فرض \&.sconsign است\&. فایل(های) واقعی پایگاه‌داده که روی دیسک ذخیره می‌شوند ممکن است پسوند مناسبی داشته باشند که توسط \fIdbm_module\fR انتخابی اضافه شده است، و همچنین ممکن است شامل نام قالب هش نیز باشند (نگاه کنید به \fB\-\-hash\-format\fR)\&. .sp آرگومان اختیاری \fIdbm_module\fR مشخص می‌کند که از کدام ماژول پایگاه‌دادهٔ Python برای خواندن/نوشتن فایل استفاده شود\&. ماژول ابتدا باید وارد (import) شود؛ سپس نام ماژول واردشده به عنوان آرگومان ارسال می‌گردد\&. پیش‌فرض، یک ماژول سفارشی SCons\&.dblite است که از ساختارهای دادهٔ serialize‌شدهٔ Python (به کمک pickle) استفاده می‌کند و روی تمام نسخه‌های Python کار می‌کند\&. برای مشاهدهٔ سایر انواع موجود، به مستندات ماژول dbm در Python مراجعه کنید\&. .sp در صورت فراخوانی بدون آرگومان، پایگاه‌داده به‌طور پیش‌فرض در \&.sconsign\&.dblite در دایرکتوری اصلی پروژه قرار خواهد گرفت، که در صورت فراخوانی نشدن \fBSConsignFile\fR نیز همین رفتار پیش‌فرض است\&. .sp این تنظیم به‌صورت سراسری است، بنابراین تنها تفاوت بین تابع سراسری و حالت متد محیطی، بسط متغیرها روی \fIname\fR است\&. در یک پیکربندی ساخت مشخص، تنها باید یک فراخوانی فعال از این تابع/متد وجود داشته باشد\&. .sp اگر \fIname\fR روی \fBNone\fR تنظیم شود، \fBscons\fR امضاهای فایل را در یک فایل \&.sconsign مجزا در هر دایرکتوری ذخیره خواهد کرد، نه در یک فایل پایگاه‌دادهٔ تجمیعی واحد\&. این تمهیدی برای سازگاری عقبرو به‌منظور پشتیبانی از رفتاری است که قبل از SCons 0\&.97 (یعنی قبل از سال ۲۰۰۸) پیش‌فرض بود\&. استفاده از این حالت منسوخ شده است و نباید در پروژه‌های جدید استفاده شود\&. .sp \fIاز نسخهٔ 4\&.11\&.0 منسوخ شده است\fR: حالت یک فایل امضا به ازای هر دایرکتوری منسوخ شده است و در انتشار‌های آینده حذف خواهد شد\&. .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf # به‌طور صریح امضاها را در "\&.sconsign\&.dblite" # در دایرکتوری سطح بالای SConstruct ذخیره می‌کند (رفتار پیش‌فرض)\&. SConsignFile() # امضاها را در فایل "etc/scons\-signatures" # نسبت به دایرکتوری سطح بالای SConstruct ذخیره می‌کند\&. # SCons یک پسوند پایگاه‌داده به این نام اضافه خواهد کرد\&. SConsignFile("etc/scons\-signatures") # امضاها را در نام فایل مطلق مشخص‌شده ذخیره می‌کند\&. # SCons یک پسوند پایگاه‌داده به این نام اضافه خواهد کرد\&. SConsignFile("/home/me/SCons/signatures") # امضاها را در یک فایل \&.sconsign جداگانه # در هر دایرکتوری ذخیره می‌کند\&. SConsignFile(None) # امضاها را در یک فایل \&.sconsign با قالب GNU dbm ذخیره می‌کند import dbm\&.gnu SConsignFile(dbm_module=dbm\&.gnu) .fi .if n \{\ .RE .\} .RE .PP \fIenv\fR\&.SetDefault(\fIkey=val, [\&.\&.\&.]\fR) .RS 4 متغیرهای ساخت (construction variables) را به مقادیر پیش‌فرض مشخص‌شده از طریق آرگومان‌های کلیدواژه‌ای تنظیم می‌کند اگر (و تنها اگر) آن متغیرها از پیش تنظیم نشده باشند\&. دستورهای زیر با یکدیگر معادل هستند: .sp .if n \{\ .RS 4 .\} .nf env\&.SetDefault(FOO=\*(Aqfoo\*(Aq) if \*(AqFOO\*(Aq not in env: env[\*(AqFOO\*(Aq] = \*(Aqfoo\*(Aq .fi .if n \{\ .RE .\} .RE .PP \fBSetOption\fR(\fIname, value\fR), \fIenv\fR\&.SetOption(\fIname, value\fR) .RS 4 متغیر گزینهٔ \fIname\fR را به \fIvalue\fR تنظیم می‌کند\&. گزینه‌های قابل تنظیم، گزینه‌های خط فرمان متناظری دارند (همان‌طور که در جدول نشان داده شده است) که می‌توان برای بازنویسی‌های یک‌باره از آن‌ها استفاده کرد \- مقداری که از طریق خط فرمان تنظیم شود بر مقداری که با \fBSetOption\fR تنظیم شده است اولویت خواهد داشت\&. علاوه بر فایل‌های SConscript، فراخوانی‌های \fBSetOption\fR را می‌توان در یک فایل site_init\&.py نیز قرار داد\&. مقدار فعلی را می‌توان با \fBGetOption\fR استعلام کرد\&. .sp رفتار گزینه‌ها در مدخل مربوط به گزینهٔ خط فرمان مرتبط در صفحهٔ راهنما (manpage) شرح داده شده است\&. پارامتر \fIvalue\fR اجباری است؛ برای مقادیر گزینه‌های بولی (در مواردی که گزینهٔ خط فرمان آرگومان دریافت نمی‌کند)، از یک \fIvalue\fR استفاده کنید که به مقدار درست (مانند \fBTrue\fR، \fB1\fR) یا نادرست (مانند \fBFalse\fR، \fB0\fR) ارزیابی شود\&. .sp گزینه‌هایی که بر خواندن و پردازش فایل‌های SConscript تأثیر می‌گذارند با استفاده از \fBSetOption\fR قابل تنظیم نیستند، زیرا آن فایل‌ها در وهلهٔ اول باید خوانده شوند تا فراخوانی \fBSetOption\fR یافت شود\&. .sp برای گزینه‌های خاص پروژه (که گاهی گزینه‌های محلی نامیده می‌شوند) که از طریق فراخوانی \fBAddOption\fR اضافه شده‌اند، استفاده از \fBSetOption\fR تنها پس از پایان موفقیت‌آمیز فراخوانی \fBAddOption\fR مجاز است، و فقط در صورتی که آن فراخوانی شامل آرگومان کلیدواژه‌ای \fIsettable=True\fR بوده باشد\&. .sp متغیرهای قابل تنظیم به همراه گزینه‌های خط فرمان متناظر با آن‌ها عبارتند از: .TS allbox tab(:); lB lB lB. T{ نام قابل تنظیم T}:T{ آرگومان خط فرمان T}:T{ یادداشت‌ها T} .T& l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l s s. T{ \fIclean\fR T}:T{ \fB\-c\fR, \fB\-\-clean\fR, \fB\-\-remove\fR T}:T{ بولی T} T{ \fIdiskcheck\fR T}:T{ \fB\-\-diskcheck\fR T}:T{ لیست T} T{ \fIduplicate\fR T}:T{ \fB\-\-duplicate\fR T}:T{ رشته T} T{ \fIexperimental\fR T}:T{ \fB\-\-experimental\fR T}:T{ مجموعه\&. \fIاز 4\&.2\fR\&. T} T{ \fIhash_chunksize\fR T}:T{ \fB\-\-hash\-chunksize\fR T}:T{ عدد صحیح\&. جایگزین \fBmd5_chunksize\fR شده است\&. \fIاز 4\&.2\fR T} T{ \fIhash_format\fR T}:T{ \fB\-\-hash\-format\fR T}:T{ رشته\&. \fIاز 4\&.2\fR T} T{ \fIhelp\fR T}:T{ \fB\-h\fR, \fB\-\-help\fR T}:T{ بولی T} T{ \fIimplicit_cache\fR T}:T{ \fB\-\-implicit\-cache\fR T}:T{ بولی T} T{ \fIimplicit_deps_changed\fR T}:T{ \fB\-\-implicit\-deps\-changed\fR T}:T{ بولی\&. همچنین \fIimplicit_cache\fR را تنظیم می‌کند\&. \fIاز 4\&.2 قابل تنظیم است\fR T} T{ \fIimplicit_deps_unchanged\fR T}:T{ \fB\-\-implicit\-deps\-unchanged\fR T}:T{ بولی\&. همچنین \fIimplicit_cache\fR را تنظیم می‌کند\&. \fIاز 4\&.2 قابل تنظیم است\fR T} T{ \fImax_drift\fR T}:T{ \fB\-\-max\-drift\fR T}:T{ عدد صحیح T} T{ \fImd5_chunksize\fR T}:T{ \fB\-\-hash\-chunksize\fR T}:T{ عدد صحیح\&. با \fBhash_chunksize\fR جایگزین شده است\&. \fIاز 4\&.2 منسوخ شده است\fR T} T{ \fIno_exec\fR T}:T{ \fB\-n\fR, \fB\-\-no\-exec\fR, \fB\-\-just\-print\fR, \fB\-\-dry\-run\fR, \fB\-\-recon\fR T}:T{ بولی T} T{ \fIno_progress\fR T}:T{ \fB\-Q\fR T}:T{ بولی\&. نگاه کنید به \&\s-2\u[6]\d\s+2 T} T{ \fInum_jobs\fR T}:T{ \fB\-j\fR, \fB\-\-jobs\fR T}:T{ عدد صحیح T} T{ \fIrandom\fR T}:T{ \fB\-\-random\fR T}:T{ بولی T} T{ \fIsilent\fR T}:T{ \fB\-s\fR, \fB\-\-silent\fR, \fB\-\-quiet\fR T}:T{ بولی T} T{ \fIstack_size\fR T}:T{ \fB\-\-stack\-size\fR T}:T{ عدد صحیح T} T{ \fIwarn\fR T}:T{ \fB\-\-warn\fR T}:T{ لیست T} T{ ---- .br [a] اگر \fIno_progress\fR از طریق \fBSetOption\fR در یک فایل SConscript تنظیم شود (اما نه در صورت تنظیم در یک فایل site_init\&.py)، همچنان یک پیام وضعیت اولیه دربارهٔ خواندن فایل‌های SConscript وجود خواهد داشت، چرا که SCons باید ابتدا خواندن آن‌ها را آغاز کند تا فراخوانی \fBSetOption\fR را ببیند\&. T} .TE .sp 1 مثال: .sp .if n \{\ .RS 4 .\} .nf SetOption(\*(Aqmax_drift\*(Aq, 0) .fi .if n \{\ .RE .\} .RE .PP \fBSideEffect\fR(\fIside_effect, target\fR), \fIenv\fR\&.SideEffect(\fIside_effect, target\fR) .RS 4 اعلان می‌کند که \fIside_effect\fR یک اثر جانبی از ساخت \fItarget\fR است\&. هر دوی \fIside_effect\fR و \fItarget\fR می‌توانند یک لیست، یک نام فایل یا یک گره (Node) باشند\&. اثر جانبی، یک فایل هدف است که در نتیجه ساخت سایر اهداف، ایجاد یا به‌روزرسانی می‌شود\&. برای نمونه، یک فایل PDB ویندوز به عنوان یک اثر جانبی از ساخت فایل‌های \&.obj برای یک کتابخانه ایستا ایجاد می‌شود، و فایل‌های لاگ گوناگون به عنوان اثرات جانبی دستورهای مختلف TeX ایجاد یا به‌روزرسانی می‌شوند\&. اگر یک هدف، اثر جانبیِ چندین دستور ساخت باشد، \fBscons\fR اطمینان حاصل می‌کند که در هر زمان تنها یک دسته از دستورها اجرا شوند\&. در نتیجه، شما تنها برای اهدافِ اثر جانبی که در نتیجه چندین دستور ساخت ساخته می‌شوند، نیاز به استفاده از این متد دارید\&. .sp از آنجا که چندین دستور ساخت ممکن است یک فایل اثر جانبی یکسان را به‌روزرسانی کنند، به طور پیش‌فرض هنگام حذف \fItarget\fR توسط گزینه \fB\-c\fR، هدف \fIside_effect\fR به طور خودکار حذف \fIنمی‌شود\fR\&. (البته توجه داشته باشید که ممکن است \fIside_effect\fR به عنوان بخشی از پاکسازی دایرکتوری‌ای که در آن قرار دارد حذف شود\&.) اگر می‌خواهید مطمئن شوید هر زمان که یک \fItarget\fR خاص پاکسازی می‌شود، \fIside_effect\fR نیز پاکسازی شود، باید این مورد را صراحتاً با تابع \fBClean\fR یا \fBenv\&.Clean\fR مشخص کنید\&. .sp این تابع فهرستی از شیءهای Node اثر جانبی را که با موفقیت اضافه شده‌اند برمی‌گرداند\&. اگر فهرست اثرات جانبی شامل مواردی باشد که از قبل اضافه شده‌اند، آن‌ها اضافه نشده و در فهرست بازگردانده‌شده قرار نمی‌گیرند\&. .RE .PP \fBSplit\fR(\fIarg\fR), \fIenv\fR\&.Split(\fIarg\fR) .RS 4 اگر \fIarg\fR یک رشته باشد، آن را بر اساس فاصله‌های خالی تفکیک کرده و فهرستی از رشته‌ها بدون نویسه‌های فاصله برمی‌گرداند\&. این حالت رایج‌ترین کاربرد است و می‌تواند (برای نمونه) برای تفکیک فهرستی از نام‌های فایل به کار رود، به جای اینکه مجبور باشید آن‌ها را به صورت فهرستی از کلمات نقل‌قول‌شدهٔ مجزا تایپ کنید\&. اگر \fIarg\fR یک لیست یا تاپل (tuple) باشد، آن لیست یا تاپل را بدون تغییر برمی‌گرداند\&. اگر \fIarg\fR هر نوع شیء دیگری باشد، فهرستی حاوی تنها همان شیء را برمی‌گرداند\&. این حالت‌های غیررشته‌ای در واقع هیچ تفکیکی انجام نمی‌دهند، بلکه اجازه می‌دهند متغیر یک آرگومان بدون نیاز به بررسی نوع آن به \fBSplit\fR پاس داده شود\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf files = Split("f1\&.c f2\&.c f3\&.c") files = env\&.Split("f4\&.c f5\&.c f6\&.c") files = Split(""" f7\&.c f8\&.c f9\&.c """) .fi .if n \{\ .RE .\} .RE .PP \fIenv\fR\&.subst(\fIinput, [raw, target, source, conv]\fR) .RS 4 عملیات درون‌یابی (جایگزینی) متغیرهای ساخت را روی \fIinput\fR انجام می‌دهد، که می‌تواند یک رشته یا یک توالی باشد\&. عناصر قابل جایگزینی به صورت ${\fIexpression\fR} هستند، هرچند اگر هیچ ابهامی در شناسایی عنصر وجود نداشته باشد، آکولادها می‌توانند حذف شوند\&. یک علامت واقعیِ \fB$\fR می‌تواند با استفاده از \fB$$\fR درج شود\&. .sp به طور پیش‌فرض، فاصله‌های خالی ابتدا و انتهای نتیجه حذف خواهند شد و تمام توالی‌های فاصله‌های خالی به یک نویسه فاصله فشرده می‌شوند\&. علاوه بر این، هرگونه توالی نویسه‌ای $( و $) از رشته بازگردانده‌شده حذف خواهد شد\&. آرگومان اختیاری \fIraw\fR اگر می‌خواهید فاصله‌های خالی و توالی‌های $(\-$) حفظ شوند، می‌تواند روی 1 تنظیم شود\&. همچنین اگر بخواهید علاوه بر این تمام نویسه‌های بین هر جفت $( و $) نیز دور ریخته شوند (همان‌طور که برای محاسبه امضا انجام می‌شود)، آرگومان \fIraw\fR می‌تواند روی 2 تنظیم شود\&. .sp اگر \fIinput\fR یک توالی (لیست یا تاپل) باشد، تک‌تک عناصر توالی بسط داده شده و نتایج به عنوان یک لیست بازگردانده می‌شوند\&. .sp اگر می‌خواهید \fB$TARGET\fR، \fB$TARGETS\fR، \fB$SOURCE\fR و \fB$SOURCES\fR برای بسط در دسترس باشند، آرگومان‌های اختیاری کلیدواژه‌ای \fItarget\fR و \fIsource\fR باید به ترتیب روی فهرست‌هایی از گره‌های هدف و منبع تنظیم شوند\&. این کار معمولاً زمانی لازم است که شما \fBenv\&.subst\fR را از داخل یک تابع Python که به عنوان یک عمل (action) در SCons استفاده شده فراخوانی می‌کنید\&. .sp مقادیر رشته‌ای بازگردانده‌شده یا عناصر توالی به طور پیش‌فرض به نمایش رشته‌ای‌شان تبدیل می‌شوند\&. آرگومان اختیاری \fIconv\fR می‌تواند یک تابع تبدیل را مشخص کند که به جای حالت پیش‌فرض استفاده خواهد شد\&. به عنوان مثال، اگر می‌خواهید شیءهای Python (شامل گره‌های SCons) به عنوان شیءهای Python بازگردانده شوند، می‌توانید از یک عبارت lambda در Python استفاده کنید تا تابعی بی‌نام را ارسال کنید که صرفاً آرگومانِ تبدیل‌نشده خود را برمی‌گرداند\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf print(env\&.subst("The C compiler is: $CC")) def compile(target, source, env): sourceDir = env\&.subst( "${SOURCE\&.srcdir}", target=target, source=source ) source_nodes = env\&.subst(\*(Aq$EXPAND_TO_NODELIST\*(Aq, conv=lambda x: x) .fi .if n \{\ .RE .\} .RE .PP \fBTag\fR(\fInode, tags\fR) .RS 4 گره‌های (Nodeهای) فایل یا دایرکتوری را با اطلاعاتی درباره نحوه بسته‌بندی آن فایل‌ها یا دایرکتوری‌ها توسط سازنده \fBPackage\fR نشانه‌گذاری می‌کند\&. تمام برچسب‌های سطح Node اختیاری هستند\&. .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf # اطمینان حاصل می‌کند که کتابخانه ساخته‌شده با حالت دسترسی فایل 644 نصب خواهد شد Tag(Library(\*(Aqlib\&.c\*(Aq), UNIX_ATTR="0o644") # فایل file2.txt را به عنوان یک فایل مستندات نشانه‌گذاری می‌کند Tag(\*(Aqfile2\&.txt\*(Aq, DOC) .fi .if n \{\ .RE .\} .RE .PP \fBTool\fR(\fIname, [toolpath, key=value, \&.\&.\&.]\fR), \fIenv\fR\&.Tool(\fIname, [toolpath, key=value, \&.\&.\&.]\fR) .RS 4 ماژول مشخصات ابزار \fIname\fR را پیدا کرده و یک شیء ابزار قابل فراخوانی برای آن ابزار برمی‌گرداند\&. هنگامی که از شکل متد محیط (\fBenv\&.Tool\fR) استفاده می‌شود، شیء ابزار پیش از بازگشت متد به‌طور خودکار فراخوانی می‌شود تا \fIenv\fR را به‌روزرسانی کند، و \fIname\fR به متغیر ساخت \fB$TOOLS\fR در آن محیط افزوده می‌شود\&. هنگامی که از شکل تابع عمومی \fBTool\fR استفاده می‌شود، شیء ابزار ساخته می‌شود اما فراخوانی نمی‌شود، زیرا فاقد زمینه یک محیط برای به‌روزرسانی است، و باید از شیء بازگردانده‌شده برای ترتیب دادن فراخوانی استفاده شود\&. .sp ماژول ابزار در مسیرهای جستجوی ابزار (برای جزئیات به بخش \fBTools\fR در صفحه راهنما مراجعه کنید) و در هر مسیری که توسط پارامتر اختیاری \fItoolpath\fR مشخص شده باشد، جستجو می‌شود؛ این پارامتر باید فهرستی از رشته‌ها باشد\&. اگر \fItoolpath\fR مشخص نشود، از \fItoolpath\fR ارائه‌شده هنگام ایجاد محیط (در صورت وجود) استفاده می‌شود\&. .sp هر آرگومان کلیدواژه‌ای باقی‌مانده در شیء ابزار ذخیره شده، و هنگام فراخوانی واقعی شیء ابزار به تابع \fBgenerate\fR ماژول ابزار ارسال خواهد شد\&. تابع \fBgenerate\fR می‌تواند محیط ساخت را با متغیرهای ساخت به‌روزرسانی کند و هرگونه مقداردهی اولیه دیگری که برای استفاده از سازوکارهای توصیف‌شده توسط ابزار لازم است را ترتیب دهد، و می‌تواند از این آرگومان‌های اضافی برای هدایت اقدامات خود بهره ببرد\&. .sp \fIتغییریافته در نسخه 4\&.2:\fR اکنون \fBenv\&.Tool\fR شیء ابزار را برمی‌گرداند؛ پیش از این مقداری برنمی‌گرداند (یعنی \fBNone\fR برمی‌گرداند)\&. .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf env\&.Tool(\*(Aqgcc\*(Aq) env\&.Tool(\*(Aqopengl\*(Aq, toolpath=[\*(Aqbuild/tools\*(Aq]) .fi .if n \{\ .RE .\} .sp شیء ابزارِ بازگردانده‌شده می‌تواند به عنوان بخشی از آرگومان کلیدواژه‌ای \fItools\fR به یک فراخوانی \fBEnvironment\fR یا \fBClone\fR ارسال شود، که در این حالت ابزار به محیطِ در حال ساخت اعمال می‌شود؛ یا می‌تواند مستقیماً فراخوانی شود، که در این حالت باید یک محیط ساخت برای به‌روزرسانی به عنوان آرگومان به آن ارسال گردد\&. هر یک از این دو روش، متغیر ساخت \fB$TOOLS\fR را نیز به‌روزرسانی خواهد کرد\&. .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[Tool(\*(Aqmsvc\*(Aq)]) env = Environment() msvctool = Tool(\*(Aqmsvc\*(Aq) msvctool(env) # مقدار \*(Aqmsvc\*(Aq را به متغیر TOOLS اضافه می‌کند gltool = Tool(\*(Aqopengl\*(Aq, toolpath = [\*(Aqtools\*(Aq]) gltool(env) # مقدار \*(Aqopengl\*(Aq را به متغیر TOOLS اضافه می‌کند .fi .if n \{\ .RE .\} .RE .PP \fBValidateOptions\fR(\fI[throw_exception=False]\fR) .RS 4 بررسی می‌کند که تمام گزینه‌های مشخص‌شده در خط فرمان، یا از گزینه‌های توکار SCons باشند یا از طریق فراخوانی‌های \fBAddOption\fR تعریف شده باشند\&. SCons در هر صورت در مواجهه با گزینه‌های ناشناخته در نهایت با شکست مواجه خواهد شد، اما فراخوانی این تابع به فرایند ساخت امکان می‌دهد تا پیش از اجرای منطق‌های پرهزینه در مراحل بعدی ساخت، «سریع شکست بخورد» (fail fast)\&. .sp این تابع باید تنها پس از آخرین فراخوانی \fBAddOption\fR در منطق SConscript شما فراخوانی شود\&. توجه داشته باشید که برخی از ابزارها \fBAddOption\fR را فراخوانی می‌کنند؛ اگر برای آرگومان‌هایی که آن‌ها اضافه می‌کنند پیام خطا دریافت می‌کنید، باید اطمینان حاصل کنید که آن ابزارها پیش از فراخوانی \fBValidateOptions\fR بارگذاری شده باشند\&. .sp اگر گزینه ناشناخته‌ای در خط فرمان وجود داشته باشد، \fBValidateOptions\fR یک پیام خطا چاپ کرده و با وضعیت خروج خطا خارج می‌شود\&. اگر آرگومان اختیاری \fIthrow_exception\fR برابر با True باشد (پیش‌فرض False است)، یک SConsBadOptionError صادر می‌شود (raise)، که به منطق SConscript این امکان را می‌دهد تا آن استثنا را دریافت کرده و گزینه‌های نامعتبر را به شکل مناسب مدیریت کند\&. توجه داشته باشید که این نام استثنا باید وارد (import) شود (به مثال زیر مراجعه کنید)\&. .sp یک مشکل رایج در ساخت، اشتباهات تایپی (یا اشتباهات لپی و سهوی) است \- کاربر گزینه‌ای را وارد می‌کند که اندکی با مقدار مورد انتظار تفاوت دارد، یا شاید واژه‌ای دیگر با معنای مشابه باشد\&. متوقف کردن ساخت پیش از پیشروی بیش از حد در مسیری نادرست می‌تواند مفید باشد\&. برای مثال: .sp .if n \{\ .RS 4 .\} .nf $ \fBscons \-\-complier=mingw\fR # پرچم درست \-\-compiler است .fi .if n \{\ .RE .\} .sp در اینجا ممکن بود SCons به کار خود ادامه دهد و مجموعه‌ای از مراحل پیکربندی (configure) را با استفاده از مقدار پیش‌فرض \fB\-\-compiler\fR اجرا کند، چرا که گزینه دارای غلط املایی باعث می‌شود مقدار مدنظر به آن عرضه نشود؛ امری که زمان توسعه‌دهنده را برای ردیابی این که چرا منطق پیکربندی گزینه‌های «اشتباه» را انتخاب کرده تلف می‌کند\&. این مثال گرفتن و مدیریت این وضعیت را نشان می‌دهد: .sp .if n \{\ .RS 4 .\} .nf from SCons\&.Script\&.SConsOptions import SConsBadOptionError AddOption( \*(Aq\-\-compiler\*(Aq, dest=\*(Aqcompiler\*(Aq, action=\*(Aqstore\*(Aq, default=\*(Aqgcc\*(Aq, type=\*(Aqstring\*(Aq, ) # \&.\&.\&. سایر منطق‌های SConscript \&.\&.\&. try: ValidateOptions(throw_exception=True) except SConsBadOptionError as e: print(f"ValidateOptions detects a fail: ", e\&.opt_str) Exit(3) .fi .if n \{\ .RE .\} .sp \fIجدید در نسخه 4\&.5\&.0\fR .RE .PP \fBValue\fR(\fIvalue, [built_value], [name]\fR), \fIenv\fR\&.Value(\fIvalue, [built_value], [name]\fR) .RS 4 یک شیء Node را برمی‌گرداند که نشان‌دهندهٔ \fIvalue\fR مشخص‌شده در Python است\&. گره‌های Value می‌توانند به عنوان وابستگی‌های هدف‌ها استفاده شوند\&. اگر بازنمود رشته‌ایِ گره Value بین دفعات اجرای SCons تغییر کند، قدیمی تلقی شده و هر هدفی که به آن وابسته است از نو ساخته خواهد شد\&. از آنجا که گره‌های Value هیچ بازنمودی در سیستم‌فایل ندارند، برچسب‌های زمانی استفاده نمی‌شوند؛ تصمیم‌گیرنده‌های برچسب زمانی همان بررسی به‌روز بودن مبتنی بر محتوا را انجام می‌دهند\&. .sp آرگومان اختیاری \fIbuilt_value\fR را می‌توان هنگام ایجاد گره Value مشخص کرد تا نشان دهد که این Node باید از قبل «ساخته‌شده» در نظر گرفته شود\&. .sp پارامتر اختیاری \fIname\fR می‌تواند به عنوان نامی جایگزین برای گره Value حاصل ارائه شود؛ در صورتی که پارامتر \fIvalue\fR نتواند به یک رشته تبدیل شود، استفاده از این پارامتر توصیه می‌شود\&. .sp گره‌های Value متدی به نام write دارند که می‌توان با تنظیم مقداری جدید، از آن برای «ساختن» یک گره Value استفاده کرد\&. متد متناظرِ read مقدار ساخته‌شدهٔ Node را برمی‌گرداند\&. .sp \fIتغییریافته در نسخهٔ 4\&.0:\fR پارامتر \fIname\fR اضافه شد\&. .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf env = Environment() def create(target, source, env): """Action function to create a file from a Value\&. Writes \*(Aqprefix=$SOURCE\*(Aq into the file name given as $TARGET\&. """ with open(target[0], \*(Aqwb\*(Aq) as f: f\&.write(b\*(Aqprefix=\*(Aq + source[0]\&.get_contents() + b\*(Aq\en\*(Aq) # Fetch the prefix= argument, if any, from the command line\&. # Use /usr/local as the default\&. prefix = ARGUMENTS\&.get(\*(Aqprefix\*(Aq, \*(Aq/usr/local\*(Aq) # Attach builder named Config to the construction environment # using the \*(Aqcreate\*(Aq action function above\&. env[\*(AqBUILDERS\*(Aq][\*(AqConfig\*(Aq] = Builder(action=create) env\&.Config(target=\*(Aqpackage\-config\*(Aq, source=Value(prefix)) def build_value(target, source, env): """Action function to "build" a Value\&. Writes contents of $SOURCE into $TARGET, thus updating if it existed\&. """ target[0]\&.write(source[0]\&.get_contents()) output = env\&.Value(\*(Aqbefore\*(Aq) input = env\&.Value(\*(Aqafter\*(Aq) # Attach a builder named UpdateValue to the construction environment # using the \*(Aqbuild_value\*(Aq action function above\&. env[\*(AqBUILDERS\*(Aq][\*(AqUpdateValue\*(Aq] = Builder(action=build_value) env\&.UpdateValue(target=Value(output), source=Value(input)) .fi .if n \{\ .RE .\} .RE .PP \fBVariantDir\fR(\fIvariant_dir, src_dir, [duplicate]\fR), \fIenv\fR\&.VariantDir(\fIvariant_dir, src_dir, [duplicate]\fR) .RS 4 یک نگاشت برای تعریف یک دایرکتوری ساخت متغیر در \fIvariant_dir\fR برپا می‌کند\&. \fIsrc_dir\fR نباید در زیرمجموعهٔ \fIvariant_dir\fR قرار داشته باشد\&. نگاشت \fBVariantDir\fR سراسری است، حتی زمانی که به صورت \fBenv\&.VariantDir\fR فراخوانی شود\&. \fBVariantDir\fR می‌تواند چندین بار با همان \fIsrc_dir\fR فراخوانی شود تا چندین ساخت متغیر با گزینه‌های متفاوت راه‌اندازی کند\&. .sp توجه داشته باشید که اگرچه \fIvariant_dir\fR می‌تواند هر مکان مناسبی باشد، اما اگر زیر دایرکتوری اصلی پروژه نباشد، قواعد معمول انتخاب هدف، هدف‌های موجود در دایرکتوری متغیر را انتخاب نخواهند کرد مگر اینکه به صورت صریح مشخص شوند\&. .sp هنگامی که به فایل‌های درون \fIvariant_dir\fR ارجاع داده می‌شود، SCons فایل‌های ناموجود را بر حسب نیاز از \fIsrc_dir\fR تأمین می‌کند تا یک درخت ساخت کامل ایجاد کند\&. به طور پیش‌فرض، SCons فایل‌های منبع، فایل‌های فرعی SConscript و هر ساختار دایرکتوری مورد نیاز را به طور فیزیکی در دایرکتوری متغیر تکثیر می‌کند\&. این کار ساخت در دایرکتوری متغیر را معادل ساخت در درخت منبع می‌سازد، حتی در شرایطی که فایل‌های منبع میانی تولید می‌شوند، اسکنرها فایل‌های ضمیمه‌شده را با استفاده از مسیرهای نسبی نسبت به منبع جستجو می‌کنند، یا ابزارها طوری کدگذاری ثابت شده‌اند که فایل‌های اشتقاقی را در کنار منابعشان ایجاد کنند\&. تنها فایل‌هایی که SCons تشخیص دهد برای ساخت لازم هستند در \fIvariant_dir\fR تکثیر می‌شوند\&. در صورت امکان، تکثیر به جای کپی کردن از طریق پیوند دادن (linking) انجام می‌گیرد\&. راهبرد تکثیر را می‌توان با استفاده از گزینهٔ خط فرمان \fB\-\-duplicate\fR یا \fBSetOption\fR تنظیم کرد\&. .sp اگر آرگومان \fIduplicate\fR روی \fBFalse\fR تنظیم شود، SCons فایل‌های منبع را تکثیر نمی‌کند\&. در عوض، سازنده‌ها را با استفاده از مسیرهای اصلی منبع در \fIsrc_dir\fR و مسیرهای فایل‌های اشتقاقی در \fIvariant_dir\fR به صورت خودکار فراخوانی می‌کند\&. این روش کارآمدتر از تکثیر است و برای اغلب ساخت‌ها ایمن می‌باشد؛ اگر مشکلی ایجاد کرد، از duplicate=True (پیش‌فرض) استفاده کنید\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBنکته\fR .ps -1 .br هنگام تغییر حالت یک دایرکتوری متغیر موجود از تکثیرشونده به غیرتکثیرشونده، فایل‌های منبعی که پیش‌تر تکثیر شده‌اند به طور خودکار حذف نمی‌شوند\&. SCons همچنان استفاده از این نسخه‌های بیات‌شده را به جای منابع اصلی ترجیح می‌دهد، که این امر ممکن است مانع از تشخیص تغییرات در فایل‌های اصلی شود\&. برای جلوگیری از این مشکل، پیش از تغییر حالت، درخت ساخت را پاک‌سازی (clean) کنید\&. پس از این تغییر، SCons دیگر فایل‌های تکثیرشده در دایرکتوری متغیر را ردیابی نکرده و در حین پاک‌سازی آن‌ها را حذف نخواهد کرد\&. .sp .5v .RE دایرکتوری‌های متغیر را همچنین می‌توان با استفاده از تابع \fBSConscript\fR در ترکیب با فراخوانی یک فایل فرعی SConscript ایجاد کرد\&. .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf # use names in the build directory, not the source directory VariantDir(\*(Aqbuild\*(Aq, \*(Aqsrc\*(Aq, duplicate=False) Program(\*(Aqbuild/prog\*(Aq, \*(Aqbuild/source\&.c\*(Aq) # this builds both the source and docs in a separate subtree VariantDir(\*(Aqbuild\*(Aq, \*(Aq\&.\*(Aq, duplicate=False) SConscript(dirs=[\*(Aqbuild/src\*(Aq, \*(Aqbuild/doc\*(Aq]) # same as previous example, but only uses SConscript SConscript(dirs=\*(Aqsrc\*(Aq, variant_dir=\*(Aqbuild/src\*(Aq, duplicate=False) SConscript(dirs=\*(Aqdoc\*(Aq, variant_dir=\*(Aqbuild/doc\*(Aq, duplicate=False) .fi .if n \{\ .RE .\} .sp \fBVariantDir\fR هنگامی که به همراه یک فایل فرعی SConscript به کار رود، طبیعی‌ترین رفتار را دارد\&. فایل فرعی SConscript باید به گونه‌ای فراخوانی شود که گویی در \fIvariant_dir\fR قرار دارد، صرف‌نظر از اینکه مقدار \fIduplicate\fR چه باشد\&. از آرگومان کلیدواژه‌ای \fIexports\fR برای ارسال پارامترها یا یک شیء محیطیِ پیکربندی‌شده استفاده کنید تا SConscript فرعی بتواند تنظیمات مناسب آن ساخت متغیر را به کار گیرد\&. فایل SConscript باید پیش از استفاده از این مقادیر صادرشده، آن‌ها را با \fBImport\fR وارد کند\&. .sp .if n \{\ .RS 4 .\} .nf env1 = Environment(\&.\&.\&.settings for variant1\&.\&.\&.) env2 = Environment(\&.\&.\&.settings for variant2\&.\&.\&.) # run src/SConscript by using the variant dir paths VariantDir(\*(Aqbuild/variant1\*(Aq, \*(Aqsrc\*(Aq) SConscript(\*(Aqbuild/variant1/SConscript\*(Aq, exports={"env": env1}) VariantDir(\*(Aqbuild/variant2\*(Aq, \*(Aqsrc\*(Aq) SConscript(\*(Aqbuild/variant2/SConscript\*(Aq, exports={"env": env2}) .fi .if n \{\ .RE .\} .RE .PP \fBVirtualenv\fR() .RS 4 اگر فرایند SCons درون یک محیط مجازی Python در حال اجرا باشد، مسیر دایرکتوری‌ای که آن محیط در آن ذخیره شده است را برمی‌گرداند، وگرنه یک رشته خالی\&. اگر نیازی به مسیر نباشد، می‌توان با نتیجه به عنوان یک مقدار بولی رفتار کرد\&. .RE .PP \fBWhereIs\fR(\fIprogram, [path, pathext, reject]\fR), \fIenv\fR\&.WhereIs(\fIprogram, [path, pathext, reject]\fR) .RS 4 به دنبال برنامه اجراییِ \fIprogram\fR مشخص‌شده می‌گردد و مسیر کامل برنامه یا \fBNone\fR را برمی‌گرداند\&. .sp هنگامی که به عنوان یک متدِ محیط ساخت (construction environment) فراخوانی شود، مسیرهای موجود در آرگومان کلیدواژه‌ایِ \fIpath\fR یا در صورت \fBNone\fR بودن (پیش‌فرض)، مسیرهای فهرست‌شده در محیط ساخت (\fIenv\fR[\*(AqENV\*(Aq][\*(AqPATH\*(Aq]) را جستجو می‌کند\&. در صورتی که کلید \fIenv\fR[\*(AqENV\*(Aq][\*(AqPATH\*(Aq] وجود نداشته باشد، از فهرست مسیرهای محیط خارجی (os\&.environ[\*(AqPATH\*(Aq]) به عنوان جایگزین استفاده می‌شود\&. .sp در سیستم‌های Windows، به دنبال برنامه‌های اجرایی با هر یک از پسوندهای فایل فهرست‌شده در آرگومان کلیدواژه‌ایِ \fIpathext\fR می‌گردد، یا در صورت \fBNone\fR بودن (پیش‌فرض)، پسوندهای نام مسیر فهرست‌شده در محیط ساخت (\fIenv\fR[\*(AqENV\*(Aq][\*(AqPATHEXT\*(Aq])\&. در صورتی که کلید \fIenv\fR[\*(AqENV\*(Aq][\*(AqPATHEXT\*(Aq] وجود نداشته باشد، از فهرست پسوندهای نام مسیر محیط خارجی (os\&.environ[\*(AqPATHEXT\*(Aq]) به عنوان جایگزین استفاده می‌شود\&. .sp هنگامی که به عنوان یک تابع سراسری فراخوانی شود، در صورتی که \fIpath\fR و \fIpathext\fR برابر \fBNone\fR باشند، به ترتیب از مسیر محیط خارجی os\&.environ[\*(AqPATH\*(Aq] و پسوندهای مسیر os\&.environ[\*(AqPATHEXT\*(Aq] استفاده می‌کند\&. .sp هیچ‌یک از نام مسیرها یا نام‌های موجود در فهرست اختیاریِ \fIreject\fR را انتخاب نخواهد کرد\&. .RE .SS "متغیرهای SConscript (SConscript Variables)" .PP علاوه بر توابع و متدهای سراسری، \fBscons\fR از تعدادی متغیر پشتیبانی می‌کند که می‌توان از آن‌ها برای پرس‌وجوهای زمان اجرا در فایل‌های SConscript جهت اثرگذاری بر نحوه اجرای ساخت استفاده کرد\&. .PP \fIARGLIST\fR .RS 4 فهرستی از آرگومان‌های متغیر ساختِ \fIvariable\fR=\fIvalue\fR مشخص‌شده در خط فرمان\&. هر عنصر در این فهرست یک تاپل (tuple) متشکل از متغیر و مقدار آن است\&. عناصر مجزای \fIvariable\fR و \fIvalue\fR تاپل را می‌توان با اندیس‌گذاری برای عناصر \fB[0]\fR و \fB[1]\fR تاپل، یا خواناتر از آن، با استفاده از باز کردن تاپل (tuple unpacking) به دست آورد\&. مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf print("first variable, value =", ARGLIST[0][0], ARGLIST[0][1]) print("second variable, value =", ARGLIST[1][0], ARGLIST[1][1]) var, value = ARGLIST[2] print("third variable, value =", var, value) for var, value in ARGLIST: # process variable and value .fi .if n \{\ .RE .\} .sp مقادیر به‌دست‌آمده از \fIARGLIST\fR (یا از \fIARGUMENTS\fR) همواره رشته هستند، زیرا از خارج فرایند SCons سرچشمه می‌گیرند\&. به عنوان «داده‌های غیرقابل اعتماد»، آن‌ها باید پیش از استفاده اعتبارسنجی شوند و ممکن است نیاز به تبدیل به یک نوع مناسب داشته باشند\&. .RE .PP \fIARGUMENTS\fR .RS 4 فرهنگ‌لغتی (dictionary) از تمام آرگومان‌های متغیر ساختِ \fIvariable\fR=\fIvalue\fR مشخص‌شده در خط فرمان\&. این فرهنگ‌لغت به ترتیب خط فرمان است، بنابراین اگر در خط فرمان بیش از یک مقدار به یک متغیر مشخص تخصیص داده شود، آخرین (راست‌ترین) مقدار، همان مقداری است که در فرهنگ‌لغت \fIARGUMENTS\fR ذخیره می‌شود\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf if ARGUMENTS\&.get("debug", ""): env = Environment(CCFLAGS="\-g") else: env = Environment() .fi .if n \{\ .RE .\} .sp همچنین ببینید: \fIARGLIST\fR\&. .RE .PP \fIBUILD_TARGETS\fR .RS 4 فهرستی از هدف‌هایی که از \fBscons\fR خواسته شده است بسازد\&. محتویات آن شامل هدف‌های فهرست‌شده در خط فرمان خواهد بود، یا در صورت نبودن آن‌ها، هدف‌های تعیین‌شده از طریق فراخوانی‌های تابع \fBDefault\fR\&. این فهرست شامل هیچ‌یک از هدف‌های وابسته‌ای که \fBscons\fR به منظور اطمینان از به‌روز بودن هدف‌های مشخص‌شده برای ساخت انتخاب می‌کند (در صورتی که آن هدف‌ها در خط فرمان نیامده باشند) \fIنمی‌شود\fR\&. اگر نه هدفی در خط فرمان مشخص شده باشد و نه فراخوانی‌های \fBDefault\fR وجود داشته باشند، این فهرست خالی است\&. .sp عناصر این فهرست ممکن است رشته \fIیا\fR گره (Node) باشند، بنابراین باید فهرست را از طریق تابع \fBstr\fR در Python پردازش کنید تا مطمئن شوید هرگونه نام مسیر Node به رشته تبدیل می‌شود\&. .sp از آنجا که این فهرست ممکن است از فهرست هدف‌های مشخص‌شده با استفاده از تابع \fBDefault\fR گرفته شده باشد، محتویات فهرست ممکن است با هر بار فراخوانی متوالیِ \fBDefault\fR تغییر کند\&. برای اطلاعات تکمیلی، \fIDEFAULT_TARGETS\fR را ببینید\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf if \*(Aqfoo\*(Aq in BUILD_TARGETS: print("Don\*(Aqt forget to test the `foo\*(Aq program!") if \*(Aqspecial/program\*(Aq in BUILD_TARGETS: SConscript(\*(Aqspecial\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fICOMMAND_LINE_TARGETS\fR .RS 4 فهرستی از هدف‌هایی که به‌صراحت در خط فرمان مشخص شده‌اند\&. اگر هدف‌هایی در خط فرمان تعیین شده باشند، این فهرست محتوایی مشابه با \fIBUILD_TARGETS\fR خواهد داشت\&. اگر هیچ هدفی در خط فرمان مشخص نشده باشد، این فهرست خالی است\&. عناصر این فهرست رشته‌ها هستند\&. از این متغیر می‌توان، برای مثال، جهت انجام اقداماتی خاص تنها زمانی که هدف(های) معینی صریحاً برای ساخت درخواست شده باشند، استفاده کرد\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf if \*(Aqfoo\*(Aq in COMMAND_LINE_TARGETS: print("Don\*(Aqt forget to test the `foo\*(Aq program!") if \*(Aqspecial/program\*(Aq in COMMAND_LINE_TARGETS: SConscript(\*(Aqspecial\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fIDEFAULT_TARGETS\fR .RS 4 فهرستی از \fIگره‌های (nodes)\fR هدف که با استفاده از تابع \fBDefault\fR مشخص شده‌اند\&. اگر هیچ هدفی در خط فرمان نباشد، این فهرست محتوایی مشابه با \fIBUILD_TARGETS\fR خواهد داشت\&. از آنجا که عناصر این فهرست گره هستند، برای دریافت نام مسیر هر Node، لازم است تابع \fBstr\fR در Python را روی آن‌ها فراخوانی کنید\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf print(str(DEFAULT_TARGETS[0])) if \*(Aqfoo\*(Aq in [str(t) for t in DEFAULT_TARGETS]: print("Don\*(Aqt forget to test the `foo\*(Aq program!") .fi .if n \{\ .RE .\} .sp محتوای فهرست \fIDEFAULT_TARGETS\fR با هر بار فراخوانی متوالی تابع \fBDefault\fR تغییر می‌کند: .sp .if n \{\ .RS 4 .\} .nf print([str(t) for t in DEFAULT_TARGETS]) # originally [] Default(\*(Aqfoo\*(Aq) print([str(t) for t in DEFAULT_TARGETS]) # now a node [\*(Aqfoo\*(Aq] Default(\*(Aqbar\*(Aq) print([str(t) for t in DEFAULT_TARGETS]) # now a node [\*(Aqfoo\*(Aq, \*(Aqbar\*(Aq] Default(None) print([str(t) for t in DEFAULT_TARGETS]) # back to [] .fi .if n \{\ .RE .\} .sp در نتیجه، مطمئن شوید که از \fIDEFAULT_TARGETS\fR تنها پس از انجام تمام فراخوانی‌های \fBDefault\fR() خود استفاده کنید، یا در غیر این صورت صرفاً مراقب ترتیب این دستورها در فایل‌های SConscript خود باشید تا قبل از اینکه یک هدف پیش‌فرض خاص واقعاً به فهرست اضافه شود، به دنبال آن نگردید\&. .RE .PP این متغیرها از طریق ماژول‌های سفارشی Python که در یک فایل SConscript وارد (import) می‌کنید، با افزودن عبارت زیر به ماژول Python قابل دسترسی خواهند بود: .sp .if n \{\ .RS 4 .\} .nf from SCons\&.Script import * .fi .if n \{\ .RE .\} .SS "متغیرهای ساخت (Construction Variables)" .PP «متغیرهای ساخت» (Construction Variables) جفت‌های کلید\-مقداری هستند که برای ذخیره اطلاعات در یک «محیط ساخت» (construction environment) مورد استفاده قرار می‌گیرند؛ اطلاعاتی که برای انجام ساخت‌ها با استفاده از آن محیط ضروری هستند\&. نام‌گذاری متغیرهای ساخت باید از همان قواعد نام‌گذاری شناسه‌ها در Python پیروی کند: نویسه نخست باید یک زیرخط (_) یا حرف باشد و به دنبال آن هر تعداد زیرخط، حرف یا رقم قرار گیرد\&. قرارداد معمول این است که تمامی حروف بزرگ نوشته شوند تا تشخیص بصری آن‌ها آسان‌تر باشد\&. .PP متغیرهای ساخت برای نگهداری انواع مختلفی از اطلاعات به کار می‌روند\&. به عنوان مثال، متغیر \fB$CPPDEFINES\fR روشی برای آگاه کردن کامپایلر C/C++ از ماکروهای پیش‌پردازنده‌ای است که برای ساخت خود نیاز دارید\&. شناسایی ابزاری که توسط SCons انجام می‌شود باعث می‌شود که متغیر \fB$CXX\fR نام کامپایلر C++ را (در صورت شناسایی روی سیستم) در خود نگه دارد، اما می‌توانید به آن مقدار متفاوتی بدهید تا اجرای دستوری با نامی دیگر برای کامپایلر تحمیل شود\&. برخی از متغیرها شامل فهرستی از پسوندهای نام فایل هستند که توسط یک زنجیره کامپایلر خاص شناخته می‌شوند\&. \fB$BUILDERS\fR شامل نگاشتی از نام‌های پیکربندی‌شده Builder (مانند \fBTextfile\fR) به نمونه واقعی Builder است که در هنگام استفاده از آن Builder باید فراخوانی شود\&. متغیرهای ساخت ممکن است شامل ارجاع به سایر متغیرهای ساخت باشند: همان ابزاری که کامپایلر C/C++ را برپا کرده است، یک «رشته اقدام» (action string) را نیز در \fB$CXXCOM\fR تنظیم می‌کند که نحوه فراخوانی آن کامپایلر را شرح می‌دهد و با نحو $VARIABLE شامل سایر متغیرهای ساخت است\&. این ارجاع‌ها در هنگام استفاده، بسط یافته و جایگزین می‌شوند (بخش Variable Substitution را ببینید)\&. .PP به متغیرهای ساخت به‌گونه‌ای ارجاع داده می‌شود که گویی کلیدها و مقادیر موجود در یک دیکشنری Python هستند: .sp .if n \{\ .RS 4 .\} .nf env["CC"] = "cc" flags = env\&.get("CPPDEFINES", []) .fi .if n \{\ .RE .\} .PP متغیرهای ساخت همچنین می‌توانند با استفاده از متد \fBDictionary\fR محیط ساخت، برای ایجاد یک دیکشنری واقعی، دریافت و تنظیم شوند: .sp .if n \{\ .RS 4 .\} .nf cvars = env\&.Dictionary() cvars["CC"] = "cc" .fi .if n \{\ .RE .\} .PP در مثال پیشین، از آنجا که \fIcvars\fR یک کپی بیرونی است، مقدار \fB$CC\fR در خود محیط ساخت با این مقداردهی تغییر نمی‌کند\&. .PP متغیرهای ساخت را می‌توان هنگام ایجاد یک محیط ساخت جدید با ارسال آن‌ها به عنوان آرگومان‌های کلیدواژه‌ای تنظیم کرد: .sp .if n \{\ .RS 4 .\} .nf env = Environment(CC="cc") .fi .if n \{\ .RE .\} .PP یا هنگام کپی کردن یک محیط ساخت با استفاده از متد \fBClone\fR: .sp .if n \{\ .RS 4 .\} .nf env2 = env\&.Clone(CC="cl\&.exe") .fi .if n \{\ .RE .\} .PP متغیرهای ساخت همچنین می‌توانند به عنوان آرگومان‌های کلیدواژه‌ای به یک Builder داده شوند؛ در این صورت، این تنظیمات تنها بر کاری که توسط آن فراخوانی Builder انجام می‌شود اثر می‌گذارند و کل محیط ساخت را تحت تأثیر قرار نمی‌دهند\&. این مفهوم، بازنویسی (override) نامیده می‌شود: .sp .if n \{\ .RS 4 .\} .nf env\&.Program(\*(Aqhello\*(Aq, \*(Aqhello\&.c\*(Aq, LIBS=[\*(Aqgl\*(Aq, \*(Aqglut\*(Aq]) .fi .if n \{\ .RE .\} .PP بسیاری از متغیرهای ساخت کاربردی به طور خودکار توسط SCons و متناسب با پلتفرم مورد استفاده تعریف می‌شوند و شما می‌توانید آن‌ها را تغییر دهید یا متغیرهای ساخت اضافی را برای استفاده در Builderها، Scannerها و سایر ابزارهای خود تعریف کنید\&. مراقب باشید مواردی را که SCons از آن‌ها استفاده می‌کند رونویسی نکنید\&. در ادامه فهرستی از متغیرهای ساخت پیش‌تعریف‌شده آمده است\&. توجه داشته باشید که آیا مقادیر مواردی هستند که انتظار می‌رود شما آن‌ها را تنظیم کنید یا مواردی هستند که توسط ابزارهای داخلی و سایر مقداردهی‌های اولیه بر روی مقادیر مورد انتظار تنظیم شده‌اند و احتمالاً نباید تغییر داده شوند\&. .PP توجه داشته باشید که فهرست واقعی موجود در زمان اجرا هرگز شامل تمام این موارد نخواهد بود، زیرا مواردی که تشخیص داده شود قابل اعمال نیستند (پلتفرم نادرست، عدم نصب دستور یا فایل‌های خارجی لازم و غیره) راه‌اندازی نخواهند شد\&. پیکربندی‌های ساخت صحیح باید در برابر نبود احتمالی برخی از متغیرهای ساخت پیش از استفاده از آن‌ها مقاوم باشند؛ برای مثال با استفاده از متد \fBget\fR دیکشنری Python برای بازیابی مقدار و انجام اقدامی جایگزین در صورتی که نتیجه نشان‌دهنده تنظیم‌نشده بودن متغیر باشد\&. برای بررسی متغیرهای ساخت تنظیم‌شده در یک محیط خاص، می‌توان متد \fBenv\&.Dump\fR را فراخوانی کرد\&. .PP \fB__LDMODULEVERSIONFLAGS\fR .RS 4 این متغیر ساخت در صورتی که \fB$LDMODULEVERSION\fR تنظیم شده باشد، به طور خودکار \fB$_LDMODULEVERSIONFLAGS\fR را معرفی می‌کند\&. در غیر این صورت، به یک رشته خالی ارزیابی می‌شود\&. .RE .PP \fB__SHLIBVERSIONFLAGS\fR .RS 4 این متغیر ساخت به‌طور خودکار \fB$_SHLIBVERSIONFLAGS\fR را در صورتی که \fB$SHLIBVERSION\fR تنظیم شده باشد وارد می‌کند\&. در غیر این صورت، به یک رشته خالی ارزیابی می‌شود\&. .RE .PP \fBAPPLELINK_COMPATIBILITY_VERSION\fR .RS 4 در Mac OS X از این متغیر برای تنظیم پرچم پیونددهنده استفاده می‌شود: \-compatibility_version .sp مقدار به صورت X[\&.Y[\&.Z]] مشخص می‌شود که در آن X عددی بین 1 و 65535 است، Y می‌تواند حذف شود یا بین 1 و 255 باشد، و Z می‌تواند حذف شود یا بین 1 و 255 باشد\&. در صورت عدم تعیین، این مقدار از \fB$SHLIBVERSION\fR مشتق خواهد شد\&. کم‌ارزش‌ترین رقم حذف شده و با یک 0 جایگزین می‌شود\&. .sp اگر \fB$APPLELINK_NO_COMPATIBILITY_VERSION\fR تنظیم شده باشد، هیچ \-compatibility_version در خروجی قرار نخواهد گرفت\&. .sp برای جزئیات بیشتر به صفحه راهنمای ld در MacOS مراجعه کنید\&. .RE .PP \fB_APPLELINK_COMPATIBILITY_VERSION\fR .RS 4 ماکرویی (به‌طور پیش‌فرض یک تابع تولیدکننده) که برای ساخت پرچم‌های پیونددهنده به منظور تعیین پرچم \-compatibility_version پیونددهنده apple به کار می‌رود\&. تولیدکننده پیش‌فرض از \fB$APPLELINK_COMPATIBILITY_VERSION\fR و \fB$APPLELINK_NO_COMPATIBILITY_VERSION\fR و \fB$SHLIBVERSION\fR برای تعیین پرچم مناسب استفاده می‌کند\&. .RE .PP \fBAPPLELINK_CURRENT_VERSION\fR .RS 4 در Mac OS X از این متغیر برای تنظیم پرچم پیونددهنده استفاده می‌شود: \-current_version .sp مقدار به صورت X[\&.Y[\&.Z]] مشخص می‌شود که در آن X عددی بین 1 و 65535 است، Y می‌تواند حذف شود یا بین 1 و 255 باشد، و Z می‌تواند حذف شود یا بین 1 و 255 باشد\&. در صورت عدم تعیین، این مقدار برابر با \fB$SHLIBVERSION\fR تنظیم خواهد شد\&. .sp اگر \fB$APPLELINK_NO_CURRENT_VERSION\fR تنظیم شده باشد، هیچ \-current_version در خروجی قرار نخواهد گرفت\&. .sp برای جزئیات بیشتر به صفحه راهنمای ld در MacOS مراجعه کنید\&. .RE .PP \fB_APPLELINK_CURRENT_VERSION\fR .RS 4 ماکرویی (به‌طور پیش‌فرض یک تابع تولیدکننده) که برای ساخت پرچم‌های پیونددهنده به منظور تعیین پرچم \-current_version پیونددهنده apple به کار می‌رود\&. تولیدکننده پیش‌فرض از \fB$APPLELINK_CURRENT_VERSION\fR و \fB$APPLELINK_NO_CURRENT_VERSION\fR و \fB$SHLIBVERSION\fR برای تعیین پرچم مناسب استفاده می‌کند\&. .RE .PP \fBAPPLELINK_NO_COMPATIBILITY_VERSION\fR .RS 4 این مقدار را روی هر مقدار True (مانند 1|True|non\-empty string) تنظیم کنید تا اضافه کردن پرچم \-compatibility_version هنگام تولید کتابخانه‌های اشتراکی دارای نسخه غیرفعال شود\&. .sp این متغیر بر \fB$APPLELINK_COMPATIBILITY_VERSION\fR اولویت دارد\&. .RE .PP \fBAPPLELINK_NO_CURRENT_VERSION\fR .RS 4 این مقدار را روی هر مقدار True (مانند 1|True|non\-empty string) تنظیم کنید تا اضافه کردن پرچم \-current_version هنگام تولید کتابخانه‌های اشتراکی دارای نسخه غیرفعال شود\&. .sp این متغیر بر \fB$APPLELINK_CURRENT_VERSION\fR اولویت دارد\&. .RE .PP \fBAR\fR .RS 4 بایگان کتابخانه‌های ایستا\&. .RE .PP \fBARCHITECTURE\fR .RS 4 معماری سیستمی که بسته برای آن ساخته می‌شود را تعیین می‌کند\&. مقدار پیش‌فرض، معماری سیستم ماشینی است که SCons روی آن در حال اجرا است\&. این متغیر برای پر کردن فیلد Architecture: در فایل control مربوط به Ipkg، و فیلد BuildArch: در فایل \&.spec مربوط به RPM و همچنین تشکیل بخشی از نام فایل بسته RPM ایجاد شده استفاده می‌شود\&. .sp سازنده \fBPackage\fR را ببینید\&. .RE .PP \fBARCOM\fR .RS 4 خط فرمانی که برای ایجاد یک کتابخانه ایستا از فایل‌های شیء استفاده می‌شود\&. .RE .PP \fBARCOMSTR\fR .RS 4 رشته‌ای که هنگام ایجاد یک کتابخانه ایستا از فایل‌های شیء نمایش داده می‌شود\&. اگر این متغیر تنظیم نشده باشد، \fB$ARCOM\fR (خط فرمان) نمایش داده می‌شود\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(ARCOMSTR = "Archiving $TARGET") .fi .if n \{\ .RE .\} .RE .PP \fBARFLAGS\fR .RS 4 گزینه‌های عمومی که به بایگان کتابخانه‌های ایستا فرستاده می‌شوند\&. .RE .PP \fBAS\fR .RS 4 اسمبلر\&. .RE .PP \fBASCOM\fR .RS 4 خط فرمانی که برای ایجاد یک فایل شیء از یک فایل منبع زبان اسمبلی استفاده می‌شود\&. .RE .PP \fBASCOMSTR\fR .RS 4 رشته‌ای که هنگام ایجاد یک فایل شیء از یک فایل منبع زبان اسمبلی نمایش داده می‌شود\&. اگر این متغیر تنظیم نشده باشد، \fB$ASCOM\fR (خط فرمان) نمایش داده می‌شود\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(ASCOMSTR = "Assembling $TARGET") .fi .if n \{\ .RE .\} .RE .PP \fBASFLAGS\fR .RS 4 گزینه‌های عمومی ارسال‌شده به اسمبلر\&. .RE .PP \fBASPPCOM\fR .RS 4 خط فرمانی که برای اسمبل کردن یک فایل منبع زبان اسمبلی به یک فایل شیء، پس از عبور دادن اولیهٔ فایل از پیش‌پردازندهٔ C استفاده می‌شود\&. هر گزینه‌ای که در متغیرهای ساخت \fB$ASFLAGS\fR و \fB$CPPFLAGS\fR مشخص شده باشد، در این خط فرمان گنجانده می‌شود\&. .RE .PP \fBASPPCOMSTR\fR .RS 4 رشته‌ای که هنگام تولید یک فایل شیء از یک فایل منبع زبان اسمبلی پس از عبور دادن اولیهٔ فایل از پیش‌پردازندهٔ C نمایش داده می‌شود\&. اگر این مقدار تنظیم نشده باشد، \fB$ASPPCOM\fR (خط فرمان) نمایش داده می‌شود\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(ASPPCOMSTR = "Assembling $TARGET") .fi .if n \{\ .RE .\} .RE .PP \fBASPPFLAGS\fR .RS 4 گزینه‌های عمومی هنگام اسمبل کردن یک فایل منبع زبان اسمبلی به یک فایل شیء، پس از عبور دادن اولیهٔ فایل از پیش‌پردازندهٔ C\&. مقدار پیش‌فرض، استفاده از مقدار \fB$ASFLAGS\fR است\&. .RE .PP \fBBIBTEX\fR .RS 4 تولیدکنندهٔ کتاب‌شناسی برای قالب‌بند و حروف‌چین TeX و قالب‌بند و حروف‌چین ساختاریافتهٔ LaTeX\&. .RE .PP \fBBIBTEXCOM\fR .RS 4 خط فرمان مورد استفاده برای فراخوانی تولیدکنندهٔ کتاب‌شناسی برای قالب‌بند و حروف‌چین TeX و قالب‌بند و حروف‌چین ساختاریافتهٔ LaTeX\&. .RE .PP \fBBIBTEXCOMSTR\fR .RS 4 رشته‌ای که هنگام تولید یک کتاب‌شناسی برای TeX یا LaTeX نمایش داده می‌شود\&. اگر این مقدار تنظیم نشده باشد، \fB$BIBTEXCOM\fR (خط فرمان) نمایش داده می‌شود\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(BIBTEXCOMSTR = "Generating bibliography $TARGET") .fi .if n \{\ .RE .\} .RE .PP \fBBIBTEXFLAGS\fR .RS 4 گزینه‌های عمومی ارسال‌شده به تولیدکنندهٔ کتاب‌شناسی برای قالب‌بند و حروف‌چین TeX و قالب‌بند و حروف‌چین ساختاریافتهٔ LaTeX\&. .RE .PP \fBBUILDERS\fR .RS 4 یک دیکشنری که نام سازنده‌های (builders) در دسترس در محیط ساخت را به اشیاء Builder زیرین نگاشت می‌کند\&. سازنده‌های سفارشی برای در دسترس قرار گرفتن باید به این متغیر اضافه شوند\&. .sp فهرستی پیش‌فرض و وابسته به پلتفرم از سازنده‌ها مانند \fBProgram\fR، \fBLibrary\fR و غیره، هنگام مقداردهی اولیهٔ محیط ساخت بر اساس وجود یا عدم وجود ابزارهایی که این سازنده‌ها به آن‌ها وابسته‌اند، برای مقداردهی به این متغیر ساخت استفاده می‌شود\&. \fB$BUILDERS\fR می‌تواند بررسی شود تا مشخص گردد کدام سازنده‌ها در زمان اجرا واقعاً در دسترس خواهند بود\&. .sp توجه داشته باشید که اگر این متغیر ساخت را هنگام ایجاد محیط ساخت از طریق انتساب مقداردهی اولیه کنید، آن مقدار برای \fB$BUILDERS\fR جایگزین مقادیر پیش‌فرض خواهد شد: .sp .if n \{\ .RS 4 .\} .nf bld = Builder(action=\*(Aqfoobuild < $SOURCE > $TARGET\*(Aq) env = Environment(BUILDERS={\*(AqNewBuilder\*(Aq: bld}) .fi .if n \{\ .RE .\} .sp برای استفاده از یک شیء Builder جدید در کنار سازنده‌های پیش‌فرض، شیء Builder جدید خود را به این صورت اضافه کنید: .sp .if n \{\ .RS 4 .\} .nf env = Environment() env\&.Append(BUILDERS={\*(AqNewBuilder\*(Aq: bld}) .fi .if n \{\ .RE .\} .sp یا به این صورت: .sp .if n \{\ .RS 4 .\} .nf env = Environment() env[\*(AqBUILDERS\*(Aq][\*(AqNewBuilder\*(Aq] = bld .fi .if n \{\ .RE .\} .RE .PP \fBCACHEDIR_CLASS\fR .RS 4 نوع کلاسی که SCons باید هنگام نمونه‌سازی یک \fBCacheDir\fR جدید در این محیط ساخت استفاده کند\&. باید یک زیرکلاس از کلاس SCons\&.CacheDir\&.CacheDir باشد\&. .RE .PP \fBCC\fR .RS 4 کامپایلر C\&. .RE .PP \fBCCCOM\fR .RS 4 خط فرمانی که برای کامپایل یک فایل منبع C به یک فایل شیء (ایستا) استفاده می‌شود\&. هر گزینه‌ای که در متغیرهای ساخت \fB$CFLAGS\fR، \fB$CCFLAGS\fR و \fB$CPPFLAGS\fR مشخص شده باشد در این خط فرمان گنجانده می‌شود\&. همچنین برای کامپایل به اشیاء اشتراکی (shared objects)، \fB$SHCCCOM\fR را ببینید\&. .RE .PP \fBCCCOMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع C به یک فایل شیء (استاتیک) نمایش داده می‌شود\&. اگر تنظیم نشده باشد، \fB$CCCOM\fR (خط فرمان) نمایش داده می‌شود\&. همچنین برای کامپایل به اشیاء اشتراکی، \fB$SHCCCOMSTR\fR را ببینید\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(CCCOMSTR = "Compiling static object $TARGET") .fi .if n \{\ .RE .\} .RE .PP \fBCCDEPFLAGS\fR .RS 4 گزینه‌هایی که برای تولید فهرست فایل‌های وابستگی به کامپایلر C یا C++ ارسال می‌شوند\&. .sp این متغیر فقط توسط کامپایلرهایی که از این قابلیت پشتیبانی می‌کنند تنظیم می‌شود\&. (در حال حاضر gcc، clang و msvc) .RE .PP \fBCCFLAGS\fR .RS 4 گزینه‌های عمومی که به کامپایلرهای C و C++ ارسال می‌شوند\&. همچنین برای کامپایل به اشیاء اشتراکی، \fB$SHCCFLAGS\fR را ببینید\&. .RE .PP \fBCCPCHFLAGS\fR .RS 4 گزینه‌هایی که برای پشتیبانی از ساخت با سرآیندهای از‌پیش‌کامپایل‌شده به خط فرمان کامپایلر افزوده می‌شوند\&. مقدار پیش‌فرض در صورت تنظیم بودن متغیر ساخت \fB$PCH\fR، به گزینه‌های خط فرمان مناسب Microsoft Visual C++ بسط می‌یابد\&. .RE .PP \fBCCPDBFLAGS\fR .RS 4 گزینه‌هایی که برای پشتیبانی از ذخیره اطلاعات اشکال‌زدایی در یک فایل PDB متعلق به Microsoft Visual C++ به خط فرمان کامپایلر افزوده می‌شوند\&. مقدار پیش‌فرض در صورت تنظیم بودن متغیر ساخت \fB$PDB\fR، به گزینه‌های خط فرمان مناسب Microsoft Visual C++ بسط می‌یابد\&. .sp گزینه کامپایلر Microsoft Visual C++ که SCons به‌طور پیش‌فرض برای تولید اطلاعات PDB استفاده می‌کند، \fB/Z7\fR است\&. این گزینه به‌درستی با ساخت‌های موازی (\fB\-j\fR) کار می‌کند زیرا اطلاعات اشکال‌زدایی را در فایل‌های شیء واسط جاسازی می‌کند، بر خلاف به اشتراک گذاشتن یک فایل PDB واحد بین چندین فایل شیء\&. این همچنین تنها روش برای جاسازی اطلاعات اشکال‌زدایی در یک کتابخانه استاتیک است\&. استفاده از \fB/Zi\fR در عوض ممکن است کارایی زمان پیوند را بهبود بخشد، هرچند ساخت‌های موازی دیگر کار نخواهند کرد\&. .sp می‌توانید با بازنویسی متغیر پیش‌فرض \fB$CCPDBFLAGS\fR به صورت زیر، فایل‌های PDB را با سوئیچ \fB/Zi\fR تولید کنید: .sp .if n \{\ .RS 4 .\} .nf env[\*(AqCCPDBFLAGS\*(Aq] = [\*(Aq${(PDB and "/Zi /Fd%s" % File(PDB)) or ""}\*(Aq] .fi .if n \{\ .RE .\} .sp یک راهکار جایگزین، استفاده از \fB/Zi\fR برای قرار دادن اطلاعات اشکال‌زدایی در یک فایل \&.pdb جداگانه برای هر فایل شیء از طریق بازنویسی متغیر \fB$CCPDBFLAGS\fR به صورت زیر است: .sp .if n \{\ .RS 4 .\} .nf env[\*(AqCCPDBFLAGS\*(Aq] = \*(Aq/Zi /Fd${TARGET}\&.pdb\*(Aq .fi .if n \{\ .RE .\} .RE .PP \fBCCVERSION\fR .RS 4 شماره نسخه کامپایلر C\&. بسته به کامپایلر C خاصی که استفاده می‌شود، این متغیر ممکن است تنظیم شده باشد یا نباشد\&. .RE .PP \fBCFILESUFFIX\fR .RS 4 پسوند فایل‌های منبع C\&. این متغیر توسط سازنده درونی CFile هنگام تولید فایل‌های C از فایل‌های ورودی Lex (\&.l) یا YACC (\&.y) استفاده می‌شود\&. پسوند پیش‌فرض، البته، \&.c (حروف کوچک) است\&. در سیستم‌های غیرحساس به حروف کوچک و بزرگ (مانند Windows)،‏ SCons فایل‌های \&.C (حروف بزرگ) را نیز به عنوان فایل‌های C در نظر می‌گیرد\&. .RE .PP \fBCFLAGS\fR .RS 4 گزینه‌های عمومی که به کامپایلر C ارسال می‌شوند (فقط C؛ نه C++)\&. همچنین برای کامپایل به اشیاء اشتراکی، \fB$SHCFLAGS\fR را ببینید\&. .RE .PP \fBCHANGE_SPECFILE\fR .RS 4 یک قلاب برای اصلاح فایلی که ساخت بسته‌بندی را کنترل می‌کند (فایل \&.spec برای RPM، فایل control برای Ipkg، و فایل \&.wxs برای MSI)\&. در صورت تنظیم، این تابع پس از نوشته شدن الگوی SCons برای فایل فراخوانی خواهد شد\&. .sp سازنده \fBPackage\fR را ببینید\&. .RE .PP \fBCHANGED_SOURCES\fR .RS 4 یک نام متغیر رزرو شده که نباید در یک محیط ساخت تنظیم یا استفاده شود\&. (برای اطلاعات بیشتر به بخش "Variable Substitution" در صفحه راهنما مراجعه کنید)\&. .RE .PP \fBCHANGED_TARGETS\fR .RS 4 یک نام متغیر رزرو شده که نباید در یک محیط ساخت تنظیم یا استفاده شود\&. (برای اطلاعات بیشتر به بخش "Variable Substitution" در صفحه راهنما مراجعه کنید)\&. .RE .PP \fBCHANGELOG\fR .RS 4 نام فایلی شامل متن گزارش تغییرات که باید در بسته گنجانده شود\&. این متن به عنوان بخش %changelog در فایل \&.spec مربوط به RPM گنجانده می‌شود\&. .sp سازنده \fBPackage\fR را ببینید\&. .RE .PP \fBCOMPILATIONDB_COMSTR\fR .RS 4 رشته‌ای که هنگام اجرای کنش سازندهٔ \fBCompilationDatabase\fR نمایش داده می‌شود\&. .RE .PP \fBCOMPILATIONDB_PATH_FILTER\fR .RS 4 رشته‌ای که به \fBCompilationDatabase\fR دستور می‌دهد تنها مدخل‌هایی را شامل شود که در آن‌ها عضو output با استفاده از fnmatch (که از نویسه‌های عمومی به سبک glob استفاده می‌کند) با الگوی موجود در رشتهٔ فیلتر مطابقت دارد\&. .sp مقدار پیش‌فرض یک رشتهٔ خالی \*(Aq\*(Aq است که فیلتر کردن را غیرفعال می‌کند\&. .RE .PP \fBCOMPILATIONDB_USE_ABSPATH\fR .RS 4 یک پرچم بولی (boolean) برای تعیین اینکه آیا \fBCompilationDatabase\fR اعضای file و output را در پایگاه‌دادهٔ کامپایل با استفاده از مسیرهای مطلق بنویسد یا نسبی\&. .sp مقدار پیش‌فرض False است (استفاده از مسیرهای نسبی)\&. .RE .PP \fB_concat\fR .RS 4 تابعی که برای تولید متغیرهایی مانند \fB$_CPPINCFLAGS\fR استفاده می‌شود\&. این تابع چهار آرگومان اجباری و تا ۴ آرگومان اختیاری دیگر می‌پذیرد: ۱) یک پیشوند برای الحاق به هر عنصر، ۲) فهرستی از عناصر، ۳) یک پسوند برای الحاق به هر عنصر، ۴) یک محیط برای درون‌یابی متغیرها، ۵) یک تابع اختیاری که پیش از الحاق برای تبدیل فهرست فراخوانی می‌شود، ۶) یک هدف مشخص‌شدهٔ اختیاری (می‌تواند از TARGET استفاده کند)، ۷) یک منبع مشخص‌شدهٔ اختیاری (می‌تواند از SOURCE استفاده کند)، ۸) پرچم اختیاری \fIaffect_signature\fR که مقدار بازگشتی غیرخالی را با $( و $) احاطه می‌کند تا نشان دهد محتویات نباید بر امضای (signature) خط فرمان تولیدشده تأثیر بگذارند\&. .sp .if n \{\ .RS 4 .\} .nf env[\*(Aq_CPPINCFLAGS\*(Aq] = \*(Aq${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs, TARGET, SOURCE, affect_signature=False)}\*(Aq .fi .if n \{\ .RE .\} .RE .PP \fBCONFIGUREDIR\fR .RS 4 نام دایرکتوری‌ای که فایل‌های آزمون بافت Configure در آن نوشته می‌شوند\&. پیش‌فرض \&.sconf_temp در دایرکتوری سطح بالا حاوی فایل SConstruct است\&. .sp اگر دایرکتوری‌های گونه (variant directories) در حال استفاده باشند و نتایج بررسی configure نباید بین گونه‌ها به اشتراک گذاشته شوند، می‌توانید \fB$CONFIGUREDIR\fR و \fB$CONFIGURELOG\fR را طوری تنظیم کنید که به ازای هر دایرکتوری گونه یکتا باشند\&. .RE .PP \fBCONFIGURELOG\fR .RS 4 نام فایل وقایع (log) بافت \fBConfigure\fR\&. پیش‌فرض config\&.log در دایرکتوری سطح بالا حاوی فایل SConstruct است\&. .sp اگر دایرکتوری‌های گونه در حال استفاده باشند و نتایج بررسی configure نباید بین گونه‌ها به اشتراک گذاشته شوند، می‌توانید \fB$CONFIGUREDIR\fR و \fB$CONFIGURELOG\fR را طوری تنظیم کنید که به ازای هر دایرکتوری گونه یکتا باشند\&. .RE .PP \fB_CPPDEFFLAGS\fR .RS 4 یک متغیر ساخت که به‌صورت خودکار تولید شده و حاوی گزینه‌های خط فرمان پیش‌پردازندهٔ C برای تعریف مقادیر است\&. مقدار \fB$_CPPDEFFLAGS\fR به‌ترتیب با پیشوند کردن و پسوند کردن \fB$CPPDEFPREFIX\fR و \fB$CPPDEFSUFFIX\fR به هر تعریف در \fB$CPPDEFINES\fR ایجاد می‌شود\&. .RE .PP \fBCPPDEFINES\fR .RS 4 مشخصه‌ای مستقل از سکو برای تعاریف ماکروی پیش‌پردازندهٔ C\&. تعاریف از طریق متغیر ساخت خودکار تولیدشدهٔ \fB$_CPPDEFFLAGS\fR که بر اساس محتویات \fB$CPPDEFINES\fR ساخته می‌شود، به خطوط فرمان افزوده می‌شوند: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} اگر \fB$CPPDEFINES\fR یک رشته باشد، مقادیر متغیرهای ساخت \fB$CPPDEFPREFIX\fR و \fB$CPPDEFSUFFIX\fR به‌صورت جداگانه بر اساس فواصل خالی (whitespace)، به‌ترتیب به هر تعریف در \fB$CPPDEFINES\fR پیشوند و پسوند می‌شوند\&. .sp .if n \{\ .RS 4 .\} .nf # Adds \-Dxyz to POSIX compiler command lines, # and /Dxyz to Microsoft Visual C++ command lines\&. env = Environment(CPPDEFINES=\*(Aqxyz\*(Aq) .fi .if n \{\ .RE .\} .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} اگر \fB$CPPDEFINES\fR یک فهرست باشد، مقادیر متغیرهای ساخت \fB$CPPDEFPREFIX\fR و \fB$CPPDEFSUFFIX\fR به‌ترتیب به هر عنصر در فهرست پیشوند و پسوند می‌شوند\&. اگر هر عنصری یک چندتایی (tuple) یا فهرست باشد، جزءِ نخست چندتایی نام ماکرو و جزءِ دوم تعریف ماکرو است\&. اگر مقدار تعریف حذف نشده یا None نباشد، نام و تعریف پیش از پیشوند/پسوند شدن در یک آیتم واحد به‌صورت name=definition ترکیب می‌شوند\&. .sp .if n \{\ .RS 4 .\} .nf # Adds \-DB=2 \-DA to POSIX compiler command lines, # and /DB=2 /DA to Microsoft Visual C++ command lines\&. env = Environment(CPPDEFINES=[(\*(AqB\*(Aq, 2), \*(AqA\*(Aq]) .fi .if n \{\ .RE .\} .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} اگر \fB$CPPDEFINES\fR یک فرهنگ‌لغت (dictionary) باشد، مقادیر متغیرهای ساخت \fB$CPPDEFPREFIX\fR و \fB$CPPDEFSUFFIX\fR به‌ترتیب به هر کلید از فرهنگ‌لغت پیشوند و پسوند می‌شوند\&. اگر مقدار برای یک کلید None نباشد، آنگاه کلید (نام ماکرو) و مقدار (تعریف ماکرو) پیش از پیشوند/پسوند شدن در یک آیتم واحد به‌صورت name=definition ترکیب می‌شوند\&. .sp .if n \{\ .RS 4 .\} .nf # Adds \-DA \-DB=2 to POSIX compiler command lines, # or /DA /DB=2 to Microsoft Visual C++ command lines\&. env = Environment(CPPDEFINES={\*(AqB\*(Aq:2, \*(AqA\*(Aq:None}) .fi .if n \{\ .RE .\} .RE .sp بسته به نحوهٔ افزودن محتویات به \fB$CPPDEFINES\fR، ممکن است به یک نوع مرکب تبدیل شود؛ برای نمونه فهرستی حاوی رشته‌ها، چندتایی‌ها و/یا فرهنگ‌لغت‌ها\&. SCons می‌تواند چنین نوع مرکبی را به‌درستی بسط دهد\&. .sp توجه داشته باشید که SCons ممکن است کامپایلر را از طریق یک شل فراخوانی کند\&. اگر تعریف یک ماکرو حاوی نویسه‌هایی مانند فاصله‌ها باشد که برای شل معنای خاصی دارند، یا در نظر باشد که یک مقدار رشته‌ای باشد، ممکن است لازم باشد از نحو نقل‌قول (quoting) شل استفاده کنید تا پیش از دیده‌شدن توسط پیش‌پردازنده، توسط شل تفسیر نشود\&. ماکروهای تابع‌گونه (function\-like) از طریق این سازوکار پشتیبانی نمی‌شوند (و برخی کامپایلرها حتی چنین قابلیتی را از طریق خط فرمان پیاده‌سازی نمی‌کنند)\&. هنگام استفاده از نقل‌قول، توجه داشته باشید که یک جفت نویسهٔ نقل‌قول برای تعریف یک رشته در Python استفاده می‌شود و نقل‌قول‌های جاسازی‌شده در درون آن، مگر اینکه گریز داده شده باشند (escaped)، توسط شل مصرف خواهند شد\&. این مثال‌ها ممکن است به درک موضوع کمک کنند: .sp .if n \{\ .RS 4 .\} .nf env = Environment(CPPDEFINES=[\*(AqUSE_ALT_HEADER=\e\e"foo_alt\&.h\e\e"\*(Aq]) env = Environment(CPPDEFINES=[(\*(AqUSE_ALT_HEADER\*(Aq, \*(Aq\e\e"foo_alt\&.h\e\e"\*(Aq)]) .fi .if n \{\ .RE .\} .sp :\fIتغییریافته در نسخهٔ 4\&.5\fR: SCons دیگر مقادیر \fB$CPPDEFINES\fR که در قالب فرهنگ‌لغت وارد شده‌اند را مرتب‌سازی نمی‌کند\&. Python اکنون کلیدهای فرهنگ‌لغت را به ترتیبی که وارد شده‌اند نگه‌داری می‌کند، بنابراین برای تضمین یک خط فرمان پایدار دیگر نیازی به مرتب‌سازی آن‌ها نیست\&. .RE .PP \fBCPPDEFPREFIX\fR .RS 4 پیشوندی که برای مشخص کردن تعاریف ماکروی پیش‌پردازنده در خط فرمان کامپایلر C استفاده می‌شود\&. این پیشوند هنگام تولید خودکار متغیر \fB$_CPPDEFFLAGS\fR، به ابتدای هر تعریف در متغیر ساخت \fB$CPPDEFINES\fR اضافه خواهد شد\&. .RE .PP \fBCPPDEFSUFFIX\fR .RS 4 پسوندی که برای مشخص کردن تعاریف ماکروی پیش‌پردازنده در خط فرمان کامپایلر C استفاده می‌شود\&. این پسوند هنگام تولید خودکار متغیر \fB$_CPPDEFFLAGS\fR، به انتهای هر تعریف در متغیر ساخت \fB$CPPDEFINES\fR اضافه خواهد شد\&. .RE .PP \fBCPPFLAGS\fR .RS 4 گزینه‌های پیش‌پردازندهٔ C مشخص‌شده توسط کاربر\&. این گزینه‌ها در هر دستوری که از پیش‌پردازندهٔ C استفاده می‌کند گنجانده خواهند شد؛ شامل نه تنها کامپایل فایل‌های منبع C و C++ از طریق خطوط فرمان \fB$CCCOM\fR، \fB$SHCCCOM\fR، \fB$CXXCOM\fR و \fB$SHCXXCOM\fR، بلکه خطوط فرمان \fB$FORTRANPPCOM\fR، \fB$SHFORTRANPPCOM\fR، \fB$F77PPCOM\fR و \fB$SHF77PPCOM\fR که برای کامپایل فایل منبع Fortran استفاده می‌شوند، و خط فرمان \fB$ASPPCOM\fR که برای اسمبل کردن یک فایل منبع زبان اسمبلی (پس از عبور دادن اولیه هر فایل از پیش‌پردازندهٔ C) به کار می‌رود\&. توجه داشته باشید که این متغیر شامل گزینه‌های مسیر جستجوی include مانند \fB\-I\fR (یا مشابه آن) که scons به‌طور خودکار از \fB$CPPPATH\fR تولید می‌کند \fIنیست\fR\&. برای متغیری که به آن گزینه‌ها بسط می‌یابد، \fB$_CPPINCFLAGS\fR را در ادامه ببینید\&. .RE .PP \fB_CPPINCFLAGS\fR .RS 4 یک متغیر ساخت که به‌طور خودکار تولید می‌شود و شامل گزینه‌های خط فرمان پیش‌پردازندهٔ C برای تعیین دایرکتوری‌هایی است که باید برای یافتن فایل‌های include جستجو شوند\&. مقدار \fB$_CPPINCFLAGS\fR به ترتیب با اضافه کردن \fB$INCPREFIX\fR به ابتدا و \fB$INCSUFFIX\fR به انتهای هر دایرکتوری در \fB$CPPPATH\fR ایجاد می‌شود\&. .RE .PP \fBCPPPATH\fR .RS 4 فهرست دایرکتوری‌هایی که پیش‌پردازندهٔ C آن‌ها را برای دایرکتوری‌های include جستجو می‌کند\&. پویشگر وابستگی‌های ضمنی C/C++ این دایرکتوری‌ها را برای فایل‌های include جستجو خواهد کرد\&. به‌طور کلی، توصیه نمی‌شود که دستورالعمل‌های دایرکتوری include مستقیماً درون \fB$CCFLAGS\fR یا \fB$CXXFLAGS\fR قرار داده شوند، زیرا نتیجه غیرقابل‌حمل خواهد بود و دایرکتوری‌ها توسط پویشگر وابستگی جستجو نخواهند شد\&. \fB$CPPPATH\fR باید فهرستی از رشته‌های مسیر، یا یک رشتهٔ تکی باشد، نه فهرستی از مسیرها که با نویسهٔ os\&.pathsep در Python به یکدیگر متصل شده باشند\&. .sp نکته: نام‌های دایرکتوری در \fB$CPPPATH\fR هنگامی که در یک دستور به کار می‌روند، نسبت به دایرکتوری فایل SConscript جستجو خواهند شد\&. برای وادار کردن \fBscons\fR به جستجوی یک دایرکتوری نسبت به ریشهٔ درخت منبع، از پیشوند # استفاده کنید: .sp .if n \{\ .RS 4 .\} .nf env = Environment(CPPPATH=\*(Aq#/include\*(Aq) .fi .if n \{\ .RE .\} .sp همچنین می‌توان جستجوی دایرکتوری را با استفاده از تابع \fBDir\fR اجبار کرد: .sp .if n \{\ .RS 4 .\} .nf include = Dir(\*(Aqinclude\*(Aq) env = Environment(CPPPATH=include) .fi .if n \{\ .RE .\} .sp فهرست دایرکتوری‌ها از طریق متغیر ساخت تولیدشده به‌طور خودکارِ \fB$_CPPINCFLAGS\fR به خطوط فرمان اضافه می‌شود؛ این متغیر با افزودن مقادیر متغیرهای ساخت \fB$INCPREFIX\fR و \fB$INCSUFFIX\fR به ترتیب به ابتدا و انتهای هر دایرکتوری در \fB$CPPPATH\fR ساخته می‌شود\&. هر خط فرمانی که تعریف می‌کنید و به فهرست دایرکتوری‌های \fB$CPPPATH\fR نیاز دارد باید شامل \fB$_CPPINCFLAGS\fR باشد: .sp .if n \{\ .RS 4 .\} .nf env = Environment(CCCOM="my_compiler $_CPPINCFLAGS \-c \-o $TARGET $SOURCE") .fi .if n \{\ .RE .\} .RE .PP \fBCPPSUFFIXES\fR .RS 4 فهرست پسوندهای فایل‌هایی که برای وابستگی‌های ضمنی پیش‌پردازندهٔ C (خطوط #include) پویش خواهند شد\&. فهرست پیش‌فرض عبارت است از: .sp .if n \{\ .RS 4 .\} .nf ["\&.c", "\&.C", "\&.cxx", "\&.cpp", "\&.c++", "\&.cc", "\&.h", "\&.H", "\&.hxx", "\&.hpp", "\&.hh", "\&.F", "\&.fpp", "\&.FPP", "\&.m", "\&.mm", "\&.S", "\&.spp", "\&.SPP"] .fi .if n \{\ .RE .\} .RE .PP \fBCXX\fR .RS 4 کامپایلر C++\&. همچنین برای کامپایل به اشیاء مشترک (shared objects)، \fB$SHCXX\fR را ببینید\&. .RE .PP \fBCXXCOM\fR .RS 4 خط فرمانی که برای کامپایل یک فایل منبع C++ به یک فایل شیء استفاده می‌شود\&. هر گزینه‌ای که در متغیرهای ساخت \fB$CXXFLAGS\fR و \fB$CPPFLAGS\fR مشخص شده باشد در این خط فرمان گنجانده می‌شود\&. همچنین برای کامپایل به اشیاء مشترک (shared objects) به \fB$SHCXXCOM\fR مراجعه کنید\&. .RE .PP \fBCXXCOMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع C++ به یک فایل شیء (ایستا) نمایش داده می‌شود\&. اگر تنظیم نشده باشد، \fB$CXXCOM\fR (خط فرمان) نمایش داده می‌شود\&. همچنین برای کامپایل به اشیاء مشترک به \fB$SHCXXCOMSTR\fR مراجعه کنید\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(CXXCOMSTR = "Compiling static object $TARGET") .fi .if n \{\ .RE .\} .RE .PP \fBCXXFILESUFFIX\fR .RS 4 پسوند فایل‌های منبع C++\&. این پسوند توسط سازنده داخلی CXXFile هنگام تولید فایل‌های C++ از فایل‌های ورودی Lex (\&.ll) یا YACC (\&.yy) استفاده می‌شود\&. پسوند پیش‌فرض \&.cc است\&. SCons همچنین با فایل‌های دارای پسوندهای \&.cpp، \&.cxx، \&.c++، و \&.C++ مانند فایل‌های C++ رفتار می‌کند، و فایل‌های با پسوند \&.mm را به عنوان فایل‌های Objective\-C++ در نظر می‌گیرد\&. در سیستم‌های حساس به بزرگ و کوچکی حروف (Linux، UNIX و سایر مشابه‌های POSIX)، SCons با فایل‌های \&.C (حروف بزرگ) نیز به عنوان فایل‌های C++ رفتار می‌کند\&. .RE .PP \fBCXXFLAGS\fR .RS 4 گزینه‌های عمومی که به کامپایلر C++ ارسال می‌شوند\&. به‌طور پیش‌فرض، این متغیر شامل مقدار \fB$CCFLAGS\fR است، به طوری که تنظیم \fB$CCFLAGS\fR بر روی کامپایل هر دو زبان C و C++ تأثیر می‌گذارد\&. اگر می‌خواهید پرچم‌های اختصاصی C++ را اضافه کنید، باید مقدار \fB$CXXFLAGS\fR را تنظیم یا بازنویسی کنید\&. همچنین برای کامپایل به اشیاء مشترک به \fB$SHCXXFLAGS\fR مراجعه کنید\&. .RE .PP \fBCXXVERSION\fR .RS 4 شماره نسخه کامپایلر C++\&. این مقدار بسته به کامپایلر C++ خاصِ مورد استفاده، ممکن است تنظیم شده یا نشده باشد\&. .RE .PP \fBDC\fR .RS 4 کامپایلر D مورد استفاده\&. SCons ماژول‌های ابزاری را برای سه سیستم کامپایل D فراهم می‌کند: DMD (dmd)، کامپایلر مرجع؛ LDC (ldc)، کامپایلر D مبتنی بر LLVM؛ و GDC (gdc)، از مجموعه‌ی کامپایلرهای گنو (GNU Compiler Collection)، که به همین ترتیب جستجو می‌شوند\&. اگر نیاز به اولویت دادن به یک کامپایلر خاص دارید، از یک مشخص‌کننده ابزار استفاده کنید\&. همچنین برای کامپایل به اشیاء مشترک به \fB$SHDC\fR مراجعه کنید\&. .RE .PP \fBDCOM\fR .RS 4 خط فرمانی که برای کامپایل یک فایل D به یک فایل شیء استفاده می‌شود\&. هر گزینه‌ای که در متغیر ساخت \fB$DFLAGS\fR مشخص شده باشد در این خط فرمان گنجانده می‌شود\&. همچنین برای کامپایل به اشیاء مشترک به \fB$SHDCOM\fR مراجعه کنید\&. علاوه بر این، برای چگونگی کامپایل مستقیم به یک فایل اجرایی بدون ایجاد فایل‌های شیء میانی، سازنده \fBProgramAllAtOnce\fR را ببینید\&. .RE .PP \fBDCOMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع D به یک فایل شیء نمایش داده می‌شود\&. اگر تنظیم نشده باشد، \fB$DCOM\fR (خط فرمان) نمایش داده می‌شود\&. همچنین برای کامپایل به اشیاء مشترک به \fB$SHDCOMSTR\fR مراجعه کنید\&. .RE .PP \fBDDEBUG\fR .RS 4 برچسب‌های اشکال‌زدایی (debug tags) برای فعال‌سازی هنگام کامپایل\&. .RE .PP \fBDDEBUGPREFIX\fR .RS 4 پیشوند مورد استفاده برای برچسب‌های اشکال‌زدایی از \fB$DDEBUG\fR\&. مقادیر پیش‌فرض بسته به کامپایلر D متفاوت است\&. .RE .PP \fBDDEBUGSUFFIX\fR .RS 4 پسوند مورد استفاده برای برچسب‌های اشکال‌زدایی از \fB$DDEBUG\fR\&. .RE .PP \fBDESCRIPTION\fR .RS 4 توضیحات طولانی پروژه‌ای که بسته‌بندی می‌شود\&. این متن در بخش مربوطه از فایلی که ساخت بسته‌بندی را کنترل می‌کند گنجانده می‌شود\&. .sp سازنده \fBPackage\fR را ببینید\&. .RE .PP \fBDESCRIPTION_lang\fR .RS 4 توضیحات طولانی خاص یک زبان برای \fIlang\fR مشخص‌شده\&. این برای پر کردن بخش %description \-l در یک فایل \&.spec مربوط به RPM استفاده می‌شود\&. .sp سازنده \fBPackage\fR را ببینید\&. .RE .PP \fBDFILESUFFIX\fR .RS 4 پسوند فایل برای فایل‌های منبع D\&. مقدار پیش‌فرض \&.d است\&. .RE .PP \fBDFLAGPREFIX\fR .RS 4 پیشوندی که به هر عنصر از \fB$DFLAGS\fR اضافه می‌شود\&. .RE .PP \fBDFLAGS\fR .RS 4 گزینه‌های عمومی که به کامپایلر D ارسال می‌شوند\&. .RE .PP \fBDFLAGSUFFIX\fR .RS 4 پسوندی که به هر عنصر از \fB$DFLAGS\fR اضافه می‌شود\&. .RE .PP \fBDI_FILE_DIR\fR .RS 4 مسیر جستجوی فایل‌های رابط D، که ترجمه فایل‌های سرآیند C هستند\&. .RE .PP \fBDI_FILE_DIR_PREFIX\fR .RS 4 پیشوند اضافه‌شده به نام دایرکتوری فایل‌های رابط D از \fB$DI_FILE_DIR\fR\&. .RE .PP \fBDI_FILE_DIR_SUFFFIX\fR .RS 4 پسوند اضافه‌شده به نام دایرکتوری فایل‌های رابط D از \fB$DI_FILE_DIR\fR\&. .RE .PP \fBDI_FILE_SUFFIX\fR .RS 4 پسوند فایل‌های رابط D، که ترجمه فایل‌های سرآیند C هستند\&. مقدار پیش‌فرض \&.di است\&. .RE .PP \fBDINCPREFIX\fR .RS 4 پیشوند اضافه‌شده به هر مسیر در \fB$DPATH\fR\&. .RE .PP \fBDINCSUFFIX\fR .RS 4 پسوند اضافه‌شده به هر مسیر در \fB$DPATH\fR\&. .RE .PP \fBDir\fR .RS 4 تابعی که یک رشته را به یک نمونه Dir نسبت به هدف در حال ساخت تبدیل می‌کند\&. .RE .PP \fBDirs\fR .RS 4 تابعی که فهرستی از رشته‌ها را به فهرستی از نمونه‌های Dir نسبت به هدف در حال ساخت تبدیل می‌کند\&. .RE .PP \fBDLIB\fR .RS 4 نام ابزار کتابخانه ایستا برای کدهای D\&. .RE .PP \fBDLIBCOM\fR .RS 4 خط فرمانی که هنگام پیوند دادن یک کتابخانه ایستا استفاده می‌شود\&. .RE .PP \fBDLIBDIRPREFIX\fR .RS 4 پیشوند خط فرمان برای دایرکتوری‌های جستجوی کتابخانه از \fB$LIBPATH\fR هنگام پیوند دادن کد D\&. .RE .PP \fBDLIBDIRSUFFIX\fR .RS 4 پسوند خط فرمان برای دایرکتوری‌های جستجوی کتابخانه از \fB$LIBPATH\fR هنگام پیوند دادن کد D\&. .RE .PP \fBDLIBFLAGPREFIX\fR .RS 4 پیشوند اضافه‌شده به هر عنصر از \fB$DLIBFLAGS\fR\&. .RE .PP \fBDLIBFLAGS\fR .RS 4 پرچم‌هایی که باید به ابزار کتابخانه ارسال شوند\&. .RE .PP \fBDLIBFLAGSUFFIX\fR .RS 4 پسوند اضافه‌شده به هر عنصر از \fB$DLIBFLAGS\fR\&. .RE .PP \fBDLIBLINKPREFIX\fR .RS 4 پیشوند اضافه‌شده به نام هر کتابخانه از \fB$LIBS\fR\&. .RE .PP \fBDLIBLINKSUFFIX\fR .RS 4 پسوند اضافه‌شده به نام هر کتابخانه از \fB$LIBS\fR\&. .RE .PP \fBDLINK\fR .RS 4 نام پیونددهنده‌ای که برای پیوند سامانه‌های شامل سورس‌های D استفاده می‌شود\&. همچنین برای پیوند دادن شیءهای اشتراکی به \fB$SHDLINK\fR مراجعه کنید\&. .RE .PP \fBDLINKCOM\fR .RS 4 خط فرمانی که برای پیوند دادن سامانه‌های شامل سورس‌های D استفاده می‌شود\&. همچنین برای پیوند دادن شیءهای اشتراکی به \fB$SHDLINKCOM\fR مراجعه کنید\&. .RE .PP \fBDLINKFLAGPREFIX\fR .RS 4 پیشوند اضافه‌شده به هر عنصر از \fB$DLINKFLAGS\fR\&. .RE .PP \fBDLINKFLAGS\fR .RS 4 پرچم‌های پیونددهنده\&. همچنین برای پیوند دادن شیءهای اشتراکی به \fB$SHDLINKFLAGS\fR مراجعه کنید\&. .RE .PP \fBDLINKFLAGSUFFIX\fR .RS 4 پسوند اضافه‌شده به هر عنصر از \fB$DLINKFLAGS\fR\&. .RE .PP \fBDOCBOOK_DEFAULT_XSL_EPUB\fR .RS 4 فایل XSLT پیش‌فرض برای سازنده \fBDocbookEpub\fR در محیط فعلی، در صورتی که هیچ XSLT دیگری از طریق کلمه کلیدی مشخص نشده باشد\&. .RE .PP \fBDOCBOOK_DEFAULT_XSL_HTML\fR .RS 4 فایل XSLT پیش‌فرض برای سازنده \fBDocbookHtml\fR در محیط فعلی، در صورتی که هیچ XSLT دیگری از طریق کلمه کلیدی مشخص نشده باشد\&. .RE .PP \fBDOCBOOK_DEFAULT_XSL_HTMLCHUNKED\fR .RS 4 فایل XSLT پیش‌فرض برای سازنده \fBDocbookHtmlChunked\fR در محیط فعلی، در صورتی که هیچ XSLT دیگری از طریق کلمه کلیدی مشخص نشده باشد\&. .RE .PP \fBDOCBOOK_DEFAULT_XSL_HTMLHELP\fR .RS 4 فایل XSLT پیش‌فرض برای سازندهٔ \fBDocbookHtmlhelp\fR درون محیط فعلی، در صورتی که هیچ XSLT دیگری از طریق کلمهٔ کلیدی مشخص نشده باشد\&. .RE .PP \fBDOCBOOK_DEFAULT_XSL_MAN\fR .RS 4 فایل XSLT پیش‌فرض برای سازندهٔ \fBDocbookMan\fR درون محیط فعلی، در صورتی که هیچ XSLT دیگری از طریق کلمهٔ کلیدی مشخص نشده باشد\&. .RE .PP \fBDOCBOOK_DEFAULT_XSL_PDF\fR .RS 4 فایل XSLT پیش‌فرض برای سازندهٔ \fBDocbookPdf\fR درون محیط فعلی، در صورتی که هیچ XSLT دیگری از طریق کلمهٔ کلیدی مشخص نشده باشد\&. .RE .PP \fBDOCBOOK_DEFAULT_XSL_SLIDESHTML\fR .RS 4 فایل XSLT پیش‌فرض برای سازندهٔ \fBDocbookSlidesHtml\fR درون محیط فعلی، در صورتی که هیچ XSLT دیگری از طریق کلمهٔ کلیدی مشخص نشده باشد\&. .RE .PP \fBDOCBOOK_DEFAULT_XSL_SLIDESPDF\fR .RS 4 فایل XSLT پیش‌فرض برای سازندهٔ \fBDocbookSlidesPdf\fR درون محیط فعلی، در صورتی که هیچ XSLT دیگری از طریق کلمهٔ کلیدی مشخص نشده باشد\&. .RE .PP \fBDOCBOOK_FOP\fR .RS 4 مسیر به رندرکنندهٔ PDF fop یا xep، در صورتی که یکی از آن‌ها نصب شده باشد (ابتدا fop بررسی می‌شود)\&. .RE .PP \fBDOCBOOK_FOPCOM\fR .RS 4 خط فرمان کامل برای رندرکنندهٔ PDF fop یا xep\&. .RE .PP \fBDOCBOOK_FOPCOMSTR\fR .RS 4 رشته‌ای که هنگام استفاده از یک رندرکننده مانند fop یا xep برای ایجاد خروجی PDF از یک فایل XML نمایش داده می‌شود\&. .RE .PP \fBDOCBOOK_FOPFLAGS\fR .RS 4 پرچم‌های خط فرمان اضافی برای رندرکنندهٔ PDF fop یا xep\&. .RE .PP \fBDOCBOOK_XMLLINT\fR .RS 4 مسیر به فایل اجرایی خارجی xmllint، در صورت نصب بودن آن\&. توجه داشته باشید که این متغیر تنها به عنوان آخرین راهکار جایگزین برای حل XIncludeها استفاده می‌شود، در صورتی که هیچ بایندینگ پایتون برای lxml در سیستم فعلی قابل درون‌ریزی نباشد\&. .RE .PP \fBDOCBOOK_XMLLINTCOM\fR .RS 4 خط فرمان کامل برای فایل اجرایی خارجی xmllint\&. .RE .PP \fBDOCBOOK_XMLLINTCOMSTR\fR .RS 4 رشته‌ای که هنگام استفاده از xmllint برای حل XIncludeها برای یک فایل XML داده‌شده نمایش داده می‌شود\&. .RE .PP \fBDOCBOOK_XMLLINTFLAGS\fR .RS 4 پرچم‌های خط فرمان اضافی برای فایل اجرایی خارجی xmllint\&. .RE .PP \fBDOCBOOK_XSLTPROC\fR .RS 4 مسیر به فایل اجرایی خارجی xsltproc (یا saxon، xalan)، در صورتی که یکی از آن‌ها نصب شده باشد\&. توجه داشته باشید که این متغیر تنها به عنوان آخرین راهکار جایگزین برای تبدیلات XSL استفاده می‌شود، در صورتی که هیچ بایندینگ پایتون برای lxml در سیستم فعلی قابل درون‌ریزی نباشد\&. .RE .PP \fBDOCBOOK_XSLTPROCCOM\fR .RS 4 خط فرمان کامل برای فایل اجرایی خارجی xsltproc (یا saxon، xalan)\&. .RE .PP \fBDOCBOOK_XSLTPROCCOMSTR\fR .RS 4 رشته‌ای که هنگام استفاده از xsltproc برای تبدیل یک فایل XML از طریق یک شیوه‌نامهٔ XSLT داده‌شده نمایش داده می‌شود\&. .RE .PP \fBDOCBOOK_XSLTPROCFLAGS\fR .RS 4 پرچم‌های خط فرمان اضافی برای فایل اجرایی خارجی xsltproc (یا saxon، xalan)\&. .RE .PP \fBDOCBOOK_XSLTPROCPARAMS\fR .RS 4 پارامترهای اضافی که نه برای فایل اجرایی پردازشگر XSLT، بلکه برای خود پردازش XSL در نظر گرفته شده‌اند\&. به‌طور پیش‌فرض، این پارامترها به ترتیب به انتهای خط فرمان برای saxon و saxon\-xslt پیوست می‌شوند\&. .RE .PP \fBDPATH\fR .RS 4 فهرست مسیرها برای جستجوی ماژول‌های وارداتی (import modules)\&. .RE .PP \fBDRPATHPREFIX\fR .RS 4 پیشوندی که هنگام تولید اشیاء اشتراکی (shared objects) به مدخل‌های rpath اضافه می‌شود\&. .RE .PP \fBDRPATHSUFFIX\fR .RS 4 پسوندی که هنگام تولید اشیاء اشتراکی (shared objects) به مدخل‌های rpath اضافه می‌شود\&. .RE .PP \fBDSUFFIXES\fR .RS 4 فهرست پسوندهای فایل‌هایی که برای یافتن فایل‌های بسته واردشدهٔ D پویش خواهند شد\&. فهرست پیش‌فرض [\*(Aq\&.d\*(Aq] است\&. .RE .PP \fBDVERPREFIX\fR .RS 4 پیشوندی که به هر عنصر از \fB$DVERSIONS\fR اضافه می‌شود\&. .RE .PP \fBDVERSIONS\fR .RS 4 فهرست برچسب‌های نسخه برای فعال‌سازی هنگام کامپایل\&. .RE .PP \fBDVERSUFFIX\fR .RS 4 پسوندی که به هر عنصر از \fB$DVERSIONS\fR اضافه می‌شود\&. .RE .PP \fBDVIPDF\fR .RS 4 مبدل فایل TeX DVI به فایل PDF\&. .RE .PP \fBDVIPDFCOM\fR .RS 4 خط فرمانی که برای تبدیل فایل‌های TeX DVI به یک فایل PDF استفاده می‌شود\&. .RE .PP \fBDVIPDFCOMSTR\fR .RS 4 رشته‌ای که هنگام تبدیل یک فایل TeX DVI به یک فایل PDF نمایش داده می‌شود\&. اگر این متغیر تنظیم نشده باشد، مقدار \fB$DVIPDFCOM\fR (خط فرمان) نمایش می‌یابد\&. .RE .PP \fBDVIPDFFLAGS\fR .RS 4 گزینه‌های عمومی ارسالی به مبدل فایل TeX DVI به فایل PDF\&. .RE .PP \fBDVIPS\fR .RS 4 مبدل فایل TeX DVI به PostScript\&. .RE .PP \fBDVIPSFLAGS\fR .RS 4 گزینه‌های عمومی ارسالی به مبدل فایل TeX DVI به PostScript\&. .RE .PP \fBENV\fR .RS 4 محیط اجرا (execution environment) \- دیکشنری متغیرهای محیطی مورد استفاده هنگامی که SCons دستورهای خارجی را برای ساخت هدف‌های تعریف‌شده در این محیط ساخت فراخوانی می‌کند\&. هنگامی که \fB$ENV\fR به یک دستور فرستاده می‌شود، فرض می‌شود همهٔ مقادیر فهرستی، فهرست‌هایی از مسیرها هستند و با استفاده از جداکنندهٔ مسیر جستجو به هم متصل می‌شوند\&. هر مقدار غیررشته‌ای دیگر نیز به یک رشته تبدیل می‌شود\&. .sp توجه داشته باشید که به‌طور پیش‌فرض، SCons محیط فعال در زمان اجرای \fBscons\fR («محیط شل») را به محیط اجرا منتقل \fIنمی‌کند\fR\&. این امر بدان جهت است که صرف‌نظر از متغیرهای محیطی تنظیم‌شده در زمان فراخوانی \fBscons\fR، تکرارپذیری ساخت تضمین شود\&. اگر می‌خواهید متغیری از محیط شل را به دستورهای اجراشده برای ساخت فایل‌های هدف منتقل کنید، باید صریحاً این کار را انجام دهید\&. یک مثال متداول، متغیر محیطی سیستمی \fBPATH\fR است تا \fBscons\fR بتواند برنامه‌ها و ابزارها را همانند شل فراخوان (یا فرآیندهای دیگر) پیدا کند: .sp .if n \{\ .RS 4 .\} .nf import os env = Environment(ENV={\*(AqPATH\*(Aq: os\&.environ[\*(AqPATH\*(Aq]}) .fi .if n \{\ .RE .\} .sp هرچند معمولاً توصیه نمی‌شود، اما می‌توانید کل محیط شل را یک‌باره منتقل کنید: .sp .if n \{\ .RS 4 .\} .nf import os env = Environment(ENV=os\&.environ\&.copy()) .fi .if n \{\ .RE .\} .RE .PP \fBESCAPE\fR .RS 4 تابعی که برای گریز دادن (escape کردن) نویسه‌های ویژهٔ شل در خطوط فرمان فراخوانی می‌شود\&. این تابع باید یک آرگومان دریافت کند: رشتهٔ خط فرمانی که باید گریز داده شود؛ و باید خط فرمان گریز داده‌شده را برگرداند\&. .RE .PP \fBF03\fR .RS 4 کامپایلر Fortran 03\&. شما معمولاً باید متغیر \fB$FORTRAN\fR را تنظیم کنید که کامپایلر پیش‌فرض فرترن را برای تمامی نسخه‌های فرترن مشخص می‌کند\&. تنها در صورتی نیاز به تنظیم \fB$F03\fR دارید که بخواهید از یک کامپایلر یا نسخهٔ کامپایلر خاص برای فایل‌های Fortran 03 استفاده کنید\&. .RE .PP \fBF03COM\fR .RS 4 خط فرمانی که برای کامپایل یک فایل منبع Fortran 03 به یک فایل شیء استفاده می‌شود\&. تنها در صورتی نیاز است \fB$F03COM\fR را تنظیم کنید که به یک خط فرمان خاص برای فایل‌های Fortran 03 نیاز داشته باشید\&. معمولاً باید متغیر \fB$FORTRANCOM\fR را تنظیم کنید که خط فرمان پیش‌فرض را برای تمامی نسخه‌های فرترن تعیین می‌کند\&. .RE .PP \fBF03COMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع Fortran 03 به یک فایل شیء نمایش داده می‌شود\&. اگر تنظیم نشده باشد، مقدار \fB$F03COM\fR یا \fB$FORTRANCOM\fR (خط فرمان) نمایش می‌یابد\&. .RE .PP \fBF03FILESUFFIXES\fR .RS 4 فهرست پسوندهای فایلی که لهجهٔ F03 برای آن‌ها استفاده خواهد شد\&. به‌طور پیش‌فرض، این مقدار برابر است با [\*(Aq\&.f03\*(Aq] .RE .PP \fBF03FLAGS\fR .RS 4 گزینه‌های عمومی تعیین‌شده توسط کاربر که به کامپایلر Fortran 03 ارسال می‌شوند\&. توجه داشته باشید که این متغیر شامل گزینه‌های مسیر جستجوی include مانند \fB\-I\fR (یا موارد مشابه) که scons به‌طور خودکار از روی \fB$F03PATH\fR تولید می‌کند \fIنمی‌شود\fR\&. برای متغیری که به این گزینه‌ها بسط می‌یابد، \fB$_F03INCFLAGS\fR را در ادامه ببینید\&. تنها در صورتی نیاز است \fB$F03FLAGS\fR را تنظیم کنید که بخواهید گزینه‌های کاربری خاصی را برای فایل‌های Fortran 03 مشخص نمایید\&. معمولاً باید متغیر \fB$FORTRANFLAGS\fR را تنظیم کنید که گزینه‌های کاربر ارسالی به کامپایلر پیش‌فرض فرترن را برای تمامی نسخه‌های فرترن تعیین می‌کند\&. .RE .PP \fB_F03INCFLAGS\fR .RS 4 یک متغیر ساخت تولیدشده به‌صورت خودکار شامل گزینه‌های خط فرمان کامپایلر Fortran 03 برای مشخص کردن دایرکتوری‌هایی که باید برای فایل‌های include جستجو شوند\&. مقدار \fB$_F03INCFLAGS\fR با افزودن \fB$INCPREFIX\fR و \fB$INCSUFFIX\fR به ابتدا و انتهای هر دایرکتوری در \fB$F03PATH\fR ایجاد می‌شود\&. .RE .PP \fBF03PATH\fR .RS 4 فهرست دایرکتوری‌هایی که کامپایلر Fortran 03 برای دایرکتوری‌های include جستجو خواهد کرد\&. پویشگر وابستگی‌های ضمنی این دایرکتوری‌ها را برای یافتن فایل‌های include جستجو می‌کند\&. آرگومان‌های دایرکتوری include را به‌طور صریح در \fB$F03FLAGS\fR قرار ندهید، چرا که نتیجه غیرقابل‌حمل خواهد بود و دایرکتوری‌ها توسط پویشگر وابستگی جستجو نخواهند شد\&. نکته: نام دایرکتوری‌ها در \fB$F03PATH\fR هنگامی که در یک دستور به کار می‌روند، نسبت به دایرکتوری SConscript جستجو می‌شوند\&. برای وادار کردن \fBscons\fR به جستجوی یک دایرکتوری نسبت به ریشه درخت منبع، از # استفاده کنید: شما تنها زمانی نیاز به تنظیم \fB$F03PATH\fR دارید که بخواهید یک مسیر include مشخص برای فایل‌های Fortran 03 تعریف کنید\&. معمولاً باید متغیر \fB$FORTRANPATH\fR را تنظیم کنید که مسیر include را برای کامپایلر پیش‌فرض Fortran برای تمام نسخه‌های Fortran مشخص می‌کند\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(F03PATH=\*(Aq#/include\*(Aq) .fi .if n \{\ .RE .\} .sp جستجوی دایرکتوری را می‌توان با استفاده از تابع \fBDir\fR() نیز اجبار کرد: .sp .if n \{\ .RS 4 .\} .nf include = Dir(\*(Aqinclude\*(Aq) env = Environment(F03PATH=include) .fi .if n \{\ .RE .\} .sp فهرست دایرکتوری‌ها از طریق متغیر ساخت خودکار تولیدشده‌ی \fB$_F03INCFLAGS\fR به خطوط فرمان افزوده خواهد شد، که با الحاق مقادیر متغیرهای ساخت \fB$INCPREFIX\fR و \fB$INCSUFFIX\fR به ابتدا و انتهای هر دایرکتوری در \fB$F03PATH\fR ساخته می‌شود\&. هر خط فرمانی که تعریف می‌کنید و به فهرست دایرکتوری F03PATH نیاز دارد، باید شامل \fB$_F03INCFLAGS\fR باشد: .sp .if n \{\ .RS 4 .\} .nf env = Environment(F03COM="my_compiler $_F03INCFLAGS \-c \-o $TARGET $SOURCE") .fi .if n \{\ .RE .\} .RE .PP \fBF03PPCOM\fR .RS 4 خط فرمان مورد استفاده برای کامپایل یک فایل منبع Fortran 03 به یک فایل شیء پس از عبور دادن اولیه فایل از پیش‌پردازنده C\&. هر گزینه‌ای که در متغیرهای ساخت \fB$F03FLAGS\fR و \fB$CPPFLAGS\fR مشخص شده باشد در این خط فرمان گنجانده می‌شود\&. شما فقط زمانی نیاز به تنظیم \fB$F03PPCOM\fR دارید که بخواهید از یک خط فرمان پیش‌پردازنده C خاص برای فایل‌های Fortran 03 استفاده کنید\&. در حالت عادی باید متغیر \fB$FORTRANPPCOM\fR را تنظیم کنید که خط فرمان پیش‌فرض پیش‌پردازنده C را برای تمام نسخه‌های Fortran مشخص می‌کند\&. .RE .PP \fBF03PPCOMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع Fortran 03 به یک فایل شیء پس از عبور دادن اولیه فایل از پیش‌پردازنده C نمایش داده می‌شود\&. اگر تنظیم نشده باشد، \fB$F03PPCOM\fR یا \fB$FORTRANPPCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBF03PPFILESUFFIXES\fR .RS 4 فهرست پسوندهای فایلی که گذر کامپایل + پیش‌پردازنده برای گویش F03 برای آن‌ها استفاده خواهد شد\&. به‌طور پیش‌فرض، این مقدار خالی است\&. .RE .PP \fBF08\fR .RS 4 کامپایلر Fortran 08\&. در حالت عادی باید متغیر \fB$FORTRAN\fR را تنظیم کنید که کامپایلر پیش‌فرض Fortran را برای تمام نسخه‌های Fortran مشخص می‌کند\&. شما فقط در صورتی نیاز به تنظیم \fB$F08\fR دارید که بخواهید از یک کامپایلر یا نسخه کامپایلر خاص برای فایل‌های Fortran 08 استفاده کنید\&. .RE .PP \fBF08COM\fR .RS 4 خط فرمان مورد استفاده برای کامپایل یک فایل منبع Fortran 08 به یک فایل شیء\&. شما فقط زمانی نیاز به تنظیم \fB$F08COM\fR دارید که بخواهید از یک خط فرمان خاص برای فایل‌های Fortran 08 استفاده کنید\&. در حالت عادی باید متغیر \fB$FORTRANCOM\fR را تنظیم کنید که خط فرمان پیش‌فرض را برای تمام نسخه‌های Fortran مشخص می‌کند\&. .RE .PP \fBF08COMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع Fortran 08 به یک فایل شیء نمایش داده می‌شود\&. اگر تنظیم نشده باشد، \fB$F08COM\fR یا \fB$FORTRANCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBF08FILESUFFIXES\fR .RS 4 فهرست پسوندهای فایلی که گویش F08 برای آن‌ها استفاده خواهد شد\&. به‌طور پیش‌فرض، این مقدار [\*(Aq\&.f08\*(Aq] است\&. .RE .PP \fBF08FLAGS\fR .RS 4 گزینه‌های عمومی مشخص‌شده توسط کاربر که به کامپایلر Fortran 08 ارسال می‌شوند\&. توجه داشته باشید که این متغیر شامل گزینه‌های مسیر جستجوی include مانند \fB\-I\fR (یا موارد مشابه) که scons به‌طور خودکار از \fB$F08PATH\fR تولید می‌کند، \fIنمی‌شود\fR\&. برای متغیری که به این گزینه‌ها بسط می‌یابد، به \fB$_F08INCFLAGS\fR در زیر مراجعه کنید\&. شما فقط زمانی نیاز به تنظیم \fB$F08FLAGS\fR دارید که نیاز به تعریف گزینه‌های کاربری مشخص برای فایل‌های Fortran 08 داشته باشید\&. در حالت عادی باید متغیر \fB$FORTRANFLAGS\fR را تنظیم کنید که گزینه‌های مشخص‌شده توسط کاربر را برای ارسال به کامپایلر پیش‌فرض Fortran برای تمام نسخه‌های Fortran مشخص می‌کند\&. .RE .PP \fB_F08INCFLAGS\fR .RS 4 یک متغیر ساخت تولیدشده به‌صورت خودکار شامل گزینه‌های خط فرمان کامپایلر Fortran 08 برای مشخص کردن دایرکتوری‌هایی که باید برای فایل‌های include جستجو شوند\&. مقدار \fB$_F08INCFLAGS\fR با افزودن \fB$INCPREFIX\fR و \fB$INCSUFFIX\fR به ابتدا و انتهای هر دایرکتوری در \fB$F08PATH\fR ایجاد می‌شود\&. .RE .PP \fBF08PATH\fR .RS 4 فهرست دایرکتوری‌هایی که کامپایلر Fortran 08 برای دایرکتوری‌های include جستجو خواهد کرد\&. پویشگر وابستگی ضمنی، این دایرکتوری‌ها را برای فایل‌های include جستجو می‌کند\&. آرگومان‌های دایرکتوری include را مستقیماً در \fB$F08FLAGS\fR قرار ندهید، زیرا نتیجه غیرقابل‌حمل خواهد بود و این دایرکتوری‌ها توسط پویشگر وابستگی جستجو نخواهند شد\&. توجه: نام‌های دایرکتوری در \fB$F08PATH\fR در هنگام استفاده در یک دستور، نسبت به دایرکتوری SConscript جستجو خواهند شد\&. برای اجبار کردن \fBscons\fR به جستجوی یک دایرکتوری نسبت به ریشه درخت کد مبدأ، از # استفاده کنید: تنها در صورتی نیاز به تنظیم \fB$F08PATH\fR دارید که بخواهید یک مسیر include خاص برای فایل‌های Fortran 08 تعریف کنید\&. در حالت عادی باید متغیر \fB$FORTRANPATH\fR را تنظیم کنید که مسیر include را برای کامپایلر پیش‌فرض Fortran برای تمام نسخه‌های Fortran مشخص می‌کند\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(F08PATH=\*(Aq#/include\*(Aq) .fi .if n \{\ .RE .\} .sp جستجوی دایرکتوری همچنین می‌تواند با استفاده از تابع \fBDir\fR() اجبار شود: .sp .if n \{\ .RS 4 .\} .nf include = Dir(\*(Aqinclude\*(Aq) env = Environment(F08PATH=include) .fi .if n \{\ .RE .\} .sp فهرست دایرکتوری‌ها از طریق متغیر ساخت خودکار تولیدشده‌ی \fB$_F08INCFLAGS\fR به خطوط دستور اضافه خواهد شد؛ این متغیر با افزودن مقادیر متغیرهای ساخت \fB$INCPREFIX\fR و \fB$INCSUFFIX\fR به ابتدا و انتهای هر دایرکتوری در \fB$F08PATH\fR ساخته می‌شود\&. هر خط دستوری که تعریف می‌کنید و به فهرست دایرکتوری‌های F08PATH نیاز دارد، باید شامل \fB$_F08INCFLAGS\fR باشد: .sp .if n \{\ .RS 4 .\} .nf env = Environment(F08COM="my_compiler $_F08INCFLAGS \-c \-o $TARGET $SOURCE") .fi .if n \{\ .RE .\} .RE .PP \fBF08PPCOM\fR .RS 4 خط دستوری که برای کامپایل یک فایل مبدأ Fortran 08 به یک فایل شیء (object file) پس از عبور دادن اولیه فایل از پیش‌پردازنده C استفاده می‌شود\&. هر گزینه‌ای که در متغیرهای ساخت \fB$F08FLAGS\fR و \fB$CPPFLAGS\fR مشخص شده باشد، در این خط دستور گنجانده می‌شود\&. تنها در صورتی نیاز به تنظیم \fB$F08PPCOM\fR دارید که نیاز به استفاده از یک خط دستور پیش‌پردازنده C مشخص برای فایل‌های Fortran 08 داشته باشید\&. در حالت عادی باید متغیر \fB$FORTRANPPCOM\fR را تنظیم کنید که خط دستور پیش‌فرض پیش‌پردازنده C را برای تمام نسخه‌های Fortran تعیین می‌کند\&. .RE .PP \fBF08PPCOMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل مبدأ Fortran 08 به یک فایل شیء، پس از عبور دادن اولیه فایل از پیش‌پردازنده C نمایش داده می‌شود\&. اگر تنظیم نشده باشد، مقدار \fB$F08PPCOM\fR یا \fB$FORTRANPPCOM\fR (خود خط دستور) نمایش داده می‌شود\&. .RE .PP \fBF08PPFILESUFFIXES\fR .RS 4 فهرست پسوندهای فایلی که گذر کامپایل + پیش‌پردازنده برای گویش F08 برای آن‌ها استفاده می‌شود\&. به‌طور پیش‌فرض، این متغیر خالی است\&. .RE .PP \fBF77\fR .RS 4 کامپایلر Fortran 77\&. در حالت عادی باید متغیر \fB$FORTRAN\fR را تنظیم کنید که کامپایلر پیش‌فرض Fortran را برای همه نسخه‌های Fortran مشخص می‌کند\&. تنها در صورتی نیاز به تنظیم \fB$F77\fR دارید که بخواهید از یک کامپایلر یا نسخه کامپایلر خاص برای فایل‌های Fortran 77 استفاده کنید\&. .RE .PP \fBF77COM\fR .RS 4 خط دستوری که برای کامپایل یک فایل مبدأ Fortran 77 به یک فایل شیء استفاده می‌شود\&. تنها زمانی نیاز به تنظیم \fB$F77COM\fR دارید که بخواهید از یک خط دستور خاص برای فایل‌های Fortran 77 استفاده کنید\&. در حالت عادی باید متغیر \fB$FORTRANCOM\fR را تنظیم کنید که خط دستور پیش‌فرض را برای تمام نسخه‌های Fortran مشخص می‌کند\&. .RE .PP \fBF77COMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل مبدأ Fortran 77 به یک فایل شیء نمایش داده می‌شود\&. اگر تنظیم نشود، \fB$F77COM\fR یا \fB$FORTRANCOM\fR (خط دستور) نمایش داده خواهد شد\&. .RE .PP \fBF77FILESUFFIXES\fR .RS 4 فهرست پسوندهای فایلی که گویش F77 برای آن‌ها به کار خواهد رفت\&. به‌طور پیش‌فرض، این مقدار [\*(Aq\&.f77\*(Aq] است\&. .RE .PP \fBF77FLAGS\fR .RS 4 گزینه‌های عمومی تعیین‌شده توسط کاربر که به کامپایلر Fortran 77 ارسال می‌شوند\&. توجه داشته باشید که این متغیر شامل گزینه‌های مسیر جستجوی include مانند \fB\-I\fR (یا مشابه آن) که scons به‌طور خودکار از \fB$F77PATH\fR تولید می‌کند، \fIنمی‌شود\fR\&. برای متغیری که به این گزینه‌ها بسط می‌یابد، به \fB$_F77INCFLAGS\fR در زیر مراجعه کنید\&. تنها در صورتی نیاز به تنظیم \fB$F77FLAGS\fR دارید که بخواهید گزینه‌های کاربری خاصی برای فایل‌های Fortran 77 تعریف کنید\&. در حالت عادی باید متغیر \fB$FORTRANFLAGS\fR را تنظیم کنید که گزینه‌های تعیین‌شده توسط کاربر برای کامپایلر پیش‌فرض Fortran را برای تمام نسخه‌های Fortran مشخص می‌کند\&. .RE .PP \fB_F77INCFLAGS\fR .RS 4 یک متغیر ساخت تولیدشده به‌طور خودکار که شامل گزینه‌های خط فرمان کامپایلر Fortran 77 برای مشخص کردن دایرکتوری‌های مورد جستجو جهت فایل‌های include است\&. مقدار \fB$_F77INCFLAGS\fR با افزودن \fB$INCPREFIX\fR و \fB$INCSUFFIX\fR به ابتدا و انتهای هر دایرکتوری در \fB$F77PATH\fR ایجاد می‌شود\&. .RE .PP \fBF77PATH\fR .RS 4 فهرست دایرکتوری‌هایی که کامپایلر Fortran 77 برای دایرکتوری‌های include جستجو خواهد کرد\&. پویشگر وابستگی ضمنی، این دایرکتوری‌ها را برای فایل‌های include جستجو می‌کند\&. آرگومان‌های دایرکتوری include را مستقیماً در \fB$F77FLAGS\fR قرار ندهید، زیرا نتیجه غیرقابل‌حمل خواهد بود و این دایرکتوری‌ها توسط پویشگر وابستگی جستجو نخواهند شد\&. توجه: نام‌های دایرکتوری در \fB$F77PATH\fR در هنگام استفاده در یک دستور، نسبت به دایرکتوری SConscript جستجو خواهند شد\&. برای اجبار کردن \fBscons\fR به جستجوی یک دایرکتوری نسبت به ریشه درخت کد مبدأ، از # استفاده کنید: تنها در صورتی نیاز به تنظیم \fB$F77PATH\fR دارید که بخواهید یک مسیر include خاص برای فایل‌های Fortran 77 تعریف کنید\&. در حالت عادی باید متغیر \fB$FORTRANPATH\fR را تنظیم کنید که مسیر include را برای کامپایلر پیش‌فرض Fortran برای تمام نسخه‌های Fortran مشخص می‌کند\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(F77PATH=\*(Aq#/include\*(Aq) .fi .if n \{\ .RE .\} .sp جستجوی دایرکتوری همچنین می‌تواند با استفاده از تابع \fBDir\fR() اجبار شود: .sp .if n \{\ .RS 4 .\} .nf include = Dir(\*(Aqinclude\*(Aq) env = Environment(F77PATH=include) .fi .if n \{\ .RE .\} .sp فهرست دایرکتوری‌ها از طریق متغیر ساخت خودکار تولیدشده‌ی \fB$_F77INCFLAGS\fR به خطوط دستور اضافه خواهد شد؛ این متغیر با افزودن مقادیر متغیرهای ساخت \fB$INCPREFIX\fR و \fB$INCSUFFIX\fR به ابتدا و انتهای هر دایرکتوری در \fB$F77PATH\fR ساخته می‌شود\&. هر خط دستوری که تعریف می‌کنید و به فهرست دایرکتوری‌های F77PATH نیاز دارد، باید شامل \fB$_F77INCFLAGS\fR باشد: .sp .if n \{\ .RS 4 .\} .nf env = Environment(F77COM="my_compiler $_F77INCFLAGS \-c \-o $TARGET $SOURCE") .fi .if n \{\ .RE .\} .RE .PP \fBF77PPCOM\fR .RS 4 خط فرمانی که برای کامپایل یک فایل منبع Fortran 77 به یک فایل شیء پس از عبور دادن اولیه فایل از پیش‌پردازنده C استفاده می‌شود\&. هر گزینه‌ای که در متغیرهای ساخت \fB$F77FLAGS\fR و \fB$CPPFLAGS\fR مشخص شده باشد در این خط فرمان گنجانده می‌شود\&. شما تنها در صورتی نیاز به تنظیم \fB$F77PPCOM\fR دارید که بخواهید از یک خط فرمان پیش‌پردازنده C خاص برای فایل‌های Fortran 77 استفاده کنید\&. در حالت عادی باید متغیر \fB$FORTRANPPCOM\fR را تنظیم کنید که خط فرمان پیش‌پردازنده C پیش‌فرض را برای تمام نسخه‌های Fortran مشخص می‌کند\&. .RE .PP \fBF77PPCOMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع Fortran 77 به یک فایل شیء پس از عبور دادن اولیه فایل از پیش‌پردازنده C نمایش داده می‌شود\&. در صورت عدم تنظیم، \fB$F77PPCOM\fR یا \fB$FORTRANPPCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBF77PPFILESUFFIXES\fR .RS 4 فهرست پسوندهای فایلی که مرحله کامپایل + پیش‌پردازنده برای گویش F77 برای آن‌ها استفاده خواهد شد\&. به‌طور پیش‌فرض، این متغیر خالی است\&. .RE .PP \fBF90\fR .RS 4 کامپایلر Fortran 90\&. در حالت عادی باید متغیر \fB$FORTRAN\fR را تنظیم کنید که کامپایلر پیش‌فرض Fortran را برای تمام نسخه‌های Fortran مشخص می‌کند\&. شما تنها در صورتی نیاز به تنظیم \fB$F90\fR دارید که بخواهید از یک کامپایلر یا نسخه کامپایلر خاص برای فایل‌های Fortran 90 استفاده کنید\&. .RE .PP \fBF90COM\fR .RS 4 خط فرمانی که برای کامپایل یک فایل منبع Fortran 90 به یک فایل شیء استفاده می‌شود\&. شما تنها در صورتی نیاز به تنظیم \fB$F90COM\fR دارید که بخواهید از یک خط فرمان خاص برای فایل‌های Fortran 90 استفاده کنید\&. در حالت عادی باید متغیر \fB$FORTRANCOM\fR را تنظیم کنید که خط فرمان پیش‌فرض را برای تمام نسخه‌های Fortran مشخص می‌کند\&. .RE .PP \fBF90COMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع Fortran 90 به یک فایل شیء نمایش داده می‌شود\&. در صورت عدم تنظیم، \fB$F90COM\fR یا \fB$FORTRANCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBF90FILESUFFIXES\fR .RS 4 فهرست پسوندهای فایلی که گویش F90 برای آن‌ها استفاده خواهد شد\&. به‌طور پیش‌فرض، این مقدار [\*(Aq\&.f90\*(Aq] است\&. .RE .PP \fBF90FLAGS\fR .RS 4 گزینه‌های عمومی مشخص‌شده توسط کاربر که به کامپایلر Fortran 90 منتقل می‌شوند\&. توجه داشته باشید که این متغیر \fIحاوی\fR گزینه‌های مسیر جستجوی include نظیر \fB\-I\fR (یا موارد مشابه) که scons به‌طور خودکار از \fB$F90PATH\fR تولید می‌کند، \fIنیست\fR\&. برای متغیری که به این گزینه‌ها بسط می‌یابد، به \fB$_F90INCFLAGS\fR در زیر مراجعه کنید\&. شما تنها در صورتی نیاز به تنظیم \fB$F90FLAGS\fR دارید که بخواهید گزینه‌های کاربری خاصی را برای فایل‌های Fortran 90 تعریف کنید\&. در حالت عادی باید متغیر \fB$FORTRANFLAGS\fR را تنظیم کنید که گزینه‌های مشخص‌شده توسط کاربر را که به کامپایلر پیش‌فرض Fortran برای تمام نسخه‌های Fortran ارسال می‌شوند، مشخص می‌کند\&. .RE .PP \fB_F90INCFLAGS\fR .RS 4 یک متغیر ساخت که به‌طور خودکار ایجاد می‌شود و حاوی گزینه‌های خط فرمان کامپایلر Fortran 90 برای مشخص کردن دایرکتوری‌هایی است که باید برای یافتن فایل‌های include جستجو شوند\&. مقدار \fB$_F90INCFLAGS\fR با الصاق \fB$INCPREFIX\fR و \fB$INCSUFFIX\fR به ابتدا و انتهای هر دایرکتوری در \fB$F90PATH\fR ایجاد می‌شود\&. .RE .PP \fBF90PATH\fR .RS 4 فهرست دایرکتوری‌هایی که کامپایلر Fortran 90 در آن‌ها به دنبال دایرکتوری‌های include می‌گردد\&. اسکنر وابستگی ضمنی این دایرکتوری‌ها را برای یافتن فایل‌های include جستجو خواهد کرد\&. آرگومان‌های دایرکتوری include را به‌طور صریح در \fB$F90FLAGS\fR قرار ندهید زیرا نتیجه غیرقابل‌حمل خواهد بود و دایرکتوری‌ها توسط اسکنر وابستگی جستجو نخواهند شد\&. نکته: نام‌های دایرکتوری در \fB$F90PATH\fR هنگامی که در یک فرمان استفاده می‌شوند، به‌صورت نسبی نسبت به دایرکتوری SConscript جستجو خواهند شد\&. برای وادار کردن \fBscons\fR به جستجوی یک دایرکتوری به‌صورت نسبی نسبت به ریشه درخت منبع، از # استفاده کنید: شما تنها در صورتی نیاز به تنظیم \fB$F90PATH\fR دارید که بخواهید یک مسیر include خاص را برای فایل‌های Fortran 90 تعریف کنید\&. در حالت عادی باید متغیر \fB$FORTRANPATH\fR را تنظیم کنید که مسیر include را برای کامپایلر پیش‌فرض Fortran برای تمام نسخه‌های Fortran مشخص می‌کند\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(F90PATH=\*(Aq#/include\*(Aq) .fi .if n \{\ .RE .\} .sp همچنین جستجوی دایرکتوری می‌تواند با استفاده از تابع \fBDir\fR() اجبار شود: .sp .if n \{\ .RS 4 .\} .nf include = Dir(\*(Aqinclude\*(Aq) env = Environment(F90PATH=include) .fi .if n \{\ .RE .\} .sp فهرست دایرکتوری‌ها از طریق متغیر ساخت خودکار ایجاد‌شده \fB$_F90INCFLAGS\fR به خطوط فرمان اضافه می‌شود؛ متغیری که با الصاق مقادیر متغیرهای ساخت \fB$INCPREFIX\fR و \fB$INCSUFFIX\fR به ابتدا و انتهای هر دایرکتوری در \fB$F90PATH\fR ساخته می‌شود\&. هر خط فرمانی که تعریف می‌کنید و به فهرست دایرکتوری F90PATH نیاز دارد باید شامل \fB$_F90INCFLAGS\fR باشد: .sp .if n \{\ .RS 4 .\} .nf env = Environment(F90COM="my_compiler $_F90INCFLAGS \-c \-o $TARGET $SOURCE") .fi .if n \{\ .RE .\} .RE .PP \fBF90PPCOM\fR .RS 4 خط فرمانی که برای کامپایل یک فایل منبع Fortran 90 به یک فایل شیء پس از عبور دادن اولیه فایل از پیش‌پردازنده C استفاده می‌شود\&. هر گزینه‌ای که در متغیرهای ساخت \fB$F90FLAGS\fR و \fB$CPPFLAGS\fR مشخص شده باشد در این خط فرمان گنجانده می‌شود\&. شما تنها در صورتی نیاز به تنظیم \fB$F90PPCOM\fR دارید که بخواهید از یک خط فرمان پیش‌پردازنده C خاص برای فایل‌های Fortran 90 استفاده کنید\&. در حالت عادی باید متغیر \fB$FORTRANPPCOM\fR را تنظیم کنید که خط فرمان پیش‌پردازنده C پیش‌فرض را برای تمام نسخه‌های Fortran مشخص می‌کند\&. .RE .PP \fBF90PPCOMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع Fortran 90 پس از عبور اولیه فایل از پیش‌پردازنده C نمایش داده می‌شود\&. اگر تنظیم نشده باشد، \fB$F90PPCOM\fR یا \fB$FORTRANPPCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBF90PPFILESUFFIXES\fR .RS 4 فهرست پسوندهای فایلی که گذر کامپایل + پیش‌پردازنده برای گویش F90 روی آن‌ها اعمال خواهد شد\&. به طور پیش‌فرض، این مقدار خالی است\&. .RE .PP \fBF95\fR .RS 4 کامپایلر Fortran 95\&. معمولاً باید متغیر \fB$FORTRAN\fR را تنظیم کنید که کامپایلر پیش‌فرض Fortran را برای تمام نسخه‌های Fortran مشخص می‌کند\&. تنها زمانی نیاز به تنظیم \fB$F95\fR دارید که بخواهید از کامپایلر یا نسخه کامپایلر خاصی برای فایل‌های Fortran 95 استفاده کنید\&. .RE .PP \fBF95COM\fR .RS 4 خط فرمان مورد استفاده برای کامپایل یک فایل منبع Fortran 95 به یک فایل شیء (object file)\&. تنها در صورتی نیاز به تنظیم \fB$F95COM\fR دارید که بخواهید از یک خط فرمان خاص برای فایل‌های Fortran 95 استفاده کنید\&. معمولاً باید متغیر \fB$FORTRANCOM\fR را تنظیم کنید که خط فرمان پیش‌فرض را برای تمام نسخه‌های Fortran مشخص می‌کند\&. .RE .PP \fBF95COMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع Fortran 95 به یک فایل شیء نمایش داده می‌شود\&. اگر تنظیم نشده باشد، \fB$F95COM\fR یا \fB$FORTRANCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBF95FILESUFFIXES\fR .RS 4 فهرست پسوندهای فایلی که گویش F95 برای آن‌ها استفاده خواهد شد\&. به طور پیش‌فرض، این مقدار [\*(Aq\&.f95\*(Aq] است\&. .RE .PP \fBF95FLAGS\fR .RS 4 گزینه‌های عمومی مشخص‌شده توسط کاربر که به کامپایلر Fortran 95 ارسال می‌شوند\&. توجه داشته باشید که این متغیر شامل گزینه‌های مسیر جستجوی include مانند \fB\-I\fR (یا موارد مشابه) که scons به طور خودکار از \fB$F95PATH\fR تولید می‌کند، \fIنمی‌شود\fR\&. برای متغیری که به آن گزینه‌ها بسط می‌یابد، \fB$_F95INCFLAGS\fR در زیر را ببینید\&. تنها در صورتی نیاز به تنظیم \fB$F95FLAGS\fR دارید که بخواهید گزینه‌های خاص کاربر را برای فایل‌های Fortran 95 تعریف کنید\&. معمولاً باید متغیر \fB$FORTRANFLAGS\fR را تنظیم کنید که گزینه‌های مشخص‌شده توسط کاربر را برای ارسال به کامپایلر پیش‌فرض Fortran در تمام نسخه‌ها تعیین می‌کند\&. .RE .PP \fB_F95INCFLAGS\fR .RS 4 یک متغیر ساخت به‌طور خودکار تولید شده که شامل گزینه‌های خط فرمان کامپایلر Fortran 95 برای مشخص کردن دایرکتوری‌های مورد جستجو برای فایل‌های include است\&. مقدار \fB$_F95INCFLAGS\fR با الحاق \fB$INCPREFIX\fR و \fB$INCSUFFIX\fR به ابتدا و انتهای هر دایرکتوری در \fB$F95PATH\fR ایجاد می‌شود\&. .RE .PP \fBF95PATH\fR .RS 4 فهرست دایرکتوری‌هایی که کامپایلر Fortran 95 در آن‌ها به دنبال دایرکتوری‌های include می‌گردد\&. پویشگر وابستگی ضمنی این دایرکتوری‌ها را برای یافتن فایل‌های include جستجو خواهد کرد\&. آرگومان‌های دایرکتوری include را صراحتاً در \fB$F95FLAGS\fR قرار ندهید زیرا نتیجه غیرقابل‌حمل خواهد بود و این دایرکتوری‌ها توسط پویشگر وابستگی جستجو نخواهند شد\&. نکته: نام‌های دایرکتوری در \fB$F95PATH\fR هنگامی که در یک دستور استفاده می‌شوند، به صورت نسبی نسبت به دایرکتوری SConscript جستجو خواهند شد\&. برای وادار کردن \fBscons\fR به جستجوی یک دایرکتوری نسبت به ریشه درخت منبع، از # استفاده کنید: تنها در صورتی نیاز به تنظیم \fB$F95PATH\fR دارید که بخواهید یک مسیر include خاص را برای فایل‌های Fortran 95 تعریف کنید\&. معمولاً باید متغیر \fB$FORTRANPATH\fR را تنظیم کنید که مسیر include را برای کامپایلر پیش‌فرض Fortran در تمام نسخه‌های Fortran مشخص می‌کند\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(F95PATH=\*(Aq#/include\*(Aq) .fi .if n \{\ .RE .\} .sp همچنین می‌توان جستجوی دایرکتوری را با استفاده از تابع \fBDir\fR() اجبار کرد: .sp .if n \{\ .RS 4 .\} .nf include = Dir(\*(Aqinclude\*(Aq) env = Environment(F95PATH=include) .fi .if n \{\ .RE .\} .sp فهرست دایرکتوری‌ها از طریق متغیر ساخت به‌طور خودکار تولید شده‌ی \fB$_F95INCFLAGS\fR به خطوط فرمان اضافه خواهد شد که با الحاق مقادیر متغیرهای ساخت \fB$INCPREFIX\fR و \fB$INCSUFFIX\fR به ابتدا و انتهای هر دایرکتوری در \fB$F95PATH\fR ساخته می‌شود\&. هر خط فرمانی که تعریف می‌کنید و به فهرست دایرکتوری‌های F95PATH نیاز دارد باید شامل \fB$_F95INCFLAGS\fR باشد: .sp .if n \{\ .RS 4 .\} .nf env = Environment(F95COM="my_compiler $_F95INCFLAGS \-c \-o $TARGET $SOURCE") .fi .if n \{\ .RE .\} .RE .PP \fBF95PPCOM\fR .RS 4 خط فرمان مورد استفاده برای کامپایل یک فایل منبع Fortran 95 به یک فایل شیء پس از عبور دادن اولیه فایل از پیش‌پردازنده C\&. هر گزینه‌ای که در متغیرهای ساخت \fB$F95FLAGS\fR و \fB$CPPFLAGS\fR مشخص شده باشد در این خط فرمان گنجانده می‌شود\&. تنها در صورتی نیاز به تنظیم \fB$F95PPCOM\fR دارید که بخواهید از یک خط فرمان پیش‌پردازنده C خاص برای فایل‌های Fortran 95 استفاده کنید\&. معمولاً باید متغیر \fB$FORTRANPPCOM\fR را تنظیم کنید که خط فرمان پیش‌پردازنده C پیش‌فرض را برای تمام نسخه‌های Fortran مشخص می‌کند\&. .RE .PP \fBF95PPCOMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع Fortran 95 به یک فایل شیء پس از عبور دادن اولیه فایل از پیش‌پردازنده C نمایش داده می‌شود\&. اگر تنظیم نشده باشد، \fB$F95PPCOM\fR یا \fB$FORTRANPPCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBF95PPFILESUFFIXES\fR .RS 4 فهرست پسوندهای فایلی که برای آن‌ها مرحله کامپایل + پیش‌پردازنده برای گویش F95 استفاده خواهد شد\&. به‌طور پیش‌فرض، این متغیر خالی است\&. .RE .PP \fBFile\fR .RS 4 تابعی که یک رشته را به یک نمونهٔ File نسبت به هدف در حال ساخت تبدیل می‌کند\&. .RE .PP \fBFILE_ENCODING\fR .RS 4 کدگذاری فایلی که برای فایل‌های نوشته‌شده توسط \fBTextfile\fR و \fBSubstfile\fR استفاده می‌شود\&. به‌طور پیش‌فرض روی "utf\-8" تنظیم شده است\&. .sp \fIجدید در نگارش 4\&.5\&.0\&.\fR .RE .PP \fBFORTRAN\fR .RS 4 کامپایلر پیش‌فرض Fortran برای تمام نسخه‌های Fortran\&. .RE .PP \fBFORTRANCOM\fR .RS 4 خط فرمانی که برای کامپایل یک فایل منبع Fortran به یک فایل شیء (object file) استفاده می‌شود\&. به‌طور پیش‌فرض، هر گزینه‌ای که در متغیرهای ساخت \fB$FORTRANFLAGS\fR، \fB$_FORTRANMODFLAG\fR و \fB$_FORTRANINCFLAGS\fR مشخص شده باشد، در این خط فرمان گنجانده می‌شود\&. .RE .PP \fBFORTRANCOMMONFLAGS\fR .RS 4 گزینه‌های عمومی مشخص‌شده توسط کاربر که به کامپایلر Fortran ارسال می‌شوند\&. مشابه با \fB$FORTRANFLAGS\fR، اما این متغیر ساخت روی تمام گویش‌ها اعمال می‌شود\&. .sp \fIجدید در نگارش 4\&.4\&.\fR .RE .PP \fBFORTRANCOMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع Fortran به یک فایل شیء نمایش داده می‌شود\&. در صورت عدم تنظیم، \fB$FORTRANCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBFORTRANFILESUFFIXES\fR .RS 4 فهرست پسوندهای فایلی که برای آن‌ها گویش FORTRAN استفاده خواهد شد\&. به‌طور پیش‌فرض، این مقدار برابر است با [\*(Aq\&.f\*(Aq, \*(Aq\&.for\*(Aq, \*(Aq\&.ftn\*(Aq] .RE .PP \fBFORTRANFLAGS\fR .RS 4 گزینه‌های عمومی مشخص‌شده توسط کاربر برای گویش FORTRAN که به کامپایلر Fortran ارسال می‌شوند\&. توجه داشته باشید که این متغیر شامل گزینه‌های مسیر جستجوی include یا ماژول \fB\-I\fR (یا مشابه آن) که scons به‌طور خودکار از \fB$FORTRANPATH\fR تولید می‌کند، \fIنمی‌شود\fR\&. برای متغیرهای ساختی که آن گزینه‌ها را بسط می‌دهند، \fB$_FORTRANINCFLAGS\fR و \fB$_FORTRANMODFLAG\fR را ببینید\&. .RE .PP \fB_FORTRANINCFLAGS\fR .RS 4 یک متغیر ساخت تولیدشده به صورت خودکار که شامل گزینه‌های خط فرمان کامپایلر Fortran برای تعیین دایرکتوری‌های مورد جستجو جهت یافتن فایل‌های include و فایل‌های ماژول است\&. مقدار \fB$_FORTRANINCFLAGS\fR به ترتیب با افزودن \fB$INCPREFIX\fR و \fB$INCSUFFIX\fR به ابتدا و انتهای هر دایرکتوری در \fB$FORTRANPATH\fR ایجاد می‌شود\&. .RE .PP \fBFORTRANMODDIR\fR .RS 4 مکان دایرکتوری که کامپایلر Fortran باید فایل‌های ماژول تولیدشده را در آن قرار دهد\&. این متغیر به‌طور پیش‌فرض خالی است\&. برخی از کامپایلرهای Fortran این دایرکتوری را به‌طور داخلی به مسیر جستجوی فایل‌های ماژول نیز اضافه می‌کنند\&. .RE .PP \fBFORTRANMODDIRPREFIX\fR .RS 4 پیشوندی که برای تعیین دایرکتوری ماژول در خط فرمان کامپایلر Fortran به کار می‌رود\&. این مقدار در هنگام تولید خودکار متغیرهای \fB$_FORTRANMODFLAG\fR، به ابتدای دایرکتوری در متغیر ساخت \fB$FORTRANMODDIR\fR اضافه خواهد شد\&. .RE .PP \fBFORTRANMODDIRSUFFIX\fR .RS 4 پسوندی که برای تعیین دایرکتوری ماژول در خط فرمان کامپایلر Fortran به کار می‌رود\&. این مقدار در هنگام تولید خودکار متغیرهای \fB$_FORTRANMODFLAG\fR، به انتهای دایرکتوری در متغیر ساخت \fB$FORTRANMODDIR\fR اضافه خواهد شد\&. .RE .PP \fB_FORTRANMODFLAG\fR .RS 4 یک متغیر ساخت تولیدشده به صورت خودکار که شامل گزینهٔ خط فرمان کامپایلر Fortran برای تعیین مکان دایرکتوری‌ای است که کامپایلر Fortran باید فایل‌های ماژول تولیدشده در حین کامپایل را در آن قرار دهد\&. مقدار \fB$_FORTRANMODFLAG\fR به ترتیب با افزودن \fB$FORTRANMODDIRPREFIX\fR و \fB$FORTRANMODDIRSUFFIX\fR به ابتدا و انتهای دایرکتوری در \fB$FORTRANMODDIR\fR ایجاد می‌شود\&. .RE .PP \fBFORTRANMODPREFIX\fR .RS 4 پیشوند فایل ماژول مورد استفاده توسط کامپایلر Fortran\&. برنامهٔ SCons فرض می‌کند که کامپایلر Fortran از قرارداد شبه‌استاندارد نام‌گذاری فایل‌های ماژول به صورت module_name\&.mod پیروی می‌کند\&. در نتیجه، این متغیر به‌طور پیش‌فرض خالی گذاشته شده است\&. در شرایطی که کامپایلر لزوماً از این قرارداد متداول پیروی نمی‌کند، کاربر می‌تواند از این متغیر استفاده کند\&. مقدار آن زمانی که scons برای حل وابستگی‌ها تلاش می‌کند، به نام هر فایل ماژول اضافه خواهد شد\&. .RE .PP \fBFORTRANMODSUFFIX\fR .RS 4 پسوند فایل ماژول مورد استفاده توسط کامپایلر Fortran\&. برنامهٔ SCons فرض می‌کند که کامپایلر Fortran از قرارداد شبه‌استاندارد نام‌گذاری فایل‌های ماژول به صورت module_name\&.mod پیروی می‌کند\&. در نتیجه، این متغیر به‌طور پیش‌فرض روی "\&.mod" تنظیم شده است\&. در شرایطی که کامپایلر لزوماً از این قرارداد متداول پیروی نمی‌کند، کاربر می‌تواند از این متغیر استفاده کند\&. مقدار آن زمانی که scons برای حل وابستگی‌ها تلاش می‌کند، به انتهای نام هر فایل ماژول افزوده خواهد شد\&. .RE .PP \fBFORTRANPATH\fR .RS 4 فهرست دایرکتوری‌هایی که کامپایلر Fortran برای یافتن فایل‌های include و (برای برخی از کامپایلرها) فایل‌های ماژول در آن‌ها جستجو می‌کند\&. پویشگر وابستگی‌های ضمنی Fortran این دایرکتوری‌ها را برای یافتن فایل‌های include جستجو خواهد کرد (اما نه فایل‌های ماژول، زیرا آن‌ها به‌طور خودکار تولید می‌شوند و ممکن است در زمان انجام پویش واقعاً وجود نداشته باشند)\&. آرگومان‌های دایرکتوری include را صراحتاً در FORTRANFLAGS قرار ندهید؛ چرا که نتیجه غیرقابل‌حمل خواهد بود و دایرکتوری‌ها توسط پویشگر وابستگی جستجو نخواهند شد\&. نکته: نام‌های دایرکتوری در FORTRANPATH هنگام استفاده در یک دستور، نسبت به دایرکتوری SConscript جستجو خواهند شد\&. برای وادار کردن \fBscons\fR به جستجوی یک دایرکتوری نسبت به ریشهٔ درخت مبدأ، از # استفاده کنید: .sp .if n \{\ .RS 4 .\} .nf env = Environment(FORTRANPATH=\*(Aq#/include\*(Aq) .fi .if n \{\ .RE .\} .sp جستجوی دایرکتوری را می‌توان با استفاده از تابع \fBDir\fR() نیز اجبار کرد: .sp .if n \{\ .RS 4 .\} .nf include = Dir(\*(Aqinclude\*(Aq) env = Environment(FORTRANPATH=include) .fi .if n \{\ .RE .\} .sp فهرست دایرکتوری‌ها از طریق متغیر ساخت تولیدشده به صورت خودکار \fB$_FORTRANINCFLAGS\fR به خطوط فرمان اضافه خواهد شد؛ این متغیر با افزودن مقادیر متغیرهای ساخت \fB$INCPREFIX\fR و \fB$INCSUFFIX\fR به ترتیب به ابتدا و انتهای هر دایرکتوری در \fB$FORTRANPATH\fR ساخته می‌شود\&. هر خط فرمانی که تعریف می‌کنید و به فهرست دایرکتوری‌های FORTRANPATH نیاز دارد، باید شامل \fB$_FORTRANINCFLAGS\fR باشد: .sp .if n \{\ .RS 4 .\} .nf env = Environment(FORTRANCOM="my_compiler $_FORTRANINCFLAGS \-c \-o $TARGET $SOURCE") .fi .if n \{\ .RE .\} .RE .PP \fBFORTRANPPCOM\fR .RS 4 خط فرمانی که برای کامپایل یک فایل منبع Fortran به یک فایل شیء (object file) پس از عبور دادن اولیه فایل از پیش‌پردازندهٔ C استفاده می‌شود\&. به‌طور پیش‌فرض، هر گزینه‌ای که در متغیرهای ساخت \fB$FORTRANFLAGS\fR، \fB$CPPFLAGS\fR، \fB$_CPPDEFFLAGS\fR، \fB$_FORTRANMODFLAG\fR و \fB$_FORTRANINCFLAGS\fR مشخص شده باشد، در این خط فرمان گنجانده می‌شود\&. .RE .PP \fBFORTRANPPCOMSTR\fR .RS 4 در صورت تنظیم شدن، رشته‌ای است که هنگام کامپایل یک فایل منبع Fortran به یک فایل شیء پس از عبور اولیه فایل از پیش‌پردازندهٔ C، نمایش داده می‌شود\&. در صورت عدم تنظیم، متغیر \fB$FORTRANPPCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBFORTRANPPFILESUFFIXES\fR .RS 4 فهرست پسوندهای فایلی که مرحلهٔ کامپایل + پیش‌پردازنده برای گویش FORTRAN روی آن‌ها اعمال خواهد شد\&. به‌طور پیش‌فرض، این فهرست برابر با [\*(Aq\&.fpp\*(Aq, \*(Aq\&.FPP\*(Aq] است\&. .RE .PP \fBFORTRANSUFFIXES\fR .RS 4 فهرست پسوندهای فایل‌هایی که برای وابستگی‌های ضمنی Fortran (خطوط INCLUDE و عبارات USE) پویش خواهند شد\&. فهرست پیش‌فرض عبارت است از: .sp .if n \{\ .RS 4 .\} .nf ["\&.f", "\&.F", "\&.for", "\&.FOR", "\&.ftn", "\&.FTN", "\&.fpp", "\&.FPP", "\&.f77", "\&.F77", "\&.f90", "\&.F90", "\&.f95", "\&.F95"] .fi .if n \{\ .RE .\} .RE .PP \fBFRAMEWORKPATH\fR .RS 4 در Mac OS X به همراه gcc، فهرستی شامل مسیرهای جستجو برای frameworkها\&. توسط کامپایلر برای یافتن includeهای به سبک چارچوب مانند #include استفاده می‌شود\&. توسط پیونددهنده برای یافتن frameworkهای مشخص‌شده توسط کاربر هنگام پیونددهی استفاده می‌شود (ببینید \fB$FRAMEWORKS\fR)\&. برای نمونه: .sp .if n \{\ .RS 4 .\} .nf env\&.AppendUnique(FRAMEWORKPATH=\*(Aq#myframeworkdir\*(Aq) .fi .if n \{\ .RE .\} .sp عبارت .sp .if n \{\ .RS 4 .\} .nf \&.\&.\&. \-Fmyframeworkdir .fi .if n \{\ .RE .\} .sp را به خطوط فرمان کامپایلر و پیونددهنده اضافه خواهد کرد\&. .RE .PP \fB_FRAMEWORKPATH\fR .RS 4 در Mac OS X به همراه gcc، یک متغیر ساخت به‌طور خودکار تولیدشده که شامل گزینه‌های خط فرمان پیونددهنده متناظر با \fB$FRAMEWORKPATH\fR است\&. .RE .PP \fBFRAMEWORKPATHPREFIX\fR .RS 4 در Mac OS X به همراه gcc، پیشوندی که برای مدخل‌های FRAMEWORKPATH استفاده می‌شود (ببینید \fB$FRAMEWORKPATH\fR)\&. مقدار پیش‌فرض \fB\-F\fR است\&. .RE .PP \fBFRAMEWORKPREFIX\fR .RS 4 در Mac OS X به همراه gcc، پیشوندی که برای پیوند دادن frameworkها استفاده می‌شود (ببینید \fB$FRAMEWORKS\fR)\&. مقدار پیش‌فرض \fB\-framework\fR است\&. .RE .PP \fBFRAMEWORKS\fR .RS 4 در Mac OS X به همراه gcc، فهرستی از نام‌های frameworkها برای پیوند داده شدن به یک برنامه، کتابخانه اشتراکی یا bundle\&. مقدار پیش‌فرض یک فهرست خالی است\&. برای نمونه: .sp .if n \{\ .RS 4 .\} .nf env\&.AppendUnique(FRAMEWORKS=Split(\*(AqSystem Cocoa SystemConfiguration\*(Aq)) .fi .if n \{\ .RE .\} .RE .PP \fB_FRAMEWORKS\fR .RS 4 در Mac OS X به همراه gcc، یک متغیر ساخت به‌طور خودکار تولیدشده شامل گزینه‌های خط فرمان پیونددهنده برای پیوند دادن با FRAMEWORKS\&. .RE .PP \fBFRAMEWORKSFLAGS\fR .RS 4 در Mac OS X به همراه gcc، گزینه‌های عمومی framework ارائه‌شده توسط کاربر برای اضافه شدن به انتهای خط فرمانِ ساخت یک پیمانه قابل بارگذاری (loadable module)\&. (این متغیر تا حد زیادی توسط متغیرهای \fB$FRAMEWORKPATH\fR، \fB$FRAMEWORKPATHPREFIX\fR، \fB$FRAMEWORKPREFIX\fR و \fB$FRAMEWORKS\fR که در بالا شرح داده شدند، جایگزین شده است\&.) .RE .PP \fBGS\fR .RS 4 برنامه Ghostscript که برای نمونه، برای تبدیل فایل‌های PostScript به PDF استفاده می‌شود\&. .RE .PP \fBGSCOM\fR .RS 4 خط فرمان کامل Ghostscript که برای فرایند تبدیل استفاده می‌شود\&. مقدار پیش‌فرض آن \(lq$GS $GSFLAGS \-sOutputFile=$TARGET $SOURCES\(rq است\&. .RE .PP \fBGSCOMSTR\fR .RS 4 رشته‌ای که هنگام فراخوانی Ghostscript برای فرایند تبدیل نمایش داده می‌شود\&. اگر این متغیر تنظیم نشده باشد (حالت پیش‌فرض)، آنگاه \fB$GSCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBGSFLAGS\fR .RS 4 گزینه‌های عمومی ارسال‌شده به برنامه Ghostscript، برای نمونه هنگام تبدیل فایل‌های PostScript به PDF\&. مقدار پیش‌فرض آن \(lq\-dNOPAUSE \-dBATCH \-sDEVICE=pdfwrite\(rq است\&. .RE .PP \fBHOST_ARCH\fR .RS 4 نام معماری سخت‌افزار میزبان که برای ایجاد این محیط ساخت استفاده شده است\&. کد پلتفرم این متغیر را هنگام مقداردهی اولیه تنظیم می‌کند (ببینید \fB$PLATFORM\fR و آرگومان \fIplatform\fR برای \fBEnvironment\fR)\&. توجه داشته باشید نام شناسایی‌شده برای معماری ممکن است با آنچه توسط متد platform\&.machine در Python بازگردانده می‌شود یکسان نباشد\&. .sp در پلتفرم win32، اگر کامپایلر Microsoft Visual C++ در دسترس باشد، راه‌اندازی ابزار msvc با استفاده از \fB$HOST_ARCH\fR و \fB$TARGET_ARCH\fR انجام می‌شود\&. تغییر دادن این مقادیر در زمان‌های بعدی باعث مقداردهی اولیه مجدد ابزار نخواهد شد\&. مقادیر معتبر معماری میزبان عبارتند از x86 و arm برای میزبان‌های ۳۲ بیتی، و amd64، arm64 و x86_64 برای میزبان‌های ۶۴ بیتی\&. .sp باید تغییرناپذیر در نظر گرفته شود\&. \fB$HOST_ARCH\fR در حال حاضر توسط سایر پلتفرم‌ها استفاده نمی‌شود، اما این گزینه برای استفاده در آینده محفوظ است\&. .RE .PP \fBHOST_OS\fR .RS 4 نام سیستم‌عامل میزبان برای پلتفرمی که جهت ایجاد این محیط ساخت استفاده شده است\&. کد پلتفرم این متغیر را هنگام مقداردهی اولیه تنظیم می‌کند (ببینید \fB$PLATFORM\fR و آرگومان \fIplatform\fR برای \fBEnvironment\fR)\&. .sp باید تغییرناپذیر در نظر گرفته شود\&. \fB$HOST_OS\fR در حال حاضر توسط SCons استفاده نمی‌شود، اما این گزینه برای استفاده در آینده محفوظ است\&. .RE .PP \fBIDLSUFFIXES\fR .RS 4 فهرست پسوندهای فایل‌هایی که برای وابستگی‌های ضمنی IDL (خطوط #include یا import) پویش خواهند شد\&. فهرست پیش‌فرض عبارت است از: .sp .if n \{\ .RS 4 .\} .nf ["\&.idl", "\&.IDL"] .fi .if n \{\ .RE .\} .RE .PP \fBIMPLIBNOVERSIONSYMLINKS\fR .RS 4 برای بازنویسی (override کردن) \fB$SHLIBNOVERSIONSYMLINKS\fR/\fB$LDMODULENOVERSIONSYMLINKS\fR هنگام ساخت کتابخانهٔ واردات (import library) نسخه‌بندی‌شده برای یک کتابخانهٔ اشتراکی/پیمانهٔ قابل‌بارگذاری به کار می‌رود\&. اگر تعریف نشده باشد، از \fB$SHLIBNOVERSIONSYMLINKS\fR/\fB$LDMODULENOVERSIONSYMLINKS\fR برای تعیین اینکه آیا تولید پیوندهای نمادین غیرفعال شود یا خیر، استفاده می‌شود\&. .RE .PP \fBIMPLIBPREFIX\fR .RS 4 پیشوندی که برای نام‌های کتابخانه‌های واردات به کار می‌رود\&. برای نمونه، cygwin از کتابخانه‌های واردات (libfoo\&.dll\&.a) به همراه کتابخانه‌های پویا (cygfoo\&.dll) استفاده می‌کند\&. پیونددهندهٔ cyglink مقدار \fB$IMPLIBPREFIX\fR را برابر با \*(Aqlib\*(Aq و \fB$SHLIBPREFIX\fR را برابر با \*(Aqcyg\*(Aq قرار می‌دهد\&. .RE .PP \fBIMPLIBSUFFIX\fR .RS 4 پسوندی که برای نام‌های کتابخانه‌های واردات به کار می‌رود\&. برای نمونه، cygwin از کتابخانه‌های واردات (libfoo\&.dll\&.a) به همراه کتابخانه‌های پویا (cygfoo\&.dll) استفاده می‌کند\&. پیونددهندهٔ cyglink مقدار \fB$IMPLIBSUFFIX\fR را برابر با \*(Aq\&.dll\&.a\*(Aq و \fB$SHLIBSUFFIX\fR را برابر با \*(Aq\&.dll\*(Aq قرار می‌دهد\&. .RE .PP \fBIMPLIBVERSION\fR .RS 4 برای بازنویسی \fB$SHLIBVERSION\fR/\fB$LDMODULEVERSION\fR هنگام تولید کتابخانهٔ واردات نسخه‌بندی‌شده برای یک کتابخانهٔ اشتراکی/پیمانهٔ قابل‌بارگذاری به کار می‌رود\&. در صورت تعریف نشدن، از \fB$SHLIBVERSION\fR/\fB$LDMODULEVERSION\fR برای تعیین نسخهٔ کتابخانهٔ واردات نسخه‌بندی‌شده استفاده می‌شود\&. .RE .PP \fBIMPLICIT_COMMAND_DEPENDENCIES\fR .RS 4 چگونگی افزودن وابستگی‌های ضمنی توسط SCons از روی رشته‌های کنش (دستورهایی که برای ساخت هدف‌ها اجرا می‌شوند) را کنترل می‌کند\&. این وابستگی‌های ضمنی به SCons اجازه می‌دهند تا هنگام تغییر کامپایلرها، ابزارها یا اسکریپت‌هایی که بر نتیجهٔ ساخت تأثیر می‌گذارند (برای نمونه، هنگامی که نسخهٔ جدیدی از کامپایلر نصب می‌شود)، بازسازی هدف‌ها را فعال کند\&. به‌طور پیش‌فرض، SCons یک وابستگی ضمنی به فایل اجرایی که با نخستین آرگومان خط فرمان مشخص شده اضافه می‌کند\&. این فایل اجرایی ابتدا به عنوان یک مسیر بررسی می‌شود؛ در صورت پیدا نشدن، در مسیر جستجوی محیط اجرا (env[\*(AqENV\*(Aq][\*(AqPATH\*(Aq]) جستجو می‌شود\&. .sp اگر \fB$IMPLICIT_COMMAND_DEPENDENCIES\fR روی یک مقدار نادرست ("none" یا "false" یا "no" یا "off" یا "0" یا عدد صحیح 0) تنظیم شود، هیچ وابستگی ضمنی از رشته‌های کنش اضافه نمی‌شود\&. اگر روی یک مقدار عددی صحیح بزرگتر از 1 یا روی "all" تنظیم شود، آرگومان‌های خط فرمان اضافی بررسی می‌شوند\&. مقدار عددی \fIN\fR تعداد \fIN\fR آرگومان اول را بررسی می‌کند، در حالی که "all" تمام آرگومان‌ها را بررسی می‌کند\&. یک آرگومان بررسی‌شده فراتر از آرگومان نخست، در صورتی که یک مسیر مطلق باشد یا به فایلی موجود در سیستم فایل اشاره کند، به عنوان یک وابستگی افزوده می‌شود؛ برخلاف نخستین آرگومان، این آرگومان‌های اضافی با استفاده از مسیر جستجوی محیط اجرا جستجو نمی‌شوند\&. با سایر مقادیر \fB$IMPLICIT_COMMAND_DEPENDENCIES\fR مانند حالت پیش‌فرض رفتار می‌شود\&. مقدار \fB$IMPLICIT_COMMAND_DEPENDENCIES\fR پیش از استفاده مشمول جایگزینی است، بنابراین می‌تواند شامل ارجاعی به یک متغیر ساخت باشد\&. .sp رشته‌های کنش ممکن است با یک عملگر AND منطقی (&&) بخش‌بندی شده باشند، که نشان می‌دهد هر بخش به صورت ترتیبی اجرا می‌شود، اما تنها در صورتی که بخش قبلی با موفقیت به پایان رسیده باشد\&. اگر \fB$IMPLICIT_COMMAND_DEPENDENCIES\fR روی "all" یا یک عدد صحیح بزرگتر از 1 تنظیم شده باشد، هر بخش برای محاسبهٔ وابستگی‌ها به عنوان یک خط فرمان مجزا در نظر گرفته می‌شود؛ در غیر این صورت، تنها بخش نخست بررسی می‌شود\&. .RE .PP \fBINCPREFIX\fR .RS 4 پیشوندی که برای مشخص کردن یک دایرکتوری include در خط فرمان کامپایلر C استفاده می‌شود\&. این پیشوند به ابتدای هر دایرکتوری در متغیرهای ساخت \fB$CPPPATH\fR و \fB$FORTRANPATH\fR هنگام تولید خودکار متغیرهای \fB$_CPPINCFLAGS\fR و \fB$_FORTRANINCFLAGS\fR اضافه خواهد شد\&. .RE .PP \fBINCSUFFIX\fR .RS 4 پسوندی که برای مشخص کردن یک دایرکتوری include در خط فرمان کامپایلر C استفاده می‌شود\&. این پسوند به انتهای هر دایرکتوری در متغیرهای ساخت \fB$CPPPATH\fR و \fB$FORTRANPATH\fR هنگام تولید خودکار متغیرهای \fB$_CPPINCFLAGS\fR و \fB$_FORTRANINCFLAGS\fR اضافه خواهد شد\&. .RE .PP \fBINSTALL\fR .RS 4 تابعی که برای نصب یک فایل در یک نام فایل مقصد فراخوانی می‌شود\&. تابع پیش‌فرض فایل را در مقصد کپی می‌کند (و بیت‌های دسترسی و حالت فایل مقصد را مطابق با فایل منبع تنظیم می‌کند)\&. این تابع آرگومان‌های زیر را دریافت می‌کند: .sp .if n \{\ .RS 4 .\} .nf def install(dest, source, env): .fi .if n \{\ .RE .\} .sp \fIdest\fR نام مسیر فایل مقصد است\&. \fIsource\fR نام مسیر فایل منبع است\&. \fIenv\fR محیط ساخت (دیکشنری‌ای از مقادیر ساخت) است که برای نصب این فایل اعمال می‌شود\&. .RE .PP \fBINSTALLSTR\fR .RS 4 رشته‌ای که هنگام نصب یک فایل در نام فایل مقصد نمایش داده می‌شود\&. مقدار پیش‌فرض عبارت است از: .sp .if n \{\ .RS 4 .\} .nf Install file: "$SOURCE" as "$TARGET" .fi .if n \{\ .RE .\} .RE .PP \fBINTEL_C_COMPILER_VERSION\fR .RS 4 توسط ابزار intelc به شماره نسخه اصلی کامپایلر Intel C انتخاب‌شده برای استفاده، تنظیم می‌شود\&. .RE .PP \fBJAR\fR .RS 4 ابزار بایگانی جاوا (Java archive tool)\&. .RE .PP \fBJARCHDIR\fR .RS 4 دایرکتوری‌ای که ابزار بایگانی جاوا باید به آن تغییر مکان دهد (با استفاده از گزینه \fB\-C\fR)\&. .RE .PP \fBJARCOM\fR .RS 4 خط فرمانی که برای فراخوانی ابزار بایگانی جاوا استفاده می‌شود\&. .RE .PP \fBJARCOMSTR\fR .RS 4 رشته‌ای که هنگام فراخوانی ابزار بایگانی جاوا نمایش داده می‌شود\&. اگر این مقدار تنظیم نشده باشد، آن‌گاه \fB$JARCOM\fR (خط فرمان) نمایش داده می‌شود\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(JARCOMSTR="JARchiving $SOURCES into $TARGET") .fi .if n \{\ .RE .\} .RE .PP \fBJARFLAGS\fR .RS 4 گزینه‌های عمومی ارسال‌شده به ابزار بایگانی جاوا\&. به‌طور پیش‌فرض، این متغیر روی \fBcf\fR تنظیم شده است تا فایل \fBjar\fR مورد نیاز ایجاد شود\&. .RE .PP \fBJARSUFFIX\fR .RS 4 پسوند بایگانی‌های جاوا؛ به‌طور پیش‌فرض \&.jar است\&. .RE .PP \fBJAVABOOTCLASSPATH\fR .RS 4 مکان فایل‌های کلاس راه‌انداز (bootstrap class files) را مشخص می‌کند\&. می‌تواند به صورت یک رشته یا شیء Node، یا به صورت فهرستی از رشته‌ها یا اشیاء Node مشخص شود\&. .sp این مقدار از طریق گزینه \fB\-bootclasspath\fR به خطوط فرمان JDK اضافه خواهد شد، که نیازمند جداکننده مسیر جستجوی وابسته به سیستم است\&. در صورتی که \fB$JAVABOOTCLASSPATH\fR به صورت فهرست ارائه شده باشد، این مقدار در صورت نیاز هنگام ساخت خط فرمان توسط SCons تأمین خواهد شد\&. اگر \fB$JAVABOOTCLASSPATH\fR یک رشته منفرد حاوی نویسه‌های جداکننده مسیر جستجو باشد (: برای سیستم‌های POSIX یا ; برای Windows)، اصلاح نخواهد شد؛ و از این رو ذاتاً وابسته به سیستم است؛ برای ارائه مسیر به روشی مستقل از سیستم، در عوض \fB$JAVABOOTCLASSPATH\fR را به صورت فهرستی از مسیرها مشخص کنید\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBنکته\fR .ps -1 .br فقط هنگام کامپایل برای نسخه‌های پیش از JDK 9 قابل استفاده است\&. .sp .5v .RE .RE .PP \fBJAVAC\fR .RS 4 کامپایلر جاوا\&. .RE .PP \fBJAVACCOM\fR .RS 4 خط فرمانی که برای کامپایل یک درخت دایرکتوری حاوی فایل‌های منبع جاوا به فایل‌های کلاس جاوای متناظر استفاده می‌شود\&. هر گزینه‌ای که در متغیر ساخت \fB$JAVACFLAGS\fR مشخص شود، در این خط فرمان گنجانده خواهد شد\&. .RE .PP \fBJAVACCOMSTR\fR .RS 4 رشته‌ای که هنگام کامپایل یک درخت دایرکتوری از فایل‌های منبع جاوا به فایل‌های کلاس جاوای متناظر نمایش داده می‌شود\&. اگر این مقدار تنظیم نشده باشد، آن‌گاه \fB$JAVACCOM\fR (خط فرمان) نمایش داده می‌شود\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(JAVACCOMSTR="Compiling class files $TARGETS from $SOURCES") .fi .if n \{\ .RE .\} .RE .PP \fBJAVACFLAGS\fR .RS 4 گزینه‌های عمومی که به کامپایلر جاوا ارسال می‌شوند\&. .RE .PP \fBJAVACLASSDIR\fR .RS 4 دایرکتوری‌ای که ممکن است فایل‌های کلاس جاوا در آن یافت شوند\&. این مقدار از ابتدای نام هر فایل \&.class جاوایی که به سازنده \fBJavaH\fR ارائه شود، حذف می‌گردد\&. .RE .PP \fBJAVACLASSPATH\fR .RS 4 مسیر جستجوی کلاس را برای ابزارهای JDK مشخص می‌کند\&. می‌تواند به عنوان یک رشته یا شیء Node، یا فهرستی از رشته‌ها یا اشیاء Node تعیین شود\&. مدخل‌های مسیر کلاس می‌توانند نام دایرکتوری‌ها برای جستجوی فایل‌ها یا بسته‌های کلاس، مسیرهای بایگانی‌های (\&.jar یا \&.zip) حاوی کلاس‌ها، یا مسیرهای منتهی به نویسه عمومی نام پایه (*) باشند که با فایل‌های دارای پسوند \&.jar در آن دایرکتوری مطابقت دارد\&. برای جزئیات بیشتر به مستندات Java مراجعه کنید\&. .sp این مقدار از طریق گزینه \fB\-classpath\fR به خطوط فرمان JDK افزوده خواهد شد، که نیازمند جداکننده مسیر جستجوی مختص به سیستم است\&. این مورد در صورت نیاز توسط SCons هنگام ساخت خط فرمان، در صورتی که \fB$JAVACLASSPATH\fR به شکل فهرست ارائه شده باشد، تأمین می‌شود\&. اگر \fB$JAVACLASSPATH\fR یک رشته تکی حاوی نویسه‌های جداکننده مسیر جستجو (: برای سیستم‌های POSIX یا ; برای Windows) باشد، به منظور پایش وابستگی‌ها بر اساس جداکننده به فهرستی از مسیرهای مجزا تقسیم می‌شود\&. این رشته برای استفاده در خط فرمان JDK تغییر نخواهد کرد، بنابراین چنین رشته‌ای ذاتا وابسته به سیستم است؛ برای مشخص کردن مسیر به روشی مستقل از سیستم، به جای آن \fB$JAVACLASSPATH\fR را به صورت فهرستی از مسیرها ارائه دهید\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBنکته\fR .ps -1 .br SCons \fBهمیشه\fR هنگام فراخوانی کامپایلر جاوا javac، صرف‌نظر از تنظیمات \fB$JAVASOURCEPATH\fR، یک \fB\-sourcepath\fR ارائه می‌دهد؛ چرا که مسیر(های) منبع(های) ارائه‌شده در فراخوانی سازنده \fBJava\fR را از طریق \fB\-sourcepath\fR ارسال می‌کند\&. طبق مستندات جعبه‌ابزار استاندارد Java برای javac: \(lqدر صورت کامپایل نکردن کد برای ماژول‌ها، اگر گزینه \fB\-\-source\-path\fR یا \fB\-sourcepath\fR مشخص نشده باشد، مسیر کلاس کاربر نیز برای فایل‌های منبع جستجو می‌شود\&.\(rq از آنجا که \fB\-sourcepath\fR همیشه ارائه می‌شود، javac هنگام جستجوی منابع از محتوای مقدار \fB$JAVACLASSPATH\fR استفاده نخواهد کرد\&. .sp .5v .RE .RE .PP \fBJAVACLASSSUFFIX\fR .RS 4 پسوند فایل‌های کلاس Java؛ به طور پیش‌فرض \&.class\&. .RE .PP \fBJAVAH\fR .RS 4 تولیدکننده Java برای فایل‌های هدر و استاب C\&. .RE .PP \fBJAVAHCOM\fR .RS 4 خط فرمان مورداستفاده برای تولید فایل‌های هدر و استاب C از کلاس‌های Java\&. هر گزینه‌ای که در متغیر ساخت \fB$JAVAHFLAGS\fR مشخص شده باشد در این خط فرمان قرار می‌گیرد\&. .RE .PP \fBJAVAHCOMSTR\fR .RS 4 رشته‌ای که هنگام تولید فایل‌های هدر و استاب C از کلاس‌های Java نمایش داده می‌شود\&. اگر این مقدار تنظیم نشده باشد، \fB$JAVAHCOM\fR (خط فرمان) نمایش داده می‌شود\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(JAVAHCOMSTR="Generating header/stub file(s) $TARGETS from $SOURCES") .fi .if n \{\ .RE .\} .RE .PP \fBJAVAHFLAGS\fR .RS 4 گزینه‌های عمومی ارسال‌شده به تولیدکننده فایل هدر و استاب C برای کلاس‌های Java\&. .RE .PP \fBJAVAINCLUDES\fR .RS 4 مسیر include برای فایل‌های هدر Java (مانند jni\&.h)\&. .RE .PP \fBJAVAPROCESSORPATH\fR .RS 4 مکان فایل‌های کلاس پردازشگر حاشیه‌نویسی (annotation processor) را مشخص می‌کند\&. می‌تواند به صورت یک رشته یا شیء Node، یا به صورت فهرستی از رشته‌ها یا اشیاء Node تعیین شود\&. .sp این مقدار از طریق گزینه \fB\-processorpath\fR به خطوط فرمان JDK افزوده خواهد شد، که نیازمند جداکننده مسیر جستجوی مختص به سیستم است\&. این مورد در صورت نیاز توسط SCons هنگام ساخت خط فرمان، در صورتی که \fB$JAVAPROCESSORPATH\fR به صورت فهرست ارائه شده باشد، تأمین می‌شود\&. اگر \fB$JAVAPROCESSORPATH\fR یک رشته تکی حاوی نویسه‌های جداکننده مسیر جستجو (: برای سیستم‌های POSIX یا ; برای Windows) باشد، تغییر داده نخواهد شد؛ بنابراین ذاتا وابسته به سیستم است؛ برای تعیین مسیر به روشی مستقل از سیستم، به جای آن \fB$JAVAPROCESSORPATH\fR را به صورت فهرستی از مسیرها ارائه دهید\&. .sp \fIجدید در نسخه 4\&.5\&.0\fR .RE .PP \fBJAVASOURCEPATH\fR .RS 4 فهرست دایرکتوری‌هایی را مشخص می‌کند که برای فایل‌های ورودی (منبع) \&.java جستجو خواهند شد\&. می‌تواند به صورت یک رشته یا شیء Node، یا به صورت فهرستی از رشته‌ها یا اشیاء Node تعیین شود\&. .sp این مقدار از طریق گزینه \fB\-sourcepath\fR به خطوط فرمان JDK اضافه خواهد شد، که نیازمند یک جداکننده مسیر جستجوی مختص به سیستم است\&. این مورد در صورت نیاز توسط SCons هنگام ایجاد خط فرمان، در صورتی که \fB$JAVASOURCEPATH\fR به صورت فهرست ارائه شده باشد، تأمین می‌شود\&. اگر \fB$JAVASOURCEPATH\fR یک رشته تکی حاوی نویسه‌های جداکننده مسیر جستجو (: برای سیستم‌های POSIX یا ; برای Windows) باشد، تغییر نخواهد کرد و در نتیجه ذاتا وابسته به سیستم است؛ برای ارائه مسیر به شیوه‌ای مستقل از سیستم، به جای آن \fB$JAVASOURCEPATH\fR را به صورت فهرستی از مسیرها تعیین کنید\&. .sp توجه داشته باشید که دایرکتوری‌های مشخص‌شده تنها از طریق گزینه \fB\-sourcepath\fR به خط فرمان افزوده می‌شوند\&. SCons در حال حاضر دایرکتوری‌های \fB$JAVASOURCEPATH\fR را برای فایل‌های وابسته \&.java جستجو نمی‌کند\&. .RE .PP \fBJAVASUFFIX\fR .RS 4 پسوند فایل‌های Java؛ به‌طور پیش‌فرض \&.java است\&. .RE .PP \fBJAVAVERSION\fR .RS 4 نسخهٔ Java مورد استفاده توسط سازندهٔ \fBJava\fR را مشخص می‌کند\&. این متغیر را برای مشخص کردن نسخهٔ Java هدف کامپایلر javac تنظیم کنید\&. این کار گاهی ضروری است زیرا Java 1\&.5 نام فایل‌های ایجادشده برای کلاس‌های درونی بی‌نامِ تو در تو (nested anonymous inner classes) را تغییر داد، که می‌تواند منجر به عدم تطابق با فایل‌هایی شود که SCons انتظار دارد توسط کامپایلر javac تولید شوند\&. تنظیم \fB$JAVAVERSION\fR به نسخه‌ای بزرگ‌تر از 1\&.4 باعث می‌شود SCons متوجه شود ساختِ انجام‌شده با چنین کامپایلری در واقع به‌روز است\&. مقدار پیش‌فرض 1\&.4 است\&. .sp اگرچه این متغیر در درجه اول برای انتخاب یک نسخه از کامپایلر Java در برابر نسخه‌ای دیگر در نظر گرفته \fIنشده\fR است، اما در بستر Windows چنین تأثیری دارد\&. رویکرد دقیق‌تر این است که در صورتی که کامپایلر مد نظر شما کامپایلر پیش‌فرض نیست، \fB$JAVAC\fR (و متغیرهای ساخت مربوطه برای ابزارهای مرتبط) را روی مسیر کامپایلر Java خاصی که می‌خواهید تنظیم کنید\&. در بسترهای غیر از Windows، سامانهٔ alternatives ممکن است روشی برای تنظیم کامپایلر پیش‌فرض Java بدون نیاز به مشخص کردن صریح مسیرها فراهم کند\&. .RE .PP \fBLATEX\fR .RS 4 قالب‌بند و حروف‌چین ساختاریافتهٔ LaTeX\&. .RE .PP \fBLATEXCOM\fR .RS 4 خط فرمانی که برای فراخوانی قالب‌بند و حروف‌چین ساختاریافتهٔ LaTeX استفاده می‌شود\&. .RE .PP \fBLATEXCOMSTR\fR .RS 4 رشته‌ای که هنگام فراخوانی قالب‌بند و حروف‌چین ساختاریافتهٔ LaTeX نمایش داده می‌شود\&. اگر این متغیر تنظیم نشده باشد، \fB$LATEXCOM\fR (خط فرمان) نمایش داده می‌شود\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(LATEXCOMSTR = "Building $TARGET from LaTeX input $SOURCES") .fi .if n \{\ .RE .\} .RE .PP \fBLATEXFLAGS\fR .RS 4 گزینه‌های عمومی ارسال‌شده به قالب‌بند و حروف‌چین ساختاریافتهٔ LaTeX\&. .RE .PP \fBLATEXRETRIES\fR .RS 4 حداکثر دفعاتی که در صورت اعلام وجود ارجاعات تعریف‌نشده در فایل \&.log تولیدشده توسط فرمان \fB$LATEXCOM\fR، دستور LaTeX دوباره اجرا خواهد شد\&. حالت پیش‌فرض، تلاش برای حل ارجاعات تعریف‌نشده با اجرای مجدد LaTeX تا سه بار است\&. .RE .PP \fBLATEXSUFFIXES\fR .RS 4 فهرست پسوندهای فایل‌هایی که برای وابستگی‌های ضمنی LaTeX (فایل‌های \einclude یا \eimport) پویش خواهند شد\&. فهرست پیش‌فرض عبارت است از: .sp .if n \{\ .RS 4 .\} .nf ["\&.tex", "\&.ltx", "\&.latex"] .fi .if n \{\ .RE .\} .RE .PP \fBLDMODULE\fR .RS 4 پیونددهنده (linker) برای ساخت ماژول‌های قابل بارگذاری\&. به‌طور پیش‌فرض، همانند \fB$SHLINK\fR است\&. .RE .PP \fBLDMODULECOM\fR .RS 4 خط فرمان برای ساخت ماژول‌های قابل بارگذاری\&. در Mac OS X، از متغیرهای \fB$LDMODULE\fR، \fB$LDMODULEFLAGS\fR و \fB$FRAMEWORKSFLAGS\fR استفاده می‌کند\&. در سایر سیستم‌ها، همانند \fB$SHLINK\fR است\&. .RE .PP \fBLDMODULECOMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام ساخت ماژول‌های قابل بارگذاری نمایش داده می‌شود\&. اگر تنظیم نشده باشد، \fB$LDMODULECOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBLDMODULEEMITTER\fR .RS 4 شامل مشخصات گسیل‌کننده (emitter) برای سازندهٔ \fBLoadableModule\fR است\&. بخش "Builder Objects" در صفحهٔ راهنما شامل اطلاعات کلی دربارهٔ مشخص کردن گسیل‌کننده‌ها است\&. .RE .PP \fBLDMODULEFLAGS\fR .RS 4 گزینه‌های عمومی کاربر که برای ساخت ماژول‌های قابل بارگذاری به پیونددهنده ارسال می‌شوند\&. .RE .PP \fBLDMODULENOVERSIONSYMLINKS\fR .RS 4 به سازندهٔ \fBLoadableModule\fR دستور می‌دهد پیوندهای نمادین را به‌طور خودکار برای ماژول‌های دارای نسخه ایجاد نکند\&. مقدار پیش‌فرض آن \fB$SHLIBNOVERSIONSYMLINKS\fR است\&. .RE .PP \fBLDMODULEPREFIX\fR .RS 4 پیشوند مورد استفاده برای نام فایل‌های ماژول‌های قابل بارگذاری\&. در Mac OS X، تهی (null) است؛ در سیستم‌های دیگر، همانند \fB$SHLIBPREFIX\fR است\&. .RE .PP \fB_LDMODULESONAME\fR .RS 4 ماکرویی که به‌طور خودکار \fB$SONAME\fR یک ماژول قابل بارگذاری را بر اساس $TARGET، \fB$LDMODULEVERSION\fR و \fB$LDMODULESUFFIX\fR تولید می‌کند\&. در صورتی که ابزار پیونددهنده از SONAME پشتیبانی کند (مانند gnulink)، توسط سازندهٔ \fBLoadableModule\fR استفاده می‌شود\&. .RE .PP \fBLDMODULESUFFIX\fR .RS 4 پسوند مورد استفاده برای نام فایل‌های ماژول‌های قابل بارگذاری\&. در Mac OS X، این مقدار تهی (null) است؛ در سیستم‌های دیگر، مقداری یکسان با $SHLIBSUFFIX دارد\&. .RE .PP \fBLDMODULEVERSION\fR .RS 4 هنگامی که این متغیر ساخت تعریف شده باشد، یک ماژول قابل بارگذاری نسخه‌دار توسط سازندهٔ \fBLoadableModule\fR ایجاد می‌شود\&. این کار \fB$_LDMODULEVERSIONFLAGS\fR را فعال کرده و در نتیجه \fB$LDMODULECOM\fR را بر حسب نیاز تغییر می‌دهد، شماره نسخه را به نام کتابخانه اضافه می‌کند و پیوندهای نمادین مورد نیاز را می‌سازد\&. نسخه‌های \fB$LDMODULEVERSION\fR باید در همان قالبی مشخص شوند که برای \fB$SHLIBVERSION\fR استفاده می‌شود\&. .RE .PP \fB_LDMODULEVERSIONFLAGS\fR .RS 4 این ماکرو هنگام ساخت یک \fBLoadableModule\fR نسخه‌دار (یعنی زمانی که \fB$LDMODULEVERSION\fR تنظیم شده باشد)، پرچم‌های اضافی را به طور خودکار به \fB$LDMODULECOM\fR معرفی می‌کند\&. \fB$_LDMODULEVERSIONFLAGS\fR معمولاً \fB$SHLIBVERSIONFLAGS\fR و برخی گزینه‌های پویای تولیدشدهٔ اضافی (مانند \-Wl,\-soname=$_LDMODULESONAME) را اضافه می‌کند\&. این متغیر برای ماژول‌های قابل بارگذاری ساده (بدون نسخه) استفاده نمی‌شود\&. .RE .PP \fBLDMODULEVERSIONFLAGS\fR .RS 4 پرچم‌های اضافی که هنگام ساخت \fBLoadableModule\fR نسخه‌دار به \fB$LDMODULECOM\fR اضافه می‌شوند\&. این پرچم‌ها فقط زمانی استفاده می‌شوند که \fB$LDMODULEVERSION\fR تنظیم شده باشد\&. .RE .PP \fBLEX\fR .RS 4 تولیدکنندهٔ تحلیل‌گر واژگانی\&. .RE .PP \fBLEX_HEADER_FILE\fR .RS 4 در صورت مشخص شدن، یک فایل هدر C با نام برگرفته از این متغیر تولید می‌کند\&. این مقدار به صورت یک گزینهٔ خط فرمان \fB\-\-header\-file=\fR ارسال خواهد شد\&. بهتر است به جای گنجاندن مستقیم \fB\-\-header\-file=\fR در \fB$LEXFLAGS\fR از این متغیر استفاده کنید\&. .RE .PP \fBLEX_TABLES_FILE\fR .RS 4 در صورت مشخص شدن، جدول‌های lex را در فایلی با نام برگرفته از این متغیر می‌نویسد\&. این مقدار به صورت یک گزینهٔ خط فرمان \fB\-\-tables\-file=\fR ارسال خواهد شد\&. بهتر است به جای گنجاندن مستقیم \fB\-\-tables\-file=\fR در \fB$LEXFLAGS\fR از این متغیر استفاده کنید\&. .RE .PP \fBLEXCOM\fR .RS 4 خط فرمانی که برای فراخوانی تولیدکنندهٔ تحلیل‌گر واژگانی جهت تولید یک فایل منبع استفاده می‌شود\&. .RE .PP \fBLEXCOMSTR\fR .RS 4 رشته‌ای که هنگام تولید یک فایل منبع با استفاده از تولیدکنندهٔ تحلیل‌گر واژگانی نمایش داده می‌شود\&. اگر این متغیر تنظیم نشده باشد، \fB$LEXCOM\fR (خط فرمان) نمایش داده می‌شود\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(LEXCOMSTR="Lex\*(Aqing $TARGET from $SOURCES") .fi .if n \{\ .RE .\} .RE .PP \fBLEXFLAGS\fR .RS 4 گزینه‌های عمومی ارسال‌شده به تولیدکنندهٔ تحلیل‌گر واژگانی\&. علاوه بر ارسال مقدار هنگام فراخوانی، ابزار lex این متغیر ساخت را برای یافتن گزینه‌هایی که باعث تولید فایل‌های خروجی اضافی می‌شوند نیز بررسی کرده و آن‌ها را به فهرست هدف‌ها اضافه می‌کند\&. گزینه‌های شناخته‌شده برای این منظور در GNU flex شامل \fB\-\-header\-file=\fR و \fB\-\-tables\-file=\fR هستند؛ نام فایل خروجی توسط آرگومان گزینه تعیین می‌شود\&. .sp توجه داشته باشید که فایل‌های مشخص‌شده توسط \fB\-\-header\-file=\fR و \fB\-\-tables\-file=\fR ممکن است در همه شرایط به درستی توسط SCons مدیریت نشوند\&. در عوض، استفاده از \fB$LEX_HEADER_FILE\fR و \fB$LEX_TABLES_FILE\fR را مد نظر قرار دهید\&. .RE .PP \fBLEXUNISTD\fR .RS 4 فقط در محیط‌های Windows برای تنظیم پرچم lex جهت جلوگیری از اضافه شدن unistd\&.h استفاده می‌شود\&. مقدار پیش‌فرض \fB\-\-nounistd\fR است\&. .RE .PP \fB_LIBDIRFLAGS\fR .RS 4 یک متغیر ساخت که به‌صورت خودکار تولید می‌شود و شامل گزینه‌های خط فرمان پیونددهنده برای تعیین دایرکتوری‌های مورد جستجو برای کتابخانه‌ها است\&. مقدار \fB$_LIBDIRFLAGS\fR به ترتیب با افزودن پیشوند \fB$LIBDIRPREFIX\fR و پسوند \fB$LIBDIRSUFFIX\fR به هر دایرکتوری در \fB$LIBPATH\fR ایجاد می‌شود\&. .RE .PP \fBLIBDIRPREFIX\fR .RS 4 پیشوند مورد استفاده برای مشخص کردن دایرکتوری کتابخانه در خط فرمان پیونددهنده\&. این مقدار در زمان تولید خودکار متغیر \fB$_LIBDIRFLAGS\fR به ابتدای هر دایرکتوری در متغیر ساخت \fB$LIBPATH\fR اضافه خواهد شد\&. .RE .PP \fBLIBDIRSUFFIX\fR .RS 4 پسوندی که برای مشخص کردن دایرکتوری کتابخانه در خط فرمان پیونددهنده استفاده می‌شود\&. این مقدار به هر دایرکتوری در متغیر ساخت \fB$LIBPATH\fR هنگام تولید خودکار متغیر \fB$_LIBDIRFLAGS\fR الحاق خواهد شد\&. .RE .PP \fBLIBEMITTER\fR .RS 4 شامل مشخصات منتشرکننده (emitter) برای سازندهٔ \fBStaticLibrary\fR است\&. بخش «Builder Objects» در صفحهٔ راهنما حاوی اطلاعات عمومی دربارهٔ مشخص کردن emitterها است\&. .RE .PP \fB_LIBFLAGS\fR .RS 4 یک متغیر ساخت که به‌طور خودکار تولید می‌شود و شامل گزینه‌های خط فرمان پیونددهنده برای مشخص کردن کتابخانه‌هایی است که باید با هدف حاصل پیوند داده شوند\&. مقدار \fB$_LIBFLAGS\fR با افزودن پیشوند \fB$LIBLINKPREFIX\fR و پسوند \fB$LIBLINKSUFFIX\fR به ترتیب به ابتدا و انتهای هر نام فایل در \fB$LIBS\fR ایجاد می‌شود\&. .RE .PP \fBLIBLINKPREFIX\fR .RS 4 پیشوندی که برای مشخص کردن کتابخانه جهت پیوند در خط فرمان پیونددهنده استفاده می‌شود\&. این مقدار به ابتدای هر کتابخانه در متغیر ساخت \fB$LIBS\fR هنگام تولید خودکار متغیر \fB$_LIBFLAGS\fR اضافه خواهد شد\&. .RE .PP \fBLIBLINKSUFFIX\fR .RS 4 پسوندی که برای مشخص کردن کتابخانه جهت پیوند در خط فرمان پیونددهنده استفاده می‌شود\&. این مقدار به انتهای هر کتابخانه در متغیر ساخت \fB$LIBS\fR هنگام تولید خودکار متغیر \fB$_LIBFLAGS\fR الحاق خواهد شد\&. .RE .PP \fBLIBLITERALPREFIX\fR .RS 4 اگر پیونددهنده از ساختار خط فرمانی پشتیبانی کند که نشان می‌دهد آرگومان مشخص‌کنندهٔ کتابخانه باید به‌صورت لفظی (بدون تغییر) جستجو شود، \fB$LIBLITERALPREFIX\fR می‌تواند روی آن شناسه تنظیم گردد\&. برای مثال، پیونددهندهٔ GNU از این قاعده پیروی می‌کند: \(lq \-l:foo در مسیر کتابخانه به دنبال نام فایلی به نام foo می‌گردد، بدون آنکه آن را به libfoo\&.so یا libfoo\&.a تبدیل کند\&. \(rq اگر \fB$LIBLITERALPREFIX\fR تنظیم شده باشد، SCons ورودی‌های رشته‌ای در \fB$LIBS\fR را که با آن رشته آغاز می‌شوند تغییر نخواهد داد\&. این ورودی همچنان در خط فرمان با \fB$LIBLINKPREFIX\fR و \fB$LIBLINKSUFFIX\fR احاطه خواهد شد\&. این قابلیت برای نمونه زمانی مفید است که هم کتابخانهٔ ایستا و هم پویا در دسترس هستند و سیاست پیونددهنده ترجیح کتابخانه‌های پویاست، اما می‌خواهید استفاده از کتابخانهٔ ایستا را تحمیل کنید\&. در مقایسه با مثال موجود در \fB$LIBS\fR، .sp .if n \{\ .RS 4 .\} .nf env\&.Append(LIBS=":libmylib\&.a") .fi .if n \{\ .RE .\} .sp به پیونددهنده اجازه می‌دهد در صورت یافتن آن نام کتابخانهٔ خاص (ایستا) در مسیر جستجوی کتابخانه، آن را انتخاب کند\&. این روش با استفاده از یک شیء File برای تعیین کتابخانهٔ ایستا متفاوت است، زیرا دومی مسیر جستجوی کتابخانه را به‌طور کامل دور می‌زند\&. .RE .PP \fBLIBPATH\fR .RS 4 فهرست دایرکتوری‌هایی که برای یافتن کتابخانه‌های مشخص‌شده در متغیر ساخت \fB$LIBS\fR جستجو خواهند شد\&. \fB$LIBPATH\fR باید فهرستی از رشته‌های مسیر یا یک رشتهٔ تکی باشد، نه فهرستی از مسیرها که با نویسهٔ os\&.pathsep در Python به یکدیگر متصل شده‌اند\&. دستورهای جستجوی کتابخانه را مستقیماً در \fB$LINKFLAGS\fR یا \fB$SHLINKFLAGS\fR قرار ندهید، چرا که نتیجه غیرقابل‌حمل (non\-portable) خواهد بود\&. .sp نکته: نام‌های دایرکتوری در \fB$LIBPATH\fR هنگامی که در یک فرمان استفاده می‌شوند، نسبت به دایرکتوری فایل SConscript جستجو خواهند شد\&. برای وادار کردن \fBscons\fR به جستجوی دایرکتوری نسبت به ریشهٔ درخت کد منبع، از پیشوند # استفاده کنید: .sp .if n \{\ .RS 4 .\} .nf env = Environment(LIBPATH=\*(Aq#/libs\*(Aq) .fi .if n \{\ .RE .\} .sp همچنین می‌توان جستجوی دایرکتوری را با استفاده از تابع \fBDir\fR اجبار کرد: .sp .if n \{\ .RS 4 .\} .nf libs = Dir(\*(Aqlibs\*(Aq) env = Environment(LIBPATH=libs) .fi .if n \{\ .RE .\} .sp فهرست دایرکتوری‌ها از طریق متغیر ساخت خودکار تولیدشدهٔ \fB$_LIBDIRFLAGS\fR به خطوط فرمان اضافه خواهد شد، که با افزودن مقادیر متغیرهای ساخت \fB$LIBDIRPREFIX\fR و \fB$LIBDIRSUFFIX\fR به ترتیب به ابتدا و انتهای هر دایرکتوری در \fB$LIBPATH\fR ایجاد می‌شود\&. هر خط فرمانی که تعریف می‌کنید و به فهرست دایرکتوری‌های \fB$LIBPATH\fR نیاز دارد، باید شامل \fB$_LIBDIRFLAGS\fR باشد: .sp .if n \{\ .RS 4 .\} .nf env = Environment(LINKCOM="my_linker $_LIBDIRFLAGS $_LIBFLAGS \-o $TARGET $SOURCE") .fi .if n \{\ .RE .\} .RE .PP \fBLIBPREFIX\fR .RS 4 پیشوندی که برای نام فایل‌های کتابخانه (ایستا) به کار می‌رود\&. برای هر بستر (posix، win32، os2 و غیره) یک مقدار پیش‌فرض تنظیم شده است، اما این مقدار توسط ابزارهای مجزا (ar، mslib، sgiar، sunar، tlib و غیره) بازنویسی می‌شود تا بازتاب‌دهندهٔ نام کتابخانه‌هایی باشد که ایجاد می‌کنند\&. .RE .PP \fBLIBPREFIXES\fR .RS 4 فهرستی از تمام پیشوندهای مجاز برای نام فایل‌های کتابخانه در بستر جاری\&. هنگام جستجو برای وابستگی‌های کتابخانه، SCons به دنبال فایل‌هایی با این پیشوندها، نام پایهٔ کتابخانه، و پسوندهای موجود در فهرست \fB$LIBSUFFIXES\fR خواهد گشت\&. .RE .PP \fBLIBS\fR .RS 4 فهرست کتابخانه‌هایی که برای پیوند با هر برنامهٔ اجرایی، کتابخانهٔ اشتراکی، یا ماژول قابل بارگذاری ایجادشده توسط محیط ساخت یا بازنویسی (override)، به خط پیوند (link line) اضافه خواهند شد\&. .sp برای سازگاری و حمل‌پذیری، نام کتابخانه‌ای که به صورت رشته باشد باید تنها شامل نام پایهٔ کتابخانه باشد، بدون پیشوندهایی مانند lib یا پسوندهایی چون \&.so یا \&.dll\&. SCons تلاش \fIخواهد کرد\fR که پیشوندها را از فهرست \fB$LIBPREFIXES\fR و پسوندها را از فهرست \fB$LIBSUFFIXES\fR حذف کند، اما تکیه بر این رفتار قابلیت حمل ساخت را کاهش می‌دهد: برای مثال، در یک سیستم POSIX، هیچ تلاشی برای حذف پسوندی مانند \&.dll صورت نخواهد گرفت\&. رشته‌های نام کتابخانه در \fB$LIBS\fR نباید شامل جزء مسیر (path component) باشند: در عوض از \fB$LIBPATH\fR استفاده کنید تا کامپایلر را هدایت کند که علاوه بر هر مسیر پیش‌فرضی که پیونددهنده (linker) جستجو می‌کند، در آن مسیرها نیز به دنبال کتابخانه‌ها بگردد\&. اگر \fB$LIBLITERALPREFIX\fR روی یک رشتهٔ غیرخالی تنظیم شده باشد، آنگاه مدخلی در \fB$LIBS\fR که با مقدار رشته‌ای \fB$LIBLITERALPREFIX\fR شروع شود، باعث خواهد شد که باقی‌ماندهٔ آن مدخل بدون تغییر اما با رعایت مسیرهای جستجوی عادی کتابخانه جستجو شود (این یک استثنا بر راهنمای بالا در خصوص حذف پیشوند/پسوند از نام کتابخانه است)\&. .sp اگر یک مدخل \fB$LIBS\fR یک شیء Node باشد (خواه خروجی فراخوانی قبلی یک سازنده (Builder) باشد، یا نتیجهٔ فراخوانی صریح \fBFile\fR)، نام مسیر برگرفته از آن Node به صورت دست‌نخورده به \fB$_LIBFLAGS\fR، و در نتیجه به خط پیوند اضافه خواهد شد \- بدون افزودن \fB$LIBLINKPREFIX\fR یا \fB$LIBLINKSUFFIX\fR\&. چنین مدخل‌هایی به صورت لفظی (عین کلمه، شامل هر جزء مسیر) جستجو می‌شوند؛ و از مسیرهای جستجوی کتابخانه استفاده نخواهد شد\&. برای مثال: .sp .if n \{\ .RS 4 .\} .nf env\&.Append(LIBS=File(\*(Aq/tmp/mylib\&.so\*(Aq)) .fi .if n \{\ .RE .\} .sp به ازای هر فراخوانی Builder که منجر به پیوند با کتابخانه‌ها می‌شود، SCons کتابخانه‌های موجود در تنظیمات \fB$LIBS\fR را که در آن لحظه فعال است، به عنوان وابستگی‌های هدفی که در حال تولید است به گراف وابستگی اضافه خواهد کرد\&. .sp فهرست کتابخانه‌ها از طریق متغیر ساخت خودکار تولیدشدهٔ \fB$_LIBFLAGS\fR به آرگومان‌های خط فرمان تبدیل می‌شود؛ این متغیر به ترتیب با افزودن مقادیر متغیرهای ساخت \fB$LIBLINKPREFIX\fR و \fB$LIBLINKSUFFIX\fR به ابتدا و انتهای نام هر کتابخانه ایجاد می‌گردد\&. .sp هر خط فرمانی که خودتان تعریف می‌کنید و به کتابخانه‌های موجود در \fB$LIBS\fR نیاز دارد، به جای \fB$LIBS\fR باید شامل \fB$_LIBFLAGS\fR (و همچنین \fB$_LIBDIRFLAGS\fR) باشد\&. برای مثال: .sp .if n \{\ .RS 4 .\} .nf env = Environment(LINKCOM="my_linker $_LIBDIRFLAGS $_LIBFLAGS \-o $TARGET $SOURCE") .fi .if n \{\ .RE .\} .RE .PP \fBLIBSUFFIX\fR .RS 4 پسوندی که برای نام فایل‌های کتابخانه (ایستا) به کار می‌رود\&. برای هر بستر (posix، win32، os2 و غیره) یک مقدار پیش‌فرض تعیین شده است، اما این مقدار توسط ابزارهای مجزا (ar، mslib، sgiar، sunar، tlib و غیره) بازنویسی می‌شود تا بازتاب‌دهندهٔ نام کتابخانه‌هایی باشد که ایجاد می‌کنند\&. .RE .PP \fBLIBSUFFIXES\fR .RS 4 فهرستی از تمام پسوندهای مجاز برای نام فایل‌های کتابخانه در بستر جاری\&. هنگام جستجو برای وابستگی‌های کتابخانه، SCons به دنبال فایل‌هایی با پیشوندهای موجود در فهرست \fB$LIBPREFIXES\fR، نام پایهٔ کتابخانه، و این پسوندها خواهد گشت\&. .RE .PP \fBLICENSE\fR .RS 4 نام اختصاری، ترجیحاً کد SPDX، مجوزی که این پروژه تحت آن منتشر می‌شود (GPL\-3\&.0، LGPL\-2\&.1، BSD\-2\-Clause و غیره)\&. برای فهرستی از نام‌های مجوز و کدهای SPDX به \m[blue]\fBhttp://www\&.opensource\&.org/licenses/alphabetical\fR\m[]\&\s-2\u[7]\d\s+2 مراجعه کنید\&. .sp سازندهٔ \fBPackage\fR را ببینید\&. .RE .PP \fBLINESEPARATOR\fR .RS 4 جداساز مورد استفاده توسط سازنده‌های \fBSubstfile\fR و \fBTextfile\fR\&. این مقدار هنگام ساخت هدف، میان منابع استفاده می‌شود\&. مقدار پیش‌فرض آن جداساز خط سیستم جاری است\&. .RE .PP \fBLINGUAS_FILE\fR .RS 4 متغیر \fB$LINGUAS_FILE\fR فایل(هایی) حاوی فهرست زبان‌های اضافی را که باید توسط سازنده‌های \fBPOInit\fR، \fBPOUpdate\fR یا \fBMOFiles\fR پردازش شوند، مشخص می‌کند\&. این متغیر همچنین بر سازندهٔ \fBTranslate\fR اثر می‌گذارد\&. اگر متغیر حاوی یک رشته باشد، نام فایل فهرست را مشخص می‌کند\&. \fB$LINGUAS_FILE\fR می‌تواند فهرستی از نام‌های فایل نیز باشد\&. اگر \fB$LINGUAS_FILE\fR روی یک مقدار درست‌نما (truthy) غیررشته‌ای تنظیم شود، فهرست از فایلی به نام LINGUAS خوانده خواهد شد\&. .RE .PP \fBLINK\fR .RS 4 پیونددهنده\&. همچنین برای پیوند دادن اشیای اشتراکی \fB$SHLINK\fR را ببینید\&. .sp در سامانه‌های POSIX (آن‌هایی که از ابزار link استفاده می‌کنند)، در حالت عادی نباید این مقدار را تغییر دهید، زیرا به‌طور پیش‌فرض روی یک ابزار پیونددهنده «هوشمند» تنظیم شده است که راه‌انداز کامپایلر متناسب با نوع فایل‌های منبعِ در حال استفاده را انتخاب می‌کند\&. بنابراین برای نمونه، اگر \fB$CXX\fR را روی نام یک کامپایلر مشخص تنظیم کنید و در حال کامپایل منابع C++ باشید، تابع smartlink به‌طور خودکار همان کامپایلر را برای پیوند دادن انتخاب خواهد کرد\&. .RE .PP \fBLINKCOM\fR .RS 4 خط فرمانی که برای پیوند دادن فایل‌های شیء به یک فایل اجرایی استفاده می‌شود\&. همچنین برای پیوند دادن اشیای اشتراکی \fB$SHLINKCOM\fR را ببینید\&. .RE .PP \fBLINKCOMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام پیوند دادن فایل‌های شیء به یک فایل اجرایی نمایش داده می‌شود\&. اگر تنظیم نشده باشد، \fB$LINKCOM\fR (خط فرمان) نمایش داده می‌شود\&. همچنین برای پیوند دادن اشیای اشتراکی \fB$SHLINKCOMSTR\fR را ببینید\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(LINKCOMSTR = "Linking $TARGET") .fi .if n \{\ .RE .\} .RE .PP \fBLINKFLAGS\fR .RS 4 گزینه‌های عمومی کاربر که به پیونددهنده ارسال می‌شوند\&. توجه داشته باشید که این متغیر \fIنباید\fR شامل گزینه‌های \fB\-l\fR (یا مشابه آن) برای پیوند با کتابخانه‌های فهرست‌شده در \fB$LIBS\fR، و نه گزینه‌های مسیر جستجوی کتابخانه مانند \fB\-L\fR (یا مشابه آن) باشد که scons به‌طور خودکار از \fB$LIBPATH\fR تولید می‌کند\&. برای مشاهده متغیری که به گزینه‌های پیوند کتابخانه بسط می‌یابد، \fB$_LIBFLAGS\fR در بالا، و برای متغیری که به گزینه‌های مسیر جستجوی کتابخانه بسط می‌یابد، \fB$_LIBDIRFLAGS\fR در بالا را ببینید\&. همچنین برای پیوند دادن اشیای اشتراکی \fB$SHLINKFLAGS\fR را ببینید\&. .RE .PP \fBM4\fR .RS 4 پیش‌پردازنده ماکروی M4\&. .RE .PP \fBM4COM\fR .RS 4 خط فرمانی که برای عبور دادن فایل‌ها از پیش‌پردازنده ماکروی M4 استفاده می‌شود\&. .RE .PP \fBM4COMSTR\fR .RS 4 رشته‌ای که هنگام عبور دادن یک فایل از پیش‌پردازنده ماکروی M4 نمایش داده می‌شود\&. اگر این متغیر تنظیم نشده باشد، \fB$M4COM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBM4FLAGS\fR .RS 4 گزینه‌های عمومی که به پیش‌پردازنده ماکروی M4 ارسال می‌شوند\&. .RE .PP \fBMAKEINDEX\fR .RS 4 تولیدکننده makeindex برای قالب‌بند و حروف‌چین TeX و همچنین قالب‌بند و حروف‌چین ساختاریافته LaTeX\&. .RE .PP \fBMAKEINDEXCOM\fR .RS 4 خط فرمانی که برای فراخوانی تولیدکننده makeindex برای قالب‌بند و حروف‌چین TeX و قالب‌بند و حروف‌چین ساختاریافته LaTeX استفاده می‌شود\&. .RE .PP \fBMAKEINDEXCOMSTR\fR .RS 4 رشته‌ای که هنگام فراخوانی تولیدکننده makeindex برای قالب‌بند و حروف‌چین TeX و قالب‌بند و حروف‌چین ساختاریافته LaTeX نمایش داده می‌شود\&. اگر تنظیم نشده باشد، \fB$MAKEINDEXCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBMAKEINDEXFLAGS\fR .RS 4 گزینه‌های عمومی که به تولیدکننده makeindex برای قالب‌بند و حروف‌چین TeX و قالب‌بند و حروف‌چین ساختاریافته LaTeX ارسال می‌شوند\&. .RE .PP \fBMAXLINELENGTH\fR .RS 4 حداکثر تعداد نویسه‌های مجاز در یک خط فرمان خارجی\&. در سامانه‌های Win32، خطوط پیوندی که طولی بیشتر از این تعداد نویسه داشته باشند، از طریق یک نام فایل موقت پیوند داده می‌شوند\&. .RE .PP \fBMIDL\fR .RS 4 کامپایلر Microsoft IDL\&. .RE .PP \fBMIDLCOM\fR .RS 4 خط فرمانی که برای ارسال فایل‌ها به کامپایلر Microsoft IDL استفاده می‌شود\&. .RE .PP \fBMIDLCOMSTR\fR .RS 4 رشته‌ای که هنگام فراخوانی کامپایلر Microsoft IDL نمایش داده می‌شود\&. اگر این متغیر تنظیم نشده باشد، \fB$MIDLCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBMIDLFLAGS\fR .RS 4 گزینه‌های عمومی که به کامپایلر Microsoft IDL ارسال می‌شوند\&. .RE .PP \fBMOSUFFIX\fR .RS 4 پسوند مورد استفاده برای فایل‌های MO (پیش‌فرض: \*(Aq\&.mo\*(Aq)\&. ابزار msgfmt و سازندهٔ \fBMOFiles\fR را ببینید\&. .RE .PP \fBMSGFMT\fR .RS 4 مسیر مطلق به باینری \fBmsgfmt(1)\fR، یافت‌شده توسط \fBDetect()\fR\&. ابزار msgfmt و سازندهٔ \fBMOFiles\fR را ببینید\&. .RE .PP \fBMSGFMTCOM\fR .RS 4 خط فرمان کامل برای اجرای برنامهٔ \fBmsgfmt(1)\fR\&. ابزار msgfmt و سازندهٔ \fBMOFiles\fR را ببینید\&. .RE .PP \fBMSGFMTCOMSTR\fR .RS 4 رشته‌ای که هنگام فراخوانی \fBmsgfmt(1)\fR نمایش داده می‌شود (پیش‌فرض: \*(Aq\*(Aq، به معنی «چاپ \fB$MSGFMTCOM\fR»)\&. ابزار msgfmt و سازندهٔ \fBMOFiles\fR را ببینید\&. .RE .PP \fBMSGFMTFLAGS\fR .RS 4 پرچم‌های اضافی برای \fBmsgfmt(1)\fR\&. ابزار msgfmt و سازندهٔ \fBMOFiles\fR را ببینید\&. .RE .PP \fBMSGINIT\fR .RS 4 مسیر برنامهٔ \fBmsginit(1)\fR (یافت‌شده از طریق \fBDetect\fR)\&. ابزار msginit و سازندهٔ \fBPOInit\fR را ببینید\&. .RE .PP \fBMSGINITCOM\fR .RS 4 خط فرمان کامل برای اجرای برنامهٔ \fBmsginit(1)\fR\&. ابزار msginit و سازندهٔ \fBPOInit\fR را ببینید\&. .RE .PP \fBMSGINITCOMSTR\fR .RS 4 رشته‌ای که هنگام فراخوانی \fBmsginit(1)\fR نمایش داده می‌شود\&. مقدار پیش‌فرض یک رشتهٔ خالی است که خط فرمان (\fB$MSGINITCOM\fR) را چاپ خواهد کرد\&. ابزار msginit و سازندهٔ \fBPOInit\fR را ببینید\&. .RE .PP \fBMSGINITFLAGS\fR .RS 4 فهرست پرچم‌های اضافی برای \fBmsginit(1)\fR (پیش‌فرض: [])\&. ابزار msginit و سازندهٔ \fBPOInit\fR را ببینید\&. .RE .PP \fB_MSGINITLOCALE\fR .RS 4 یک «ماکرو»ی داخلی\&. نام محلی (زبان) را بر اساس نام فایل هدف محاسبه می‌کند (پیش‌فرض: \*(Aq${TARGET\&.filebase}\*(Aq)\&. .sp ابزار msginit و سازندهٔ \fBPOInit\fR را ببینید\&. .RE .PP \fBMSGMERGE\fR .RS 4 مسیر مطلق به باینری \fBmsgmerge(1)\fR آن‌طور که توسط \fBDetect()\fR یافت شده است\&. ابزار msgmerge و سازندهٔ \fBPOUpdate\fR را ببینید\&. .RE .PP \fBMSGMERGECOM\fR .RS 4 خط فرمان کامل برای اجرای دستور \fBmsgmerge(1)\fR\&. ابزار msgmerge و سازندهٔ \fBPOUpdate\fR را ببینید\&. .RE .PP \fBMSGMERGECOMSTR\fR .RS 4 رشته‌ای که هنگام فراخوانی \fBmsgmerge(1)\fR نمایش داده خواهد شد\&. مقدار پیش‌فرض یک رشتهٔ خالی است که خط فرمان (\fB$MSGMERGECOM\fR) را چاپ خواهد کرد\&. ابزار msgmerge و سازندهٔ \fBPOUpdate\fR را ببینید\&. .RE .PP \fBMSGMERGEFLAGS\fR .RS 4 پرچم‌های اضافی برای دستور \fBmsgmerge(1)\fR\&. ابزار msgmerge و سازندهٔ \fBPOUpdate\fR را ببینید\&. .RE .PP \fBMSSDK_DIR\fR .RS 4 دایرکتوری حاوی Microsoft SDK (خواه Platform SDK یا Windows SDK) که برای کامپایل استفاده می‌شود\&. .RE .PP \fBMSSDK_VERSION\fR .RS 4 رشتهٔ نسخهٔ Microsoft SDK (خواه Platform SDK یا Windows SDK) که برای کامپایل استفاده می‌شود\&. نسخه‌های پشتیبانی‌شده شامل 6\&.1، 6\&.0A، 6\&.0، 2003R2 و 2003R1 می‌شوند\&. .RE .PP \fBMSVC_BATCH\fR .RS 4 هنگامی که روی هر مقدار درستی (true) تنظیم شود، مشخص می‌کند که SCons باید کامپایل فایل‌های شیء را هنگام فراخوانی کامپایلر Microsoft Visual C++ به صورت دسته‌ای انجام دهد\&. تمامی کامپایل‌های فایل‌های منبع از یک دایرکتوری منبع یکسان که فایل‌های هدف را در یک دایرکتوری خروجی یکسان تولید می‌کنند و در SCons با استفاده از یک محیط ساخت (construction environment) یکسان پیکربندی شده‌اند، در یک فراخوانی واحد کامپایلر ساخته خواهند شد\&. تنها فایل‌های منبعی که پس از ساخته شدن فایل‌های شیءشان تغییر کرده‌اند به هر فراخوانی کامپایلر ارسال خواهند شد (از طریق متغیر ساخت \fB$CHANGED_SOURCES\fR)\&. هر کامپایلی که در آن نام پایهٔ فایل شیء (هدف) (منهای \&.obj) با نام پایهٔ فایل منبع مطابقت نداشته باشد، به طور جداگانه کامپایل خواهد شد\&. .RE .PP \fBMSVC_NOTFOUND_POLICY\fR .RS 4 رفتار \fBscons\fR را هنگام عدم شناسایی کامپایلر Microsoft Visual C++ مشخص می‌کند\&. .sp متغیر \fB$MSVC_NOTFOUND_POLICY\fR رفتار \fBscons\fR را در زمانی که هیچ نسخه‌ای از msvc شناسایی نشود یا نسخهٔ درخواستی msvc پیدا نشود، تعیین می‌کند\&. .sp مقادیر معتبر برای \fB$MSVC_NOTFOUND_POLICY\fR و رفتار متناظر \fBscons\fR عبارتند از: .PP \fI\*(AqError\*(Aq یا \*(AqException\*(Aq\fR .RS 4 هنگامی که هیچ نسخه‌ای از msvc شناسایی نشود یا نسخهٔ درخواستی msvc پیدا نشود، یک استثنا (exception) ایجاد می‌کند\&. .RE .PP \fI\*(AqWarning\*(Aq یا \*(AqWarn\*(Aq\fR .RS 4 هنگامی که هیچ نسخه‌ای از msvc شناسایی نشود یا نسخهٔ درخواستی msvc پیدا نشود، یک هشدار صادر کرده و ادامه می‌دهد\&. بسته به نحوهٔ استفاده، این کار ممکن است منجر به شکست در ساخت شود\&. .RE .PP \fI\*(AqIgnore\*(Aq یا \*(AqSuppress\*(Aq\fR .RS 4 هنگامی که هیچ نسخه‌ای از msvc شناسایی نشود یا نسخهٔ درخواستی msvc پیدا نشود، هیچ اقدامی انجام نداده و ادامه می‌دهد\&. بسته به نحوهٔ استفاده، این کار ممکن است منجر به شکست در ساخت شود\&. .RE .sp نکته: علاوه بر مقادیر با حروف‌چینی شتری (camel case) که در بالا نشان داده شده‌اند، مقادیر با حروف کوچک و بزرگ نیز پذیرفته می‌شوند\&. .sp متغیر \fB$MSVC_NOTFOUND_POLICY\fR هنگامی اعمال می‌شود که هر یک از شرایط زیر برقرار باشد: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fB$MSVC_VERSION\fR مشخص شده باشد، فهرست ابزارهای پیش‌فرض به صورت ضمنی تعریف شده باشد (یعنی فهرست ابزارها مشخص نشده باشد)، و فهرست ابزارهای پیش‌فرض شامل یک یا چند مورد از ابزارهای msvc باشد\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fB$MSVC_VERSION\fR مشخص شده باشد، فهرست ابزارهای پیش‌فرض به صورت صریح مشخص شده باشد (مانند tools=[\*(Aqdefault\*(Aq])، و فهرست ابزارهای پیش‌فرض شامل یک یا چند مورد از ابزارهای msvc باشد\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} یک فهرست ابزار غیرپیش‌فرض مشخص شده باشد که شامل یک یا چند مورد از ابزارهای msvc باشد (مانند tools=[\*(Aqmsvc\*(Aq, \*(Aqmslink\*(Aq])\&. .RE .sp متغیر \fB$MSVC_NOTFOUND_POLICY\fR هنگامی نادیده گرفته می‌شود که هر یک از شرایط زیر برقرار باشد: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fB$MSVC_VERSION\fR مشخص نشده باشد و فهرست ابزارهای پیش‌فرض به صورت ضمنی تعریف شده باشد (یعنی فهرست ابزارها مشخص نشده باشد)\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fB$MSVC_VERSION\fR مشخص نشده باشد و فهرست ابزارهای پیش‌فرض به صورت صریح مشخص شده باشد (مانند tools=[\*(Aqdefault\*(Aq])\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} یک فهرست ابزار غیرپیش‌فرض مشخص شده باشد که شامل هیچ‌یک از ابزارهای msvc نباشد (مانند tools=[\*(Aqmingw\*(Aq])\&. .RE .sp جزئیات مهم استفاده: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fB$MSVC_NOTFOUND_POLICY\fR باید به عنوان یک آرگومان به سازندهٔ \fBEnvironment\fR ارسال شود، در صورتی که یک ابزار msvc (مانند msvc، msvs و غیره) از طریق فهرست ابزارهای پیش‌فرض یا از طریق فهرست ابزارهای ارسال‌شده به سازندهٔ \fBEnvironment\fR بارگذاری شود\&. در غیر این صورت، \fB$MSVC_NOTFOUND_POLICY\fR باید پیش از بارگذاری نخستین ابزار msvc در محیط تنظیم شود\&. .RE .sp هنگامی که \fB$MSVC_NOTFOUND_POLICY\fR مشخص نشده باشد، رفتار پیش‌فرض \fBscons\fR صدور هشدار و ادامه دادن مشروط به شرایط ذکر شده در بالا است\&. رفتار پیش‌فرض \fBscons\fR ممکن است در آینده تغییر کند\&. .sp \fIجدید در نسخهٔ 4\&.4\fR .RE .PP \fBMSVC_SCRIPT_ARGS\fR .RS 4 آرگومان‌های تعریف‌شده توسط کاربر را به batch file مربوط به Microsoft Visual C++ که از طریق تشخیص خودکار تعیین شده است ارسال می‌کند\&. .sp \fB$MSVC_SCRIPT_ARGS\fR برای آن دسته از آرگومان‌های batch file مربوط به msvc در دسترس است که از طریق متغیرهای ساخت (construction variables) پشتیبانی درجه‌اول ندارند، یا زمانی که مشکلی در اعتبارسنجی متغیر ساخت مربوطه وجود دارد\&. در صورت امکان، توصیه می‌شود به جای آرگومان‌های \fB$MSVC_SCRIPT_ARGS\fR از متغیرهای ساخت مناسب (مانند \fB$MSVC_TOOLSET_VERSION\fR) استفاده شود\&. .sp مقادیر معتبر برای \fB$MSVC_SCRIPT_ARGS\fR عبارتند از: None، یک رشته، یا فهرستی از رشته‌ها\&. .sp مقدار \fB$MSVC_SCRIPT_ARGS\fR به یک رشته اسکالر تبدیل می‌شود (یعنی «تخت» یا "flattened" می‌شود)\&. رشته اسکالر حاصل، در صورتی که خالی نباشد، مشروط به شرایط اعتبارسنجی فهرست‌شده در زیر، به‌عنوان آرگومان به batch file مربوط به msvc که از طریق تشخیص خودکار تعیین شده است ارسال می‌گردد\&. .sp \fB$MSVC_SCRIPT_ARGS\fR زمانی که مقدار آن None باشد و همچنین هنگامی که نتیجه تبدیل آرگومان یک رشته خالی باشد نادیده گرفته می‌شود\&. شرایط اعتبارسنجی زیر در این حالت اعمال نمی‌شوند\&. .sp در صورت برقرار بودن هر یک از شرایط زیر، یک استثنا (exception) ایجاد می‌شود: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fB$MSVC_SCRIPT_ARGS\fR برای Visual Studio 2013 و نسخه‌های پیش از آن مشخص شده باشد\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} چندین آرگومان نگارش SDK (مانند \*(Aq10\&.0\&.20348\&.0\*(Aq) در \fB$MSVC_SCRIPT_ARGS\fR مشخص شده باشد\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fB$MSVC_SDK_VERSION\fR مشخص شده باشد و یک آرگومان نگارش SDK (مانند \*(Aq10\&.0\&.20348\&.0\*(Aq) در \fB$MSVC_SCRIPT_ARGS\fR مشخص شده باشد\&. اعلان چندگانه نگارش SDK از طریق \fB$MSVC_SDK_VERSION\fR و \fB$MSVC_SCRIPT_ARGS\fR مجاز نیست\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} چندین آرگومان نگارش toolset (مانند \*(Aq\-vcvars_ver=14\&.29\*(Aq) در \fB$MSVC_SCRIPT_ARGS\fR مشخص شده باشد\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fB$MSVC_TOOLSET_VERSION\fR مشخص شده باشد و یک آرگومان نگارش toolset (مانند \*(Aq\-vcvars_ver=14\&.29\*(Aq) در \fB$MSVC_SCRIPT_ARGS\fR مشخص شده باشد\&. اعلان چندگانه نگارش toolset از طریق \fB$MSVC_TOOLSET_VERSION\fR و \fB$MSVC_SCRIPT_ARGS\fR مجاز نیست\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} چندین آرگومان کتابخانه spectre (مانند \*(Aq\-vcvars_spectre_libs=spectre\*(Aq) در \fB$MSVC_SCRIPT_ARGS\fR مشخص شده باشد\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fB$MSVC_SPECTRE_LIBS\fR فعال باشد و یک آرگومان کتابخانه spectre (مانند \*(Aq\-vcvars_spectre_libs=spectre\*(Aq) در \fB$MSVC_SCRIPT_ARGS\fR مشخص شده باشد\&. اعلان چندگانه کتابخانه spectre از طریق \fB$MSVC_SPECTRE_LIBS\fR و \fB$MSVC_SCRIPT_ARGS\fR مجاز نیست\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} چندین آرگومان UWP (مانند uwp یا store) در \fB$MSVC_SCRIPT_ARGS\fR مشخص شده باشد\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fB$MSVC_UWP_APP\fR فعال باشد و یک آرگومان UWP (مانند uwp یا store) در \fB$MSVC_SCRIPT_ARGS\fR مشخص شده باشد\&. اعلان چندگانه UWP از طریق \fB$MSVC_UWP_APP\fR و \fB$MSVC_SCRIPT_ARGS\fR مجاز نیست\&. .RE .sp مثال ۱ \- یک ساخت Visual Studio 2022 با یک نگارش SDK و یک نگارش toolset که با یک آرگومان رشته‌ای مشخص شده‌اند: .sp .if n \{\ .RS 4 .\} .nf env = Environment(MSVC_VERSION=\*(Aq14\&.3\*(Aq, MSVC_SCRIPT_ARGS=\*(Aq10\&.0\&.20348\&.0 \-vcvars_ver=14\&.29\&.30133\*(Aq) .fi .if n \{\ .RE .\} .sp مثال ۲ \- یک ساخت Visual Studio 2022 با یک نگارش SDK و یک نگارش toolset که با یک آرگومان فهرستی مشخص شده‌اند: .sp .if n \{\ .RS 4 .\} .nf env = Environment(MSVC_VERSION=\*(Aq14\&.3\*(Aq, MSVC_SCRIPT_ARGS=[\*(Aq10\&.0\&.20348\&.0\*(Aq, \*(Aq\-vcvars_ver=14\&.29\&.30133\*(Aq]) .fi .if n \{\ .RE .\} .sp جزئیات مهم استفاده: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fB$MSVC_SCRIPT_ARGS\fR باید به‌عنوان یک آرگومان به سازنده \fBEnvironment\fR ارسال شود، هنگامی که یک ابزار msvc (مانند msvc، msvs و غیره) از طریق فهرست پیش‌فرض ابزارها یا از طریق فهرست ابزارهای ارائه‌شده به سازنده \fBEnvironment\fR بارگذاری می‌شود\&. در غیر این صورت، \fB$MSVC_SCRIPT_ARGS\fR باید پیش از بارگذاری نخستین ابزار msvc در محیط تنظیم گردد\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} به‌جز بررسی برای اعلان‌های چندگانه به همان صورت که در بالا شرح داده شد، آرگومان‌های \fB$MSVC_SCRIPT_ARGS\fR اعتبارسنجی نمی‌شوند\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fI آرگومان‌های نادرست، ناسازگار و/یا ناهماهنگ با نسخه برای \fR\fI\fB$MSVC_SCRIPT_ARGS\fR\fR\fI به احتمال زیاد به دلایلی که فوراً آشکار نبوده و عیب‌یابی آن‌ها ممکن است دشوار باشد، منجر به شکست در ساخت خواهند شد\&. \fR مسئولیت اطمینان از اینکه آرگومان‌های ارائه‌شده به فایل دسته‌ای msvc معتبر، سازگار و هماهنگ با نسخه انتخاب‌شده msvc باشند، بر عهده کاربر است\&. .RE .sp \fIجدید در نسخه 4\&.4\fR .RE .PP \fBMSVC_SCRIPTERROR_POLICY\fR .RS 4 رفتار \fBscons\fR را هنگام تشخیص خطاهای فایل دسته‌ای Microsoft Visual C++ مشخص می‌کند\&. .sp متغیر \fB$MSVC_SCRIPTERROR_POLICY\fR رفتار \fBscons\fR را هنگام تشخیص خطاهای فایل دسته‌ای msvc مشخص می‌کند\&. زمانی که \fB$MSVC_SCRIPTERROR_POLICY\fR مشخص نشده باشد، رفتار پیش‌فرض \fBscons\fR فرونشاندن پیام‌های خطای فایل دسته‌ای msvc است\&. .sp ریشه اصلی شکست‌های ساخت msvc ممکن است برای عیب‌یابی دشوار باشد\&. در این شرایط، تنظیم رفتار \fBscons\fR برای صدور هشدار هنگام تشخیص خطاهای فایل دسته‌ای msvc \fIممکن است\fR اطلاعات تشخیصی بیشتری تولید کند\&. .sp مقادیر معتبر برای \fB$MSVC_SCRIPTERROR_POLICY\fR و رفتار متناظر \fBscons\fR عبارتند از: .PP \fI\*(AqError\*(Aq یا \*(AqException\*(Aq\fR .RS 4 هنگام تشخیص خطاهای فایل دسته‌ای msvc یک استثنا ایجاد می‌کند\&. .RE .PP \fI\*(AqWarning\*(Aq یا \*(AqWarn\*(Aq\fR .RS 4 هنگام تشخیص خطاهای فایل دسته‌ای msvc یک هشدار صادر می‌کند\&. .RE .PP \fI\*(AqIgnore\*(Aq یا \*(AqSuppress\*(Aq\fR .RS 4 پیام‌های خطای فایل دسته‌ای msvc را فرونشانی می‌کند\&. .sp \fIجدید در نسخه 4\&.4\fR .RE .sp نکته: علاوه بر مقادیر با نگارش شتری (camel case) نشان‌داده‌شده در بالا، مقادیر با حروف کوچک و حروف بزرگ نیز پذیرفته می‌شوند\&. .sp مثال ۱ \- یک ساخت Visual Studio 2022 با آرگومان‌های اسکریپت تعریف‌شده توسط کاربر: .sp .if n \{\ .RS 4 .\} .nf env = environment(MSVC_VERSION=\*(Aq14\&.3\*(Aq, MSVC_SCRIPT_ARGS=[\*(Aq8\&.1\*(Aq, \*(Aqstore\*(Aq, \*(Aq\-vcvars_ver=14\&.1\*(Aq]) env\&.Program(\*(Aqhello\*(Aq, [\*(Aqhello\&.c\*(Aq], CCFLAGS=\*(Aq/MD\*(Aq, LIBS=[\*(Aqkernel32\*(Aq, \*(Aquser32\*(Aq, \*(Aqruntimeobject\*(Aq]) .fi .if n \{\ .RE .\} .sp مثال ۱ \- بخشی از خروجی: .sp .if n \{\ .RS 4 .\} .nf \&.\&.\&. link /nologo /OUT:_build001\ehello\&.exe kernel32\&.lib user32\&.lib runtimeobject\&.lib _build001\ehello\&.obj LINK : fatal error LNK1104: cannot open file \*(AqMSVCRT\&.lib\*(Aq \&.\&.\&. .fi .if n \{\ .RE .\} .sp مثال ۲ \- یک ساخت Visual Studio 2022 با آرگومان‌های اسکریپت تعریف‌شده توسط کاربر و سیاست خطای اسکریپت تنظیم‌شده روی صدور هشدار هنگام تشخیص خطاهای فایل دسته‌ای msvc: .sp .if n \{\ .RS 4 .\} .nf env = environment(MSVC_VERSION=\*(Aq14\&.3\*(Aq, MSVC_SCRIPT_ARGS=[\*(Aq8\&.1\*(Aq, \*(Aqstore\*(Aq, \*(Aq\-vcvars_ver=14\&.1\*(Aq], MSVC_SCRIPTERROR_POLICY=\*(Aqwarn\*(Aq) env\&.Program(\*(Aqhello\*(Aq, [\*(Aqhello\&.c\*(Aq], CCFLAGS=\*(Aq/MD\*(Aq, LIBS=[\*(Aqkernel32\*(Aq, \*(Aquser32\*(Aq, \*(Aqruntimeobject\*(Aq]) .fi .if n \{\ .RE .\} .sp مثال ۲ \- بخشی از خروجی: .sp .if n \{\ .RS 4 .\} .nf \&.\&.\&. scons: warning: vc script errors detected: [ERROR:vcvars\&.bat] The UWP Application Platform requires a Windows 10 SDK\&. [ERROR:vcvars\&.bat] WindowsSdkDir = "C:\eProgram Files (x86)\eWindows Kits\e8\&.1\e" [ERROR:vcvars\&.bat] host/target architecture is not supported : { x64 , x64 } \&.\&.\&. link /nologo /OUT:_build001\ehello\&.exe kernel32\&.lib user32\&.lib runtimeobject\&.lib _build001\ehello\&.obj LINK : fatal error LNK1104: cannot open file \*(AqMSVCRT\&.lib\*(Aq .fi .if n \{\ .RE .\} .sp جزئیات مهم استفاده: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fB$MSVC_SCRIPTERROR_POLICY\fR باید هنگام بارگذاری یک ابزار msvc (مانند msvc، msvs و غیره) از طریق فهرست پیش‌فرض ابزارها یا از طریق فهرست ابزارهای ارائه‌شده به سازندهٔ \fBEnvironment\fR، به عنوان یک آرگومان به سازندهٔ \fBEnvironment\fR ارسال شود\&. در غیر این صورت، \fB$MSVC_SCRIPTERROR_POLICY\fR باید پیش از بارگذاری نخستین ابزار msvc در محیط تنظیم گردد\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} به دلیل جزئیات پیاده‌سازی \fBscons\fR، همهٔ متغیرهای محیطی سیستم Windows به محیطی که فایل دسته‌ای msvc در آن اجرا می‌شود منتقل نمی‌شوند\&. بسته به نسخه Visual Studio و گزینه‌های نصب، ممکن است پیام‌های خطای غیربحرانی فایل دسته‌ای msvc برای ابزارهای جانبی تولید شوند که ممکن است بر ساخت‌های انجام‌شده با کامپایلر msvc تأثیری نداشته باشند\&. به همین دلیل، هنگام تنظیم سیاست خطای اسکریپت بر روی ایجاد استثنا (مانند \*(AqError\*(Aq) احتیاط توصیه می‌شود\&. .RE .sp \fIجدید در نسخه 4\&.4\fR .RE .PP \fBMSVC_SDK_VERSION\fR .RS 4 ساخت با یک نسخهٔ مشخص از Microsoft Software Development Kit (SDK)\&. .sp مقادیر معتبر برای \fB$MSVC_SDK_VERSION\fR عبارتند از: None یا رشته‌ای شامل نسخهٔ درخواستی SDK (برای نمونه، \*(Aq10\&.0\&.20348\&.0\*(Aq)\&. .sp هنگامی که مقدار برابر با None یا یک رشتهٔ خالی باشد، \fB$MSVC_SDK_VERSION\fR نادیده گرفته می‌شود\&. شرایط اعتبارسنجی زیر اعمال نمی‌شوند\&. .sp در صورت برقراری هر یک از شرایط زیر، یک استثنا ایجاد می‌شود: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} مقدار \fB$MSVC_SDK_VERSION\fR برای Visual Studio 2013 و نسخه‌های پیش از آن مشخص شده باشد\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} مقدار \fB$MSVC_SDK_VERSION\fR تعیین شده باشد و یک آرگومان نسخهٔ SDK نیز در \fB$MSVC_SCRIPT_ARGS\fR مشخص شده باشد\&. تعریف چندگانهٔ نسخهٔ SDK از طریق \fB$MSVC_SDK_VERSION\fR و \fB$MSVC_SCRIPT_ARGS\fR مجاز نیست\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} مقدار مشخص‌شده برای \fB$MSVC_SDK_VERSION\fR با هیچ‌یک از قالب‌های پشتیبانی‌شده مطابقت نداشته باشد: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \*(Aq10\&.0\&.XXXXX\&.Y\*(Aq [SDK 10\&.0] .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \*(Aq8\&.1\*(Aq [SDK 8\&.1] .RE .sp .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} پوشهٔ سیستمی مربوط به نسخهٔ متناظر \fB$MSVC_SDK_VERSION\fR یافت نشود\&. به نظر می‌رسد نسخهٔ درخواستی SDK نصب نشده است\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} به نظر می‌رسد نسخهٔ \fB$MSVC_SDK_VERSION\fR از نوع پلتفرم درخواستی (یعنی UWP یا Desktop) پشتیبانی نمی‌کند\&. به نظر می‌رسد مؤلفه‌های نوع پلتفرمِ نسخهٔ SDK درخواستی نصب نشده‌اند\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} نسخهٔ \fB$MSVC_SDK_VERSION\fR برابر 8\&.1 باشد، نوع پلتفرم UWP باشد، و ابزارهای ساخت انتخاب‌شده از Visual Studio 2017 و جدیدتر باشند (یعنی \fB$MSVC_VERSION\fR باید \*(Aq14\&.0\*(Aq یا \fB$MSVC_TOOLSET_VERSION\fR باید \*(Aq14\&.0\*(Aq باشد)\&. .RE .sp مثال ۱ \- ساخت Visual Studio 2022 با یک نسخهٔ مشخص از Windows SDK: .sp .if n \{\ .RS 4 .\} .nf env = Environment(MSVC_VERSION=\*(Aq14\&.3\*(Aq, MSVC_SDK_VERSION=\*(Aq10\&.0\&.20348\&.0\*(Aq) .fi .if n \{\ .RE .\} .sp مثال ۲ \- ساخت Visual Studio 2022 با یک نسخهٔ مشخص از SDK برای Universal Windows Platform: .sp .if n \{\ .RS 4 .\} .nf env = Environment(MSVC_VERSION=\*(Aq14\&.3\*(Aq, MSVC_SDK_VERSION=\*(Aq10\&.0\&.20348\&.0\*(Aq, MSVC_UWP_APP=True) .fi .if n \{\ .RE .\} .sp نکات مهم استفاده: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} هنگامی که یک ابزار msvc (مانند msvc، msvs و غیره) از طریق فهرست پیش‌فرض ابزارها یا از طریق فهرست ابزارهای ارسال‌شده به سازندهٔ \fBEnvironment\fR بارگذاری می‌شود، \fB$MSVC_SDK_VERSION\fR باید به عنوان آرگومان به سازندهٔ \fBEnvironment\fR ارسال شود\&. در غیر این صورت، \fB$MSVC_SDK_VERSION\fR باید پیش از بارگذاری نخستین ابزار msvc در محیط تنظیم گردد\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fIچنانچه نسخه‌ای از SDK 10\&.0 نصب شده باشد که از الگوی نام‌گذاری بالا پیروی نکند، تا زمانی که قالب اعتبارسنجی شمارهٔ نسخه گسترش یابد، نسخهٔ SDK باید از طریق \fR\fI\fB$MSVC_SCRIPT_ARGS\fR\fR\fI تعیین شود\&.\fR .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} چنانچه استثنایی مبنی بر پیدا نشدن نسخهٔ SDK ایجاد شد، بررسی کنید که نسخهٔ SDK درخواستی همراه با مؤلفه‌های ضروری نوع پلتفرم نصب شده باشد\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} یک مشکل شناخته‌شده در کتابخانه‌های Microsoft وجود دارد؛ زمانی که معماری هدف ARM64 باشد و یک Windows 11 SDK (نسخهٔ \*(Aq10\&.0\&.22000\&.0\*(Aq و جدیدتر) همراه با ابزارهای ساخت v141 و مجموعه‌ابزارهای قدیمی‌تر v142 (نسخه‌های \*(Aq14\&.28\&.29333\*(Aq و پیشین) به کار رود\&. چنانچه با این ترکیب از تنظیمات به دلیل نمادهای حل‌نشده در کتابخانه‌های Microsoft خطای ساخت رخ دهد، می‌توان از \fB$MSVC_SDK_VERSION\fR برای تعیین یک Windows 10 SDK (برای نمونه، \*(Aq10\&.0\&.20348\&.0\*(Aq) جهت ساخت استفاده کرد\&. .RE .sp \fIجدید در نسخهٔ 4\&.4\fR .RE .PP \fBMSVC_SPECTRE_LIBS\fR .RS 4 ساخت با کتابخانه‌های Microsoft Visual C++ تخفیف‌یافته در برابر حمله spectre (spectre\-mitigated)\&. .sp مقادیر معتبر برای \fB$MSVC_SPECTRE_LIBS\fR عبارتند از: True، False یا None\&. .sp هنگامی که \fB$MSVC_SPECTRE_LIBS\fR فعال باشد (یعنی True)، محیط Microsoft Visual C++ شامل مسیرهای پیاده‌سازی‌های تخفیف‌یافته در برابر spectre از کتابخانه‌های Microsoft Visual C++ خواهد بود\&. .sp در صورت برقرار بودن هر یک از شرایط زیر، یک استثنا رخ می‌دهد: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fB$MSVC_SPECTRE_LIBS\fR برای Visual Studio 2015 و پیش از آن فعال شده باشد\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fB$MSVC_SPECTRE_LIBS\fR فعال باشد و یک آرگومان کتابخانه spectre در \fB$MSVC_SCRIPT_ARGS\fR مشخص شده باشد\&. تعریف چندگانه کتابخانه spectre از طریق \fB$MSVC_SPECTRE_LIBS\fR و \fB$MSVC_SCRIPT_ARGS\fR مجاز نیست\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fB$MSVC_SPECTRE_LIBS\fR فعال باشد و نوع پلتفرم UWP باشد\&. هیچ کتابخانه تخفیف‌یافته در برابر spectre برای برنامه‌ها یا مؤلفه‌های پلتفرم جامع ویندوز (Universal Windows Platform یا UWP) وجود ندارد\&. .RE .sp مثال \- یک ساخت Visual Studio 2022 با کتابخانه‌های Microsoft Visual C++ تخفیف‌یافته در برابر spectre: .sp .if n \{\ .RS 4 .\} .nf env = Environment(MSVC_VERSION=\*(Aq14\&.3\*(Aq, MSVC_SPECTRE_LIBS=True) .fi .if n \{\ .RE .\} .sp جزئیات مهم استفاده: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} هنگامی که یک ابزار msvc (مانند msvc، msvs و غیره) از طریق فهرست پیش‌فرض ابزارها یا فهرستی از ابزارها که به سازنده \fBEnvironment\fR ارسال شده بارگذاری می‌شود، \fB$MSVC_SPECTRE_LIBS\fR باید به عنوان آرگومان به سازنده \fBEnvironment\fR ارسال شود\&. در غیر این صورت، \fB$MSVC_SPECTRE_LIBS\fR باید پیش از بارگذاری نخستین ابزار msvc در محیط مقداردهی شود\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} سوئیچ‌های اضافی کامپایلر (مانند /Qspectre) برای اعمال تخفیف‌های spectre هنگام ساخت مصنوعات کاربر ضروری هستند\&. برای جزئیات به مستندات Visual Studio مراجعه کنید\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fI هنگام فعال بودن \fR\fI\fB$MSVC_SPECTRE_LIBS\fR\fR\fI، وجود پوشه‌های معماری میزبان و معماری هدف کتابخانه‌های spectre بررسی نمی‌شود که می‌تواند منجر به شکست در ساخت شود\&. \fR مسئولیت اطمینان از نصب بودن کتابخانه‌های مورد نیاز با تخفیف‌های spectre بر عهده کاربر است\&. .RE .sp \fIجدید در نسخه 4\&.4\fR .RE .PP \fBMSVC_TOOLSET_VERSION\fR .RS 4 ساخت با نسخه مشخصی از مجموعه ابزار (toolset) Microsoft Visual C++\&. .sp \fI مشخص کردن \fR\fI\fB$MSVC_TOOLSET_VERSION\fR\fR\fI بر تشخیص خودکار و انتخاب نمونه‌های msvc تأثیری ندارد\&. متغیر \fR\fI\fB$MSVC_TOOLSET_VERSION\fR\fR\fI \fR\fI\fIپس از\fR\fR\fI انتخاب یک نمونه msvc اعمال می‌شود\&. اگر \fR\fI\fB$MSVC_VERSION\fR\fR\fI مشخص نشده باشد، این می‌تواند نسخه پیش‌فرض msvc باشد\&. \fR .sp مقادیر معتبر برای \fB$MSVC_TOOLSET_VERSION\fR عبارتند از: None یا رشته‌ای حاوی نسخه مجموعه ابزار درخواستی (مانند \*(Aq14\&.29\*(Aq)\&. .sp هنگامی که مقدار None و یا رشته‌ای خالی باشد، \fB$MSVC_TOOLSET_VERSION\fR نادیده گرفته می‌شود\&. شرایط اعتبارسنجی زیر اعمال نخواهند شد\&. .sp در صورت برقرار بودن هر یک از شرایط زیر، یک استثنا رخ می‌دهد: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fB$MSVC_TOOLSET_VERSION\fR برای Visual Studio 2015 و پیش از آن مشخص شده باشد\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fB$MSVC_TOOLSET_VERSION\fR مشخص شده باشد و یک آرگومان نسخه مجموعه ابزار در \fB$MSVC_SCRIPT_ARGS\fR تعیین شده باشد\&. اعلان‌های چندگانه نسخه مجموعه ابزار از طریق \fB$MSVC_TOOLSET_VERSION\fR و \fB$MSVC_SCRIPT_ARGS\fR مجاز نیست\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} مقدار \fB$MSVC_TOOLSET_VERSION\fR مشخص‌شده با هیچ‌یک از قالب‌های پشتیبانی‌شده همخوانی نداشته باشد: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \*(AqXX\&.Y\*(Aq .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \*(AqXX\&.YY\*(Aq .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \*(AqXX\&.YY\&.ZZZZZ\*(Aq .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \*(AqXX\&.YY\&.Z\*(Aq تا \*(AqXX\&.YY\&.ZZZZ\*(Aq \fI [\fR\fIافزونهٔ \fR\fB\fIscons\fR\fR\fI که مستقیماً توسط فایل‌های دسته‌ای (batch) msvc پشتیبانی نمی‌شود و ممکن است در آینده حذف شود] \fR .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \*(AqXX\&.YY\&.ZZ\&.N\*(Aq [قالب SxS] .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \*(AqXX\&.YY\&.ZZ\&.NN\*(Aq [قالب SxS] .RE .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} پیشوند نسخهٔ اصلی msvc (یعنی \*(AqXX\&.Y\*(Aq) مربوط به \fB$MSVC_TOOLSET_VERSION\fR مشخص‌شده، برای Visual Studio 2013 و قبل‌تر است (مثلاً \*(Aq12\&.0\*(Aq)\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} پیشوند نسخهٔ اصلی msvc (یعنی \*(AqXX\&.Y\*(Aq) مربوط به \fB$MSVC_TOOLSET_VERSION\fR مشخص‌شده، بزرگ‌تر از نسخهٔ انتخاب‌شدهٔ msvc است (مثلاً \*(Aq99\&.0\*(Aq)\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} پوشهٔ سیستمی برای نسخهٔ متناظر \fB$MSVC_TOOLSET_VERSION\fR یافت نشد\&. به نظر می‌رسد نسخهٔ مجموعه‌ابزار درخواست‌شده نصب نشده باشد\&. .RE .sp جزئیات انتخاب مجموعه‌ابزار: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} هنگامی که \fB$MSVC_TOOLSET_VERSION\fR یک شماره نسخهٔ SxS یا شماره نسخهٔ کامل مجموعه‌ابزار نباشد: نخستین نسخهٔ مجموعه‌ابزار با رتبه‌بندی به ترتیب نزولی که با پیشوند \fB$MSVC_TOOLSET_VERSION\fR مطابقت داشته باشد، انتخاب می‌شود\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} هنگامی که \fB$MSVC_TOOLSET_VERSION\fR با استفاده از پیشوند نسخهٔ اصلی msvc (یعنی \*(AqXX\&.Y\*(Aq) مشخص شده باشد و نسخهٔ اصلی msvc مربوط به آخرین انتشار Visual Studio باشد، ممکن است نسخهٔ مجموعه‌ابزار انتخاب‌شده با نسخهٔ پیش‌فرض مجموعه‌ابزار Microsoft Visual C++ یکسان نباشد\&. .sp در آخرین انتشار Visual Studio، نسخهٔ پیش‌فرض مجموعه‌ابزار Microsoft Visual C++ لزوماً مجموعه‌ابزاری با بزرگ‌ترین شماره نسخه نیست\&. .RE .sp مثال ۱ \- ساخت پیش‌فرض Visual Studio با مشخص کردن نسخهٔ جزئی مجموعه‌ابزار: .sp .if n \{\ .RS 4 .\} .nf env = Environment(MSVC_TOOLSET_VERSION=\*(Aq14\&.2\*(Aq) .fi .if n \{\ .RE .\} .sp مثال ۲ \- ساخت پیش‌فرض Visual Studio با مشخص کردن نسخهٔ جزئی مجموعه‌ابزار: .sp .if n \{\ .RS 4 .\} .nf env = Environment(MSVC_TOOLSET_VERSION=\*(Aq14\&.29\*(Aq) .fi .if n \{\ .RE .\} .sp مثال ۳ \- ساخت Visual Studio 2022 با مشخص کردن نسخهٔ کامل مجموعه‌ابزار: .sp .if n \{\ .RS 4 .\} .nf env = Environment(MSVC_VERSION=\*(Aq14\&.3\*(Aq, MSVC_TOOLSET_VERSION=\*(Aq14\&.29\&.30133\*(Aq) .fi .if n \{\ .RE .\} .sp مثال ۴ \- ساخت Visual Studio 2022 با مشخص کردن نسخهٔ مجموعه‌ابزار SxS: .sp .if n \{\ .RS 4 .\} .nf env = Environment(MSVC_VERSION=\*(Aq14\&.3\*(Aq, MSVC_TOOLSET_VERSION=\*(Aq14\&.29\&.16\&.11\*(Aq) .fi .if n \{\ .RE .\} .sp جزئیات مهم استفاده: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fB$MSVC_TOOLSET_VERSION\fR باید به عنوان یک آرگومان به سازندهٔ \fBEnvironment\fR داده شود هنگامی که یک ابزار msvc (مانند msvc، msvs و غیره) از طریق فهرست پیش‌فرض ابزارها یا از طریق فهرست ابزارهای ارسال‌شده به سازندهٔ \fBEnvironment\fR بارگذاری می‌شود\&. در غیر این صورت، \fB$MSVC_TOOLSET_VERSION\fR باید پیش از بارگذاری نخستین ابزار msvc در محیط تنظیم شود\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fIهنگام مشخص شدن \fR\fI\fB$MSVC_TOOLSET_VERSION\fR\fR\fI، وجود پوشه‌های معماری میزبان و معماری هدف مجموعه‌ابزار بررسی نمی‌شود که این امر می‌تواند منجر به شکست در ساخت شود\&. \fR مسئولیت اطمینان از نصب بودن ابزارهای ساخت معماری هدف لازم برای مجموعه‌ابزار بر عهدهٔ کاربر است\&. .RE .sp \fIجدید در نسخهٔ 4\&.4\fR .RE .PP \fBMSVC_USE_SCRIPT\fR .RS 4 استفاده از یک اسکریپت دسته‌ای (batch script) برای راه‌اندازی کامپایلر Microsoft Visual C++\&. .sp اگر روی نام یک فایل \&.bat مربوط به Visual Studio (مانند vcvars\&.bat) تنظیم شود، SCons آن فایل دسته‌ای را به جای فایل تشخیص‌داده‌شده به‌طور خودکار اجرا کرده و متغیرهای مرتبط (معمولاً \fB%INCLUDE%\fR، \fB%LIB%\fR و \fB%PATH%\fR) را برای ارائه به فرآیند ساخت از نتیجه استخراج می‌کند\&. این ویژگی می‌تواند برای اجبار به استفاده از نسخه‌ای از کامپایلر که SCons آن را تشخیص نمی‌دهد مفید باشد\&. \fB$MSVC_USE_SCRIPT_ARGS\fR آرگومان‌های ارسال‌شده به این اسکریپت را فراهم می‌کند\&. .sp تنظیم \fB$MSVC_USE_SCRIPT\fR روی \fBNone\fR تشخیص خودکار Visual Studio را به‌طور کامل دور می‌زند؛ اگر SCons را در یک پنجره \fBcmd\fR مربوط به Visual Studio اجرا می‌کنید و متغیرهای محیطی پوسته را وارد می‌نمایید \- یعنی اگر مطمئن هستید همه‌چیز از قبل به‌درستی تنظیم شده و نمی‌خواهید SCons چیزی را تغییر دهد \- از این حالت استفاده کنید\&. .sp \fB$MSVC_USE_SCRIPT\fR متغیرهای \fB$MSVC_VERSION\fR و \fB$TARGET_ARCH\fR را نادیده می‌گیرد\&. .sp \fIتغییریافته در نسخه 4\&.4:\fR متغیر جدید \fB$MSVC_USE_SCRIPT_ARGS\fR روشی برای ارسال آرگومان‌ها فراهم می‌کند\&. .RE .PP \fBMSVC_USE_SCRIPT_ARGS\fR .RS 4 آرگومان‌های ارسال‌شده به اسکریپت \fB$MSVC_USE_SCRIPT\fR را فراهم می‌کند\&. .sp \fIجدید در نسخه 4\&.4\fR .RE .PP \fBMSVC_USE_SETTINGS\fR .RS 4 استفاده از یک دیکشنری برای راه‌اندازی کامپایلر Microsoft Visual C++\&. .sp \fB$MSVC_USE_SETTINGS\fR در صورتی که \fB$MSVC_USE_SCRIPT\fR تعریف شده باشد و/یا زمانی که \fB$MSVC_USE_SETTINGS\fR روی \fBNone\fR تنظیم شده باشد، نادیده گرفته می‌شود\&. .sp این دیکشنری برای مقداردهی متغیرهای مربوطه در محیط (معمولاً \fB%INCLUDE%\fR، \fB%LIB%\fR و \fB%PATH%\fR) جهت ارائه به فرآیند ساخت استفاده می‌شود\&. این قابلیت می‌تواند برای اجبار به استفاده از محیط کامپایلری که SCons آن را به‌درستی پیکربندی نمی‌کند، مفید باشد\&. این روش جایگزینی برای پیکربندی دستی محیط در هنگام دور زدن کامل تشخیص خودکار Visual Studio از طریق تنظیم \fB$MSVC_USE_SCRIPT\fR روی \fBNone\fR است\&. .sp در ادامه نمونه‌ای از پیکربندی یک محیط ساخت با استفاده از کامپایلر Microsoft Visual C++ موجود در Microsoft SDK روی یک میزبان ۶۴ بیتی و ساخت برای یک معماری ۶۴ بیتی آورده شده است: .sp .if n \{\ .RS 4 .\} .nf # Microsoft SDK 6\&.0 (MSVC 8\&.0): 64\-bit host and 64\-bit target msvc_use_settings = { "PATH": [ "C:\e\eProgram Files\e\eMicrosoft SDKs\e\eWindows\e\ev6\&.0\e\eVC\e\eBin\e\ex64", "C:\e\eProgram Files\e\eMicrosoft SDKs\e\eWindows\e\ev6\&.0\e\eBin\e\ex64", "C:\e\eProgram Files\e\eMicrosoft SDKs\e\eWindows\e\ev6\&.0\e\eBin", "C:\e\eWindows\e\eMicrosoft\&.NET\e\eFramework\e\ev2\&.0\&.50727", "C:\e\eWindows\e\esystem32", "C:\e\eWindows", "C:\e\eWindows\e\eSystem32\e\eWbem", "C:\e\eWindows\e\eSystem32\e\eWindowsPowerShell\e\ev1\&.0\e\e" ], "INCLUDE": [ "C:\e\eProgram Files\e\eMicrosoft SDKs\e\eWindows\e\ev6\&.0\e\eVC\e\eInclude", "C:\e\eProgram Files\e\eMicrosoft SDKs\e\eWindows\e\ev6\&.0\e\eVC\e\eInclude\e\eSys", "C:\e\eProgram Files\e\eMicrosoft SDKs\e\eWindows\e\ev6\&.0\e\eInclude", "C:\e\eProgram Files\e\eMicrosoft SDKs\e\eWindows\e\ev6\&.0\e\eInclude\e\egl", ], "LIB": [ "C:\e\eProgram Files\e\eMicrosoft SDKs\e\eWindows\e\ev6\&.0\e\eVC\e\eLib\e\ex64", "C:\e\eProgram Files\e\eMicrosoft SDKs\e\eWindows\e\ev6\&.0\e\eLib\e\ex64", ], "LIBPATH": [], "VSCMD_ARG_app_plat": [], "VCINSTALLDIR": [], "VCToolsInstallDir": [] } # Specifying MSVC_VERSION is recommended env = Environment(MSVC_VERSION=\*(Aq8\&.0\*(Aq, MSVC_USE_SETTINGS=msvc_use_settings) .fi .if n \{\ .RE .\} .sp جزئیات مهم در استفاده: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} هنگامی که یک ابزار msvc (مانند msvc، msvs و غیره) از طریق فهرست پیش‌فرض ابزارها یا از طریق فهرست ابزارهای ارسال‌شده به سازنده \fBEnvironment\fR بارگذاری می‌شود، \fB$MSVC_USE_SETTINGS\fR باید به عنوان یک آرگومان به سازنده \fBEnvironment\fR ارسال شود\&. در غیر این صورت، \fB$MSVC_USE_SETTINGS\fR باید پیش از بارگذاری اولین ابزار msvc در محیط تنظیم گردد\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fIنیازمندی‌های محتوای دیکشنری بر اساس پیاده‌سازی داخلی msvc است و بنابراین ممکن است در هر زمانی تغییر کند\&.\fR مسئولیت اطمینان از کفایت حداقلی محتویات دیکشنری برای تضمین ساخت موفق بر عهده کاربر است\&. .RE .sp \fIجدید در نسخه 4\&.4\fR .RE .PP \fBMSVC_UWP_APP\fR .RS 4 ساخت با استفاده از کتابخانه‌های Microsoft Visual C++ برای برنامه‌های Universal Windows Platform (UWP)\&. .sp مقادیر معتبر برای \fB$MSVC_UWP_APP\fR عبارت‌اند از: True، \*(Aq1\*(Aq، False، \*(Aq0\*(Aq یا None\&. .sp هنگامی که \fB$MSVC_UWP_APP\fR فعال باشد (یعنی True یا \*(Aq1\*(Aq)، محیط Microsoft Visual C++ به‌گونه‌ای برپا خواهد شد که به کتابخانه‌های سازگار با Windows Store و زمان‌های اجرای (runtimes) Microsoft Visual C++ اشاره کند\&. با این کار، هر کتابخانه‌ای که ساخته شود می‌تواند در یک UWP App استفاده شده و در Windows Store منتشر شود\&. .sp در صورت برقراری هر یک از شرایط زیر، یک استثنا (exception) ایجاد می‌شود: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fB$MSVC_UWP_APP\fR برای Visual Studio 2013 و پیش از آن فعال شده باشد\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fB$MSVC_UWP_APP\fR فعال باشد و یک آرگومان UWP در \fB$MSVC_SCRIPT_ARGS\fR مشخص شده باشد\&. اعلان‌های چندگانه UWP از طریق \fB$MSVC_UWP_APP\fR و \fB$MSVC_SCRIPT_ARGS\fR مجاز نیستند\&. .RE .sp مثال \- ساخت Visual Studio 2022 برای Universal Windows Platform: .sp .if n \{\ .RS 4 .\} .nf env = Environment(MSVC_VERSION=\*(Aq14\&.3\*(Aq, MSVC_UWP_APP=True) .fi .if n \{\ .RE .\} .sp جزئیات مهم استفاده: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} هنگامی که یک ابزار msvc (مانند msvc، msvs و غیره) از طریق فهرست پیش‌فرض ابزارها یا فهرستی از ابزارها که به سازنده \fBEnvironment\fR ارسال شده بارگیری می‌شود، \fB$MSVC_UWP_APP\fR باید به‌عنوان یک آرگومان به سازنده \fBEnvironment\fR داده شود\&. در غیر این صورت، \fB$MSVC_UWP_APP\fR باید پیش از بارگیری نخستین ابزار msvc در محیط تنظیم شود\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fI هنگام فعال بودن \fR\fI\fB$MSVC_UWP_APP\fR\fR\fI وجود کتابخانه‌های UWP بررسی نمی‌شود که این امر می‌تواند منجر به شکست در ساخت شود\&. \fR مسئولیت اطمینان از نصب بودن کتابخانه‌های ضروری UWP بر عهده کاربر است\&. .RE .sp .RE .PP \fBMSVC_VERSION\fR .RS 4 رشته‌ای برای انتخاب نسخه مورد نظر از Microsoft Visual C++\&. اگر نسخه مشخص‌شده در دسترس نباشد و/یا برای SCons ناشناخته باشد، هشداری صادر می‌شود که نسخه‌های کشف‌شده واقعی را نشان می‌دهد و در نهایت ساخت با گزارش فقدان باینری کامپایلر شکست خواهد خورد\&. اگر \fB$MSVC_VERSION\fR تنظیم نشده باشد، SCons (به‌طور پیش‌فرض) جدیدترین نسخه از Microsoft Visual C++ نصب‌شده روی سیستم شما را (به استثنای نسخه‌های preview) انتخاب خواهد کرد\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBنکته\fR .ps -1 .br برای اعمال شدن، \fB$MSVC_VERSION\fR باید پیش از شناسایی اولیه کامپایلر Microsoft Visual C++ تنظیم شود\&. شناسایی کامپایلر در دیرترین حالت، در اولین فراخوانی تابع \fBEnvironment\fR اتفاق می‌افتد، مگر اینکه فهرست \fItools\fR مشخص شده باشد که کل زنجیره ابزار Microsoft Visual C++ را مستثنی کند \- یعنی، "defaults" و هر ماژول ابزار خاصی را که به بخش‌هایی از این زنجیره ابزار اشاره دارد (شامل msvc، mslink، masm، midl و msvs) حذف نماید\&. در این حالت، شناسایی تا زمانی که یکی از آن ماژول‌های ابزار به‌صورت دستی فراخوانی شود به تعویق می‌افتد\&. دو مثال زیر این موضوع را نشان می‌دهند: .sp .if n \{\ .RS 4 .\} .nf # MSVC_VERSION set as Environment is created env = Environment(MSVC_VERSION=\*(Aq14\&.2\*(Aq) # Initialization deferred with empty tools, triggered manually env = Environment(tools=[]) env[\*(AqMSVC_VERSION\*(Aq] = \*(Aq14\&.2 env\&.Tool(\*(Aqmsvc\*(Aq) env\&.Tool(\*(Aqmslink\*(Aq) env\&.Tool(\*(Aqmsvs\*(Aq) .fi .if n \{\ .RE .\} .sp .5v .RE مقادیر معتبر برای \fB$MSVC_VERSION\fR نشان‌دهنده نسخه‌های اصلی کامپایلر هستند، به جز اینکه نسخه‌هایی که به Exp ختم می‌شوند، به ویرایش‌های "Express" یا "Express for Desktop" در Visual Studio اشاره دارند\&. مقادیری که شبیه به یک \fIstring\fR معتبر نسخه کامپایلر نیستند، پشتیبانی نمی‌شوند\&. .sp جدول زیر تطابق مقادیر \fB$MSVC_VERSION\fR را با شناسه‌های مختلف نسخه نشان می‌دهد (\*(Aqx\*(Aq به‌عنوان یک جای‌نگه‌دار برای یک رقم متغیر استفاده می‌شود)\&. .TS allbox tab(:); lB cB cB lB cB. T{ کلید SCons T}:T{ .if n \{\ .RS 4 .\} .nf نسخه Visual C++ .fi .if n \{\ .RE .\} T}:T{ _MSVC_VER T}:T{ محصول Visual Studio T}:T{ .if n \{\ .RS 4 .\} .nf MSBuild / Visual Studio .fi .if n \{\ .RE .\} T} .T& l c c l c l c c l c l c c l c l c c l c l c c l c l c c l c l c c l c l c c l c l c c l c l c c l c l c c l c l c c l c l c c l c l c c l c l c c l c l c c l c l c c l c l c c l c l c c l c l c c l c. T{ "14\&.5" T}:T{ 14\&.5x T}:T{ 195x T}:T{ Visual Studio 2026 T}:T{ 18\&.x T} T{ "14\&.3" T}:T{ 14\&.3x T}:T{ 193x T}:T{ Visual Studio 2022 T}:T{ 17\&.x, 17\&.1x T} T{ "14\&.2" T}:T{ 14\&.2x T}:T{ 192x T}:T{ Visual Studio 2019 T}:T{ 16\&.x, 16\&.1x T} T{ "14\&.1" T}:T{ 14\&.1 یا 14\&.1x T}:T{ 191x T}:T{ Visual Studio 2017 T}:T{ 15\&.x T} T{ "14\&.1Exp" T}:T{ 14\&.1 یا 14\&.1x T}:T{ 191x T}:T{ Visual Studio 2017 Express T}:T{ 15\&.x T} T{ "14\&.0" T}:T{ 14\&.0 T}:T{ 1900 T}:T{ Visual Studio 2015 T}:T{ 14\&.0 T} T{ "14\&.0Exp" T}:T{ 14\&.0 T}:T{ 1900 T}:T{ Visual Studio 2015 Express T}:T{ 14\&.0 T} T{ "12\&.0" T}:T{ 12\&.0 T}:T{ 1800 T}:T{ Visual Studio 2013 T}:T{ 12\&.0 T} T{ "12\&.0Exp" T}:T{ 12\&.0 T}:T{ 1800 T}:T{ Visual Studio 2013 Express T}:T{ 12\&.0 T} T{ "11\&.0" T}:T{ 11\&.0 T}:T{ 1700 T}:T{ Visual Studio 2012 T}:T{ 11\&.0 T} T{ "11\&.0Exp" T}:T{ 11\&.0 T}:T{ 1700 T}:T{ Visual Studio 2012 Express T}:T{ 11\&.0 T} T{ "10\&.0" T}:T{ 10\&.0 T}:T{ 1600 T}:T{ Visual Studio 2010 T}:T{ 10\&.0 T} T{ "10\&.0Exp" T}:T{ 10\&.0 T}:T{ 1600 T}:T{ Visual C++ Express 2010 T}:T{ 10\&.0 T} T{ "9\&.0" T}:T{ 9\&.0 T}:T{ 1500 T}:T{ Visual Studio 2008 T}:T{ 9\&.0 T} T{ "9\&.0Exp" T}:T{ 9\&.0 T}:T{ 1500 T}:T{ Visual C++ Express 2008 T}:T{ 9\&.0 T} T{ "8\&.0" T}:T{ 8\&.0 T}:T{ 1400 T}:T{ Visual Studio 2005 T}:T{ 8\&.0 T} T{ "8\&.0Exp" T}:T{ 8\&.0 T}:T{ 1400 T}:T{ Visual C++ Express 2005 T}:T{ 8\&.0 T} T{ "7\&.1" T}:T{ 7\&.1 T}:T{ 1300 T}:T{ Visual Studio \&.NET 2003 T}:T{ 7\&.1 T} T{ "7\&.0" T}:T{ 7\&.0 T}:T{ 1200 T}:T{ Visual Studio \&.NET 2002 T}:T{ 7\&.0 T} T{ "6\&.0" T}:T{ 6\&.0 T}:T{ 1100 T}:T{ Visual Studio 6\&.0 T}:T{ 6\&.0 T} .TE .TE .sp 1 .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBنکته\fR .ps -1 .br .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} برای ساخت با SCons نیازی به نصب Visual Studio IDE نیست (برای نمونه، می‌توانید تنها Build Tools را نصب کنید)، اما زمانی که Visual Studio IDE نصب شده باشد، سازنده‌های دیگری مانند \fBMSVSSolution\fR و \fBMSVSProject\fR در دسترس قرار می‌گیرند و متناظر با نسخه‌های مشخص‌شده خواهند بود\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} نسخه‌هایی که به Exp ختم می‌شوند، به نگارش‌های قدیمی «Express» یا «Express for Desktop» ویژوال استودیو اشاره دارند که در مقایسه با نگارش‌های کامل محدودیت‌های قابلیتی داشتند\&. مشخص کردن پسوند Exp تنها زمانی برای انتخاب نسخه اکسپرس لازم است که هر دو نسخه اکسپرس و غیراکسپرس از یک محصول به‌طور هم‌زمان نصب شده باشند\&. اگر فقط نسخه اکسپرس نصب شده باشد، ذکر پسوند Exp غیرضروری است، اما پذیرفته می‌شود\&. .RE .sp .5v .RE محیط کامپایل را می‌توان با استفاده از چندین متغیر ساخت دیگر با جزئیات بیشتر یا با دقت بالاتری مشخص کرد: توضیحات مربوط به \fB$MSVC_TOOLSET_VERSION\fR، \fB$MSVC_SDK_VERSION\fR، \fB$MSVC_USE_SCRIPT\fR، \fB$MSVC_USE_SCRIPT_ARGS\fR و \fB$MSVC_USE_SETTINGS\fR را ببینید\&. .RE .PP \fBMSVS\fR .RS 4 هنگامی که ابزارهای Microsoft Visual Studio مقداردهی اولیه می‌شوند، این دیکشنری را با کلیدهای زیر برپا می‌کنند: .PP VERSION .RS 4 نسخه در حال استفاده از MSVS (می‌تواند از طریق \fB$MSVC_VERSION\fR تنظیم شود) .RE .PP VERSIONS .RS 4 نسخه‌های موجود و نصب‌شده از MSVS .RE .PP VCINSTALLDIR .RS 4 دایرکتوری نصب‌شده‌ی Microsoft Visual C++ .RE .PP VSINSTALLDIR .RS 4 دایرکتوری نصب‌شده‌ی Visual Studio .RE .PP FRAMEWORKDIR .RS 4 دایرکتوری نصب‌شده‌ی \&.NET framework .RE .PP FRAMEWORKVERSIONS .RS 4 فهرست نسخه‌های نصب‌شده‌ی \&.NET framework، مرتب‌شده از جدیدترین به قدیمی‌ترین\&. .RE .PP FRAMEWORKVERSION .RS 4 جدیدترین نسخه نصب‌شده از \&.NET framework .RE .PP FRAMEWORKSDKDIR .RS 4 مکان نصب‌شده‌ی \&.NET SDK\&. .RE .PP PLATFORMSDKDIR .RS 4 مکان نصب‌شده‌ی Platform SDK\&. .RE .PP PLATFORMSDK_MODULES .RS 4 دیکشنری ماژول‌های نصب‌شده‌ی Platform SDK، که در آن کلیدهای دیکشنری کلمات کلیدی برای ماژول‌های گوناگون هستند و مقادیر تاپل‌های ۲\-تایی (2\-tuple) هستند که اولین عنصر تاریخ انتشار و دومی شماره نسخه است\&. .RE .sp اگر مقداری تنظیم نشده باشد، در رجیستری در دسترس نبوده است\&. Visual Studio 2017 و نسخه‌های جدیدتر برای ذخیره‌سازی اصلی این اطلاعات از رجیستری استفاده نمی‌کنند، بنابراین معمولاً برای این نسخه‌ها فقط PROJECTSUFFIX و SOLUTIONSUFFIX تنظیم خواهند شد\&. .RE .PP \fBMSVS_ARCH\fR .RS 4 معماری‌ای را تعیین می‌کند که پروژه(های) ایجادشده باید برای آن ساخته شوند\&. .sp مقدار پیش‌فرض x86 است\&. amd64 نیز برای بیشتر نسخه‌های Visual Studio توسط SCons پشتیبانی می‌شود\&. از Visual Studio 2015 معماری arm پشتیبانی می‌شود، و از Visual Studio 2017 معماری arm64 پشتیبانی می‌شود\&. تلاش برای تنظیم \fB$MSVS_ARCH\fR روی معماری‌ای که برای یک نسخه مشخص از Visual Studio پشتیبانی نمی‌شود، خطایی ایجاد خواهد کرد\&. .RE .PP \fBMSVS_PROJECT_GUID\fR .RS 4 رشته‌ای که در فایل پروژه ایجادشده‌ی Microsoft Visual C++ به‌عنوان مقدار صفت ProjectGUID قرار می‌گیرد\&. هیچ مقدار پیش‌فرضی وجود ندارد\&. اگر تعریف نشده باشد، یک GUID جدید تولید می‌شود\&. .RE .PP \fBMSVS_SCC_AUX_PATH\fR .RS 4 نام مسیری که در فایل پروژه ایجادشده‌ی Microsoft Visual C++ به‌عنوان مقدار صفت SccAuxPath قرار می‌گیرد، در صورتی که متغیر ساخت \fBMSVS_SCC_PROVIDER\fR نیز تنظیم شده باشد\&. هیچ مقدار پیش‌فرضی وجود ندارد\&. .RE .PP \fBMSVS_SCC_CONNECTION_ROOT\fR .RS 4 مسیر ریشه پروژه‌ها در فضای کاری SCC شما، یعنی مسیری که تمام فایل‌های پروژه و solution در زیر آن تولید خواهند شد\&. این متغیر به عنوان یک مسیر مرجع استفاده می‌شود که مسیرهای نسبی فایل‌های پروژه و solution تولیدشده Microsoft Visual C++ از روی آن محاسبه می‌شوند\&. مسیر نسبی فایل پروژه به عنوان مقدار مشخصه SccLocalPath فایل پروژه و همچنین به عنوان مقادیر مشخصه‌های SccProjectFilePathRelativizedFromConnection[i] (که در آن [i] از 0 تا تعداد پروژه‌های درون solution متغیر است) در بخش GlobalSection(SourceCodeControl) از فایل solution برنامه Microsoft Visual Studio قرار می‌گیرد\&. به همین ترتیب، مسیر نسبی فایل solution به عنوان مقادیر مشخصه‌های SccLocalPath[i] (که در آن [i] از 0 تا تعداد پروژه‌های درون solution متغیر است) در بخش GlobalSection(SourceCodeControl) از فایل solution برنامه Microsoft Visual Studio قرار می‌گیرد\&. این متغیر تنها در صورتی استفاده می‌شود که متغیر ساخت \fBMSVS_SCC_PROVIDER\fR نیز تنظیم شده باشد\&. مقدار پیش‌فرض، دایرکتوری کاری جاری است\&. .RE .PP \fBMSVS_SCC_PROJECT_NAME\fR .RS 4 نام پروژه‌ای که در صورت تنظیم بودن متغیر ساخت \fBMSVS_SCC_PROVIDER\fR، به عنوان مقدار مشخصه SccProjectName در فایل پروژه تولیدشده Microsoft Visual C++ قرار می‌گیرد\&. در این حالت، این رشته در مشخصه SccProjectName0 از بخش GlobalSection(SourceCodeControl) در فایل solution برنامه Microsoft Visual Studio نیز قرار می‌گیرد\&. این متغیر مقدار پیش‌فرضی ندارد\&. .RE .PP \fBMSVS_SCC_PROVIDER\fR .RS 4 رشته‌ای که به عنوان مقدار مشخصه SccProvider در فایل پروژه تولیدشده Microsoft Visual C++ قرار می‌گیرد\&. این رشته همچنین در مشخصه SccProvider0 از بخش GlobalSection(SourceCodeControl) در فایل solution برنامه Microsoft Visual Studio قرار می‌گیرد\&. این متغیر مقدار پیش‌فرضی ندارد\&. .RE .PP \fBMSVS_VERSION\fR .RS 4 نسخه ترجیحی Microsoft Visual Studio را برای استفاده تنظیم می‌کند\&. .sp اگر \fB$MSVS_VERSION\fR تنظیم نشده باشد، SCons (به طور پیش‌فرض) آخرین نسخه Visual Studio نصب‌شده بر روی سیستم شما را انتخاب خواهد کرد\&. بنابراین، اگر نسخه‌های 6 و 7 (MSVS \&.NET) نصب شده باشند، نسخه 7 را ترجیح خواهد داد\&. شما می‌توانید با مشخص کردن متغیر \fB$MSVS_VERSION\fR هنگام مقداردهی اولیه Environment و تنظیم آن روی نسخه مناسب (برای نمونه \*(Aq6\&.0\*(Aq یا \*(Aq7\&.0\*(Aq)، این مقدار را بازنویسی کنید\&. اگر نسخه مشخص‌شده نصب نشده باشد، مقداردهی اولیه ابزار با شکست مواجه خواهد شد\&. .sp \fIاز نسخه 1\&.3\&.0 منسوخ شده است:\fR \fB$MSVS_VERSION\fR منسوخ شده و به جای آن استفاده از \fB$MSVC_VERSION\fR توصیه می‌شود\&. به عنوان یک راهکار کمکی در دوره گذار، اگر \fB$MSVS_VERSION\fR تنظیم شده باشد و \fB$MSVC_VERSION\fR تنظیم نشده باشد، \fB$MSVC_VERSION\fR با مقدار \fB$MSVS_VERSION\fR مقداردهی اولیه خواهد شد\&. در صورتی که هر دو تنظیم شده باشند و مقادیر متفاوتی داشته باشند، یک خطا ایجاد می‌شود\&. .RE .PP \fBMSVSBUILDCOM\fR .RS 4 خط فرمان ساخت (build) که در یک فایل پروژه تولیدشده Microsoft Visual C++ قرار می‌گیرد\&. حالت پیش‌فرض این است که Visual Studio دستور SCons را به همراه اهداف ساخت مشخص‌شده فراخوانی کند\&. .RE .PP \fBMSVSCLEANCOM\fR .RS 4 خط فرمان پاک‌سازی (clean) که در یک فایل پروژه تولیدشده Microsoft Visual C++ قرار می‌گیرد\&. حالت پیش‌فرض این است که Visual Studio دستور SCons را به همراه گزینه \fB\-c\fR برای حذف اهداف مشخص‌شده فراخوانی کند\&. .RE .PP \fBMSVSENCODING\fR .RS 4 رشته کدگذاری که در یک فایل پروژه تولیدشده Microsoft Visual C++ قرار می‌گیرد\&. پیش‌فرض، کدگذاری Windows\-1252 است\&. .RE .PP \fBMSVSPROJECTCOM\fR .RS 4 عملیاتی که برای تولید فایل‌های پروژه Microsoft Visual C++ استفاده می‌شود\&. .RE .PP \fBMSVSPROJECTSUFFIX\fR .RS 4 پسوند مورد استفاده برای فایل‌های پروژه (DSP) در Microsoft Visual C++\&. مقدار پیش‌فرض هنگام استفاده از Visual Studio 2010 و بالاتر برابر \&.vcxproj، هنگام استفاده از نسخه‌های Visual Studio بین 2002 تا 2008 برابر \&.vcproj، و هنگام استفاده از Visual Studio 6\&.0 برابر \&.dsp است\&. .RE .PP \fBMSVSREBUILDCOM\fR .RS 4 خط فرمان بازسازی (rebuild) که در یک فایل پروژه تولیدشده Microsoft Visual C++ قرار می‌گیرد\&. حالت پیش‌فرض این است که Visual Studio دستور SCons را به همراه اهداف بازسازی مشخص‌شده فراخوانی کند\&. .RE .PP \fBMSVSSCONS\fR .RS 4 دستور SCons استفاده‌شده در فایل‌های پروژه تولیدشده Microsoft Visual C++\&. مقدار پیش‌فرض، نسخه‌ای از SCons است که برای تولید فایل پروژه استفاده می‌شود\&. .RE .PP \fBMSVSSCONSCOM\fR .RS 4 فرمان پیش‌فرض SCons که در فایل‌های پروژه تولیدشده Microsoft Visual C++ استفاده می‌شود\&. .RE .PP \fBMSVSSCONSCRIPT\fR .RS 4 فایل sconscript (یعنی فایل SConstruct یا SConscript ) که توسط فایل‌های پروژهٔ Microsoft Visual C++ (از طریق متغیر \fB$MSVSSCONSCOM\fR ) فراخوانی خواهد شد\&. مقدار پیش‌فرض، همان فایل sconscript است که شامل فراخوانی به \fBMSVSProject\fR برای ساخت فایل پروژه می‌باشد\&. .RE .PP \fBMSVSSCONSFLAGS\fR .RS 4 پرچم‌های SCons مورد استفاده در فایل‌های پروژهٔ تولیدشدهٔ Microsoft Visual C++\&. .RE .PP \fBMSVSSOLUTIONCOM\fR .RS 4 عملیاتی که برای تولید فایل‌های راهکار (solution) نرم‌افزار Microsoft Visual Studio استفاده می‌شود\&. .RE .PP \fBMSVSSOLUTIONSUFFIX\fR .RS 4 پسوند مورد استفاده برای فایل‌های راهکار (DSW) نرم‌افزار Microsoft Visual Studio\&. مقدار پیش‌فرض هنگام استفاده از Visual Studio نسخهٔ 7\&.x (\&.NET 2002) و جدیدتر، \&.sln و هنگام استفاده از Visual Studio 6\&.0، \&.dsw است\&. .RE .PP \fBMT\fR .RS 4 برنامه‌ای که در سیستم‌های Windows برای جاسازی مانیفست‌ها در DLLها و EXEها استفاده می‌شود\&. همچنین ببینید: \fB$WINDOWS_EMBED_MANIFEST\fR\&. .RE .PP \fBMTEXECOM\fR .RS 4 خط فرمان Windows مورد استفاده برای جاسازی مانیفست‌ها در فایل‌های اجرایی\&. همچنین ببینید: \fB$MTSHLIBCOM\fR\&. .RE .PP \fBMTFLAGS\fR .RS 4 پرچم‌های ارسال‌شده به برنامهٔ جاسازی مانیفست \fB$MT\fR (فقط در Windows)\&. .RE .PP \fBMTSHLIBCOM\fR .RS 4 خط فرمان Windows مورد استفاده برای جاسازی مانیفست‌ها در کتابخانه‌های اشتراکی (DLLها)\&. همچنین ببینید: \fB$MTEXECOM\fR\&. .RE .PP \fBMWCW_VERSION\fR .RS 4 شماره نسخهٔ کامپایلر C متعلق به MetroWerks CodeWarrior که باید استفاده شود\&. .RE .PP \fBMWCW_VERSIONS\fR .RS 4 فهرستی از نسخه‌های نصب‌شده از کامپایلر C متعلق به MetroWerks CodeWarrior روی این سیستم\&. .RE .PP \fBNAME\fR .RS 4 نام پروژه‌ای را که باید بسته‌بندی شود مشخص می‌کند\&. .sp سازندهٔ \fBPackage\fR را ببینید\&. .RE .PP \fBNINJA_ALIAS_NAME\fR .RS 4 نام هدف نام مستعار (alias target) که باعث می‌شود SCons فایل ساخت ninja را ایجاد کرده و سپس (به‌صورت اختیاری) ninja را اجرا کند\&. مقدار پیش‌فرض generate\-ninja است\&. .RE .PP \fBNINJA_CMD_ARGS\fR .RS 4 رشته‌ای که هنگام اجرای ninja توسط scons، آرگومان‌ها را از طریق SCons به دستور ninja منتقل می‌کند\&. در صورت تنظیم بودن \fB$NINJA_DISABLE_AUTO_RUN\fR هیچ اثری ندارد\&. .sp این مقدار را می‌توان از طریق خط فرمان نیز ارسال کرد: .sp .if n \{\ .RS 4 .\} .nf scons NINJA_CMD_ARGS=\-v or scons NINJA_CMD_ARGS="\-v \-j 3" .fi .if n \{\ .RE .\} .RE .PP \fBNINJA_COMPDB_EXPAND\fR .RS 4 مقدار بولی برای دستور دادن به ninja جهت بسط دادن آرگومان‌های خط فرمان که معمولاً در فایل‌های پاسخ (response files) قرار می‌گیرند\&. اگر مقدار آن درست (true) باشد، از خطوط بسط‌نیافته در پایگاه داده کامپایل مانند \(lqgcc @rsp_file\(rq جلوگیری کرده و در عوض خطوط بسط‌یافته‌ای مانند \(lqgcc \-c \-o myfile\&.o myfile\&.c \-Ia \-DXYZ\(rq تولید می‌کند\&. .sp ابزار compdb در Ninja پرچم \fB\-x\fR را در Ninja V1\&.9\&.0 اضافه کرد\&. .RE .PP \fBNINJA_DEPFILE_PARSE_FORMAT\fR .RS 4 نوع قالبی را که ninja هنگام تجزیه depfileهای شمول سرآیند باید انتظار داشته باشد، تعیین می‌کند\&. می‌تواند \fBmsvc\fR، \fBgcc\fR یا \fBclang\fR باشد\&. گزینهٔ \fBmsvc\fR با قالب \fB/showIncludes\fR مطابقت دارد و \fBgcc\fR یا \fBclang\fR با \fB\-MMD \-MF\fR مطابقت دارند\&. .RE .PP \fBNINJA_DIR\fR .RS 4 مقدار \fIbuilddir\fR\&. مستقیماً در فایل ساخت تولیدشدهٔ ninja اعمال می‌شود\&. از مستندات Ninja: \(lq دایرکتوری برای برخی از فایل‌های خروجی Ninja\&. \&.\&.\&. (همچنین می‌توانید سایر خروجی‌های ساخت را در این دایرکتوری ذخیره کنید\&.) \(rq مقدار پیش‌فرض \&.ninja است\&. .RE .PP \fBNINJA_DISABLE_AUTO_RUN\fR .RS 4 بولی\&. پیش‌فرض: \fBFalse\fR\&. اگر درست (true) باشد، SCons پس از ایجاد فایل ساخت ninja، به‌طور خودکار ninja را اجرا نخواهد کرد\&. .sp اگر به‌صراحت تنظیم نشده باشد، در صورتی که \fB\-\-disable_execute_ninja\fR یا SetOption(\*(Aqdisable_execute_ninja\*(Aq, True) دیده شود، این متغیر روی \fBTrue\fR تنظیم خواهد شد\&. .RE .PP \fBNINJA_ENV_VAR_CACHE\fR .RS 4 رشته‌ای که محیط را برای هر متغیر محیطی که بین محیط سیستم‌عامل و محیط اجرای SCons متفاوت است، تنظیم می‌کند\&. .sp این مقدار با شل (shell) پیش‌فرض سیستم‌عامل سازگار خواهد بود\&. .sp اگر به‌صراحت تنظیم نشده باشد، SCons آن را به‌طور پویا از محیط اجرای ذخیره‌شده در محیط ساخت فعلی (مثلاً env[\*(AqENV\*(Aq]) در جاهایی که آن مقادیر با شل موجود تفاوت دارند، تولید خواهد کرد\&. .RE .PP \fBNINJA_FILE_NAME\fR .RS 4 نام فایل برای فایل ساخت Ninja تولیدشده\&. مقدار پیش‌فرض ninja\&.build است\&. .RE .PP \fBNINJA_FORCE_SCONS_BUILD\fR .RS 4 اگر درست (true) باشد، باعث می‌شود گره‌های ساخت به‌جای استفاده از ninja برای ساخت آن‌ها، دوباره scons را فراخوانی کنند\&. این گزینه برای این در نظر گرفته شده که هنگام فراخوانی سازنده به محیط ارسال شود\&. زمانی مفید است که گره ساختی دارید که کاری انجام می‌دهد که به‌راحتی به ninja ترجمه نمی‌شود\&. .RE .PP \fBNINJA_GENERATED_SOURCE_ALIAS_NAME\fR .RS 4 رشته‌ای منطبق بر نام یک نام مستعار (alias) تعریف‌شده توسط کاربر که فهرستی از تمام سورس‌های تولیدشده را مشخص می‌کند\&. این کار از تشخیص خودکار سورس‌های تولیدشده از طریق \fB$NINJA_GENERATED_SOURCE_SUFFIXES\fR جلوگیری خواهد کرد\&. سپس تمام فایل‌های سورس دیگر در فایل ساخت ninja به این وابسته می‌شوند و سورس‌های تولیدشده را وادار می‌کنند که ابتدا ساخته شوند\&. .RE .PP \fBNINJA_GENERATED_SOURCE_SUFFIXES\fR .RS 4 فهرست پسوندهای فایل‌های سورسی که توسط مراحل ساخت SCons تولید می‌شوند\&. تمام فایل‌های سورسی که با این پسوندها مطابقت داشته باشند، به نام مستعار _generated_sources در فایل ساخت خروجی ninja اضافه خواهند شد\&. سپس تمام فایل‌های سورس دیگر در فایل ساخت ninja به این وابسته می‌شوند و سورس‌های تولیدشده را وادار می‌کنند که ابتدا ساخته شوند\&. .RE .PP \fBNINJA_MSVC_DEPS_PREFIX\fR .RS 4 رشتهٔ \fImsvc_deps_prefix\fR\&. مستقیماً به فایل ساخت ninja تولیدشده منتقل می‌شود\&. برگرفته از مستندات Ninja: \(lqرشته‌ای را تعریف می‌کند که باید از خروجی \fB/showIncludes\fR مربوط به msvc حذف شود\(rq .RE .PP \fBNINJA_POOL\fR .RS 4 تنظیم \fIninja_pool\fR برای این هدف یا تمام اهداف در حوزهٔ این متغیر محیطی\&. .RE .PP \fBNINJA_REGENERATE_DEPS\fR .RS 4 یک تابع مولد (generator) مورد استفاده برای ایجاد یک depfile در ninja که شامل تمام فایل‌هایی است که در صورت تغییر آن‌ها، فراخوانی مجدد SCons لازم خواهد بود\&. یا فهرستی از فایل‌های یادشده\&. .RE .PP \fB_NINJA_REGENERATE_DEPS_FUNC\fR .RS 4 یک مقدار درونی که برای تعیین تابعی استفاده می‌شود که با آرگومان env فراخوانی می‌گردد تا فهرستی از فایل‌هایی را تولید کند که در صورت تغییر، نیازمند تولید مجدد فایل ساخت ninja هستند\&. .RE .PP \fBNINJA_SCONS_DAEMON_KEEP_ALIVE\fR .RS 4 تعداد ثانیه‌هایی که دیمن SCons راه‌اندازی‌شده توسط ninja زنده می‌ماند\&. (پیش‌فرض: 180000) .RE .PP \fBNINJA_SCONS_DAEMON_PORT\fR .RS 4 پورت TCP/IP برای گوش فرا دادن دیمن SCons به آن\&. \fIنکته: نمی‌توانید از پورتی استفاده کنید که هم‌اکنون روی دستگاه ساخت شما در حال شنود است\&.\fR (پیش‌فرض: عدد تصادفی بین 10000 و 60000) .RE .PP \fBNINJA_SYNTAX\fR .RS 4 مسیر به فایل سفارشی ninja_syntax\&.py که در تولید استفاده می‌شود\&. این ابزار در حال حاضر فرض می‌کند که شما ninja را به عنوان یک ماژول Python نصب کرده‌اید و در صورتی که \fB$NINJA_SYNTAX\fR به‌صراحت تنظیم نشده باشد، فایل نحوی (syntax) را از آن نسخهٔ نصب‌شده برمی‌دارد\&. .RE .PP \fBno_import_lib\fR .RS 4 هنگامی که روی مقداری غیر از صفر تنظیم شود، از ایجاد کتابخانهٔ وارداتی ایستای (static import lib) متناظر در ویندوز توسط سازندهٔ \fBSharedLibrary\fR هنگام استفاده با MinGW، Microsoft Visual Studio یا Metrowerks جلوگیری می‌کند\&. این مقدار همچنین هنگام استفاده از Microsoft Visual Studio از ایجاد فایل export (\&.exp) جلوگیری می‌نماید\&. .RE .PP \fBOBJPREFIX\fR .RS 4 پیشوند مورد استفاده برای نام فایل‌های شیء (ایستا)\&. .RE .PP \fBOBJSUFFIX\fR .RS 4 پسوند مورد استفاده برای نام فایل‌های شیء (ایستا)\&. .RE .PP \fBPACKAGEROOT\fR .RS 4 دایرکتوری‌ای را مشخص می‌کند که در صورت امکان، تمام فایل‌های آرشیو حاصل در آن قرار خواهند گرفت\&. مقدار پیش‌فرض \(lq\fB$NAME\fR\-\fB$VERSION\fR\(rq است\&. .sp سازندهٔ \fBPackage\fR را ببینید\&. .RE .PP \fBPACKAGETYPE\fR .RS 4 نوع بسته‌ای را که هنگام استفاده از سازندهٔ \fBPackage\fR باید ساخته شود، انتخاب می‌کند\&. این متغیر می‌تواند یک رشته یا فهرستی از رشته‌ها باشد\&. برای انواع پشتیبانی‌شده در حال حاضر، به مستندات این سازنده مراجعه کنید\&. .sp \fB$PACKAGETYPE\fR می‌تواند با گزینهٔ خط فرمان \fB\-\-package\-type\fR بازنویسی شود\&. .sp سازندهٔ \fBPackage\fR را ببینید\&. .RE .PP \fBPACKAGEVERSION\fR .RS 4 نسخهٔ بسته (نه پروژهٔ اصلی)\&. در حال حاضر این متغیر فقط توسط بسته‌بند rpm استفاده می‌شود و باید نشان‌دهندهٔ تغییرات در بسته‌بندی باشد، نه خود کد پروژهٔ اصلی\&. .sp سازندهٔ \fBPackage\fR را ببینید\&. .RE .PP \fBPCH\fR .RS 4 گره‌ای برای سرآیند پیش‌کامپایل‌شدهٔ Microsoft Visual C++ که هنگام کامپایل فایل‌های شیء استفاده خواهد شد\&. این متغیر توسط ابزارهایی غیر از Microsoft Visual C++ نادیده گرفته می‌شود\&. هنگامی که این متغیر تعریف شود، SCons گزینه‌هایی را به خط فرمان کامپایلر اضافه می‌کند تا از سرآیند پیش‌کامپایل‌شده استفاده کند، و همچنین وابستگی‌ها را برای فایل PCH تنظیم خواهد کرد\&. مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf env[\*(AqPCH\*(Aq] = File(\*(AqStdAfx\&.pch\*(Aq) env[\*(AqPCH\*(Aq] = env\&.PCH(\*(Aqpch\&.cc\*(Aq)[0] .fi .if n \{\ .RE .\} .RE .PP \fBPCHCOM\fR .RS 4 خط فرمانی که توسط سازندهٔ \fBPCH\fR برای تولید یک سرآیند پیش‌کامپایل‌شده استفاده می‌شود\&. .RE .PP \fBPCHCOMSTR\fR .RS 4 رشته‌ای که هنگام تولید یک سرآیند پیش‌کامپایل‌شده نمایش داده می‌شود\&. اگر تنظیم نشده باشد، \fB$PCHCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBPCHPDBFLAGS\fR .RS 4 یک متغیر ساخت که هنگام بسط داده شدن، پرچم \fB/yD\fR را تنها در صورتی به خط فرمان اضافه می‌کند که متغیر ساخت \fB$PDB\fR تنظیم شده باشد\&. .RE .PP \fBPCHSTOP\fR .RS 4 این متغیر مشخص می‌کند که چه مقدار از یک فایل منبع پیش‌کامپایل می‌شود\&. این متغیر توسط ابزارهایی غیر از Microsoft Visual C++، یا زمانی که متغیر PCH استفاده نمی‌شود، نادیده گرفته می‌شود\&. هنگامی که این متغیر تعریف شود، باید رشته‌ای شامل نام سرآیندی باشد که در انتهای بخش پیش‌کامپایل‌شدهٔ فایل‌های منبع گنجانده شده است، یا در صورتی که از ساختار «#pragma hrdstop» استفاده می‌شود، یک رشتهٔ خالی باشد: .sp .if n \{\ .RS 4 .\} .nf env[\*(AqPCHSTOP\*(Aq] = \*(AqStdAfx\&.h\*(Aq .fi .if n \{\ .RE .\} .RE .PP \fBPDB\fR .RS 4 فایل PDB مربوط به Microsoft Visual C++ که اطلاعات اشکال‌زدایی را برای فایل‌های شیء، کتابخانه‌های اشتراکی و برنامه‌ها ذخیره می‌کند\&. این متغیر توسط ابزارهایی غیر از Microsoft Visual C++ نادیده گرفته می‌شود\&. هنگامی که این متغیر تعریف شود، SCons گزینه‌هایی را به خط فرمان کامپایلر و پیونددهنده اضافه می‌کند تا اطلاعات اشکال‌زدایی خارجی تولید کنند، و همچنین وابستگی‌ها را برای فایل PDB تنظیم می‌نماید\&. مثال: .sp .if n \{\ .RS 4 .\} .nf env[\*(AqPDB\*(Aq] = \*(Aqhello\&.pdb\*(Aq .fi .if n \{\ .RE .\} .sp سوییچ کامپایلر Microsoft Visual C++ که SCons به‌طور پیش‌فرض برای تولید اطلاعات PDB استفاده می‌کند \fB/Z7\fR است\&. این سوییچ با ساخت‌های موازی (\fB\-j\fR) به درستی کار می‌کند زیرا برخلاف به‌اشتراک‌گذاری یک فایل PDB واحد بین چندین فایل شیء، اطلاعات اشکال‌زدایی را درون فایل‌های شیء میانی جاسازی می‌کند\&. این روش همچنین تنها راه برای گنجاندن اطلاعات اشکال‌زدایی درون یک کتابخانهٔ ایستا است\&. استفاده از \fB/Zi\fR به جای آن ممکن است عملکرد زمان پیوند را بهبود بخشد، هرچند ساخت‌های موازی دیگر کار نخواهند کرد\&. شما می‌توانید با بازنویسی متغیر پیش‌فرض \fB$CCPDBFLAGS\fR، فایل‌های PDB را با سوییچ \fB/Zi\fR تولید کنید؛ برای مثال‌های مشخص، مدخل مربوط به آن متغیر را ببینید\&. .RE .PP \fBPDFLATEX\fR .RS 4 ابزار pdflatex\&. .RE .PP \fBPDFLATEXCOM\fR .RS 4 خط فرمانی که برای فراخوانی ابزار pdflatex استفاده می‌شود\&. .RE .PP \fBPDFLATEXCOMSTR\fR .RS 4 رشته‌ای که هنگام فراخوانی ابزار pdflatex نمایش داده می‌شود\&. اگر این متغیر تنظیم نشده باشد، \fB$PDFLATEXCOM\fR (خط فرمان) نمایش داده می‌شود\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(PDFLATEX;COMSTR = "Building $TARGET from LaTeX input $SOURCES") .fi .if n \{\ .RE .\} .RE .PP \fBPDFLATEXFLAGS\fR .RS 4 گزینه‌های عمومی ارسال‌شده به ابزار pdflatex\&. .RE .PP \fBPDFPREFIX\fR .RS 4 پیشوند مورد استفاده برای نام فایل‌های PDF\&. .RE .PP \fBPDFSUFFIX\fR .RS 4 پسوند مورد استفاده برای نام فایل‌های PDF\&. .RE .PP \fBPDFTEX\fR .RS 4 ابزار pdftex\&. .RE .PP \fBPDFTEXCOM\fR .RS 4 خط فرمان مورد استفاده برای فراخوانی ابزار pdftex\&. .RE .PP \fBPDFTEXCOMSTR\fR .RS 4 رشته‌ای که هنگام فراخوانی ابزار pdftex نمایش داده می‌شود\&. اگر این متغیر تنظیم نشده باشد، \fB$PDFTEXCOM\fR (خط فرمان) نمایش داده می‌شود\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(PDFTEXCOMSTR = "Building $TARGET from TeX input $SOURCES") .fi .if n \{\ .RE .\} .RE .PP \fBPDFTEXFLAGS\fR .RS 4 گزینه‌های عمومی ارسال‌شده به ابزار pdftex\&. .RE .PP \fBPKGCHK\fR .RS 4 در سیستم‌های Solaris، برنامه بررسی بسته‌ای که (به همراه \fB$PKGINFO\fR) برای جستجوی نسخه‌های نصب‌شده کامپایلر Sun PRO C++ استفاده می‌شود\&. مقدار پیش‌فرض /usr/sbin/pgkchk است\&. .RE .PP \fBPKGINFO\fR .RS 4 در سیستم‌های Solaris، برنامه اطلاعات بسته‌ای که (به همراه \fB$PKGCHK\fR) برای جستجوی نسخه‌های نصب‌شده کامپایلر Sun PRO C++ استفاده خواهد شد\&. مقدار پیش‌فرض pkginfo است\&. .RE .PP \fBPLATFORM\fR .RS 4 نام پلتفرمی که برای ایجاد این محیط ساخت استفاده شده است\&. SCons این متغیر را هنگام مقداردهی اولیه پلتفرم تنظیم می‌کند که به‌طور پیش‌فرض به‌صورت خودکار شناسایی می‌شود (آرگومان \fIplatform\fR در \fBEnvironment\fR را ببینید)\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[]) if env[\*(AqPLATFORM\*(Aq] == \*(Aqcygwin\*(Aq: Tool(\*(Aqmingw\*(Aq)(env) else: Tool(\*(Aqmsvc\*(Aq)(env) .fi .if n \{\ .RE .\} .RE .PP \fBPOAUTOINIT\fR .RS 4 متغیر \fB$POAUTOINIT\fR، اگر روی True (یا یک مقدار عددی غیرصفر) تنظیم شده باشد، به ابزار msginit اجازه می‌دهد تا فایل‌های PO \fIناموجود\fR را به‌طور خودکار با \fBmsginit(1)\fR مقداردهی اولیه کند\&. این قابلیت هم بر سازندهٔ \fBPOInit\fR و هم \fBPOUpdate\fR (و سایر مواردی که از هر یک از آن‌ها استفاده می‌کنند) اعمال می‌شود\&. .RE .PP \fBPOCREATE_ALIAS\fR .RS 4 نام مستعار (alias) مشترک برای تمام فایل‌های PO ایجاد شده با سازندهٔ \fBPOInit\fR (پیش‌فرض: \*(Aqpo\-create\*(Aq)\&. ابزار msginit و سازندهٔ \fBPOInit\fR را ببینید\&. .RE .PP \fBPOSUFFIX\fR .RS 4 پسوند مورد استفاده برای فایل‌های PO (پیش‌فرض: \*(Aq\&.po\*(Aq)\&. ابزار msginit و سازندهٔ \fBPOInit\fR را ببینید\&. .RE .PP \fBPOTDOMAIN\fR .RS 4 متغیر \fB$POTDOMAIN\fR دامنه پیش‌فرضی را تعریف می‌کند که در صورت مشخص نشدن نام فایل POT توسط کاربر، برای تولید نام فایل POT به‌صورت \fB$POTDOMAIN\fR\&.pot به کار می‌رود\&. این موضوع بر سازنده‌های \fBPOTUpdate\fR، \fBPOInit\fR و \fBPOUpdate\fR (و سازنده‌هایی که از آن‌ها استفاده می‌کنند، مانند \fBTranslate\fR) اعمال می‌شود\&. معمولاً (اگر \fB$POTDOMAIN\fR تعریف نشده باشد)، سازنده‌ها از messages\&.pot به‌عنوان نام پیش‌فرض فایل POT استفاده می‌کنند\&. .RE .PP \fBPOTSUFFIX\fR .RS 4 پسوند مورد استفاده برای فایل‌های الگوی PO (پیش‌فرض: \*(Aq\&.pot\*(Aq)\&. ابزار xgettext و سازندهٔ \fBPOTUpdate\fR را ببینید\&. .RE .PP \fBPOTUPDATE_ALIAS\fR .RS 4 نام هدف ساختگی (phony target) مشترک برای تمام الگوهای PO ایجادشده با \fBPOUpdate\fR (پیش‌فرض: \*(Aqpot\-update\*(Aq)\&. ابزار xgettext و سازندهٔ \fBPOTUpdate\fR را ببینید\&. .RE .PP \fBPOUPDATE_ALIAS\fR .RS 4 نام مستعار (alias) مشترک برای تمام فایل‌های PO تعریف‌شده با سازندهٔ \fBPOUpdate\fR (پیش‌فرض: \*(Aqpo\-update\*(Aq)\&. ابزار msgmerge و سازندهٔ \fBPOUpdate\fR را ببینید\&. .RE .PP \fBPRINT_CMD_LINE_FUNC\fR .RS 4 تابعی برای چاپ خطوط فرمان هنگام اجرای آن‌ها\&. این تابع فراخوانی می‌شود مگر اینکه چاپ خط فرمان با گزینه‌های \fB\-q\fR/\fB\-\-question\fR یا \fB\-s\fR/\fB\-\-silent\fR غیرفعال شده باشد\&. تابع با چهار آرگومان فراخوانی خواهد شد: \fIs\fR، \fItarget\fR، \fIsource\fR و \fIenv\fR\&. \fIs\fR رشتهٔ خط فرمان برای اجرا است، \fItarget\fR هدف (یا اهداف) در حال ساخت، \fIsource\fR منبع (یا منابع) مورد استفاده، و \fIenv\fR محیط مورد استفاده است\&. .sp هر یک یا همهٔ آرگومان‌ها را می‌توان برای ایجاد پیام به کار برد\&. \fIsource\fR و \fItarget\fR فهرست‌هایی از گره‌ها خواهند بود و باید برای چاپ به شکل مناسبی تبدیل شوند (نمونه را ببینید)\&. حالت پیش‌فرض که در صورت تنظیم نشدن متغیر یا تنظیم آن روی \fBNone\fR استفاده می‌شود، تنها چاپ رشتهٔ \fIs\fR است که معادل است با: .sp .if n \{\ .RS 4 .\} .nf def print_cmd_line(s, target, source, env): sys\&.stdout\&.write(s + "\en") .fi .if n \{\ .RE .\} .sp این نمونه از پارامترهای source و target برای قالب‌بندی یک پیام سفارشی استفاده می‌کند: .sp .if n \{\ .RS 4 .\} .nf def print_cmd_line(s, target, source, env): sys\&.stdout\&.write( "Building %s \-> %s\&.\&.\&.\en" % ( \*(Aq and \*(Aq\&.join([str(x) for x in source]), \*(Aq and \*(Aq\&.join([str(x) for x in target]), ) ) env = Environment(PRINT_CMD_LINE_FUNC=print_cmd_line) env\&.Program(\*(Aqfoo\*(Aq, [\*(Aqfoo\&.c\*(Aq, \*(Aqbar\&.c\*(Aq]) .fi .if n \{\ .RE .\} .sp این موارد را چاپ می‌کند: .sp .if n \{\ .RS 4 .\} .nf \&.\&.\&. scons: Building targets \&.\&.\&. Building bar\&.c \-> bar\&.o\&.\&.\&. Building foo\&.c \-> foo\&.o\&.\&.\&. Building foo\&.o and bar\&.o \-> foo\&.\&.\&. scons: done building targets\&. .fi .if n \{\ .RE .\} .sp کاربرد احتمالی دیگر برای یک تابع چاپ، نمایش پیامی بسیار مختصر در کنسول و هم‌زمان ثبت کامل خط فرمان در یک فایل است\&. .RE .PP \fBPROGEMITTER\fR .RS 4 شامل مشخصات گسیل‌دهنده (emitter) برای سازندهٔ \fBProgram\fR است\&. بخش «Builder Objects» در صفحهٔ راهنما حاوی اطلاعات عمومی دربارهٔ تعیین گسیل‌دهنده‌ها است\&. .RE .PP \fBPROGPREFIX\fR .RS 4 پیشوندی که برای نام فایل‌های اجرایی به کار می‌رود\&. .RE .PP \fBPROGSUFFIX\fR .RS 4 پسوندی که برای نام فایل‌های اجرایی به کار می‌رود\&. .RE .PP \fBPSCOM\fR .RS 4 خط فرمانی که برای تبدیل فایل‌های TeX DVI به یک فایل PostScript استفاده می‌شود\&. .RE .PP \fBPSCOMSTR\fR .RS 4 رشته‌ای که هنگام تبدیل یک فایل TeX DVI به یک فایل PostScript نمایش داده می‌شود\&. اگر این متغیر تنظیم نشده باشد، \fB$PSCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBPSPREFIX\fR .RS 4 پیشوندی که برای نام فایل‌های PostScript به کار می‌رود\&. .RE .PP \fBPSSUFFIX\fR .RS 4 پیشوند مورد استفاده برای نام فایل‌های PostScript\&. .RE .PP \fBRANLIB\fR .RS 4 نمایه‌ساز آرشیو\&. .RE .PP \fBRANLIBCOM\fR .RS 4 خط فرمانی که برای نمایه‌سازی یک آرشیو کتابخانهٔ ایستا استفاده می‌شود\&. .RE .PP \fBRANLIBCOMSTR\fR .RS 4 رشته‌ای که هنگام نمایه‌سازی یک آرشیو کتابخانهٔ ایستا نمایش داده می‌شود\&. اگر این متغیر تنظیم نشده باشد، \fB$RANLIBCOM\fR (خط فرمان) نمایش داده می‌شود\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(RANLIBCOMSTR = "Indexing $TARGET") .fi .if n \{\ .RE .\} .RE .PP \fBRANLIBFLAGS\fR .RS 4 گزینه‌های عمومی ارسال‌شده به نمایه‌ساز آرشیو\&. .RE .PP \fBRC\fR .RS 4 کامپایلر منابع مورد استفاده برای ساخت یک فایل منبع Microsoft Visual C++\&. .RE .PP \fBRCCOM\fR .RS 4 خط فرمانی که برای ساخت یک فایل منبع Microsoft Visual C++ استفاده می‌شود\&. .RE .PP \fBRCCOMSTR\fR .RS 4 رشته‌ای که هنگام فراخوانی کامپایلر منابع برای ساخت یک فایل منبع Microsoft Visual C++ نمایش داده می‌شود\&. اگر این متغیر تنظیم نشده باشد، \fB$RCCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBRCFLAGS\fR .RS 4 پرچم‌های ارسال‌شده به کامپایلر منابع توسط سازندهٔ \fBRES\fR\&. .RE .PP \fBRCINCFLAGS\fR .RS 4 یک متغیر ساخت که به‌طور خودکار تولید می‌شود و حاوی گزینه‌های خط فرمان برای مشخص کردن دایرکتوری‌هایی است که باید توسط کامپایلر منابع جستجو شوند\&. مقدار \fB$RCINCFLAGS\fR به‌ترتیب با افزودن \fB$RCINCPREFIX\fR به ابتدا و \fB$RCINCSUFFIX\fR به انتهای هر دایرکتوری در \fB$CPPPATH\fR ایجاد می‌شود\&. .RE .PP \fBRCINCPREFIX\fR .RS 4 پیشوند (پرچمی) که برای مشخص کردن یک دایرکتوری include در خط فرمان کامپایلر منابع استفاده می‌شود\&. این مقدار هنگام بسط متغیر \fB$RCINCFLAGS\fR به ابتدای هر دایرکتوری در متغیر ساخت \fB$CPPPATH\fR اضافه خواهد شد\&. .RE .PP \fBRCINCSUFFIX\fR .RS 4 پسوندی که برای مشخص کردن یک دایرکتوری include در خط فرمان کامپایلر منابع استفاده می‌شود\&. این مقدار هنگام بسط متغیر \fB$RCINCFLAGS\fR به انتهای هر دایرکتوری در متغیر ساخت \fB$CPPPATH\fR اضافه خواهد شد\&. .RE .PP \fBRDirs\fR .RS 4 تابعی که با جستجو در مخازن، یک رشته را به فهرستی از نمونه‌های Dir تبدیل می‌کند\&. .RE .PP \fBREGSVR\fR .RS 4 برنامه‌ای که در سیستم‌های Windows برای ثبت یک کتابخانهٔ DLL تازه‌ساخته‌شده استفاده می‌شود، هر زمان که به سازندهٔ \fBSharedLibrary\fR آرگومان کلیدواژه‌ایِ register=True داده شود\&. .RE .PP \fBREGSVRCOM\fR .RS 4 خط فرمانی که در سیستم‌های Windows برای ثبت یک کتابخانهٔ DLL تازه‌ساخته‌شده استفاده می‌شود، هر زمان که به سازندهٔ \fBSharedLibrary\fR آرگومان کلیدواژه‌ایِ register=True داده شود\&. .RE .PP \fBREGSVRCOMSTR\fR .RS 4 رشته‌ای که هنگام ثبت یک فایل DLL تازه‌ساخته‌شده نمایش داده می‌شود\&. اگر این متغیر تنظیم نشده باشد، \fB$REGSVRCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBREGSVRFLAGS\fR .RS 4 پرچم‌های ارسالی به برنامهٔ ثبت DLL در سیستم‌های Windows هنگامی که یک کتابخانهٔ DLL تازه‌ساخته‌شده ثبت می‌شود\&. به‌طور پیش‌فرض، این شامل \fB/s\fR است که از باز شدن کادرهای محاوره‌ای و جلب توجه کاربر جلوگیری می‌کند\&. .RE .PP \fBRMIC\fR .RS 4 کامپایلر stub مربوط به Java RMI\&. .RE .PP \fBRMICCOM\fR .RS 4 خط فرمانی که برای کامپایل فایل‌های کلاس stub و skeleton از کلاس‌های Java حاوی پیاده‌سازی‌های RMI استفاده می‌شود\&. هر گزینه‌ای که در متغیر ساخت \fB$RMICFLAGS\fR مشخص شده باشد در این خط فرمان گنجانده می‌شود\&. .RE .PP \fBRMICCOMSTR\fR .RS 4 رشته‌ای که هنگام کامپایل فایل‌های کلاس stub و skeleton از کلاس‌های Java حاوی پیاده‌سازی‌های RMI نمایش داده می‌شود\&. اگر این متغیر تنظیم نشده باشد، \fB$RMICCOM\fR (خط فرمان) نمایش داده می‌شود\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment( RMICCOMSTR="Generating stub/skeleton class files $TARGETS from $SOURCES" ) .fi .if n \{\ .RE .\} .RE .PP \fBRMICFLAGS\fR .RS 4 گزینه‌های عمومی که به کامپایلر stub مربوط به Java RMI ارسال می‌شوند\&. .RE .PP \fBRPATH\fR .RS 4 فهرستی از مسیرها برای جستجوی کتابخانه‌های اشتراکی هنگام اجرای برنامه‌ها\&. در حال حاضر فقط در پیونددهنده‌های GNU (gnulink)، IRIX (sgilink) و Sun (sunlink) استفاده می‌شود\&. در بسترها و زنجیره‌های ابزاری که از آن پشتیبانی نمی‌کنند نادیده گرفته می‌شود\&. توجه داشته باشید که مسیرهای اضافه‌شده به RPATH به هیچ وجه توسط \fBscons\fR تغییر شکل نمی‌یابند: اگر به یک مسیر مطلق نیاز دارید، خودتان باید آن را مطلق کنید\&. .RE .PP \fB_RPATH\fR .RS 4 یک متغیر ساخت که به‌طور خودکار تولید می‌شود و حاوی پرچم‌های rpath برای استفاده در زمان پیوند برنامه با کتابخانه‌های اشتراکی است\&. مقدار \fB$_RPATH\fR به ترتیب با افزودن پیشوند \fB$RPATHPREFIX\fR و پسوند \fB$RPATHSUFFIX\fR به ابتدا و انتهای هر دایرکتوری در \fB$RPATH\fR ایجاد می‌شود\&. .RE .PP \fBRPATHPREFIX\fR .RS 4 پیشوندی که برای مشخص کردن یک دایرکتوری مورد جستجو برای کتابخانه‌های اشتراکی هنگام اجرای برنامه‌ها استفاده می‌شود\&. این مقدار به ابتدای هر دایرکتوری در متغیر ساخت \fB$RPATH\fR هنگامی که متغیر \fB$_RPATH\fR به‌طور خودکار تولید می‌شود، افزوده خواهد شد\&. .RE .PP \fBRPATHSUFFIX\fR .RS 4 پسوندی که برای مشخص کردن یک دایرکتوری مورد جستجو برای کتابخانه‌های اشتراکی هنگام اجرای برنامه‌ها استفاده می‌شود\&. این مقدار به انتهای هر دایرکتوری در متغیر ساخت \fB$RPATH\fR هنگامی که متغیر \fB$_RPATH\fR به‌طور خودکار تولید می‌شود، افزوده خواهد شد\&. .RE .PP \fBRPCGEN\fR .RS 4 کامپایلر پروتکل RPC\&. .RE .PP \fBRPCGENCLIENTFLAGS\fR .RS 4 گزینه‌هایی که هنگام تولید stubهای سمت کلاینت به کامپایلر پروتکل RPC ارسال می‌شوند\&. این گزینه‌ها علاوه بر پرچم‌های مشخص‌شده در متغیر ساخت \fB$RPCGENFLAGS\fR هستند\&. .RE .PP \fBRPCGENFLAGS\fR .RS 4 گزینه‌های عمومی که به کامپایلر پروتکل RPC ارسال می‌شوند\&. .RE .PP \fBRPCGENHEADERFLAGS\fR .RS 4 گزینه‌هایی که هنگام تولید یک فایل سرآیند به کامپایلر پروتکل RPC ارسال می‌شوند\&. این گزینه‌ها علاوه بر پرچم‌های مشخص‌شده در متغیر ساخت \fB$RPCGENFLAGS\fR هستند\&. .RE .PP \fBRPCGENSERVICEFLAGS\fR .RS 4 گزینه‌هایی که هنگام تولید stubهای سمت سرور به کامپایلر پروتکل RPC ارسال می‌شوند\&. این گزینه‌ها علاوه بر پرچم‌های مشخص‌شده در متغیر ساخت \fB$RPCGENFLAGS\fR هستند\&. .RE .PP \fBRPCGENXDRFLAGS\fR .RS 4 گزینه‌هایی که هنگام تولید روتین‌های XDR به کامپایلر پروتکل RPC ارسال می‌شوند\&. این گزینه‌ها علاوه بر پرچم‌های مشخص‌شده در متغیر ساخت \fB$RPCGENFLAGS\fR هستند\&. .RE .PP \fBSCANNERS\fR .RS 4 فهرستی از پوینده‌های وابستگی ضمنی موجود\&. پوینده‌های فایل جدید را می‌توان با افزودن به انتهای این فهرست اضافه کرد، اگرچه رویکرد منعطف‌تر این است که پوینده‌ها را با یک Builder خاص مرتبط کنید\&. برای اطلاعات بیشتر بخش‌های "Builder Objects" و "Scanner Objects" در صفحه راهنما را ببینید\&. .RE .PP \fBSCONS_HOME\fR .RS 4 مسیر (اختیاری) به دایرکتوری کتابخانه SCons که از محیط خارجی مقداردهی اولیه می‌شود\&. در صورت تنظیم، از این مقدار برای ایجاد یک مسیر جستجوی کوتاه‌تر و کارآمدتر در خط فرمان \fB$MSVSSCONS\fR که از فایل‌های پروژه C++ اجرا می‌شود استفاده می‌شود\&. .RE .PP \fBSHCC\fR .RS 4 کامپایلر C مورد استفاده برای تولید شیءهای کتابخانه اشتراکی\&. همچنین \fB$CC\fR را برای کامپایل به شیءهای ایستا ببینید\&. .RE .PP \fBSHCCCOM\fR .RS 4 خط فرمانی که برای کامپایل یک فایل منبع C به یک فایل شیء کتابخانه اشتراکی استفاده می‌شود\&. هر گزینه‌ای که در متغیرهای ساخت \fB$SHCFLAGS\fR، \fB$SHCCFLAGS\fR و \fB$CPPFLAGS\fR مشخص شده باشد در این خط فرمان گنجانده می‌شود\&. همچنین \fB$CCCOM\fR را برای کامپایل به شیءهای ایستا ببینید\&. .RE .PP \fBSHCCCOMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع C به یک فایل شیء اشتراکی نمایش داده می‌شود\&. اگر تنظیم نشده باشد، \fB$SHCCCOM\fR (خط فرمان) نمایش داده می‌شود\&. همچنین \fB$CCCOMSTR\fR را برای کامپایل به شیءهای ایستا ببینید\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(SHCCCOMSTR = "Compiling shared object $TARGET") .fi .if n \{\ .RE .\} .RE .PP \fBSHCCFLAGS\fR .RS 4 گزینه‌هایی که برای تولید اشیاء کتابخانهٔ اشتراکی به کامپایلرهای C و C++ ارسال می‌شوند\&. همچنین \fB$CCFLAGS\fR را برای کامپایل به اشیاء ایستا ببینید\&. .RE .PP \fBSHCFLAGS\fR .RS 4 گزینه‌هایی که برای تولید اشیاء کتابخانهٔ اشتراکی به کامپایلر C (فقط؛ نه C++) ارسال می‌شوند\&. همچنین \fB$CFLAGS\fR را برای کامپایل به اشیاء ایستا ببینید\&. .RE .PP \fBSHCXX\fR .RS 4 کامپایلر C++ مورد استفاده برای تولید اشیاء کتابخانهٔ اشتراکی\&. همچنین \fB$CXX\fR را برای کامپایل به اشیاء ایستا ببینید\&. .RE .PP \fBSHCXXCOM\fR .RS 4 خط فرمانی که برای کامپایل یک فایل منبع C++ به یک فایل شیء کتابخانهٔ اشتراکی استفاده می‌شود\&. هر گزینه‌ای که در متغیرهای ساخت \fB$SHCXXFLAGS\fR و \fB$CPPFLAGS\fR مشخص شده باشد در این خط فرمان گنجانده می‌شود\&. همچنین \fB$CXXCOM\fR را برای کامپایل به اشیاء ایستا ببینید\&. .RE .PP \fBSHCXXCOMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع C++ به یک فایل شیء اشتراکی نمایش داده می‌شود\&. اگر تنظیم نشده باشد، \fB$SHCXXCOM\fR (خط فرمان) نمایش داده می‌شود\&. همچنین \fB$CXXCOMSTR\fR را برای کامپایل به اشیاء ایستا ببینید\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(SHCXXCOMSTR = "Compiling shared object $TARGET") .fi .if n \{\ .RE .\} .RE .PP \fBSHCXXFLAGS\fR .RS 4 گزینه‌هایی که برای تولید اشیاء کتابخانهٔ اشتراکی به کامپایلر C++ ارسال می‌شوند\&. همچنین \fB$CXXFLAGS\fR را برای کامپایل به اشیاء ایستا ببینید\&. .RE .PP \fBSHDC\fR .RS 4 نام کامپایلری که هنگام کامپایل منبع D با هدف قرارگیری در یک شیء اشتراکی استفاده می‌شود\&. همچنین \fB$DC\fR را برای کامپایل به اشیاء ایستا ببینید\&. .RE .PP \fBSHDCOM\fR .RS 4 خط فرمانی که هنگام کامپایل کد با هدف قرارگیری در اشیاء اشتراکی استفاده می‌شود\&. همچنین \fB$DCOM\fR را برای کامپایل به اشیاء ایستا ببینید\&. .RE .PP \fBSHDCOMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع D به یک فایل شیء (اشتراکی) نمایش داده می‌شود\&. اگر تنظیم نشده باشد، \fB$SHDCOM\fR (خط فرمان) نمایش داده می‌شود\&. همچنین \fB$DCOMSTR\fR را برای کامپایل به اشیاء ایستا ببینید\&. .RE .PP \fBSHDLIBVERSIONFLAGS\fR .RS 4 پرچم‌های اضافی که هنگام ساخت \fBSharedLibrary\fR نسخه‌دار به \fB$SHDLINKCOM\fR اضافه می‌شوند\&. این پرچم‌ها تنها زمانی استفاده می‌شوند که \fB$SHLIBVERSION\fR تنظیم شده باشد\&. .RE .PP \fBSHDLINK\fR .RS 4 پیونددهنده‌ای که هنگام ایجاد اشیاء اشتراکی از کد dlang استفاده می‌شود\&. همچنین \fB$DLINK\fR را برای پیوند دادن اشیاء ایستا ببینید\&. .RE .PP \fBSHDLINKCOM\fR .RS 4 خط فرمانی که هنگام تولید اشیاء اشتراکی استفاده می‌شود\&. همچنین \fB$DLINKCOM\fR را برای پیوند دادن اشیاء ایستا ببینید\&. .RE .PP \fBSHDLINKFLAGS\fR .RS 4 پرچم‌هایی که هنگام تولید یک شیء اشتراکی برای زبان D استفاده می‌شوند\&. همچنین \fB$DLINKFLAGS\fR را برای پیوند دادن اشیاء ایستا ببینید\&. .RE .PP \fBSHELL\fR .RS 4 رشته‌ای که نام برنامهٔ پوسته را مشخص می‌کند و به تابع \fB$SPAWN\fR ارسال خواهد شد\&. برای اطلاعات بیشتر، متغیر ساخت \fB$SPAWN\fR را ببینید\&. .RE .PP \fBSHELL_ENV_GENERATORS\fR .RS 4 قلابی (hook) که امکان ویرایش محیط اجرا را پیش از اجرای واقعی یک خط فرمان از یک کنش، از طریق تابع اجراکنندهٔ تعریف‌شده توسط \fB$SPAWN\fR فراهم می‌کند\&. امکان جایگزینی بر اساس هدف‌ها و منابع، و همچنین مقادیر حاصل از محیط ساخت، افزودن متغیرهای محیطی بیشتر و غیره را می‌دهد\&. .sp این مقدار باید فهرستی (یا پیمایش‌پذیر دیگری) از توابعی باشد که هر کدام دیکشنریِ محیط اجرا را تولید کرده یا تغییر می‌دهند\&. به نخستین تابع، رونوشتی از محیط اجرای اولیه (\fB$ENV\fR در محیط ساخت جاری) داده می‌شود؛ دیکشنری بازگردانده‌شده توسط آن تابع به تابع بعدی داده می‌شود، تا زمانی که تمام توابع اجرا شوند و نتیجه برای استفاده توسط اجراکنندهٔ فرمان بازگردانده شود\&. محیط اجرای اصلی دست‌نخورده باقی می‌ماند\&. .sp هر تابعی که در \fB$SHELL_ENV_GENERATORS\fR ارائه می‌شود باید چهار آرگومان بپذیرد و یک دیکشنری بازگرداند: \fIenv\fR محیط ساخت برای این کنش است؛ \fItarget\fR فهرست هدف‌های مرتبط با این کنش است؛ \fIsource\fR فهرست منابع مرتبط با این کنش است؛ و \fIshell_env\fR دیکشنری فعلی پس از اجرای توابع قبلی در \fB$SHELL_ENV_GENERATORS\fR است (می‌توان این مقدار را با محیط اجرای اولیه که به صورت env[\*(AqENV\*(Aq] در دسترس است مقایسه کرد تا هرگونه تغییر تشخیص داده شود)\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf def custom_shell_env(env, target, source, shell_env): """customize shell_env if desired""" if str(target[0]) == \*(Aqspecial_target\*(Aq: shell_env[\*(AqSPECIAL_VAR\*(Aq] = env\&.subst(\*(AqSOME_VAR\*(Aq, target=target, source=source) return shell_env env["SHELL_ENV_GENERATORS"] = [custom_shell_env] .fi .if n \{\ .RE .\} .sp \fIاز نسخهٔ 4\&.4 در دسترس است\fR .RE .PP \fBSHF03\fR .RS 4 کامپایلر Fortran 03 مورد استفاده برای تولید اشیاء کتابخانهٔ اشتراکی\&. در حالت عادی باید متغیر \fB$SHFORTRAN\fR را تنظیم کنید که کامپایلر پیش‌فرض Fortran را برای تمام نسخه‌های Fortran مشخص می‌کند\&. تنها در صورتی نیاز به تنظیم \fB$SHF03\fR دارید که بخواهید از یک کامپایلر یا نسخهٔ کامپایلر خاص برای فایل‌های Fortran 03 استفاده کنید\&. .RE .PP \fBSHF03COM\fR .RS 4 خط فرمانی که برای کامپایل یک فایل منبع Fortran 03 به یک فایل شیء کتابخانهٔ اشتراکی استفاده می‌شود\&. تنها در صورتی نیاز به تنظیم \fB$SHF03COM\fR دارید که بخواهید از یک خط فرمان خاص برای فایل‌های Fortran 03 استفاده کنید\&. در حالت عادی باید متغیر \fB$SHFORTRANCOM\fR را تنظیم کنید که خط فرمان پیش‌فرض را برای تمام نسخه‌های Fortran مشخص می‌کند\&. .RE .PP \fBSHF03COMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع Fortran 03 به یک فایل شیء کتابخانهٔ اشتراکی نمایش داده می‌شود\&. در صورت عدم تنظیم، \fB$SHF03COM\fR یا \fB$SHFORTRANCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBSHF03FLAGS\fR .RS 4 گزینه‌هایی که برای تولید اشیاء کتابخانهٔ اشتراکی به کامپایلر Fortran 03 ارسال می‌شوند\&. تنها در صورتی نیاز به تنظیم \fB$SHF03FLAGS\fR دارید که بخواهید گزینه‌های کاربری خاصی را برای فایل‌های Fortran 03 تعریف کنید\&. در حالت عادی باید متغیر \fB$FORTRANCOMMONFLAGS\fR را تنظیم کنید که گزینه‌های مشخص‌شده توسط کاربر را برای ارسال به کامپایلر پیش‌فرض Fortran برای تمام نسخه‌های Fortran مشخص می‌کند\&. .RE .PP \fBSHF03PPCOM\fR .RS 4 خط فرمانی که برای کامپایل یک فایل منبع Fortran 03 به یک فایل شیء کتابخانهٔ اشتراکی، پس از عبور دادن اولیهٔ فایل از پیش‌پردازندهٔ C استفاده می‌شود\&. هر گزینه‌ای که در متغیرهای ساخت \fB$SHF03FLAGS\fR و \fB$CPPFLAGS\fR مشخص شده باشد، در این خط فرمان گنجانده می‌شود\&. تنها در صورتی نیاز به تنظیم \fB$SHF03PPCOM\fR دارید که بخواهید از یک خط فرمان پیش‌پردازندهٔ C خاص برای فایل‌های Fortran 03 استفاده کنید\&. در حالت عادی باید متغیر \fB$SHFORTRANPPCOM\fR را تنظیم کنید که خط فرمان پیش‌فرض پیش‌پردازندهٔ C را برای تمام نسخه‌های Fortran مشخص می‌کند\&. .RE .PP \fBSHF03PPCOMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع Fortran 03 به یک فایل شیء کتابخانهٔ اشتراکی، پس از عبور دادن اولیهٔ فایل از پیش‌پردازندهٔ C نمایش داده می‌شود\&. در صورت عدم تنظیم، \fB$SHF03PPCOM\fR یا \fB$SHFORTRANPPCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBSHF08\fR .RS 4 کامپایلر Fortran 08 مورد استفاده برای تولید اشیاء کتابخانهٔ اشتراکی\&. در حالت عادی باید متغیر \fB$SHFORTRAN\fR را تنظیم کنید که کامپایلر پیش‌فرض Fortran را برای تمام نسخه‌های Fortran مشخص می‌کند\&. تنها در صورتی نیاز به تنظیم \fB$SHF08\fR دارید که بخواهید از یک کامپایلر یا نسخهٔ کامپایلر خاص برای فایل‌های Fortran 08 استفاده کنید\&. .RE .PP \fBSHF08COM\fR .RS 4 خط فرمانی که برای کامپایل یک فایل منبع Fortran 08 به یک فایل شیء کتابخانهٔ اشتراکی استفاده می‌شود\&. تنها در صورتی نیاز به تنظیم \fB$SHF08COM\fR دارید که بخواهید از یک خط فرمان خاص برای فایل‌های Fortran 08 استفاده کنید\&. در حالت عادی باید متغیر \fB$SHFORTRANCOM\fR را تنظیم کنید که خط فرمان پیش‌فرض را برای تمام نسخه‌های Fortran مشخص می‌کند\&. .RE .PP \fBSHF08COMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع Fortran 08 به یک فایل شیء کتابخانهٔ اشتراکی نمایش داده می‌شود\&. در صورت عدم تنظیم، \fB$SHF08COM\fR یا \fB$SHFORTRANCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBSHF08FLAGS\fR .RS 4 گزینه‌هایی که برای تولید اشیاء کتابخانهٔ اشتراکی به کامپایلر Fortran 08 ارسال می‌شوند\&. تنها در صورتی نیاز به تنظیم \fB$SHF08FLAGS\fR دارید که بخواهید گزینه‌های کاربری خاصی را برای فایل‌های Fortran 08 تعریف کنید\&. در حالت عادی باید متغیر \fB$FORTRANCOMMONFLAGS\fR را تنظیم کنید که گزینه‌های مشخص‌شده توسط کاربر را برای ارسال به کامپایلر پیش‌فرض Fortran برای تمام نسخه‌های Fortran مشخص می‌کند\&. .RE .PP \fBSHF08PPCOM\fR .RS 4 خط فرمانی که برای کامپایل یک فایل منبع Fortran 08 به یک فایل شیء کتابخانهٔ اشتراکی، پس از عبور دادن اولیهٔ فایل از پیش‌پردازندهٔ C استفاده می‌شود\&. هر گزینه‌ای که در متغیرهای ساخت \fB$SHF08FLAGS\fR و \fB$CPPFLAGS\fR مشخص شده باشد، در این خط فرمان گنجانده می‌شود\&. تنها در صورتی نیاز به تنظیم \fB$SHF08PPCOM\fR دارید که بخواهید از یک خط فرمان پیش‌پردازندهٔ C خاص برای فایل‌های Fortran 08 استفاده کنید\&. در حالت عادی باید متغیر \fB$SHFORTRANPPCOM\fR را تنظیم کنید که خط فرمان پیش‌فرض پیش‌پردازندهٔ C را برای تمام نسخه‌های Fortran مشخص می‌کند\&. .RE .PP \fBSHF08PPCOMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع Fortran 08 به یک فایل شیء کتابخانهٔ اشتراکی، پس از عبور دادن اولیهٔ فایل از پیش‌پردازندهٔ C نمایش داده می‌شود\&. در صورت عدم تنظیم، \fB$SHF08PPCOM\fR یا \fB$SHFORTRANPPCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBSHF77\fR .RS 4 کامپایلر Fortran 77 مورد استفاده برای تولید اشیاء کتابخانهٔ اشتراکی\&. در حالت عادی باید متغیر \fB$SHFORTRAN\fR را تنظیم کنید که کامپایلر پیش‌فرض Fortran را برای تمام نسخه‌های Fortran مشخص می‌کند\&. تنها در صورتی نیاز به تنظیم \fB$SHF77\fR دارید که بخواهید از یک کامپایلر یا نسخهٔ کامپایلر خاص برای فایل‌های Fortran 77 استفاده کنید\&. .RE .PP \fBSHF77COM\fR .RS 4 خط فرمانی که برای کامپایل یک فایل منبع Fortran 77 به یک فایل شیء کتابخانهٔ اشتراکی استفاده می‌شود\&. تنها در صورتی نیاز به تنظیم \fB$SHF77COM\fR دارید که بخواهید از یک خط فرمان خاص برای فایل‌های Fortran 77 استفاده کنید\&. در حالت عادی باید متغیر \fB$SHFORTRANCOM\fR را تنظیم کنید که خط فرمان پیش‌فرض را برای تمام نسخه‌های Fortran مشخص می‌کند\&. .RE .PP \fBSHF77COMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع Fortran 77 به یک فایل شیء کتابخانهٔ اشتراکی نمایش داده می‌شود\&. در صورت عدم تنظیم، \fB$SHF77COM\fR یا \fB$SHFORTRANCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBSHF77FLAGS\fR .RS 4 گزینه‌هایی که برای تولید اشیاء کتابخانهٔ اشتراکی به کامپایلر Fortran 77 ارسال می‌شوند\&. تنها در صورتی نیاز به تنظیم \fB$SHF77FLAGS\fR دارید که بخواهید گزینه‌های کاربری خاصی را برای فایل‌های Fortran 77 تعریف کنید\&. در حالت عادی باید متغیر \fB$FORTRANCOMMONFLAGS\fR را تنظیم کنید که گزینه‌های مشخص‌شده توسط کاربر را برای ارسال به کامپایلر پیش‌فرض Fortran برای تمام نسخه‌های Fortran مشخص می‌کند\&. .RE .PP \fBSHF77PPCOM\fR .RS 4 خط فرمانی که برای کامپایل یک فایل منبع Fortran 77 به یک فایل شیء کتابخانه اشتراکی، پس از عبور دادن اولیه فایل از پیش‌پردازنده C، استفاده می‌شود\&. هر گزینه‌ای که در متغیرهای ساخت \fB$SHF77FLAGS\fR و \fB$CPPFLAGS\fR مشخص شده باشد در این خط فرمان گنجانده می‌شود\&. شما تنها زمانی نیاز به تنظیم \fB$SHF77PPCOM\fR دارید که بخواهید از یک خط فرمان پیش‌پردازنده C خاص برای فایل‌های Fortran 77 استفاده کنید\&. در حالت عادی باید متغیر \fB$SHFORTRANPPCOM\fR را تنظیم کنید که خط فرمان پیش‌پردازنده C پیش‌فرض را برای تمام نسخه‌های Fortran مشخص می‌کند\&. .RE .PP \fBSHF77PPCOMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع Fortran 77 به یک فایل شیء کتابخانه اشتراکی پس از عبور دادن اولیه آن از پیش‌پردازنده C، نمایش داده می‌شود\&. اگر تنظیم نشده باشد، \fB$SHF77PPCOM\fR یا \fB$SHFORTRANPPCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBSHF90\fR .RS 4 کامپایلر Fortran 90 که برای تولید اشیاء کتابخانه اشتراکی به کار می‌رود\&. در حالت عادی باید متغیر \fB$SHFORTRAN\fR را تنظیم کنید که کامپایلر پیش‌فرض Fortran را برای تمامی نسخه‌های Fortran مشخص می‌کند\&. شما تنها در صورتی نیاز به تنظیم \fB$SHF90\fR دارید که بخواهید از کامپایلر یا نسخه کامپایلر خاصی برای فایل‌های Fortran 90 استفاده نمایید\&. .RE .PP \fBSHF90COM\fR .RS 4 خط فرمانی که برای کامپایل یک فایل منبع Fortran 90 به یک فایل شیء کتابخانه اشتراکی استفاده می‌شود\&. تنها در صورتی نیاز به تنظیم \fB$SHF90COM\fR دارید که بخواهید از یک خط فرمان خاص برای فایل‌های Fortran 90 استفاده کنید\&. در حالت عادی باید متغیر \fB$SHFORTRANCOM\fR را تنظیم کنید که خط فرمان پیش‌فرض را برای تمام نسخه‌های Fortran مشخص می‌کند\&. .RE .PP \fBSHF90COMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع Fortran 90 به یک فایل شیء کتابخانه اشتراکی نمایش داده می‌شود\&. اگر تنظیم نشده باشد، \fB$SHF90COM\fR یا \fB$SHFORTRANCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBSHF90FLAGS\fR .RS 4 گزینه‌هایی که برای تولید اشیاء کتابخانه اشتراکی به کامپایلر Fortran 90 ارسال می‌شوند\&. تنها در صورتی نیاز به تنظیم \fB$SHF90FLAGS\fR دارید که بخواهید گزینه‌های کاربری خاصی را برای فایل‌های Fortran 90 تعریف کنید\&. در حالت عادی باید متغیر \fB$FORTRANCOMMONFLAGS\fR را تنظیم کنید که گزینه‌های مشخص‌شده توسط کاربر را برای ارسال به کامپایلر پیش‌فرض Fortran در تمامی نسخه‌های Fortran تعیین می‌کند\&. .RE .PP \fBSHF90PPCOM\fR .RS 4 خط فرمانی که برای کامپایل یک فایل منبع Fortran 90 به یک فایل شیء کتابخانه اشتراکی، پس از عبور دادن اولیه فایل از پیش‌پردازنده C، استفاده می‌شود\&. هر گزینه‌ای که در متغیرهای ساخت \fB$SHF90FLAGS\fR و \fB$CPPFLAGS\fR مشخص شده باشد در این خط فرمان گنجانده می‌شود\&. شما تنها زمانی نیاز به تنظیم \fB$SHF90PPCOM\fR دارید که بخواهید از یک خط فرمان پیش‌پردازنده C خاص برای فایل‌های Fortran 90 استفاده کنید\&. در حالت عادی باید متغیر \fB$SHFORTRANPPCOM\fR را تنظیم کنید که خط فرمان پیش‌پردازنده C پیش‌فرض را برای تمام نسخه‌های Fortran مشخص می‌کند\&. .RE .PP \fBSHF90PPCOMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع Fortran 90 به یک فایل شیء کتابخانه اشتراکی پس از عبور دادن اولیه آن از پیش‌پردازنده C، نمایش داده می‌شود\&. اگر تنظیم نشده باشد، \fB$SHF90PPCOM\fR یا \fB$SHFORTRANPPCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBSHF95\fR .RS 4 کامپایلر Fortran 95 که برای تولید اشیاء کتابخانه اشتراکی به کار می‌رود\&. در حالت عادی باید متغیر \fB$SHFORTRAN\fR را تنظیم کنید که کامپایلر پیش‌فرض Fortran را برای تمامی نسخه‌های Fortran مشخص می‌کند\&. شما تنها در صورتی نیاز به تنظیم \fB$SHF95\fR دارید که بخواهید از کامپایلر یا نسخه کامپایلر خاصی برای فایل‌های Fortran 95 استفاده نمایید\&. .RE .PP \fBSHF95COM\fR .RS 4 خط فرمانی که برای کامپایل یک فایل منبع Fortran 95 به یک فایل شیء کتابخانه اشتراکی استفاده می‌شود\&. تنها در صورتی نیاز به تنظیم \fB$SHF95COM\fR دارید که بخواهید از یک خط فرمان خاص برای فایل‌های Fortran 95 استفاده کنید\&. در حالت عادی باید متغیر \fB$SHFORTRANCOM\fR را تنظیم کنید که خط فرمان پیش‌فرض را برای تمام نسخه‌های Fortran مشخص می‌کند\&. .RE .PP \fBSHF95COMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع Fortran 95 به یک فایل شیء کتابخانه اشتراکی نمایش داده می‌شود\&. اگر تنظیم نشده باشد، \fB$SHF95COM\fR یا \fB$SHFORTRANCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBSHF95FLAGS\fR .RS 4 گزینه‌هایی که برای تولید اشیاء کتابخانه اشتراکی به کامپایلر Fortran 95 ارسال می‌شوند\&. تنها در صورتی نیاز به تنظیم \fB$SHF95FLAGS\fR دارید که بخواهید گزینه‌های کاربری خاصی را برای فایل‌های Fortran 95 تعریف کنید\&. در حالت عادی باید متغیر \fB$FORTRANCOMMONFLAGS\fR را تنظیم کنید که گزینه‌های مشخص‌شده توسط کاربر را برای ارسال به کامپایلر پیش‌فرض Fortran در تمامی نسخه‌های Fortran تعیین می‌کند\&. .RE .PP \fBSHF95PPCOM\fR .RS 4 خط فرمانی که برای کامپایل یک فایل منبع Fortran 95 به یک فایل شیء کتابخانه اشتراکی، پس از عبور دادن اولیه فایل از پیش‌پردازنده C، استفاده می‌شود\&. هر گزینه‌ای که در متغیرهای ساخت \fB$SHF95FLAGS\fR و \fB$CPPFLAGS\fR مشخص شده باشد در این خط فرمان گنجانده می‌شود\&. شما تنها زمانی نیاز به تنظیم \fB$SHF95PPCOM\fR دارید که بخواهید از یک خط فرمان پیش‌پردازنده C خاص برای فایل‌های Fortran 95 استفاده کنید\&. در حالت عادی باید متغیر \fB$SHFORTRANPPCOM\fR را تنظیم کنید که خط فرمان پیش‌پردازنده C پیش‌فرض را برای تمام نسخه‌های Fortran مشخص می‌کند\&. .RE .PP \fBSHF95PPCOMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع Fortran 95 به یک فایل شیء کتابخانه اشتراکی پس از عبور دادن اولیه آن از پیش‌پردازنده C، نمایش داده می‌شود\&. اگر تنظیم نشده باشد، \fB$SHF95PPCOM\fR یا \fB$SHFORTRANPPCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBSHFORTRAN\fR .RS 4 کامپایلر پیش‌فرض Fortran که برای تولید اشیاء کتابخانه اشتراکی به کار می‌رود\&. .RE .PP \fBSHFORTRANCOM\fR .RS 4 خط فرمانی که برای کامپایل یک فایل منبع Fortran به یک فایل شیء کتابخانه اشتراکی استفاده می‌شود\&. به‌طور پیش‌فرض، هر گزینه‌ای که در متغیرهای ساخت \fB$SHFORTRANFLAGS\fR، \fB$_FORTRANMODFLAG\fR و \fB$_FORTRANINCFLAGS\fR مشخص شده باشد در این خط فرمان گنجانده می‌شود\&. همچنین ببینید: \fB$FORTRANCOM\fR\&. .RE .PP \fBSHFORTRANCOMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع Fortran به یک فایل شیء کتابخانه مشترک نمایش داده می‌شود\&. اگر تنظیم نشده باشد، \fB$SHFORTRANCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBSHFORTRANFLAGS\fR .RS 4 گزینه‌هایی که برای تولید اشیاء کتابخانه مشترک به کامپایلر Fortran ارسال می‌شوند\&. .RE .PP \fBSHFORTRANPPCOM\fR .RS 4 خط فرمانی که برای کامپایل یک فایل منبع Fortran به یک فایل شیء کتابخانه مشترک پس از عبور دادن اولیه فایل از پیش‌پردازنده C استفاده می‌شود\&. به‌طور پیش‌فرض، هر گزینه‌ای که در متغیرهای ساخت \fB$SHFORTRANFLAGS\fR، \fB$CPPFLAGS\fR، \fB$_CPPDEFFLAGS\fR، \fB$_FORTRANMODFLAG\fR و \fB$_FORTRANINCFLAGS\fR مشخص شده باشد در این خط فرمان گنجانده می‌شود\&. همچنین ببینید: \fB$SHFORTRANCOM\fR\&. .RE .PP \fBSHFORTRANPPCOMSTR\fR .RS 4 در صورت تنظیم، رشته‌ای است که هنگام کامپایل یک فایل منبع Fortran به یک فایل شیء کتابخانه مشترک پس از عبور دادن اولیه فایل از پیش‌پردازنده C نمایش داده می‌شود\&. اگر تنظیم نشده باشد، \fB$SHFORTRANPPCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBSHLIBEMITTER\fR .RS 4 شامل مشخصات emitter برای سازنده \fBSharedLibrary\fR است\&. بخش \(lqBuilder Objects\(rq در صفحه راهنما شامل اطلاعات عمومی درباره تعیین emitterها است\&. .RE .PP \fBSHLIBNOVERSIONSYMLINKS\fR .RS 4 به سازنده \fBSharedLibrary\fR دستور می‌دهد که برای کتابخانه‌های مشترک دارای نسخه، پیوندهای نمادین ایجاد نکند\&. .RE .PP \fBSHLIBPREFIX\fR .RS 4 پیشوندی که برای نام‌های فایل کتابخانه مشترک استفاده می‌شود\&. .RE .PP \fB_SHLIBSONAME\fR .RS 4 ماکرویی که به‌طور خودکار \fB$SONAME\fR یک کتابخانه مشترک را بر اساس $TARGET، \fB$SHLIBVERSION\fR و \fB$SHLIBSUFFIX\fR تولید می‌کند\&. زمانی که ابزار پیونددهنده از SONAME پشتیبانی کند (مانند gnulink)، توسط سازنده \fBSharedLibrary\fR استفاده می‌شود\&. .RE .PP \fBSHLIBSUFFIX\fR .RS 4 پسوندی که برای نام‌های فایل کتابخانه مشترک استفاده می‌شود\&. .RE .PP \fBSHLIBVERSION\fR .RS 4 هنگامی که این متغیر ساخت تعریف شود، یک کتابخانه مشترک دارای نسخه توسط سازنده \fBSharedLibrary\fR ایجاد می‌شود\&. این کار \fB$_SHLIBVERSIONFLAGS\fR را فعال کرده و در نتیجه \fB$SHLINKCOM\fR را بر حسب نیاز تغییر می‌دهد، شماره نسخه را به نام کتابخانه می‌افزاید و پیوندهای نمادین مورد نیاز را ایجاد می‌کند\&. نسخه‌های \fB$SHLIBVERSION\fR به‌صورت مقادیر الفبایی\-عددی و جداشده با نقطه مشخص می‌شوند که توسط عبارت باقاعده "\ew+[\e\&.\ew+]*" قابل تشخیص هستند\&. نمونه مقادیر معتبر برای \fB$SHLIBVERSION\fR شامل \*(Aq1\*(Aq، \*(Aq1\&.2\&.3\*(Aq و \*(Aq1\&.2\&.gitaa412c8b\*(Aq است\&. .RE .PP \fB_SHLIBVERSIONFLAGS\fR .RS 4 این ماکرو هنگام ساخت یک \fBSharedLibrary\fR دارای نسخه (یعنی زمانی که \fB$SHLIBVERSION\fR تنظیم شده باشد)، پرچم‌های اضافی را به‌طور خودکار به \fB$SHLINKCOM\fR معرفی می‌کند\&. \fB$_SHLIBVERSIONFLAGS\fR معمولاً \fB$SHLIBVERSIONFLAGS\fR و برخی گزینه‌های پویای تولیدشده اضافی (مانند \-Wl,\-soname=$_SHLIBSONAME) را اضافه می‌کند\&. این ماکرو در کتابخانه‌های مشترک \(lqساده\(rq (بدون نسخه) استفاده نمی‌شود\&. .RE .PP \fBSHLIBVERSIONFLAGS\fR .RS 4 پرچم‌های اضافی که هنگام ساخت \fBSharedLibrary\fR دارای نسخه به \fB$SHLINKCOM\fR اضافه می‌شوند\&. این پرچم‌ها فقط زمانی استفاده می‌شوند که \fB$SHLIBVERSION\fR تنظیم شده باشد\&. .RE .PP \fBSHLINK\fR .RS 4 پیونددهنده برای برنامه‌هایی که از کتابخانه‌های مشترک استفاده می‌کنند\&. همچنین برای پیوند دادن اشیاء ایستا، \fB$LINK\fR را ببینید\&. .sp در سیستم‌های POSIX (سیستم‌هایی که از ابزار link استفاده می‌کنند)، معمولاً نباید این مقدار را تغییر دهید زیرا پیش‌فرض آن یک ابزار پیونددهنده \(lqهوشمند\(rq است که راه‌انداز کامپایلر متناسب با نوع فایل‌های منبع مورد استفاده را انتخاب می‌کند\&. بنابراین به‌عنوان مثال، اگر \fB$SHCXX\fR را روی نام یک کامپایلر خاص تنظیم کنید و در حال کامپایل منابع C++ باشید، تابع smartlink به‌طور خودکار همان کامپایلر را برای پیوند دادن انتخاب می‌کند\&. .RE .PP \fBSHLINKCOM\fR .RS 4 خط فرمانی که برای پیوند دادن برنامه‌های استفاده‌کننده از کتابخانه‌های مشترک به کار می‌رود\&. همچنین برای پیوند دادن اشیاء ایستا، \fB$LINKCOM\fR را ببینید\&. .RE .PP \fBSHLINKCOMSTR\fR .RS 4 رشته‌ای که هنگام پیوند دادن برنامه‌های استفاده‌کننده از کتابخانه‌های مشترک نمایش داده می‌شود\&. اگر تنظیم نشده باشد، \fB$SHLINKCOM\fR (خط فرمان) نمایش داده می‌شود\&. همچنین برای پیوند دادن اشیاء ایستا، \fB$LINKCOMSTR\fR را ببینید\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(SHLINKCOMSTR = "Linking shared $TARGET") .fi .if n \{\ .RE .\} .RE .PP \fBSHLINKFLAGS\fR .RS 4 گزینه‌های عمومی کاربر که برای برنامه‌های استفاده‌کننده از کتابخانه‌های اشتراکی به پیونددهنده ارسال می‌شوند\&. توجه داشته باشید که این متغیر \fIنباید\fR شامل گزینه‌های \fB\-l\fR (یا مشابه آن) برای پیوند دادن با کتابخانه‌های فهرست‌شده در \fB$LIBS\fR، و همچنین گزینه‌های مسیر جستجوی \fB\-L\fR (یا مشابه آن) که scons به‌طور خودکار از \fB$LIBPATH\fR تولید می‌کند باشد\&. برای متغیری که به گزینه‌های پیوند کتابخانه بسط می‌یابد، \fB$_LIBFLAGS\fR در بالا، و برای متغیری که به گزینه‌های مسیر جستجوی کتابخانه بسط می‌یابد، \fB$_LIBDIRFLAGS\fR در بالا را ببینید\&. همچنین \fB$LINKFLAGS\fR را برای پیوند دادن اشیاء ایستا ببینید\&. .RE .PP \fBSHOBJPREFIX\fR .RS 4 پیشوندی که برای نام فایل‌های شیء اشتراکی (shared object) استفاده می‌شود\&. .RE .PP \fBSHOBJSUFFIX\fR .RS 4 پسوندی که برای نام فایل‌های شیء اشتراکی استفاده می‌شود\&. .RE .PP \fBSONAME\fR .RS 4 نام یک کتابخانه اشتراکی یا پیمانه بارگذاری‌پذیر نسخه‌دار\&. در صورت مشخص شدن، بیانی صریح از نام است؛ در صورت عدم تعیین، مقدار آن به‌طور خودکار تولید می‌شود\&. \fB$SONAME\fR و \fB$SOVERSION\fR نباید هر دو در یک محیط ساخت (construction environment) یا بازنویسی (override) مشخص شوند\&. .sp .if n \{\ .RS 4 .\} .nf # Will cause libtest\&.so\&.2 to exist and be a symlink to libtest\&.so\&.0\&.1\&.2 env\&.SharedLibrary(\*(Aqtest\*(Aq, \*(Aqtest\&.c\*(Aq, SHLIBVERSION=\*(Aq0\&.1\&.2\*(Aq, SONAME=\*(Aqlibtest\&.so\&.2\*(Aq) .fi .if n \{\ .RE .\} .sp این متغیر توسط زنجیره‌های ابزاری که از شیءهای اشتراکی نسخه‌دار پشتیبانی می‌کنند استفاده می‌شود\&. .RE .PP \fBSOURCE\fR .RS 4 نام متغیری رزرو شده که نباید در یک محیط ساخت تنظیم یا استفاده شود\&. (برای اطلاعات بیشتر بخش «جایگزینی متغیر» در صفحه راهنما را ببینید)\&. .RE .PP \fBSOURCE_URL\fR .RS 4 نشانی وب (URL) مکانی که پروژه از آن دریافت شده است\&. این متغیر برای پر کردن فیلد Source: در اطلاعات کنترلی بسته‌های Ipkg و RPM استفاده می‌شود\&. .sp سازنده \fBPackage\fR را ببینید\&. .RE .PP \fBSOURCES\fR .RS 4 نام متغیری رزرو شده که نباید در یک محیط ساخت تنظیم یا استفاده شود\&. (برای اطلاعات بیشتر بخش «جایگزینی متغیر» در صفحه راهنما را ببینید)\&. .RE .PP \fBSOVERSION\fR .RS 4 رشته نسخه مورد استفاده در ساخت \fB$SONAME\fR\&. نسخه به نام پایه کتابخانه اضافه می‌شود (\fItest\fR در مثال زیر)\&. \fB$SONAME\fR و \fB$SOVERSION\fR نباید هر دو در یک محیط ساخت یا بازنویسی مشخص شوند\&. .sp .if n \{\ .RS 4 .\} .nf # SONAME will be libtest\&.so\&.2, and will be a symlink to libtest\&.so\&.0\&.1\&.2 env\&.SharedLibrary(\*(Aqtest\*(Aq, \*(Aqtest\&.c\*(Aq, SHLIBVERSION=\*(Aq0\&.1\&.2\*(Aq, SOVERSION=\*(Aq2\*(Aq) .fi .if n \{\ .RE .\} .sp این متغیر توسط زنجیره‌های ابزاری که از شیءهای اشتراکی نسخه‌دار پشتیبانی می‌کنند استفاده می‌شود\&. .RE .PP \fBSPAWN\fR .RS 4 یک تابع مفسر دستور که برای اجرای رشته‌های خط فرمان فراخوانی خواهد شد\&. این تابع باید پنج آرگومان بپذیرد: .sp .if n \{\ .RS 4 .\} .nf def spawn(shell, escape, cmd, args, env): .fi .if n \{\ .RE .\} .sp \fIshell\fR رشته‌ای است که نام برنامه پوسته مورد استفاده را مشخص می‌کند، \fIescape\fR تابعی است که می‌تواند برای گریز دادن نویسه‌های ویژه پوسته در خط فرمان فراخوانی شود، \fIcmd\fR مسیر دستوری است که باید اجرا شود، \fIargs\fR شامل آرگومان‌های دستور است و \fIenv\fR واژه‌نامه‌ای از متغیرهای محیطی است که محیط اجرایی دستور را تعریف می‌کند\&. .RE .PP \fBSTATIC_AND_SHARED_OBJECTS_ARE_THE_SAME\fR .RS 4 هنگامی که این متغیر برقرار (true) باشد، شیءهای ایستا و شیءهای اشتراکی یکسان فرض می‌شوند؛ به این معنی که SCons پیوند دادن شیءهای ایستا را در یک کتابخانه اشتراکی بررسی نمی‌کند\&. .RE .PP \fBSUBST_DICT\fR .RS 4 واژه‌نامه‌ای که توسط سازنده‌های \fBSubstfile\fR یا \fBTextfile\fR برای مقادیر جایگزینی استفاده می‌شود\&. این متغیر می‌تواند هر چیزی باشد که برای سازنده \fBdict()\fR قابل قبول است؛ بنابراین علاوه بر واژه‌نامه، فهرستی از چندتایی‌ها (tuples) نیز پذیرفته می‌شود\&. .RE .PP \fBSUBSTFILEPREFIX\fR .RS 4 پیشوندی که برای نام فایل‌های \fBSubstfile\fR استفاده می‌شود، که به‌طور پیش‌فرض یک رشته خالی است\&. .RE .PP \fBSUBSTFILESUFFIX\fR .RS 4 پسوندی که برای نام‌های فایل \fBSubstfile\fR به کار می‌رود؛ به‌طور پیش‌فرض یک رشتهٔ خالی است\&. .RE .PP \fBSUMMARY\fR .RS 4 خلاصه‌ای کوتاه دربارهٔ موضوع پروژه\&. این متغیر برای پر کردن فیلد Summary: در اطلاعات کنترلی بسته‌های Ipkg و RPM، و به عنوان فیلد Description: در بسته‌های MSI استفاده می‌شود\&. .sp سازندهٔ \fBPackage\fR را ببینید\&. .RE .PP \fBSWIG\fR .RS 4 نام کامپایلر SWIG مورد استفاده\&. .RE .PP \fBSWIGCFILESUFFIX\fR .RS 4 پسوندی که برای فایل‌های منبع میانی C تولیدشده توسط SWIG استفاده خواهد شد\&. مقدار پیش‌فرض \*(Aq_wrap$CFILESUFFIX\*(Aq است \- یعنی الحاق رشتهٔ _wrap و پسوند C فعلی \fB$CFILESUFFIX\fR\&. به‌طور پیش‌فرض، این مقدار هر زمانی که گزینهٔ \fB\-c++\fR به عنوان بخشی از متغیر ساخت \fB$SWIGFLAGS\fR مشخص \fIنشده باشد\fR، استفاده می‌شود\&. .RE .PP \fBSWIGCOM\fR .RS 4 خط فرمانی که برای فراخوانی SWIG استفاده می‌شود\&. .RE .PP \fBSWIGCOMSTR\fR .RS 4 رشته‌ای که هنگام فراخوانی SWIG نمایش داده می‌شود\&. اگر این متغیر تنظیم نشده باشد، \fB$SWIGCOM\fR (خط فرمان) نمایش داده می‌شود\&. .RE .PP \fBSWIGCXXFILESUFFIX\fR .RS 4 پسوندی که برای فایل‌های منبع میانی ++C تولیدشده توسط SWIG استفاده خواهد شد\&. مقدار پیش‌فرض \*(Aq_wrap$CXXFILESUFFIX\*(Aq است \- یعنی الحاق رشتهٔ _wrap و پسوند ++C فعلی \fB$CXXFILESUFFIX\fR\&. به‌طور پیش‌فرض، این مقدار هر زمانی که گزینهٔ \fB\-c++\fR به عنوان بخشی از متغیر ساخت \fB$SWIGFLAGS\fR مشخص شده باشد، استفاده می‌شود\&. .RE .PP \fBSWIGDIRECTORSUFFIX\fR .RS 4 پسوندی که برای فایل‌های سرآیند (header) میانی ++C تولیدشده توسط SWIG استفاده خواهد شد\&. این فایل‌ها تنها برای کدهای ++C زمانی تولید می‌شوند که قابلیت \*(Aqdirectors\*(Aq در SWIG فعال باشد\&. مقدار پیش‌فرض _wrap\&.h است\&. .RE .PP \fBSWIGFLAGS\fR .RS 4 گزینه‌های عمومی پاس داده شده به SWIG\&. اینجا جایی است که باید زبان مقصد (\fB\-python\fR، \fB\-perl5\fR، \fB\-tcl\fR و غیره) و هر گزینهٔ دیگری را که می‌خواهید برای SWIG مشخص کنید، مانند \fB\-c++\fR برای تولید کد ++C به جای کد C، تنظیم نمایید\&. .RE .PP \fB_SWIGINCFLAGS\fR .RS 4 یک متغیر ساخت به‌طور خودکار تولیدشده شامل گزینه‌های خط فرمان SWIG برای تعیین دایرکتوری‌هایی که باید برای فایل‌های گنجانده‌شده (included) جستجو شوند\&. مقدار \fB$_SWIGINCFLAGS\fR با افزودن پیشوند \fB$SWIGINCPREFIX\fR و پسوند \fB$SWIGINCSUFFIX\fR به ترتیب به ابتدا و انتهای هر دایرکتوری در \fB$SWIGPATH\fR ایجاد می‌شود\&. .RE .PP \fBSWIGINCPREFIX\fR .RS 4 پیشوند مورد استفاده برای مشخص کردن یک دایرکتوری include در خط فرمان SWIG\&. این پیشوند هنگام تولید خودکار متغیر \fB$_SWIGINCFLAGS\fR، به ابتدای هر دایرکتوری در متغیر ساخت \fB$SWIGPATH\fR اضافه خواهد شد\&. .RE .PP \fBSWIGINCSUFFIX\fR .RS 4 پسوند مورد استفاده برای مشخص کردن یک دایرکتوری include در خط فرمان SWIG\&. این پسوند هنگام تولید خودکار متغیر \fB$_SWIGINCFLAGS\fR، به انتهای هر دایرکتوری در متغیر ساخت \fB$SWIGPATH\fR اضافه خواهد شد\&. .RE .PP \fBSWIGOUTDIR\fR .RS 4 دایرکتوری خروجی را مشخص می‌کند که SWIG باید فایل‌های مختصِ زبان تولیدشده را در آن قرار دهد\&. این متغیر توسط SCons برای شناسایی فایل‌هایی که با فراخوانی SWIG تولید می‌شوند استفاده خواهد شد، و به گزینهٔ swig \-outdir در خط فرمان ترجمه می‌شود\&. .RE .PP \fBSWIGPATH\fR .RS 4 فهرست دایرکتوری‌هایی که SWIG در آن‌ها به دنبال فایل‌های include خواهد گشت\&. پویندهٔ وابستگی ضمنی SWIG در SCons، این دایرکتوری‌ها را برای یافتن فایل‌های include جستجو خواهد کرد\&. مقدار پیش‌فرض یک لیست خالی است\&. .sp آرگومان‌های دایرکتوری include را صریحاً در \fB$SWIGFLAGS\fR قرار ندهید؛ نتیجه غیرقابل‌حمل خواهد بود و دایرکتوری‌ها توسط پویندهٔ وابستگی جستجو نخواهند شد\&. نکته: نام‌های دایرکتوری در \fB$SWIGPATH\fR هنگامی که در یک فرمان استفاده می‌شوند، نسبت به دایرکتوری SConscript جستجو خواهند شد\&. برای وادار کردن \fBscons\fR به جستجوی یک دایرکتوری نسبت به ریشهٔ درخت کد منبع، از مسیر نسبی به ریشه (#) استفاده کنید: .sp .if n \{\ .RS 4 .\} .nf env = Environment(SWIGPATH=\*(Aq#/include\*(Aq) .fi .if n \{\ .RE .\} .sp همچنین می‌توان جستجوی دایرکتوری را با استفاده از تابع \fBDir\fR() اجبار کرد: .sp .if n \{\ .RS 4 .\} .nf include = Dir(\*(Aqinclude\*(Aq) env = Environment(SWIGPATH=include) .fi .if n \{\ .RE .\} .sp فهرست دایرکتوری‌ها از طریق متغیر ساخت به‌طور خودکار تولیدشدهٔ \fB$_SWIGINCFLAGS\fR به خطوط فرمان اضافه خواهد شد، که با الحاق مقادیر متغیرهای ساخت \fB$SWIGINCPREFIX\fR و \fB$SWIGINCSUFFIX\fR به ترتیب به ابتدا و انتهای هر دایرکتوری در \fB$SWIGPATH\fR ساخته می‌شود\&. هر خط فرمانی که تعریف می‌کنید و به فهرست دایرکتوری‌های SWIGPATH نیاز دارد، باید شامل \fB$_SWIGINCFLAGS\fR باشد: .sp .if n \{\ .RS 4 .\} .nf env = Environment(SWIGCOM="my_swig \-o $TARGET $_SWIGINCFLAGS $SOURCES") .fi .if n \{\ .RE .\} .RE .PP \fBSWIGVERSION\fR .RS 4 رشته نگارش شناسایی‌شده از ابزار SWIG\&. .RE .PP \fBTAR\fR .RS 4 بایگانی‌ساز tar\&. .RE .PP \fBTARCOM\fR .RS 4 خط فرمانی که برای فراخوانی بایگانی‌ساز tar استفاده می‌شود\&. .RE .PP \fBTARCOMSTR\fR .RS 4 رشته‌ای که هنگام بایگانی فایل‌ها با استفاده از بایگانی‌ساز tar نمایش داده می‌شود\&. اگر تنظیم نشده باشد، \fB$TARCOM\fR (خط فرمان) نمایش داده می‌شود\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(TARCOMSTR = "Archiving $TARGET") .fi .if n \{\ .RE .\} .RE .PP \fBTARFLAGS\fR .RS 4 گزینه‌های عمومی ارسال‌شده به بایگانی‌ساز tar\&. .RE .PP \fBTARGET\fR .RS 4 یک نام متغیر رزروشده که نباید در یک محیط ساخت مقداردهی یا استفاده شود\&. (برای اطلاعات بیشتر بخش «جایگزینی متغیر» در صفحه راهنما را ببینید)\&. .RE .PP \fBTARGET_ARCH\fR .RS 4 نام معماری سخت‌افزاری که اشیاء ساخته‌شده با استفاده از این محیط ساخت باید آن را هدف قرار دهند\&. می‌توان آن را هنگام ایجاد یک محیط ساخت با ارسال به عنوان یک آرگومان کلیدواژه‌ای در فراخوانی \fBEnvironment\fR تنظیم کرد\&. .sp در سکوی win32، اگر کامپایلر Microsoft Visual C++ در دسترس باشد، راه‌اندازی ابزار msvc با استفاده از \fB$HOST_ARCH\fR و \fB$TARGET_ARCH\fR انجام می‌شود\&. اگر مقداری مشخص نشده باشد، برابر با همان مقدار \fB$HOST_ARCH\fR تنظیم خواهد شد\&. تغییر مقدار پس از مقداردهی اولیه محیط باعث راه‌اندازی مجدد ابزار نخواهد شد\&. در صورتی که سامانه کامپایل از تولید برای آن هدف پشتیبانی کند، اشیاء کامپایل‌شده در معماری هدف خواهند بود\&. جدیدترین کامپایلری که بتواند این نیازمندی را برآورده کند انتخاب خواهد شد، مگر اینکه نگارش متفاوتی توسط مقدار متغیر ساخت \fB$MSVC_VERSION\fR تعیین شده باشد\&. .sp در ترکیب win32/msvc، مقادیر معتبر معماری هدف عبارتند از x86، arm، i386 برای هدف‌های ۳۲ بیتی و amd64، arm64، x86_64 و ia64 (ایتانیوم) برای هدف‌های ۶۴ بیتی\&. برای نمونه، اگر می‌خواهید باینری‌های ۶۴ بیتی کامپایل کنید، هنگام ایجاد محیط ساخت، TARGET_ARCH=\*(Aqx86_64\*(Aq را تنظیم می‌کنید\&. توجه داشته باشید که همه معماری‌های هدف برای تمام نگارش‌های Visual Studio / MSVC پشتیبانی نمی‌شوند\&. مستندات مربوطه مایکروسافت را بررسی کنید\&. .sp متغیر \fB$TARGET_ARCH\fR در حال حاضر توسط سایر ابزارهای کامپایل استفاده نمی‌شود، اما این گزینه برای انجام این کار در آینده رزرو شده است\&. .RE .PP \fBTARGET_OS\fR .RS 4 نام سیستم‌عاملی که اشیاء ساخته‌شده با استفاده از این محیط ساخت باید آن را هدف قرار دهند\&. می‌توان آن را هنگام ایجاد یک محیط ساخت با ارسال به عنوان یک آرگومان کلیدواژه‌ای در فراخوانی \fBEnvironment\fR تنظیم کرد;\&. .sp متغیر \fB$TARGET_OS\fR در حال حاضر توسط SCons استفاده نمی‌شود، اما این گزینه برای انجام این کار در آینده رزرو شده است\&. .RE .PP \fBTARGETS\fR .RS 4 یک نام متغیر رزروشده که نباید در یک محیط ساخت مقداردهی یا استفاده شود\&. (برای اطلاعات بیشتر بخش «جایگزینی متغیر» در صفحه راهنما را ببینید)\&. .RE .PP \fBTARSUFFIX\fR .RS 4 پسوند مورد استفاده برای نام فایل‌های tar\&. .RE .PP \fBTEMPFILE\fR .RS 4 نگه‌دارنده یک شیء قابل فراخوانی است که برای تبدیل خطوط فرمان طولانی (رشته یا فهرست) به یک شکل جایگزین فراخوانی می‌شود\&. محدودیت‌های طول در سیستم‌عامل‌های مختلف ممکن است هنگام فراخوانی پوسته برای اجرای فرمان، باعث شکست خطوط فرمان طولانی شود\&. این مسئله اغلب بر پیونددهی تأثیر می‌گذارد، زمانی که فایل‌های شیء و/یا کتابخانه‌های متعددی برای پیوند وجود دارند، اما ممکن است سایر مراحل کامپایل را نیز که آرگومان‌های زیادی دارند تحت تأثیر قرار دهد\&. \fB$TEMPFILE\fR به‌طور مستقیم فراخوانی نمی‌شود، بلکه معمولاً در متغیر ساخت دیگری تعبیه می‌شود تا هنگام استفاده باز شود\&. مثال: .sp .if n \{\ .RS 4 .\} .nf env["TEMPFILE"] = TempFileMunge env["LINKCOM"] = "${TEMPFILE(\*(Aq$LINK $TARGET $SOURCES\*(Aq, \*(Aq$LINKCOMSTR\*(Aq)}" .fi .if n \{\ .RE .\} .sp مقدار پیش‌فرض SCons برای \fB$TEMPFILE\fR، یعنی TempFileMunge، جایگزینی فرمان را روی خط فرمان ارسال‌شده انجام می‌دهد، بررسی می‌کند که آیا نیاز به تغییر وجود دارد یا خیر، سپس همه کلمات به جز کلمه نخست (که فرض می‌شود نام فرمان است) از فهرست حاصل را در یک فایل موقت (که گاهی response file یا command file نامیده می‌شود) قرار می‌دهد، و یک خط فرمان جدید متشکل از نام فرمان و ارجاعی با قالب‌بندی مناسب به فایل موقت بازمی‌گرداند\&. .sp یک جایگزین برای شیء tempfile پیش‌فرض باید اساساً همان کار را انجام دهد، از جمله در نظر گرفتن مقادیر \fB$MAXLINELENGTH\fR، \fB$TEMPFILEPREFIX\fR، \fB$TEMPFILESUFFIX\fR، \fB$TEMPFILEARGJOIN\fR، \fB$TEMPFILEDIR\fR و \fB$TEMPFILEARGESCFUNC\fR\&. اگر مورد استفاده خاصی نیاز به تبدیلی متفاوت از پیش‌فرض داشته باشد، توصیه می‌شود سازوکار مربوطه کپی شده و یک متغیر ساخت جدید تعریف شود و متغیر(های) *COM مرتبط برای استفاده از آن بازنویسی شوند، تا از احتمال اختلال در کاربردهای موجود \fB$TEMPFILE\fR جلوگیری شود\&. .RE .PP \fBTEMPFILEARGESCFUNC\fR .RS 4 تابع گریز (escape) پیش‌فرض آرگومان‌ها، \fBSCons\&.Subst\&.quote_spaces\fR است\&. اگر نیاز دارید پیش از نوشتن در فایل موقت، عملیات بیشتری روی یک آرگومان خط فرمان اعمال کنید (برای رفع اسلش‌های ویندوز، یکسان‌سازی مسیرها و غیره)، می‌توانید متغیر \fB$TEMPFILEARGESCFUNC\fR را روی یک تابع سفارشی تنظیم کنید\&. این تابع باید یک آرگومان رشته‌ای منفرد را بپذیرد و رشته جدیدی را با اعمال تغییرات بازگرداند\&. مثال: .sp .if n \{\ .RS 4 .\} .nf import sys import re from SCons\&.Subst import quote_spaces WINPATHSEP_RE = re\&.compile(r"\e\e([^\e"\*(Aq\e\e]|$)") def tempfile_arg_esc_func(arg): arg = quote_spaces(arg) if sys\&.platform != "win32": return arg # GCC requires double Windows slashes, let\*(Aqs use UNIX separator return WINPATHSEP_RE\&.sub(r"/\e1", arg) env["TEMPFILEARGESCFUNC"] = tempfile_arg_esc_func .fi .if n \{\ .RE .\} .RE .PP \fBTEMPFILEARGJOIN\fR .RS 4 رشته‌ای که برای اتصال آرگومان‌های ارسالی به \fB$TEMPFILE\fR در زمانی که خط فرمان از حد تعیین‌شده توسط \fB$MAXLINELENGTH\fR فراتر می‌رود، استفاده می‌شود\&. مقدار پیش‌فرض یک فاصله (space) است\&. با این حال برای MSVC و MSLINK، مقدار پیش‌فرض جداکننده خط تعریف‌شده توسط os\&.linesep می‌باشد\&. توجه داشته باشید این مقدار به صورت لفظی استفاده شده و توسط منطق subst بسط داده نمی‌شود\&. .RE .PP \fBTEMPFILEDIR\fR .RS 4 دایرکتوری جهت ایجاد فایل موقت برای خطوط طولانی\&. در صورت عدم تنظیم، ماژول tempfile در Python دایرکتوری را بر اساس متغیرهای محیطی \fBTMPDIR\fR، \fBTEMP\fR یا \fBTMP\fR انتخاب می‌کند\&. اگر مسیر پیش‌فرض باعث بروز خطاهای پردازشی می‌شود، \fB$TEMPFILEDIR\fR را روی یک جایگزین امن‌تر تنظیم کنید\&. به عنوان مثال، در ویندوز، مسیر فایل موقت پیش‌فرض شامل نام کاربری است\&. اگر نام کاربری حاوی نویسه‌های غیر 7\-bit\-ASCII باشد، ممکن است هنگام باز کردن مسیر فایل موقت خطاهای رمزگشایی رخ دهد\&. همچنین ببینید: \fB$TEMPFILEENCODING\fR\&. .RE .PP \fBTEMPFILEENCODING\fR .RS 4 به‌طور پیش‌فرض، فایل موقت خطوط طولانی (معروف به "response file") که توسط تابع \fB$TEMPFILE\fR ایجاد می‌شود، با کدگذاری پیش‌فرض Python، یعنی UTF\-8 کدگذاری خواهد شد\&. اگر فرمان خارجی که فایل پاسخ را می‌خواند دچار خطاهای رمزگشایی شود (معمولاً اگر آن فرمان وابسته به صفحه‌کدهای قدیمی ویندوز باشد، و یک نام مسیر در فایل پاسخ یا خود مسیر فایل پاسخ نتواند در مجموعه نویسه‌های 7\-bit ASCII نمایش داده شود)، این متغیر را روی کدک مناسب تنظیم کنید\&. همچنین ببینید: \fB$TEMPFILEDIR\fR\&. .sp \fIجدید در نسخه 4\&.10\&.0\fR .RE .PP \fBTEMPFILEPREFIX\fR .RS 4 پیشوند نام فایل موقتی که برای ذخیره خطوط فرمانی که از \fB$MAXLINELENGTH\fR فراتر می‌روند، استفاده می‌شود\&. این پیشوند باید شامل نحو کامپایلر برای گنجاندن و پردازش واقعی فایل باشد\&. پیشوند پیش‌فرض \*(Aq@\*(Aq است که برای زنجیره‌ابزارهای Microsoft Visual C++ و GNU در ویندوز کار می‌کند\&. این مقدار را برای سایر زنجیره‌ابزارها به‌درستی تنظیم کنید، برای مثال \*(Aq\-@\*(Aq برای کامپایلر diab یا \*(Aq\-via\*(Aq برای زنجیره‌ابزار ARM\&. .RE .PP \fBTEMPFILESUFFIX\fR .RS 4 پسوند نام فایل موقتی که برای ذخیره خطوط فرمانی که از \fB$MAXLINELENGTH\fR فراتر می‌روند، استفاده می‌شود\&. در صورت نیاز به نقطه (\*(Aq\&.\*(Aq)، پسوند باید شامل آن باشد، زیرا به‌طور خودکار اضافه نخواهد شد\&. مقدار پیش‌فرض \&.lnk است\&. .RE .PP \fBTEX\fR .RS 4 قالب‌بند و حروف‌چین TeX\&. .RE .PP \fBTEXCOM\fR .RS 4 خط فرمان مورد استفاده برای فراخوانی قالب‌بند و حروف‌چین TeX\&. .RE .PP \fBTEXCOMSTR\fR .RS 4 رشته‌ای که هنگام فراخوانی قالب‌بند و حروف‌چین TeX نمایش داده می‌شود\&. اگر این مقدار تنظیم نشده باشد، آن‌گاه \fB$TEXCOM\fR (خط فرمان) نمایش داده می‌شود\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(TEXCOMSTR = "Building $TARGET from TeX input $SOURCES") .fi .if n \{\ .RE .\} .RE .PP \fBTEXFLAGS\fR .RS 4 گزینه‌های عمومی ارسال‌شده به قالب‌بند و حروف‌چین TeX\&. .RE .PP \fBTEXINPUTS\fR .RS 4 فهرست دایرکتوری‌هایی که برنامه LaTeX در آن‌ها به دنبال دایرکتوری‌های include می‌گردد\&. پویشگر وابستگی‌های ضمنی LaTeX این دایرکتوری‌ها را برای فایل‌های \einclude و \eimport جستجو خواهد کرد\&. .RE .PP \fBTEXTFILEPREFIX\fR .RS 4 پیشوند مورد استفاده برای نام‌های فایل \fBTextfile\fR؛ به‌طور پیش‌فرض یک رشته خالی است\&. .RE .PP \fBTEXTFILESUFFIX\fR .RS 4 پسوند مورد استفاده برای نام‌های فایل \fBTextfile\fR؛ به‌طور پیش‌فرض \&.txt است\&. .RE .PP \fBTOOLS\fR .RS 4 فهرستی از نام‌های ماژول‌های مشخصات Tool که واقعاً در محیط ساخت (construction environment) فعلی مقداردهی اولیه شده‌اند\&. این مقدار می‌تواند به عنوان یک ابزار کمکی تشخیصی برای بررسی اینکه آیا ابزاری اجرا شده است (یا نشده است) مفید باشد\&. این مقدار جنبه اطلاع‌رسانی دارد و تضمینی برای کامل بودن آن وجود ندارد\&. .RE .PP \fBUNCHANGED_SOURCES\fR .RS 4 یک نام متغیر رزرو شده که نباید در یک محیط ساخت (construction environment) تنظیم یا استفاده شود\&. (برای اطلاعات بیشتر به بخش "Variable Substitution" در صفحه راهنما مراجعه کنید)\&. .RE .PP \fBUNCHANGED_TARGETS\fR .RS 4 یک نام متغیر رزرو شده که نباید در یک محیط ساخت مقداردهی یا استفاده شود\&. (برای اطلاعات بیشتر بخش «Variable Substitution» را در صفحه راهنما ببینید)\&. .RE .PP \fBVENDOR\fR .RS 4 شخص یا سازمانی که نرم‌افزار بسته‌بندی‌شده را ارائه می‌دهد\&. این متغیر برای پر کردن فیلد Vendor: در اطلاعات کنترلی بسته‌های RPM، و فیلد Manufacturer: در اطلاعات کنترلی بسته‌های MSI استفاده می‌شود\&. .sp سازندهٔ \fBPackage\fR را ببینید\&. .RE .PP \fBVERSION\fR .RS 4 نسخهٔ پروژه، که به‌صورت یک رشته مشخص می‌شود\&. .sp سازندهٔ \fBPackage\fR را ببینید\&. .RE .PP \fBVSWHERE\fR .RS 4 مکان \fBvswhere\&.exe\fR را مشخص می‌کند\&. .sp فایل اجرایی \fBvswhere\&.exe\fR از نسخهٔ 2017 به بعد همراه با Microsoft Visual Studio و Build Tools عرضه می‌شود، اما به‌صورت یک نصب مستقل نیز در دسترس است\&. این ابزار امکان پرس‌وجو برای دریافت اطلاعات دقیق دربارهٔ نسخه‌های نصب‌شدهٔ 2017 و جدیدتر را فراهم می‌کند\&. SCons از این اطلاعات برای تعیین وضعیت پشتیبانی کامپایلر از آن نسخه‌ها استفاده می‌کند\&. .sp تنظیم متغیر \fB$VSWHERE\fR به مسیر یک فایل اجرایی \fBvswhere\&.exe\fR خاص، باعث می‌شود SCons از آن فایل استفاده کند\&. در صورت عدم تنظیم، SCons به ترتیب در مکان‌های زیر به دنبال آن می‌گردد و از اولین مورد یافت‌شده استفاده می‌کند (\fB$VSWHERE\fR با این مکان به‌روزرسانی می‌شود): .RS 4 %ProgramFiles(x86)%\eMicrosoft Visual Studio\eInstaller .RE .RS 4 %ProgramFiles%\eMicrosoft Visual Studio\eInstaller .RE .RS 4 %ChocolateyInstall%\ebin .RE .RS 4 %LOCALAPPDATA%\eMicrosoft\eWinGet\eLinks .RE .RS 4 %USERPROFILE%\escoop\eshims .RE .RS 4 %SCOOP%\eshims .RE .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBنکته\fR .ps -1 .br برای اینکه \fB$VSWHERE\fR اثرگذار باشد، باید پیش از انجام شناسایی اولیهٔ کامپایلر Microsoft Visual C++ تنظیم شود\&. این شناسایی در دیرترین حالت، در اولین فراخوانی تابع \fBEnvironment\fR رخ می‌دهد، مگر اینکه یک فهرست \fItools\fR مشخص شده باشد که کل زنجیره ابزار Microsoft Visual C++ را مستثنی کند \- یعنی، "defaults" و هر ماژول ابزار خاصی که به بخش‌هایی از این زنجیره ابزار ارجاع می‌دهد (msvc، mslink، masm، midl و msvs) را حذف کند\&. در این حالت، شناسایی تا زمانی که یکی از آن ماژول‌های ابزار به‌صورت دستی فراخوانی شود به تعویق می‌افتد\&. دو مثال زیر این موضوع را نشان می‌دهند: .sp .if n \{\ .RS 4 .\} .nf # VSWHERE set as Environment is created env = Environment(VSWHERE=\*(Aqc:/my/path/to/vswhere\*(Aq) # Initialization deferred with empty tools, triggered manually env = Environment(tools=[]) env[\*(AqVSWHERE\*(Aq] = r\*(Aqc:/my/vswhere/install/location/vswhere\&.exe\*(Aq env\&.Tool(\*(Aqmsvc\*(Aq) env\&.Tool(\*(Aqmslink\*(Aq) env\&.Tool(\*(Aqmsvs\*(Aq) .fi .if n \{\ .RE .\} .sp .5v .RE .RE .PP \fBWINDOWS_EMBED_MANIFEST\fR .RS 4 روی \fBTrue\fR تنظیم کنید تا مانیفست تولیدشده توسط کامپایلر (معمولاً ${TARGET}\&.manifest) به‌عنوان یک منبع در طول مرحلهٔ پیوند، در تمام فایل‌های اجرایی و DLLهای ویندوز ساخته‌شده با این محیط تعبیه شود\&. این کار با استفاده از \fB$MT\fR و \fB$MTEXECOM\fR و \fB$MTSHLIBCOM\fR انجام می‌شود\&. همچنین \fB$WINDOWS_INSERT_MANIFEST\fR را ببینید\&. .RE .PP \fBWINDOWS_INSERT_DEF\fR .RS 4 اگر روی true تنظیم شود، در صورت عدم وجود فایل تعریف ماژول (module\-definition) در فهرست اهداف ساخت، ساخت یک کتابخانهٔ اشتراکی ویندوز (فایل \&.dll) به‌طور هم‌زمان شامل ارجاعی به فایل تعریف ماژول متناظر خواهد بود\&. نام فایل تعریف ماژول از نام پایهٔ کتابخانه و متغیرهای ساخت \fB$WINDOWSDEFSUFFIX\fR و \fB$WINDOWSDEFPREFIX\fR ساخته خواهد شد\&. حالت پیش‌فرض عدم افزودن فایل تعریف ماژول است\&. فایل تعریف ماژول توسط این دستورالعمل ایجاد نمی‌شود و باید توسط توسعه‌دهنده ارائه گردد\&. .RE .PP \fBWINDOWS_INSERT_MANIFEST\fR .RS 4 اگر روی true تنظیم شود، \fBscons\fR فایل مانیفست تولیدشده توسط Microsoft Visual C++ نسخهٔ 8\&.0 و جدیدتر را به فهرست اهداف اضافه می‌کند تا SCons از ایجاد آن‌ها مطلع شود\&. در مورد یک فایل اجرایی، نام فایل مانیفست با استفاده از \fB$WINDOWSPROGMANIFESTSUFFIX\fR و \fB$WINDOWSPROGMANIFESTPREFIX\fR ساخته می‌شود\&. در مورد یک کتابخانهٔ اشتراکی، نام فایل مانیفست با استفاده از \fB$WINDOWSSHLIBMANIFESTSUFFIX\fR و \fB$WINDOWSSHLIBMANIFESTPREFIX\fR ساخته می‌شود\&. همچنین \fB$WINDOWS_EMBED_MANIFEST\fR را ببینید\&. .RE .PP \fBWINDOWSDEFPREFIX\fR .RS 4 پیشوندی که برای نام فایل تعریف پیمانه (module\-definition) پیونددهندهٔ ویندوز استفاده می‌شود\&. پیش‌فرض، خالی است\&. .RE .PP \fBWINDOWSDEFSUFFIX\fR .RS 4 پسوندی که برای نام فایل تعریف پیمانه (module\-definition) پیونددهندهٔ ویندوز استفاده می‌شود\&. پیش‌فرض \&.def است\&. .RE .PP \fBWINDOWSEXPPREFIX\fR .RS 4 پیشوند مورد استفاده برای نام فایل‌های صدور نماد (exports) پیونددهندهٔ ویندوز\&. پیش‌فرض، خالی است\&. .RE .PP \fBWINDOWSEXPSUFFIX\fR .RS 4 پسوند مورد استفاده برای نام فایل‌های صدور نماد (exports) پیونددهندهٔ ویندوز\&. پیش‌فرض \&.exp است\&. .RE .PP \fBWINDOWSPROGMANIFESTPREFIX\fR .RS 4 پیشوند مورد استفاده برای فایل‌های مانیفست برنامه‌های اجرایی تولید شده توسط Microsoft Visual C++\&. پیش‌فرض، خالی است\&. .RE .PP \fBWINDOWSPROGMANIFESTSUFFIX\fR .RS 4 پسوند مورد استفاده برای فایل‌های مانیفست برنامه‌های اجرایی تولید شده توسط Microsoft Visual C++\&. پیش‌فرض \&.manifest است\&. .RE .PP \fBWINDOWSSHLIBMANIFESTPREFIX\fR .RS 4 پیشوند مورد استفاده برای فایل‌های مانیفست کتابخانه‌های اشتراکی تولید شده توسط Microsoft Visual C++\&. پیش‌فرض، خالی است\&. .RE .PP \fBWINDOWSSHLIBMANIFESTSUFFIX\fR .RS 4 پسوند مورد استفاده برای فایل‌های مانیفست کتابخانه‌های اشتراکی تولید شده توسط Microsoft Visual C++\&. پیش‌فرض \&.manifest است\&. .RE .PP \fBX_IPK_DEPENDS\fR .RS 4 این متغیر برای پر کردن فیلد Depends: در اطلاعات کنترلی بسته‌های Ipkg استفاده می‌شود\&. .sp سازندهٔ \fBPackage\fR را ببینید\&. .RE .PP \fBX_IPK_DESCRIPTION\fR .RS 4 این متغیر برای پر کردن فیلد Description: در اطلاعات کنترلی بسته‌های Ipkg استفاده می‌شود\&. مقدار پیش‌فرض \(lq\fB$SUMMARY\fR\en\fB$DESCRIPTION\fR\(rq است\&. .RE .PP \fBX_IPK_MAINTAINER\fR .RS 4 این متغیر برای پر کردن فیلد Maintainer: در اطلاعات کنترلی بسته‌های Ipkg استفاده می‌شود\&. .RE .PP \fBX_IPK_PRIORITY\fR .RS 4 این متغیر برای پر کردن فیلد Priority: در اطلاعات کنترلی بسته‌های Ipkg استفاده می‌شود\&. .RE .PP \fBX_IPK_SECTION\fR .RS 4 این متغیر برای پر کردن فیلد Section: در اطلاعات کنترلی بسته‌های Ipkg استفاده می‌شود\&. .RE .PP \fBX_MSI_LANGUAGE\fR .RS 4 این متغیر برای پر کردن صفت Language: در اطلاعات کنترلی بسته‌های MSI استفاده می‌شود\&. .sp سازندهٔ \fBPackage\fR را ببینید\&. .RE .PP \fBX_MSI_LICENSE_TEXT\fR .RS 4 متن پروانهٔ نرم‌افزار در قالب RTF\&. نویسه‌های بازگشت به سر خط (carriage return) با معادل RTF آن یعنی \e\epar جایگزین خواهند شد\&. .sp سازندهٔ \fBPackage\fR را ببینید\&. .RE .PP \fBX_MSI_UPGRADE_CODE\fR .RS 4 TODO .RE .PP \fBX_RPM_AUTOREQPROV\fR .RS 4 این متغیر برای پر کردن فیلد AutoReqProv: در فایل \&.spec مربوط به RPM استفاده می‌شود\&. .sp سازندهٔ \fBPackage\fR را ببینید\&. .RE .PP \fBX_RPM_BUILD\fR .RS 4 داخلی، اما قابل بازنویسی .RE .PP \fBX_RPM_BUILDREQUIRES\fR .RS 4 این متغیر برای پر کردن فیلد BuildRequires: در فایل \&.spec مربوط به RPM استفاده می‌شود\&. توجه داشته باشید که این مورد تنها باید در میزبانی استفاده شود که توسط rpm مدیریت می‌شود، زیرا در غیر این صورت وابستگی‌ها در زمان ساخت (build) قابل حل نخواهند بود\&. .RE .PP \fBX_RPM_BUILDROOT\fR .RS 4 داخلی، اما قابل بازنویسی .RE .PP \fBX_RPM_CLEAN\fR .RS 4 داخلی، اما قابل بازنویسی .RE .PP \fBX_RPM_CONFLICTS\fR .RS 4 برای پر کردن فیلد Conflicts: در فایل \&.spec مربوط به RPM استفاده می‌شود\&. .RE .PP \fBX_RPM_DEFATTR\fR .RS 4 این مقدار به عنوان ویژگی‌های پیش‌فرض برای فایل‌های درون بستهٔ RPM استفاده می‌شود\&. مقدار پیش‌فرض \(lq(\-,root,root)\(rq است\&. .RE .PP \fBX_RPM_DISTRIBUTION\fR .RS 4 برای پر کردن فیلد Distribution: در فایل \&.spec مربوط به RPM استفاده می‌شود\&. .RE .PP \fBX_RPM_EPOCH\fR .RS 4 برای پر کردن فیلد Epoch: در فایل \&.spec مربوط به RPM استفاده می‌شود\&. .RE .PP \fBX_RPM_EXCLUDEARCH\fR .RS 4 برای پر کردن فیلد ExcludeArch: در فایل \&.spec مربوط به RPM استفاده می‌شود\&. .RE .PP \fBX_RPM_EXLUSIVEARCH\fR .RS 4 برای پر کردن فیلد ExclusiveArch: در فایل \&.spec مربوط به RPM استفاده می‌شود\&. .RE .PP \fBX_RPM_EXTRADEFS\fR .RS 4 فهرستی که برای ارائهٔ تعاریف یا پرچم‌های اضافی جهت افزودن به فایل \&.spec مربوط به RPM استفاده می‌شود\&. هر مورد بدون تغییر به همراه یک بازگشت به ابتدای سطر (carriage return) در انتها افزوده می‌شود\&. این قابلیت زمانی سودمند است که نیاز به فعال یا غیرفعال کردن ویژگی خاصی از RPM باشد که در SCons پیش‌بینی نشده است\&. توجه داشته باشید اگر این متغیر حذف شود، SCons به صورت پیش‌فرض مقدار \*(Aq%global debug_package %{nil}\*(Aq را برای غیرفعال کردن تولید بستهٔ اشکال‌زدایی ارائه می‌دهد\&. برای فعال‌سازی تولید بستهٔ اشکال‌زدایی، این متغیر را روی None یا یک فهرست سفارشی که شامل خط پیش‌فرض نباشد، تنظیم کنید\&. .sp \fIجدید در نگارش 3\&.1\&.\fR .sp .if n \{\ .RS 4 .\} .nf env\&.Package( NAME="foo", \&.\&.\&. X_RPM_EXTRADEFS=[ "%define _unpackaged_files_terminate_build 0" "%define _missing_doc_files_terminate_build 0" ], \&.\&.\&. ) .fi .if n \{\ .RE .\} .RE .PP \fBX_RPM_GROUP\fR .RS 4 برای پر کردن فیلد Group: در فایل \&.spec مربوط به RPM استفاده می‌شود\&. .RE .PP \fBX_RPM_GROUP_lang\fR .RS 4 برای پر کردن فیلد Group(lang): در فایل \&.spec مربوط به RPM استفاده می‌شود\&. توجه داشته باشید که \fIlang\fR به صورت تحت‌اللفظی نیست و باید با کد زبان مناسب جایگزین شود\&. .RE .PP \fBX_RPM_ICON\fR .RS 4 برای پر کردن فیلد Icon: در فایل \&.spec مربوط به RPM استفاده می‌شود\&. .RE .PP \fBX_RPM_INSTALL\fR .RS 4 داخلی، اما قابل بازنویسی .RE .PP \fBX_RPM_PACKAGER\fR .RS 4 برای پر کردن فیلد Packager: در فایل \&.spec مربوط به RPM استفاده می‌شود\&. .RE .PP \fBX_RPM_POSTINSTALL\fR .RS 4 برای پر کردن بخش %post: در فایل \&.spec مربوط به RPM استفاده می‌شود\&. .RE .PP \fBX_RPM_POSTUNINSTALL\fR .RS 4 برای پر کردن بخش %postun: در فایل \&.spec مربوط به RPM استفاده می‌شود\&. .RE .PP \fBX_RPM_PREFIX\fR .RS 4 برای پر کردن فیلد Prefix: در فایل \&.spec مربوط به RPM استفاده می‌شود\&. .RE .PP \fBX_RPM_PREINSTALL\fR .RS 4 برای پر کردن بخش %pre: در فایل \&.spec مربوط به RPM به کار می‌رود\&. .RE .PP \fBX_RPM_PREP\fR .RS 4 داخلی، اما قابل بازنویسی است\&. .RE .PP \fBX_RPM_PREUNINSTALL\fR .RS 4 برای پر کردن بخش %preun: در فایل \&.spec مربوط به RPM به کار می‌رود\&. .RE .PP \fBX_RPM_PROVIDES\fR .RS 4 برای پر کردن فیلد Provides: در فایل \&.spec مربوط به RPM به کار می‌رود\&. .RE .PP \fBX_RPM_REQUIRES\fR .RS 4 برای پر کردن فیلد Requires: در فایل \&.spec مربوط به RPM به کار می‌رود\&. .RE .PP \fBX_RPM_SERIAL\fR .RS 4 برای پر کردن فیلد Serial: در فایل \&.spec مربوط به RPM به کار می‌رود\&. .RE .PP \fBX_RPM_URL\fR .RS 4 برای پر کردن فیلد Url: در فایل \&.spec مربوط به RPM به کار می‌رود\&. .RE .PP \fBXGETTEXT\fR .RS 4 مسیر برنامهٔ \fBxgettext(1)\fR (یافته‌شده از طریق \fBDetect()\fR)\&. ابزار xgettext و سازندهٔ \fBPOTUpdate\fR را ببینید\&. .RE .PP \fBXGETTEXTCOM\fR .RS 4 خط فرمان کامل xgettext\&. ابزار xgettext و سازندهٔ \fBPOTUpdate\fR را ببینید\&. .RE .PP \fBXGETTEXTCOMSTR\fR .RS 4 رشته‌ای که هنگام فراخوانی دستور \fBxgettext(1)\fR نمایش داده می‌شود (پیش‌فرض: \*(Aq\*(Aq، به معنی «چاپ \fB$XGETTEXTCOM\fR»)\&. ابزار xgettext و سازندهٔ \fBPOTUpdate\fR را ببینید\&. .RE .PP \fB_XGETTEXTDOMAIN\fR .RS 4 «ماکروی» داخلی\&. نام دامنهٔ \fBxgettext\fR را از مبدأ و هدف تولید می‌کند (پیش‌فرض: \*(Aq${TARGET\&.filebase}\*(Aq)\&. .RE .PP \fBXGETTEXTFLAGS\fR .RS 4 پرچم‌های اضافی برای \fBxgettext(1)\fR\&. ابزار xgettext و سازندهٔ \fBPOTUpdate\fR را ببینید\&. .RE .PP \fBXGETTEXTFROM\fR .RS 4 نام فایل حاوی فهرست فایل‌های مبدأ \fBxgettext(1)\fR\&. کاربران Autotools این را با عنوان POTFILES\&.in می‌شناسند، بنابراین در بیشتر موارد در اینجا XGETTEXTFROM="POTFILES\&.in" را تنظیم خواهند کرد\&. فایل‌های \fB$XGETTEXTFROM\fR نحو و بار معنایی یکسانی با POTFILES\&.in شناخته‌شدهٔ GNU دارند\&. ابزار xgettext و سازندهٔ \fBPOTUpdate\fR را ببینید\&. .RE .PP \fB_XGETTEXTFROMFLAGS\fR .RS 4 «ماکروی» داخلی\&. فهرستی از پرچم‌های \-D را از فهرست \fB$XGETTEXTPATH\fR تولید می‌کند\&. .RE .PP \fBXGETTEXTFROMPREFIX\fR .RS 4 این پرچم برای افزودن یک فایل \fB$XGETTEXTFROM\fR به خط فرمان \fBxgettext(1)\fR به کار می‌رود (پیش‌فرض: \*(Aq\-f\*(Aq)\&. .RE .PP \fBXGETTEXTFROMSUFFIX\fR .RS 4 (پیش‌فرض: \*(Aq\*(Aq) .RE .PP \fBXGETTEXTPATH\fR .RS 4 فهرست دایرکتوری‌هایی که در آن‌ها \fBxgettext(1)\fR به دنبال فایل‌های منبع خواهد گشت (پیش‌فرض: [])\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBنکته\fR .ps -1 .br این متغیر تنها همراه با \fB$XGETTEXTFROM\fR کار می‌کند\&. .sp .5v .RE همچنین ابزار xgettext و سازندهٔ \fBPOTUpdate\fR را ببینید\&. .RE .PP \fB_XGETTEXTPATHFLAGS\fR .RS 4 «ماکرو» داخلی\&. فهرستی از پرچم‌های \-f را از \fB$XGETTEXTFROM\fR تولید می‌کند\&. .RE .PP \fBXGETTEXTPATHPREFIX\fR .RS 4 این پرچم برای افزودن یک مسیر جست‌وجوی منفرد به خط فرمان \fBxgettext(1)\fR استفاده می‌شود (پیش‌فرض: \*(Aq\-D\*(Aq)\&. .RE .PP \fBXGETTEXTPATHSUFFIX\fR .RS 4 (پیش‌فرض: \*(Aq\*(Aq) .RE .PP \fBYACC\fR .RS 4 تولیدکنندهٔ تجزیه‌کننده\&. .RE .PP \fBYACC_GRAPH_FILE\fR .RS 4 در صورت ارائه، گراف ماشین خودکار (اتوماتون) را در فایلی با نام برگرفته از این متغیر می‌نویسد\&. این مقدار به عنوان گزینهٔ خط فرمان \fB\-\-graph=\fR ارسال خواهد شد\&. بهتر است به جای گنجاندن مستقیم \fB\-\-graph=\fR در \fB$YACCFLAGS\fR، از این متغیر استفاده کنید\&. .sp \fIجدید در نسخهٔ 4\&.4\&.0\&.\fR .RE .PP \fBYACC_GRAPH_FILE_SUFFIX\fR .RS 4 پیش‌تر توسط \fB$YACCVCGFILESUFFIX\fR مشخص می‌شد\&. .sp پسوند فایلی که حاوی گراف ماشین خودکار دستور زبان است، هنگامی که گزینهٔ \fB\-g\fR (یا \fB\-\-graph=\fR بدون آرگومان گزینه) در \fB$YACCFLAGS\fR استفاده شود\&. توجه داشته باشید که تنظیم این متغیر به SCons اطلاع می‌دهد که چگونه نام فایل گراف را برای مقاصد ردیابی بسازد، و تاثیری بر نام واقعی فایل تولید‌شده نمی‌گذارد\&. ابزارهای گوناگون yacc در زمان‌های مختلف قالب‌های متفاوتی را تولید کرده‌اند\&. این متغیر را طوری تنظیم کنید که با آنچه تولیدکنندهٔ تجزیه‌کنندهٔ شما تولید می‌کند مطابقت داشته باشد\&. .sp \fIجدید در نسخهٔ 4\&.6\&.0\fR\&. .RE .PP \fBYACC_HEADER_FILE\fR .RS 4 در صورت ارائه، یک فایل سرآیند با نام برگرفته از این متغیر تولید می‌کند\&. این مقدار به عنوان گزینهٔ خط فرمان \fB\-\-header=\fR ارسال خواهد شد\&. بهتر است به جای گنجاندن مستقیم \fB\-\-header=\fR در \fB$YACCFLAGS\fR، از این متغیر استفاده کنید\&. .sp \fIجدید در نسخهٔ 4\&.4\&.0\&.\fR .RE .PP \fBYACCCOM\fR .RS 4 خط فرمانی که برای فراخوانی تولیدکنندهٔ تجزیه‌کننده جهت تولید یک فایل منبع استفاده می‌شود\&. .RE .PP \fBYACCCOMSTR\fR .RS 4 رشته‌ای که هنگام تولید یک فایل منبع با استفاده از تولیدکنندهٔ تجزیه‌کننده نمایش داده می‌شود\&. اگر این متغیر تنظیم نشده باشد، \fB$YACCCOM\fR (خط فرمان) نمایش داده می‌شود\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(YACCCOMSTR="Yacc\*(Aqing $TARGET from $SOURCES") .fi .if n \{\ .RE .\} .RE .PP \fBYACCFLAGS\fR .RS 4 گزینه‌های عمومی ارسال‌شده به تولیدکنندهٔ تجزیه‌کننده\&. ابزار yacc علاوه بر ارسال این مقدار در طول فراخوانی، این متغیر ساخت را برای یافتن گزینه‌هایی که باعث تولید فایل‌های خروجی بیشتر می‌شوند نیز بررسی می‌کند و آن‌ها را به فهرست اهداف اضافه می‌نماید\&. .sp اگر گزینهٔ \fB\-d\fR در \fB$YACCFLAGS\fR موجود باشد، \fBscons\fR فرض می‌کند که این فراخوانی یک فایل سرآیند نیز ایجاد خواهد کرد؛ با پسوند تعیین‌شده توسط \fB$YACCHFILESUFFIX\fR اگر فایل منبع yacc به پسوند \&.y ختم شود، یا فایلی با پسوند تعیین‌شده توسط \fB$YACCHXXFILESUFFIX\fR اگر فایل منبع yacc به پسوند \&.yy ختم شود\&. فایل سرآیند همان نام پایهٔ هدف درخواستی را خواهد داشت\&. این رفتار تنها در صورتی درست است که فایل اجرایی \fBbison\fR (یا \fBwin_bison\fR) باشد\&. در صورت استفاده از Berkeley yacc (\fBbyacc\fR)، همواره فایل y\&.tab\&.h نوشته می‌شود \- در این حالت از \fB\-d\fR اجتناب کرده و در عوض از \fB$YACC_HEADER_FILE\fR استفاده کنید\&. .sp اگر گزینهٔ \fB\-g\fR موجود باشد، \fBscons\fR فرض می‌کند که فراخوانی یک فایل گراف نیز با پسوند تعیین‌شده توسط \fB$YACCVCGFILESUFFIX\fR ایجاد خواهد کرد\&. .sp اگر گزینهٔ \fB\-v\fR موجود باشد، \fBscons\fR فرض می‌کند که فراخوانی یک فایل خروجی اشکال‌زدایی با پسوند \&.output نیز ایجاد خواهد کرد\&. .sp همچنین گزینه‌های GNU bison شناسایی می‌شوند: \fB\-\-header\fR (و مترادف منسوخ‌شدهٔ آن \fB\-\-defines\fR)، که مشابه \fB\-d\fR است اما امکان نام‌گذاری صریح فایل سرآیند خروجی را از طریق آرگومان گزینه فراهم می‌سازد؛ و \fB\-\-graph\fR، که مشابه \fB\-g\fR است اما امکان نام‌گذاری صریح فایل گراف خروجی را از طریق یک آرگومان گزینه فراهم می‌کند\&. در صورتی که این گزینه‌ها در قالب option=argument استفاده شوند، پسوندهای فایل توصیف‌شده برای \fB\-d\fR و \fB\-g\fR در بالا اعمال نخواهند شد\&. .sp توجه داشته باشید که فایل‌های مشخص‌شده با \fB\-\-header=\fR و \fB\-\-graph=\fR ممکن است در همهٔ شرایط به‌درستی توسط SCons مدیریت نشوند و استفاده از آن‌ها در \fB$YACCFLAGS\fR باید صرفاً به عنوان پشتیبانی از روش‌های قدیمی در نظر گرفته شود\&. اگر نیاز به نام‌گذاری صریح فایل‌ها دارید، استفاده از \fB$YACC_HEADER_FILE\fR و \fB$YACC_GRAPH_FILE\fR را در نظر بگیرید (\fIجدید در نسخهٔ 4\&.4\&.0\fR)\&. .RE .PP \fBYACCHFILESUFFIX\fR .RS 4 پسوند فایل سرآیند C تولیدشده توسط مولد تجزیه‌کننده، هنگامی که گزینه \fB\-d\fR (یا \fB\-\-header\fR بدون آرگومان گزینه) در \fB$YACCFLAGS\fR استفاده می‌شود\&. توجه داشته باشید که تنظیم این متغیر به SCons اطلاع می‌دهد که چگونه نام فایل سرآیند را برای اهداف ردیابی بسازد و بر نام فایل واقعی تولیدشده تأثیری ندارد\&. این مقدار را طوری تنظیم کنید که با آنچه مولد تجزیه‌کننده شما تولید می‌کند مطابقت داشته باشد\&. مقدار پیش‌فرض \&.h است\&. .RE .PP \fBYACCHXXFILESUFFIX\fR .RS 4 پسوند فایل سرآیند ++C تولیدشده توسط مولد تجزیه‌کننده، هنگامی که گزینه \fB\-d\fR (یا \fB\-\-header\fR بدون آرگومان گزینه) در \fB$YACCFLAGS\fR استفاده می‌شود\&. توجه داشته باشید که تنظیم این متغیر به SCons اطلاع می‌دهد که چگونه نام فایل سرآیند را برای اهداف ردیابی بسازد و بر نام فایل واقعی تولیدشده تأثیری ندارد\&. این مقدار را طوری تنظیم کنید که با آنچه مولد تجزیه‌کننده شما تولید می‌کند مطابقت داشته باشد\&. مقدار پیش‌فرض \&.hpp است\&. .RE .PP \fBYACCVCGFILESUFFIX\fR .RS 4 منسوخ شده است\&. به‌جای آن از \fB$YACC_GRAPH_FILE_SUFFIX\fR استفاده کنید\&. این مقدار فقط در صورتی استفاده می‌شود که \fB$YACC_GRAPH_FILE_SUFFIX\fR تنظیم نشده باشد\&. مقدار پیش‌فرض \&.gv است\&. .sp \fIتغییریافته در نسخه 4\&.6\&.0\fR: منسوخ شد\&. مقدار پیش‌فرض از \&.vcg تغییر یافت (تولید خروجی \&.vcg توسط bison از نسخه 2\&.4 در سال 2006 متوقف شد)\&. .RE .PP \fBZIP\fR .RS 4 ابزار فشرده‌سازی و بسته‌بندی فایل zip\&. .RE .PP \fBZIP_OVERRIDE_TIMESTAMP\fR .RS 4 یک برچسب زمان اختیاری که زمان آخرین تغییر فایل را هنگام ذخیره شدن در آرشیو Zip بازنویسی می‌کند\&. این متغیر یک چندتایی (tuple) از شش مقدار است: سال (1980 =<)، ماه (بر پایه یک)، روزِ ماه (بر پایه یک)، ساعت (بر پایه صفر)، دقیقه (بر پایه صفر)، ثانیه (بر پایه صفر)\&. .RE .PP \fBZIPCOM\fR .RS 4 خط فرمانی که برای فراخوانی ابزار zip استفاده می‌شود، یا تابع داخلی Python که برای ایجاد یک آرشیو zip به کار می‌رود\&. .RE .PP \fBZIPCOMPRESSION\fR .RS 4 پرچم \fIcompression\fR از ماژول zipfile در Python که توسط تابع داخلی Python برای کنترل فشرده شدن یا نشدن آرشیو zip استفاده می‌شود\&. مقدار پیش‌فرض zipfile\&.ZIP_DEFLATED است که یک آرشیو zip فشرده ایجاد می‌کند\&. این مقدار در صورتی که ماژول zipfile در دسترس نباشد، تأثیری ندارد\&. .RE .PP \fBZIPCOMSTR\fR .RS 4 رشته‌ای که هنگام آرشیو کردن فایل‌ها با استفاده از ابزار zip نمایش داده می‌شود\&. اگر این مقدار تنظیم نشده باشد، \fB$ZIPCOM\fR (خط فرمان یا تابع داخلی Python) نمایش داده می‌شود\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(ZIPCOMSTR = "Zipping $TARGET") .fi .if n \{\ .RE .\} .RE .PP \fBZIPFLAGS\fR .RS 4 گزینه‌های عمومی ارسال‌شده به ابزار zip\&. .RE .PP \fBZIPROOT\fR .RS 4 یک دایرکتوری ریشه اختیاری برای zip (پیش‌فرض خالی است)\&. در صورت تعیین، نام فایل‌های ذخیره‌شده در فایل zip نسبت به این دایرکتوری خواهند بود\&. در غیر این صورت، نام فایل‌ها نسبت به دایرکتوری جاری دستور در نظر گرفته می‌شوند\&. برای نمونه: .sp .if n \{\ .RS 4 .\} .nf env = Environment() env\&.Zip(\*(Aqfoo\&.zip\*(Aq, \*(Aqsubdir1/subdir2/file1\*(Aq, ZIPROOT=\*(Aqsubdir1\*(Aq) .fi .if n \{\ .RE .\} .sp یک فایل zip با نام foo\&.zip تولید خواهد کرد که حاوی فایلی با نام subdir2/file1 به‌جای subdir1/subdir2/file1 است\&. .RE .PP \fBZIPSUFFIX\fR .RS 4 پسوند مورد استفاده برای نام‌های فایل zip\&. .RE .SS "بافت‌های پیکربندی (Configure Contexts)" .PP SCons یک سازوکار پیکربندی خودکارِ یکپارچه (الهام‌گرفته از GNU Autoconf اما درونیِ SCons) برای بررسی وجود موارد خارجیِ مورد نیاز ساخت، مانند فایل‌های سرایند C، کتابخانه‌ها و غیره ارائه می‌دهد\&. این سازوکار می‌تواند برای ساخت ویژگی‌های اختیاری تنها در صورت در دسترس بودن پشتیبانی آن‌ها، لغو سریع ساخت در صورت مفقود بودن عناصر ضروری، یا صرفاً تنظیم ساخت متناسب با بستر ساختِ مشخص مورد استفاده قرار گیرد\&. این سازوکار در میان بسترهای مختلف، قابل‌حمل (portable) است\&. .PP شما سیستم پیکربندی را با ایجاد یک بافت پیکربندی (configure context) فعال می‌کنید که اطلاعات گردآوری‌شده را در حین انجام بررسی‌ها نگهداری کرده، بررسی‌های مورد نظر را درخواست می‌کند و سپس اطلاعات را به محیط ساخت عادی انتقال می‌دهد\&. همچنین به‌صورت اختیاری، یک سرایند پیکربندی که کدهای C یا C++ می‌توانند آن را درج (include) کنند، می‌تواند تولید شود\&. SCons (برخلاف Autoconf) یک حافظهٔ نهان (cache) صریح از مقادیر آزمایش‌شده نگهداری نمی‌کند، بلکه از سازوکار عادیِ ردیابی وابستگی‌های خود برای به‌روز نگه داشتن مقادیر بررسی‌شده استفاده می‌کند\&. شما می‌توانید این رفتار را با گزینهٔ خط فرمان \fB\-\-config\fR بازنویسی (override) کنید\&. .PP \fBConfigure\fR(\fIenv, [custom_tests, conf_dir, log_file, config_h, clean, help]\fR), \fIenv\fR\&.Configure(\fI[custom_tests, conf_dir, log_file, config_h, clean, help]\fR) .RS 4 یک بافت پیکربندی (configure context) ایجاد می‌کند که اطلاعات کشف‌شده در حین اجرای بررسی‌ها را ردیابی می‌نماید\&. این بافت شامل یک محیط ساخت (construction environment) محلی است (که به‌صورت \fIcontext\fR\&.\fIenv\fR در دسترس است) که هنگام اجرای بررسی‌ها مورد استفاده قرار گرفته و می‌تواند با نتایج بررسی به‌روزرسانی شود\&. در هر زمان تنها یک بافت می‌تواند فعال باشد، اما پس از کامل شدن بافت فعال، بافت جدیدی قابل ایجاد است\&. در شکل تابع عمومی، مقدار الزامیِ \fIenv\fR مقادیر اولیه را برای محیط ساخت محلیِ بافت مشخص می‌کند؛ در شکل متدِ محیط ساخت، نمونه مقادیر را فراهم می‌آورد\&. .sp \fIcustom_tests\fR یک دیکشنری شامل بررسی‌های سفارشی را مشخص می‌کند (جزئیات را در ادامه ببینید)\&. مقدار پیش‌فرض \fBNone\fR است که نشان‌دهندهٔ عدم وجود بررسی‌های سفارشی در بافت پیکربندی است\&. .sp \fIconf_dir\fR دایرکتوری‌ای را مشخص می‌کند که موارد آزمایشی در آن ساخته می‌شوند\&. این دایرکتوری برای ساخت اهداف عادی استفاده نمی‌شود\&. مقدار پیش‌فرض \(lq#/\&.sconf_temp\(rq است\&. .sp \fIlog_file\fR فایلی را مشخص می‌کند که خروجی دستورات اجرا شده برای بررسی وجود فایل‌های سرایند، کتابخانه‌ها و غیره را جمع‌آوری می‌کند\&. مقدار پیش‌فرض \(lq#/config\&.log\(rq است\&. اگر از دایرکتوری‌های متغیر (variant directories) استفاده می‌کنید، ممکن است بخواهید فایل گزارش را برای یک ساخت مشخص، زیر دایرکتوری متغیرِ همان ساخت قرار دهید\&. .sp \fIconfig_h\fR یک فایل سرایند C را مشخص می‌کند که نتایج آزمایش‌ها در آن نوشته خواهد شد، تا فرآیند ساخت با درج (include) کردن آن به این اطلاعات دسترسی داشته باشد\&. نتایج شامل خطوطی مانند #define HAVE_GETADDRINFO 1, #define HAVE_INTTYPES_H 1 و غیره خواهند بود\&. مقدار پیش‌فرض None است که هیچ سرایند پیکربندی‌ای ایجاد نمی‌کند\&. عرف بر این بوده است که این سرایند پیکربندی config\&.h نامیده شود\&. می‌توانید فایل \fIconfig_h\fR یکسانی را در فراخوانی‌های متعدد \fBConfigure\fR مشخص کنید، که در این صورت SCons تمام نتایج را در فایل مشخص‌شده الحاق خواهد کرد\&. توجه داشته باشید که SCons از سازوکار عادیِ ردیابی وابستگی‌های خود برای تصمیم‌گیری در مورد لزوم بازسازی سرایند پیکربندی استفاده می‌کند\&. این بدان معناست که این فایل لزوماً با هر بار اجرای scons بازسازی نمی‌شود، بلکه تنها در صورتی بازسازی می‌شود که محتویات آن تغییر کرده باشد و هدفی وابسته به سرایند پیکربندی در حال ساخت باشد\&. .sp آرگومان‌های \fIclean\fR و \fIhelp\fR می‌توانند برای جلوگیری از اجرای آزمایش‌های پیکربندی، به‌ترتیب هنگام استفاده از گزینه‌های \fB\-c\fR/\fB\-\-clean\fR یا \fB\-H\fR/\fB\-h\fR/\fB\-\-help\fR استفاده شوند\&. رفتار پیش‌فرض همیشه اجرای آزمایش‌های بافت پیکربندی است، زیرا نتایج آزمایش‌ها ممکن است بر فهرست اهداف پاک‌سازی‌شونده یا متن راهنما تأثیر بگذارد\&. اگر آزمایش‌های پیکربندی بر این موارد تأثیری ندارند، می‌توانید آرگومان‌های \fBclean=False\fR یا \fBhelp=False\fR (یا هر دو) را اضافه کنید تا از اجرای غیرضروری آزمایش‌ها جلوگیری شود\&. .sp \fIتغییر یافته در نسخهٔ 4\&.0\fR: در صورت تلاش برای ایجاد یک بافت جدید در حالی که یک بافت فعال وجود دارد، یک استثنا صادر می‌کند\&. .RE .PP \fIcontext\fR\&.Finish() .RS 4 باید پس از تکمیل پیکربندی فراخوانی شود\&. هرچند الزامی است، اما اجباری بر آن نیست مگر اینکه \fBConfigure\fR در حالی که هنوز یک بافت فعال وجود دارد مجدداً فراخوانی شود، که در این صورت یک استثنا صادر می‌شود\&. محیط ساختِ بافت را همان‌گونه که در طول اجرای بررسی‌های پیکربندی تغییر یافته است، برمی‌گرداند \- محیط اصلی بدون تغییر باقی می‌ماند؛ معمولاً از محیط بازگردانده‌شده برای جایگزینی محیط اصلی استفاده می‌شود\&. پس از فراخوانی این متد، بررسی‌های بیشتری با این بافت پیکربندی قابل انجام نیست\&. با این حال، می‌توانید برای انجام بررسی‌های بیشتر یک بافت پیکربندی جدید ایجاد کنید\&. .RE .PP مثالی از یک کاربرد متداول Configure: .sp .if n \{\ .RS 4 .\} .nf env = Environment() conf = Configure(env) if not conf\&.CheckCHeader("math\&.h"): print("We really need math\&.h!") Exit(1) if conf\&.CheckLibWithHeader("qt", "qapp\&.h", "c++", call="QApplication qapp(0,0);"): # do stuff for qt \- usage, e\&.g\&. conf\&.env\&.Append(CPPDEFINES="WITH_QT") env = conf\&.Finish() .fi .if n \{\ .RE .\} .PP یک بافت پیکربندی متدهای از پیش تعریف‌شدهٔ زیر را دارد که می‌توانند برای انجام بررسی‌ها استفاده شوند\&. در جاهایی که \fIlanguage\fR یک پارامتر اختیاری است، زبان برنامه‌نویسی بررسی را مشخص می‌کند که در حال حاضر انتخابی بین C یا C++ است\&. نگارش‌های قابل قبول برای C عبات‌اند از \(lqC\(rq یا \(lqc\(rq؛ برای C++ این مقدار می‌تواند \(lqCXX\(rq, \(lqcxx\(rq, \(lqC++\(rq یا \(lqc++\(rq باشد\&. اگر \fIlanguage\fR حذف شود، \(lqC\(rq در نظر گرفته می‌شود\&. .PP \fIcontext\fR\&.CheckHeader(\fIheader, [include_quotes, language]\fR) .RS 4 بررسی می‌کند که آیا \fIheader\fR می‌تواند هنگام ساخت این پروژه استفاده شود یا خیر\&. یک برنامهٔ خرد (stub) تولید‌شده در \fIlanguage\fR مشخص‌شده برای بررسی ساخته می‌شود\&. \fIheader\fR همچنین می‌تواند یک لیست باشد، که در این صورت آخرین مورد در لیست، فایل سرایندی است که باید بررسی شود، و موارد قبلیِ لیست فایل‌های سرایندی هستند که دستورالعمل‌های #include آن‌ها باید پیش از خط سرایند مورد بررسی قرار گیرند\&. آرگومان اختیاری \fIinclude_quotes\fR نویسه‌های احاطه‌کنندهٔ نام سرایند را مشخص می‌کند \- تنها دو نویسهٔ اول در نظر گرفته می‌شوند\&. اساساً این به شما امکان می‌دهد که نقل‌قول‌های دوگانهٔ پیش‌فرض ("") را با قلاب‌های زاویه‌دار (<>) جایگزین کنید\&. .sp یک مقدار بولی را برمی‌گرداند که نشان‌دهندهٔ موفقیت یا شکست است\&. اگر یک سرایند پیکربندی درخواست شده باشد، نتیجه در صورت موفقیت به‌صورت یک ماکروی پیش‌پردازنده، یا در صورت شکست به‌صورت یک توضیح (comment) آگاهی‌بخش در آن ثبت می‌شود\&. .RE .PP \fIcontext\fR\&.CheckCHeader(\fIheader, [include_quotes]\fR) .RS 4 بررسی می‌کند که آیا \fIheader\fR هنگام کامپایل یک برنامهٔ زبان C قابل استفاده است یا خیر\&. این یک پوشش (wrapper) بر روی \fBCheckHeader\fR است \- برای جزئیات مدخل آن را ببینید\&. .RE .PP \fIcontext\fR\&.CheckCXXHeader(\fIheader, [include_quotes]\fR) .RS 4 بررسی می‌کند که آیا \fIheader\fR هنگام کامپایل یک برنامه به زبان C++ قابل استفاده است یا خیر\&. این یک پوسته به دور \fBCheckHeader\fR است \- برای جزئیات به مدخل آن مراجعه کنید\&. .RE .PP \fIcontext\fR\&.CheckFunc(\fIfunction_name, [header, language, funcargs]\fR) .RS 4 بررسی می‌کند که آیا \fIfunction_name\fR در محیط محلی context، با استفاده از کامپایلر مشخص‌شده توسط \fIlanguage\fR قابل استفاده است یا خیر \- به این معنی که آیا یک بررسی که به آن ارجاع می‌دهد می‌تواند با استفاده از مقادیر فعلی \fB$CFLAGS\fR، \fB$CPPFLAGS\fR، \fB$LIBS\fR یا سایر متغیرهای ساخت (construction variables) مربوطه کامپایل شود یا خیر\&. .sp آرگومان اختیاری \fIheader\fR رشته‌ای است که قطعه کدی را برای قرار گرفتن در بالای برنامه آزمایشی مشخص می‌کند که برای بررسی وجود تابع کامپایل خواهد شد\&. در صورت حذف، قطعه پیش‌فرض به این صورت خواهد بود (با جایگزینی مناسب \fIfunction_name\fR): .sp .if n \{\ .RS 4 .\} .nf #ifdef __cplusplus extern "C" #endif char function_name(void); .fi .if n \{\ .RE .\} .sp اگر \fIheader\fR ارائه شود، \fInot\fR (نباید) شامل فایل سرآیند استانداردی باشد که \fIfunction_name\fR را اعلان می‌کند، و \fIshould\fR (باید) شامل یک پیش‌نمونه ساختگی مشابه حالت پیش‌فرض باشد\&. اگر این کار ممکن نیست، می‌توان از آرگومان اختیاری \fIfuncargs\fR برای تعیین رشته‌ای حاوی فهرست آرگومان‌ها با همان تعداد و نوع آرگومان‌های پیش‌نمونه استفاده کرد\&. این آرگومان‌ها می‌توانند صرفاً مقادیر ثابتی از نوع صحیح باشند\&. کامپایلرهای مدرن C/C++ اعلان‌های ضمنی توابع را رد می‌کنند و همچنین ممکن است فراخوانی‌های توابعی را که آرگومان‌های آن‌ها از نظر نوع با پیش‌نمونه سازگار نیستند، رد کنند\&. .sp یک مقدار بولی نشان‌دهنده موفقیت یا شکست بازمی‌گرداند\&. اگر یک سرآیند پیکربندی (configure header) درخواست شده باشد، نتیجه در صورت موفقیت به صورت یک ماکروی پیش‌پردازنده، یا در صورت شکست به صورت یک توضیح (comment) آگاهی‌بخش در آن ثبت می‌شود\&. .sp \fIتغییریافته در نسخه 4\&.7\&.0: آرگومان \fR\fI\fIfuncargs\fR\fR\fI اضافه شد\&.\fR .RE .PP \fIcontext\fR\&.CheckLib(\fI[library, symbol, header, language, extra_libs=None, autoadd=True, append=True, unique=False]\fR) .RS 4 بررسی می‌کند که آیا \fIlibrary\fR می‌تواند برای ساخت این پروژه استفاده شود یا خیر (همچنین ببینید \fBCheckLibWithHeader\fR)\&. یک برنامه ساختگی (stub) کوچک تولید شده و در برابر \fIlibrary\fR توسط کامپایلر انتخاب‌شده بر اساس \fIlanguage\fR پیوند داده می‌شود\&. اگر \fIsymbol\fR مشخص شده باشد، برنامه ساختگی حاوی ارجاعی به آن نماد خواهد بود تا بررسی شود که آیا واقعاً توسط کتابخانه ارائه شده است یا خیر\&. در صورت ارائه، متن \fIheader\fR در بالای برنامه ساختگی گنجانده می‌شود؛ این متن باید از نظر نحوی در \fIlanguage\fR صحیح باشد\&. .sp توجه داشته باشید که اگر \fIsymbol\fR داده شود، برنامه ساختگی با یک پیش‌نمونه به سبک قدیمی (old\-style) تولید خواهد شد، زیرا اطلاعی از پیش‌نمونه واقعی ندارد (برای مثال char sin(); به جای double sin(double x);)\&. چنین استفاده‌ای در C23 و نسخه‌های پس از آن دیگر مجاز نیست\&. .sp باقی آرگومان‌ها باید به صورت کلیدواژه‌ای مشخص شوند\&. اگر \fIextra_libs\fR مشخص شده باشد، فهرستی از کتابخانه‌های اضافی برای گنجاندن هنگام پیوند دادن برنامه ساختگی است (معمولاً وابستگی‌های کتابخانه‌ای که بررسی می‌شود)\&. اگر \fIautoadd\fR درست (true، پیش‌فرض) باشد و پیوند موفقیت‌آمیز باشد، کتابخانه به متغیر ساخت \fB$LIBS\fR در context اضافه می‌شود\&. اگر \fIappend\fR درست (true، پیش‌فرض) باشد، کتابخانه افزوده شده به انتها الحاق می‌شود، در غیر این صورت به ابتدا اضافه می‌شود\&. اگر \fIunique\fR درست (true) باشد، و در حالتی که کتابخانه باید اضافه شود اما از قبل در \fB$LIBS\fR در context پیکربندی وجود داشته باشد، مجدداً اضافه نخواهد شد\&. مقدار پیش‌فرض False است\&. .sp \fIlibrary\fR می‌تواند فهرستی از نام‌های کتابخانه‌ها یا \fBNone\fR (پیش‌فرض در صورت حذف آرگومان) باشد\&. در حالت اول، \fIsymbol\fR به ترتیب با هر نام کتابخانه بررسی شده و با اولین آزمایش موفق، نتیجه بازگردانده می‌شود (و موفقیت گزارش می‌گردد)؛ در حالت دوم، با مقدار فعلی \fB$LIBS\fR بررسی می‌شود (در این حالت هیچ نام کتابخانه‌ای اضافه نخواهد شد)\&. اگر \fIsymbol\fR حذف شود یا \fBNone\fR باشد، آنگاه \fBCheckLib\fR صرفاً بررسی می‌کند که آیا می‌توانید در برابر \fIlibrary\fR مشخص‌شده پیوند دهید یا خیر\&. توجه داشته باشید که با وجود نحو معتبر، فراخوانی این متد با حذف یا \fBNone\fR بودن هم‌زمان \fIlibrary\fR و \fIsymbol\fR چندان کاربردی نخواهد بود \- حداقل یکی از آن‌ها باید ارائه شود\&. .sp یک مقدار بولی نشان‌دهنده موفقیت یا شکست بازمی‌گرداند\&. .sp \fIتغییریافته در نسخه 4\&.5\&.0: پارامترهای \fR\fI\fIappend\fR\fR\fI و \fR\fI\fIunique\fR\fR\fI اضافه شدند\&.\fR .sp \fIتغییریافته در نسخه 4\&.9\&.0: پارامتر \fR\fI\fIextra_libs\fR\fR\fI اضافه شد\&.\fR .RE .PP \fIcontext\fR\&.CheckLibWithHeader(\fI[library, header, language, extra_libs=None, call=None, autoadd=True, append=True, unique=False]\fR) .RS 4 بررسی می‌کند که آیا \fIlibrary\fR می‌تواند برای ساخت این پروژه استفاده شود یا خیر، هنگامی که برای استفاده از \fIlibrary\fR حتماً باید یک فایل سرآیند گنجانده شود (همچنین ببینید \fBCheckLib\fR)\&. سه آرگومان اول را می‌توان به عنوان آرگومان‌های مکانی یا کلیدواژه‌ای ارائه کرد\&. \fIlibrary\fR یک کتابخانه یا فهرستی از کتابخانه‌ها را برای بررسی مشخص می‌کند (پیش‌فرض None است)، \fIheader\fR یک فایل سرآیند یا فهرستی از فایل‌های سرآیند را برای گنجاندن در برنامه آزمایشی مشخص می‌کند\&. اگر \fIheader\fR یک فهرست باشد، آخرین مورد در فهرست همان فایل سرآیندی است که باید بررسی شود، و موارد قبلی فهرست فایل‌های سرآیندی هستند که خطوط #include آن‌ها باید پیش از خط سرآیندِ در حال بررسی قرار گیرند\&. حالت پیش‌فرض گنجاندن هیچ متن سرآیندی نیست\&. .sp باقی پارامترها باید به صورت کلیدواژه‌ای مشخص شوند\&. در صورت ارائه، \fIcall\fR قطعه کدی است که به عنوان آزمایش ساختگی کامپایل می‌شود و جایگزین برنامه ساختگی تولیدشده به‌طور خودکار می‌گردد\&. این قطعه‌کد باید یک عبارت معتبر در \fIlanguage\fR باشد\&. در صورت عدم ارائه، حالت پیش‌فرض قابلیت پیوند در برابر \fIlibrary\fR مشخص‌شده را بررسی می‌کند\&. \fIextra_libs\fR می‌تواند برای افزودن کتابخانه‌های اضافی جهت پیوند دادن استفاده شود (معمولاً وابستگی‌های کتابخانه تحت آزمایش)\&. اگر \fIautoadd\fR درست (true، پیش‌فرض) باشد، نخستین کتابخانه‌ای که بررسی را با موفقیت بگذراند به متغیر ساخت \fB$LIBS\fR در context پیکربندی اضافه می‌شود و متد پایان می‌یابد\&. اگر \fIappend\fR درست (true، پیش‌فرض) باشد، کتابخانه افزوده شده به انتها الحاق می‌شود، در غیر این صورت به ابتدا اضافه می‌شود\&. اگر \fIunique\fR درست (true) باشد، و در حالتی که کتابخانه باید اضافه شود اما از قبل در \fB$LIBS\fR در context پیکربندی وجود داشته باشد، مجدداً اضافه نخواهد شد\&. مقدار پیش‌فرض False است\&. .sp یک مقدار بولی نشان‌دهنده موفقیت یا شکست بازمی‌گرداند\&. .sp \fIتغییریافته در نسخه 4\&.5\&.0: پارامترهای \fR\fI\fIappend\fR\fR\fI و \fR\fI\fIunique\fR\fR\fI اضافه شدند\&.\fR .sp \fIتغییریافته در نسخه 4\&.9\&.0: پارامتر \fR\fI\fIextra_libs\fR\fR\fI اضافه شد\&.\fR .RE .PP \fIcontext\fR\&.CheckType(\fItype_name, [includes, language]\fR) .RS 4 بررسی می‌کند که آیا \fItype_name\fR از طریق یک typedef تعریف شده است یا خیر\&. \fIincludes\fR رشته‌ای شامل یک یا چند خط #include است که در بالای برنامه آزمایشی (stub) که برای انجام بررسی کامپایل می‌شود، قرار خواهد گرفت\&. یک مقدار بولی نشان‌دهنده موفقیت یا شکست را برمی‌گرداند\&. اگر یک هدر پیکربندی (configure header) درخواست شده باشد، نتیجه در صورت موفقیت به صورت یک ماکروی پیش‌پردازنده، یا در صورت شکست به صورت یک کامنت توضیحی در آن ثبت می‌شود\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf sconf\&.CheckType(\*(Aqfoo_type\*(Aq, \*(Aq#include "my_types\&.h"\*(Aq, \*(AqC++\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fIcontext\fR\&.CheckTypeSize(\fItype_name, [header, language, expect]\fR) .RS 4 اندازه نوع داده \fItype_name\fR را که از طریق یک typedef (یا به صورت توکار) تعریف شده است بررسی می‌کند\&. آرگومان اختیاری \fIheader\fR رشته‌ای است که در بالای برنامه آزمایشی که برای انجام بررسی کامپایل می‌شود، قرار خواهد گرفت \- پیش‌فرض آن خالی است\&. اگر نوع داده پیدا شود، بررسی موفق شده و اندازه آن را برمی‌گرداند، در غیر این صورت صفر بازمی‌گرداند\&. اگر پارامتر اختیاری \fIexpect\fR (یک عدد صحیح) داده شده باشد، بررسی تنها در صورتی موفق می‌شود که اندازه شناسایی‌شده با آن مطابقت داشته باشد\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf CheckTypeSize(\*(Aqshort\*(Aq, expect=2) .fi .if n \{\ .RE .\} .sp تنها در صورتی اندازه 2 را برمی‌گرداند که short واقعاً دو بایت باشد\&. .RE .PP \fIcontext\fR\&.CheckCC() .RS 4 بررسی می‌کند که آیا کامپایلر C (همان‌طور که توسط متغیر ساخت \fB$CC\fR تعریف شده) با تلاش برای کامپایل یک فایل مبدأ کوچک کار می‌کند یا خیر\&. این یک بررسی دقیق‌تر فراهم می‌کند: به‌طور پیش‌فرض، SCons تنها تشخیص می‌دهد که آیا برنامه‌ای با نام درست وجود دارد یا خیر، نه اینکه آیا کامپایلری کاربردی و فعال است یا نه\&. یک مقدار بولی نشان‌دهنده موفقیت یا شکست را برمی‌گرداند\&. .sp برنامه آزمایشی با همان خط فرمانی ساخته می‌شود که توسط سازنده \fBObject\fR برای فایل‌های مبدأ C استفاده می‌شود، بنابراین با تنظیم متغیرهای ساخت مربوطه می‌توان از آن برای تشخیص پذیرفته شدن یا رد شدن پرچم‌های خاص کامپایلر توسط کامپایلر استفاده کرد\&. .RE .PP \fIcontext\fR\&.CheckCXX() .RS 4 بررسی می‌کند که آیا کامپایلر ++C (همان‌طور که توسط متغیر ساخت \fB$CXX\fR تعریف شده) با تلاش برای کامپایل یک فایل مبدأ کوچک کار می‌کند یا خیر\&. این یک بررسی دقیق‌تر فراهم می‌کند: به‌طور پیش‌فرض، SCons تنها تشخیص می‌دهد که آیا برنامه‌ای با نام درست وجود دارد یا خیر، نه اینکه آیا کامپایلری کاربردی و فعال است یا نه\&. یک مقدار بولی نشان‌دهنده موفقیت یا شکست را برمی‌گرداند\&. .sp برنامه آزمایشی با همان خط فرمانی ساخته می‌شود که توسط سازنده \fBObject\fR برای فایل‌های مبدأ ++C استفاده می‌شود، بنابراین با تنظیم متغیرهای ساخت مربوطه می‌توان از آن برای تشخیص پذیرفته شدن یا رد شدن پرچم‌های خاص کامپایلر توسط کامپایلر استفاده کرد\&. .RE .PP \fIcontext\fR\&.CheckSHCC() .RS 4 بررسی می‌کند که آیا کامپایلر C برای شیء اشتراکی (shared\-object) (همان‌طور که توسط متغیر ساخت \fB$SHCC\fR تعریف شده) با تلاش برای کامپایل یک فایل مبدأ کوچک کار می‌کند یا خیر\&. این یک بررسی دقیق‌تر فراهم می‌کند: به‌طور پیش‌فرض، SCons تنها تشخیص می‌دهد که آیا برنامه‌ای با نام درست وجود دارد یا خیر، نه اینکه آیا کامپایلری کاربردی و فعال است یا نه\&. یک مقدار بولی نشان‌دهنده موفقیت یا شکست را برمی‌گرداند\&. .sp برنامه آزمایشی با همان خط فرمانی ساخته می‌شود که توسط سازنده \fBSharedObject\fR برای فایل‌های مبدأ C استفاده می‌شود، بنابراین با تنظیم متغیرهای ساخت مربوطه می‌توان از آن برای تشخیص پذیرفته شدن یا رد شدن پرچم‌های خاص کامپایلر توسط کامپایلر استفاده کرد\&. توجه داشته باشید که این متد ایجاد شدن یا نشدن یک کتابخانه اشتراکی/dll را بررسی نمی‌کند\&. .RE .PP \fIcontext\fR\&.CheckSHCXX() .RS 4 بررسی می‌کند که آیا کامپایلر ++C برای شیء اشتراکی (shared\-object) (همان‌طور که توسط متغیر ساخت \fB$SHCXX\fR تعریف شده) با تلاش برای کامپایل یک فایل مبدأ کوچک کار می‌کند یا خیر\&. این یک بررسی دقیق‌تر فراهم می‌کند: به‌طور پیش‌فرض، SCons تنها تشخیص می‌دهد که آیا برنامه‌ای با نام درست وجود دارد یا خیر، نه اینکه آیا کامپایلری کاربردی و فعال است یا نه\&. یک مقدار بولی نشان‌دهنده موفقیت یا شکست را برمی‌گرداند\&. .sp برنامه آزمایشی با همان خط فرمانی ساخته می‌شود که توسط سازنده \fBSharedObject\fR برای فایل‌های مبدأ ++C استفاده می‌شود، بنابراین با تنظیم متغیرهای ساخت مربوطه می‌توان از آن برای تشخیص پذیرفته شدن یا رد شدن پرچم‌های خاص کامپایلر توسط کامپایلر استفاده کرد\&. توجه داشته باشید که این متد ایجاد شدن یا نشدن یک کتابخانه اشتراکی/dll را بررسی نمی‌کند\&. .RE .PP \fIcontext\fR\&.CheckProg(\fIprog_name\fR) .RS 4 بررسی می‌کند که آیا \fIprog_name\fR در مسیری که SCons در زمان ساخت استفاده خواهد کرد وجود دارد یا خیر\&. (\fIcontext\fR\&.\fIenv[\*(AqENV\*(Aq][\*(AqPATH\*(Aq]\fR)\&. رشته‌ای حاوی مسیر برنامه، یا در صورت شکست \fBNone\fR را برمی‌گرداند\&. .RE .PP \fIcontext\fR\&.CheckDeclaration(\fIsymbol, [includes, language]\fR) .RS 4 بررسی می‌کند که آیا \fIsymbol\fR مشخص‌شده اعلان شده است یا خیر\&. \fIincludes\fR رشته‌ای شامل یک یا چند خط #include است که در برنامه‌ای که برای آزمایش وجود نماد اجرا خواهد شد درج می‌شود\&. .sp یک مقدار بولی نشان‌دهنده موفقیت یا شکست را برمی‌گرداند\&. .RE .PP \fIcontext\fR\&.CheckMember(\fIaggregate_member, [header, language]\fR) .RS 4 وجود یک عضو از یک struct یا class زبان‌های C/C++ را بررسی می‌کند\&. \fIaggregate_member\fR نوع struct/class و عضوی را که باید بررسی شود مشخص می‌کند\&. \fIheader\fR رشته‌ای شامل یک یا چند خط #include است که در برنامه‌ای که برای آزمایش وجود عضو اجرا خواهد شد درج می‌شود\&. مثال: .sp .if n \{\ .RS 4 .\} .nf sconf\&.CheckMember(\*(Aqstruct tm\&.tm_sec\*(Aq, \*(Aq#include \*(Aq) .fi .if n \{\ .RE .\} .sp یک مقدار بولی نشان‌دهنده موفقیت یا شکست را برمی‌گرداند\&. .sp \fIاضافه‌شده در 4\&.4\&.0\fR\&. .RE .PP \fIcontext\fR\&.Define(\fIsymbol, [value, comment]\fR) .RS 4 این متد چیزی را بررسی نمی‌کند، بلکه اجباراً یک ماکروی پیش‌پردازنده را تعریف می‌کند که به سرآیند پیکربندی اضافه خواهد شد\&. \fIname\fR شناسهٔ ماکرو است\&. اگر \fIvalue\fR مشخص شده باشد، به عنوان مقدار جایگزین ماکرو استفاده خواهد شد\&. اگر \fIvalue\fR یک رشته باشد و نیاز به نمایش با علامت‌های نقل‌قول داشته باشد، علامت‌های نقل‌قول باید اضافه شوند، مانند \*(Aq"string"\*(Aq اگر مقدار اختیاری \fIcomment\fR داده شود، به عنوان یک کامنت در بالای تعریف ماکرو درج می‌شود (نشانه‌های مناسب کامنت‌گذاری به‌طور خودکار اضافه خواهند شد)\&. این عمل مشابه استفاده از \fBAC_DEFINE\fR در Autoconf است\&. .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf env = Environment() conf = Configure(env) # Puts the following line in the config header file: # #define A_SYMBOL conf\&.Define("A_SYMBOL") # Puts the following line in the config header file: # #define A_SYMBOL 1 conf\&.Define("A_SYMBOL", 1) .fi .if n \{\ .RE .\} .sp مثال‌هایی از قرار دادن مقادیر رشته‌ای در نقل‌قول: .sp .if n \{\ .RS 4 .\} .nf env = Environment() conf = Configure(env) # Puts the following line in the config header file: # #define A_SYMBOL YA conf\&.Define("A_SYMBOL", "YA") # Puts the following line in the config header file: # #define A_SYMBOL "YA" conf\&.Define("A_SYMBOL", \*(Aq"YA"\*(Aq) .fi .if n \{\ .RE .\} .sp مثال شامل کامنت: .sp .if n \{\ .RS 4 .\} .nf env = Environment() conf = Configure(env) # Puts the following lines in the config header file: # /* Set to 1 if you have a symbol */ # #define A_SYMBOL 1 conf\&.Define("A_SYMBOL", 1, "Set to 1 if you have a symbol") .fi .if n \{\ .RE .\} .RE .PP شما می‌توانید علاوه بر استفاده از بررسی‌های از پیش تعریف‌شده، بررسی‌های سفارشی خود را نیز تعریف کنید\&. برای فعال‌سازی بررسی‌های سفارشی، یک دیکشنری را به تابع \fBConfigure\fR به عنوان پارامتر \fIcustom_tests\fR ارسال کنید\&. این دیکشنری نام‌های بررسی‌ها را به فراخوان‌پذیرهای (callables) بررسی سفارشی (یا یک تابع Python یا نمونه‌ای از کلاسی که متد __call__ را پیاده‌سازی کرده است) نگاشت می‌کند\&. هر بررسی سفارشی با یک نمونه از CheckContext به عنوان اولین پارامتر فراخوانی می‌شود و به دنبال آن بقیه آرگومان‌ها که باید توسط کاربر بررسی ارائه شوند، قرار می‌گیرند\&. یک CheckContext مشابه بافت پیکربندی (configure context) نیست؛ بلکه نمونه‌ای از کلاسی است که حاوی یک بافت پیکربندی می‌باشد (قابل دسترس از طریق \fIchk_ctx\fR\&.\fIsconf\fR)\&. یک CheckContext متدهای زیر را ارائه می‌دهد که بررسی‌های سفارشی می‌توانند از آن‌ها بهره ببرند: .PP \fIchk_ctx\fR\&.Message(\fItext\fR) .RS 4 متن \fItext\fR را به عنوان نشانگر پیشرفت نمایش می‌دهد\&. برای مثال: Checking for library X\&.\&.\&.\&. معمولاً قبل از شروع بررسی فراخوانی می‌شود\&. .RE .PP \fIchk_ctx\fR\&.Result(\fIres\fR) .RS 4 پیام نتیجه را به عنوان نشانگر پیشرفت نمایش می‌دهد\&. اگر \fIres\fR یک عدد صحیح باشد، در صورت درست (true) بودن \fIres\fR مقدار yes و در صورت نادرست (false) بودن آن، no نمایش داده می‌شود\&. اگر \fIres\fR یک رشته باشد، دقیقاً همان‌طور که هست نمایش داده می‌شود\&. معمولاً پس از اتمام بررسی فراخوانی می‌شود\&. .RE .PP \fIchk_ctx\fR\&.TryCompile(\fItext, extension=\*(Aq\*(Aq\fR) .RS 4 بررسی می‌کند که آیا فایلی حاوی \fItext\fR و با پسوند تعیین‌شدهٔ \fIextension\fR (مانند \*(Aq\&.c\*(Aq) می‌تواند با استفاده از سازندهٔ \fBObject\fR محیط به یک فایل شیء (object file) کامپایل شود یا خیر\&. یک مقدار بولی برمی‌گرداند که نشان‌دهندهٔ موفقیت یا شکست است\&. .RE .PP \fIchk_ctx\fR\&.TryLink(\fItext, extension=\*(Aq\*(Aq\fR) .RS 4 بررسی می‌کند که آیا فایلی حاوی \fItext\fR و با پسوند تعیین‌شدهٔ \fIextension\fR (مانند \*(Aq\&.c\*(Aq) می‌تواند با استفاده از سازندهٔ \fBProgram\fR محیط به یک برنامهٔ اجرایی کامپایل شود یا خیر\&. یک مقدار بولی برمی‌گرداند که نشان‌دهندهٔ موفقیت یا شکست است\&. .RE .PP \fIchk_ctx\fR\&.TryRun(\fItext, extension=\*(Aq\*(Aq\fR) .RS 4 بررسی می‌کند که آیا فایلی حاوی \fItext\fR و با پسوند تعیین‌شدهٔ \fIextension\fR (مانند \*(Aq\&.c\*(Aq) می‌تواند با استفاده از سازندهٔ \fBProgram\fR محیط به یک برنامهٔ اجرایی کامپایل شده و متعاقباً اجرا شود یا خیر\&. اجرای برنامه تنها در صورتی صورت می‌گیرد که ساخت با موفقیت انجام شود\&. اگر برنامه با موفقیت اجرا شود (یعنی وضعیت بازگشتی آن 0 باشد)، یک چندتایی به صورت (True, outputStr) برگردانده می‌شود، که در آن \fIoutputStr\fR خروجی استاندارد برنامه است\&. اگر اجرای برنامه با شکست مواجه شود (وضعیت بازگشتی آن غیرصفر باشد)، آن‌گاه (False, \*(Aq\*(Aq) برگردانده می‌شود\&. .RE .PP \fIchk_ctx\fR\&.TryAction(\fIaction, [text, extension=\*(Aq\*(Aq]\fR) .RS 4 بررسی می‌کند که آیا \fIaction\fR مشخص‌شده با یک فایل منبع اختیاری (محتویات \fItext\fR، پسوند تعیین‌شدهٔ \fIextension\fR) قابل اجرا است یا خیر\&. \fIaction\fR می‌تواند هر چیزی باشد که قابل تبدیل به یک Action Object باشد\&. در صورت موفقیت، یک تاپل به‌صورت (True, outputStr) برگردانده می‌شود، که در آن \fIoutputStr\fR محتوای فایل هدف است\&. در صورت شکست، (False, \*(Aq\*(Aq) برگردانده می‌شود\&. .RE .PP \fIchk_ctx\fR\&.TryBuild(\fIbuilder, [text, extension=\*(Aq\*(Aq]\fR) .RS 4 پیاده‌سازی سطح‌پایین برای آزمایش ساخت‌های خاص؛ متدهای بالا بر اساس این متد هستند\&. با داشتن نمونهٔ Builder به نام \fIbuilder\fR و \fItext\fR اختیاری از یک فایل منبع با \fIextension\fR اختیاری، یک مقدار بولی بازمی‌گرداند که نشان‌دهندهٔ موفقیت یا شکست است\&. علاوه‌بر این، در صورت موفقیت‌آمیز بودن ساخت، \fIchk_ctx\fR\&.\fIlastTarget\fR بر روی گرهٔ هدفِ ساخت تنظیم می‌شود\&. .RE .PP نمونه‌ای از پیاده‌سازی و استفاده از بررسی‌های سفارشی: .sp .if n \{\ .RS 4 .\} .nf def CheckQt(chk_ctx, qtdir): chk_ctx\&.Message(\*(AqChecking for qt \&.\&.\&.\*(Aq) lastLIBS = chk_ctx\&.env[\*(AqLIBS\*(Aq] lastLIBPATH = chk_ctx\&.env[\*(AqLIBPATH\*(Aq] lastCPPPATH = chk_ctx\&.env[\*(AqCPPPATH\*(Aq] chk_ctx\&.env\&.Append(LIBS=\*(Aqqt\*(Aq, LIBPATH=qtdir + \*(Aq/lib\*(Aq, CPPPATH=qtdir + \*(Aq/include\*(Aq) ret = chk_ctx\&.TryLink( """\e #include int main(int argc, char **argv) { QApplication qapp(argc, argv); return 0; } """ ) if not ret: chkctx\&.env\&.Replace(LIBS=lastLIBS, LIBPATH=lastLIBPATH, CPPPATH=lastCPPPATH) chkctx\&.Result(ret) return ret env = Environment() conf = Configure(env, custom_tests={\*(AqCheckQt\*(Aq: CheckQt}) if not conf\&.CheckQt(\*(Aq/usr/lib/qt\*(Aq): print(\*(AqWe really need qt!\*(Aq) Exit(1) env = conf\&.Finish() .fi .if n \{\ .RE .\} .SS "متغیرهای ساخت خط فرمان (Command\-Line Construction Variables)" .PP ابزار SCons برای کنترل چگونگی ساخت هدف‌ها به اطلاعات ذخیره‌شده در متغیرهای ساخت وابسته است\&. اغلب ضروری است که اطلاعات خاصی در زمان ساخت منتقل شود تا متغیرهای موجود در اسکریپت‌های ساخت بازنویسی (override) شوند\&. این کار می‌تواند از طریق آرگومان‌های مقداردهی متغیر در خط فرمان و/یا در فایل‌های متغیرهای ذخیره‌شده انجام شود\&. .PP برای مواردی که می‌خواهید مقادیر جدیدی را برای متغیرهای ساخت تعیین کنید، SCons یک شیء \fBVariables\fR فراهم می‌کند تا جمع‌آوری آن‌ها و به‌روزرسانی محیط ساخت با این مقادیر را تسهیل کند\&. این قابلیت به پردازش خط فرمان‌هایی مانند این کمک می‌کند: .sp .if n \{\ .RS 4 .\} .nf \fBscons VARIABLE=foo OTHERVAR=bar\fR .fi .if n \{\ .RE .\} .PP متغیرهای ارائه‌شده در خط فرمان همیشه می‌توانند با پیمایش دیکشنری \fIARGUMENTS\fR یا لیست \fIARGLIST\fR به صورت دستی پردازش شوند\&. با این حال، استفاده از یک شیء \fBVariables\fR به شما امکان می‌دهد متغیرهای مورد انتظار را توصیف کنید، تبدیل نوع لازم را انجام دهید، مطابقت مقادیر با محدودیت‌های تعریف‌شده را اعتبارسنجی کنید، و مقادیر پیش‌فرض، پیام‌های راهنما و نام‌های مستعار را تعیین نمایید\&. این رویکرد رابطی مشابه مدیریت گزینه‌ها ارائه می‌دهد (ببینید: \fBAddOption\fR)\&. یک شیء \fBVariables\fR همچنین دریافت مقادیر از یک فایل متغیرهای ذخیره‌شده، یا از یک دیکشنری سفارشی در یک فایل SConscript را امکان‌پذیر می‌سازد\&. سپس می‌توان متغیرهای پردازش‌شده را در محیط ساخت مورد نظر اعمال کرد\&. .PP از نظر مفهومی، هدف‌های خط فرمان کنترل می‌کنند که چه چیزی ساخته شود، متغیرهای خط فرمان (و فایل‌های متغیر) نحوه ساخت را مشخص می‌کنند، و گزینه‌های خط فرمان بر شیوه عملکرد SCons نظارت دارند (اگرچه SCons این تفکیک را اجباری نمی‌کند)\&. .PP برای دریافت شیئی جهت دستکاری متغیرها، تابع سازنده \fBVariables\fR را فراخوانی کنید: .PP \fBVariables\fR([\fIfiles, [args]]\fR) .RS 4 اگر \fIfiles\fR یک نام فایل یا فهرستی از نام‌های فایل باشد، در زمان فراخوانی متد \fBUpdate\fR، به عنوان اسکریپت‌های Python برای تنظیم متغیرهای ذخیره‌شده اجرا می‌شوند\&. این امر امکان استفاده از نحو Python را در مقداردهی‌ها فراهم می‌کند\&. یک فایل متغیرها می‌تواند حاصل فراخوانی پیشین متد \fBSave\fR باشد\&. اگر \fIfiles\fR مشخص نشده باشد، یا آرگومان \fIfiles\fR برابر با \fBNone\fR باشد، هیچ فایلی پردازش نخواهد شد\&. در صورتی که فایلی وجود نداشته باشد اما بخواهید \fIargs\fR را به عنوان یک آرگومان موضعی مشخص کنید، تعیین \fBNone\fR الزامی است؛ همچنین می‌توانید برای اجتناب از آن، از آرگومان‌های کلیدواژه‌ای استفاده کنید\&. اگر هر یک از فایل‌های مشخص‌شده در \fIfiles\fR یافت نشود، بدون هشدار نادیده گرفته می‌شود\&. .sp هر یک از محتواهای نمونه فایل زیر می‌تواند برای تنظیم یک کامپایلر C جایگزین استفاده شود: .sp .if n \{\ .RS 4 .\} .nf CC = \*(Aqmy_cc\*(Aq CC = os\&.environ\&.get(\*(AqCC\*(Aq) .fi .if n \{\ .RE .\} .sp اگر \fIargs\fR مشخص شود، باید یک دیکشنری باشد\&. جفت‌های کلید\-مقدار موجود در \fIargs\fR به جفت‌های به‌دست‌آمده از \fIfiles\fR (در صورت وجود) اضافه خواهند شد\&. کلیدهای \fIargs\fR بر کلیدهای هم‌نام در \fIfiles\fR اولویت دارند\&. در صورت حذف، پیش‌فرض دیکشنری \fIARGUMENTS\fR است که متغیرهای ساخت تعیین‌شده در خط فرمان را نگهداری می‌کند\&. استفاده از \fIARGUMENTS\fR به شما امکان می‌دهد تعیین کنید که اگر یک مقدار هم در خط فرمان و هم در فایل(ها) وجود داشته باشد، مقدار خط فرمان ترجیح داده شود\&. با این حال، هر دیکشنری دلخواهی را می‌توان ارسال کرد\&. مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf vars = Variables(\*(Aqcustom\&.py\*(Aq) vars = Variables(\*(Aqoverrides\&.py\*(Aq, ARGUMENTS) vars = Variables(None, {FOO:\*(Aqexpansion\*(Aq, BAR:7}) vars = Variables(args={FOO:\*(Aqexpansion\*(Aq, BAR:7}) .fi .if n \{\ .RE .\} .sp فراخوانی \fBVariables\fR بدون هیچ آرگومانی معادل است با: .sp .if n \{\ .RS 4 .\} .nf vars = Variables(files=None, args=ARGUMENTS) .fi .if n \{\ .RE .\} .RE .PP یک شیء \fBVariables\fR ظرفی برای توصیف‌های متغیر است که با فراخوانی متدهای \fBAdd\fR یا \fBAddVariables\fR اضافه می‌شوند\&. توصیف یک متغیر شامل یک نام، فهرستی از نام‌های مستعار برای آن نام، یک پیام راهنما، یک مقدار پیش‌فرض، و توابعی برای اعتبارسنجی و تبدیل مقادیر است\&. پردازش منابع ورودی تا زمان فراخوانی متد \fBUpdate\fR به تعویق می‌افتد؛ در این زمان، متغیرها با استفاده از نام خود به عنوان نام متغیر ساخت به محیط ساخت مشخص‌شده افزوده می‌شوند؛ نام‌های مستعار اضافه نخواهند شد\&. متغیرهایی از منابع ورودی که با هیچ‌یک از نام‌ها یا نام‌های مستعار موجود در توصیف‌های متغیر این شیء مطابقت ندارند نادیده گرفته می‌شوند، با این تفاوت که دیکشنری‌ای از نام‌ها و مقادیر آن‌ها در ویژگی \fIunknown\fR از شیء \fBVariables\fR در دسترس قرار می‌گیرد\&. این فهرست از طریق متد \fBUnknownVariables\fR نیز قابل دریافت است\&. اگر توصیف یک متغیر مقدار پیش‌فرضی غیر از None داشته باشد و در منابع ورودی ظاهر نشود، با مقدار پیش‌فرض خود به محیط ساخت افزوده می‌شود\&. فهرستی از متغیرهایی که از مقادیر پیش‌فرضشان تنظیم شده‌اند و نه از منابع ورودی، در ویژگی \fIdefaulted\fR شیء \fBVariables\fR در دسترس است\&. اطلاعات متغیرهای ناشناخته و متغیرهای پیش‌فرض تا زمانی که متد \fBUpdate\fR اجرا نشده باشد، در دسترس نیستند\&. .PP از آن‌جا که متغیرها در نهایت به عنوان متغیرهای ساخت (construction variables) اضافه می‌شوند، باید نام‌هایی را برای متغیرها انتخاب کنید که ناخواسته متغیرهای ساخت از پیش تعریف‌شده‌ای را که پروژه‌تان از آن‌ها استفاده می‌کند تغییر ندهند (برای مرجع به بخش \(lqConstruction Variables\(rq مراجعه کنید)، زیرا مقادیر مشخص‌شده به متغیرهای ساخت مربوطه انتساب داده می‌شوند، نه اینکه با آن‌ها ادغام گردند\&. .PP زیرسیستم \fBVariables\fR به طور مستقیم روشی را برای تعریف متغیری که کاربر \fIحتماً باید\fR آن را مشخص کند پشتیبانی نمی‌کند، اما می‌توان این حالت را با استفاده از یک تابع اعتبارسنج (validator) و تعیین یک مقدار پیش‌فرض که اعتبارسنج آن را رد می‌کند شبیه‌سازی کرد، که منجر به پیام خطای مقدار نامعتبر می‌شود (متدهای کمکی \fBEnumVariable\fR و \fBListVariable\fR این کار را نسبتاً ساده می‌کنند)\&. .PP یک شیء \fBVariables\fR دارای متدهای زیر است: .PP \fIvars\fR\&.\fBAdd\fR(\fIkey, [help, default, validator, converter, subst]\fR) .RS 4 افزودن یک متغیر ساخت قابل سفارشی‌سازی به شیء \fBVariables\fR\&. پارامتر \fIkey\fR یا نام متغیر است، یا دنباله‌ای از رشته‌ها، که در این حالت اولین مورد در دنباله به عنوان نام متغیر در نظر گرفته شده و سایر مقادیر به عنوان نام‌های مستعار برای متغیر منظور می‌شوند\&. \fIkey\fR اجباری است، فیلدهای دیگر اختیاری هستند\&. .sp \fIhelp\fR متن راهنما برای متغیر است (پیش‌فرض یک رشتهٔ خالی است)\&. .sp \fIdefault\fR مقداری است که در صورت ارائه نشدن هیچ مقداری در منابع ورودی، در محیط ساخت به متغیر تخصیص می‌یابد\&. اگر \fIdefault\fR برابر None باشد (حالت پیش‌فرض)، متغیر به محیط ساخت اضافه نمی‌شود مگر اینکه به طور صریح در منابع ورودی تنظیم شده باشد\&. مقدار پیش‌فرض می‌تواند از نوع مورد نظر، یا رشته‌ای باشد که \fIconverter\fR بتواند آن را به آن نوع تبدیل کند\&. .sp اگر آرگومان \fIvalidator\fR مشخص شود، یک تابع بازفراخوانی برای اعتبارسنجی مقدار متغیر است\&. اعتبارسنج هنگامی که متد \fBUpdate\fR فراخوانی شود صدا زده می‌شود\&. یک اعتبارسنج باید سه آرگومان بپذیرد: \fIkey\fR، \fIvalue\fR و \fIenv\fR\&. در صورتی که مقدار نامعتبر باشد باید یک استثنا (با یک پیام خطای مفید) ایجاد کند؛ هیچ مقدار بازگشتی مورد انتظار نیست\&. .sp اگر آرگومان \fIconverter\fR مشخص شود، یک تابع بازفراخوانی برای تبدیل مقدار به قالب مورد نظر برای محیط ساخت است\&. مبدل پیش از اعتبارسنج فراخوانی می‌شود\&. باید مقداری را برگرداند، که سپس به \fIvalidator\fR (در صورت وجود) فرستاده می‌شود\&. یک مبدل باید حداقل آرگومان \fIvalue\fR را بپذیرد، و در صورتی که نیاز به دسترسی به محیط ساخت داشته باشد، می‌تواند به صورت اختیاری \fIenv\fR را به عنوان آرگومان دوم بپذیرد\&. به طور کلی، مبدل نباید با شکست مواجه شود و بررسی‌های اعتبارسنجی را به اعتبارسنج واگذار می‌کند، اگرچه اگر انجام یک عملیات غیرممکن باشد یا اعتبارسنج جداگانه‌ای وجود نداشته باشد، می‌تواند یک ValueError ایجاد کند\&. .sp اگر آرگومان \fIsubst\fR مشخص شود، یک مقدار بولی است که نشان می‌دهد آیا پیش از ارسال مقدار به توابع مبدل و اعتبارسنج، جایگزینی روی مقدار انجام شود یا خیر\&. مقدار پیش‌فرض True است\&. غیرفعال کردن جایگزینی زمانی مفید است که مقدار متغیر شبیه به یک ارجاع متغیر ساخت (مانند $VAR) باشد و اعتبارسنج یا مبدل باید آن را بسط‌نیافته ببینند\&. .sp به عنوان یک حالت خاص، اگر \fIkey\fR یک دنباله و \fIتنها\fR آرگومان ورودی به \fBAdd\fR باشد، به شش پارامتر \fIkey\fR، \fIhelp\fR، \fIdefault\fR، \fIvalidator\fR، \fIconverter\fR و \fIsubst\fR باز می‌شود، و هر عضو ناموجود از سمت راست با مقادیر پیش‌فرض مربوطه پر می‌شود\&. این حالت امکان استفاده از تاپل حاصل از توابع تسهیل‌کنندهٔ \fBBoolVariable\fR، \fBEnumVariable\fR، \fBListVariable\fR، \fBPackageVariable\fR و \fBPathVariable\fR را فراهم می‌کند\&. .sp مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf vars\&.Add(\*(AqCC\*(Aq, help=\*(AqThe C compiler\*(Aq) def valid_color(key, val, env): if not val in [\*(Aqred\*(Aq, \*(Aqblue\*(Aq, \*(Aqyellow\*(Aq]: raise Exception("Invalid color value \*(Aq%s\*(Aq" % val) vars\&.Add(\*(AqCOLOR\*(Aq, validator=valid_color) .fi .if n \{\ .RE .\} .sp \fIتغییریافته در نسخهٔ 4\&.8\&.0:\fR پارامتر \fIsubst\fR اضافه شد\&. .RE .PP \fIvars\fR\&.\fBAddVariables\fR(\fIargs\fR) .RS 4 یک متد تسهیل‌کننده که یک یا چند متغیر ساخت قابل سفارشی‌سازی را با یک فراخوانی به شیء \fBVariables\fR اضافه می‌کند؛ معادل چندین بار فراخوانی \fBAdd\fR\&. هر عضو \fIargs\fR باید یک تاپل شامل آرگومان‌ها برای فراخوانی مجزای متد \fBAdd\fR با استفاده از ساختار "حالت خاص" باشد؛ سایر شیوه‌های فراخوانی (آرگومان‌های مکانی منفرد و/یا آرگومان‌های کلیدواژه‌ای) پشتیبانی نمی‌شوند\&. .sp .if n \{\ .RS 4 .\} .nf opt\&.AddVariables( ("debug", "", 0), ("CC", "The C compiler"), ("VALIDATE", "An option for testing validation", "notset", validator, None), ) .fi .if n \{\ .RE .\} .RE .PP \fIvars\fR\&.\fBFormatVariableHelpText\fR(\fIenv, opt, help, default, actual, aliases\fR) .RS 4 یک رشته قالب‌بندی‌شده حاوی متن راهنمای قابل‌چاپ برای متغیر تکی \fIopt\fR را برمی‌گرداند\&. تمام آرگومان‌ها باید ارائه شوند، به‌جز \fIaliases\fR که اختیاری است\&. \fIenv\fR محیط ساخت (construction environment) حاوی مقادیر متغیر است، (\fIenv\fR توسط پیاده‌سازی استاندارد \fBFormatVariableHelpText\fR استفاده نمی‌شود)؛ \fIvar\fR نام متغیر است؛ \fIhelp\fR متن پیام راهنمای اولیه هنگام افزودن متغیر به شیء \fBVariables\fR است؛ \fIdefault\fR مقدار پیش‌فرضی است که هنگام افزودن متغیر به شیء \fBVariables\fR تخصیص داده شده است؛ \fIactual\fR مقداری است که در \fIenv\fR تعیین شده است (که در صورت عدم انتساب توسط منابع ورودی، ممکن است برابر با \fIdefault\fR باشد)؛ و \fIaliases\fR هرگونه نام مستعار برای متغیر است، که در صورت حذف شدن، به‌طور پیش‌فرض یک فهرست خالی خواهد بود\&. .sp \fBFormatVariableHelpText\fR به‌طور معمول مستقیماً فراخوانی نمی‌شود، بلکه توسط \fBGenerateHelpText\fR که وظیفه به‌دست آوردن مقادیر لازم را بر عهده دارد، فراخوانی می‌گردد\&. برای سفارشی‌سازی ظاهر پیام‌های راهنمای متغیر، می‌توانید تابع اختصاصی خود را با همان امضای تابع جایگزین کنید\&. مثال: .sp .if n \{\ .RS 4 .\} .nf def my_format(env, var, help, default, actual): fmt = "\en%s: default=%s actual=%s (%s)\en" return fmt % (var, default, actual, help) vars\&.FormatVariableHelpText = my_format .fi .if n \{\ .RE .\} .sp توجه داشته باشید که \fBGenerateHelpText\fR هیچ خط خالی یا نویسه اضافه‌ای میان مدخل‌ها قرار نمی‌دهد؛ بنابراین اگر می‌خواهید مدخل‌ها جدا شوند، باید این نویسه‌ها را به رشته بازگشتی اضافه کنید\&. .RE .PP \fIvars\fR\&.\fBGenerateHelpText\fR(\fIenv, [sort]\fR) .RS 4 یک رشته قالب‌بندی‌شده حاوی متن راهنمای گردآوری‌شده از تمام متغیرهای پیکربندی‌شده در این شیء \fBVariables\fR را بازمی‌گرداند\&. این رشته برای ارسال به تابع \fBHelp\fR مناسب است\&. رشته تولیدشده شامل نشانگری از مقدار واقعی در محیط ارائه‌شده توسط \fIenv\fR است\&. .sp اگر پارامتر اختیاری \fIsort\fR روی یک مقدار قابل‌فراخوانی (callable) تنظیم شده باشد، از آن به‌عنوان تابع مقایسه برای تعیین نحوه مرتب‌سازی متغیرهای افزوده‌شده استفاده می‌شود\&. این تابع باید دو آرگومان را بپذیرد، آن‌ها را با هم مقایسه کند و در صورتی که اولی کوچک‌تر از دومی باشد یک عدد صحیح منفی، در صورت برابر بودن صفر، و در صورتی که بزرگ‌تر باشد یک عدد صحیح مثبت بازگرداند\&. اگر \fIsort\fR قابل‌فراخوانی نباشد اما به مقدار درست (true) ارزیابی شود، یک مرتب‌سازی الفبایی انجام می‌شود\&. پیش‌فرض \fBFalse\fR (مرتب‌نشده) است\&. .sp .if n \{\ .RS 4 .\} .nf Help(vars\&.GenerateHelpText(env)) def cmp(a, b): return (a > b) \- (a < b) Help(vars\&.GenerateHelpText(env, sort=cmp)) .fi .if n \{\ .RE .\} .RE .PP \fIvars\fR\&.\fBSave\fR(\fIfilename, env\fR) .RS 4 متغیرهای تنظیم‌شده فعلی را در یک فایل اسکریپت به نام \fIfilename\fR ذخیره می‌کند\&. می‌توانید این متغیرهای ذخیره‌شده را در اجرای بعدی با ارسال فایل به تابع \fBVariables\fR بارگذاری کنید\&. این کار روشی برای ذخیره موقت (کَش) تنظیمات خاص متغیرها جهت استفاده مجدد فراهم می‌آورد\&. تنها متغیرهایی که روی مقادیری غیر از پیش‌فرض تنظیم شده‌اند ذخیره می‌شوند\&. هر متغیر انتخاب‌شده به‌صورت یک دستور انتساب Python ذخیره می‌شود\&. محتویات قبلی فایل ذخیره نگهداری نمی‌شوند، مگر اینکه برای مقداردهی اولیه به شیء Variables به‌کار رفته باشند\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment() vars = Variables([\*(Aqvariables\&.cache\*(Aq, \*(Aqcustom\&.py\*(Aq]) vars\&.Add(\&.\&.\&.) vars\&.Update(env) vars\&.Save(\*(Aqvariables\&.cache\*(Aq, env) .fi .if n \{\ .RE .\} .RE .PP \fIvars\fR\&.\fBUnknownVariables\fR() .RS 4 یک دیکشنری شامل تمام متغیرهایی برمی‌گرداند که هنگام فراخوانی \fBVariables\fR در پارامترهای \fIfiles\fR و/یا \fIargs\fR مشخص شده بودند، اما شیء در واقع برای آن‌ها پیکربندی نشده بود\&. این اطلاعات تا زمانی که متد \fBUpdate\fR اجرا نشده باشد در دسترس نیست\&. .sp .if n \{\ .RS 4 .\} .nf env = Environment(variables=vars) for key, value in vars\&.UnknownVariables(): print("unknown variable: %s=%s" % (key, value)) .fi .if n \{\ .RE .\} .RE .PP \fIvars\fR\&.\fBUpdate\fR(\fIenv, [args]\fR) .RS 4 منابع ورودی ثبت‌شده هنگام راه‌اندازی شیء \fBVariables\fR را پردازش کرده و \fIenv\fR را با متغیرهای ساخت سفارشی‌شده به‌روزرسانی می‌کند\&. نام‌های هر متغیری در منابع ورودی که در شیء \fBVariables\fR پیکربندی نشده باشند ثبت شده و می‌توان با استفاده از متد \fBUnknownVariables\fR آن‌ها را بازیابی کرد\&. .sp اگر آرگومان اختیاری \fIargs\fR ارائه شود، باید یک دیکشنری از متغیرها باشد که به‌جای دیکشنری ذخیره‌شده در هنگام ایجاد شیء \fBVariables\fR استفاده خواهد شد\&. .sp به‌طور معمول، \fBUpdate\fR به‌صورت مستقیم فراخوانی نمی‌شود، بلکه به‌طور غیرمستقیم با ارسال شیء \fBVariables\fR به تابع \fBEnvironment\fR فراخوانی می‌گردد: .sp .if n \{\ .RS 4 .\} .nf env = Environment(\&.\&.\&., variables=vars) .fi .if n \{\ .RE .\} .RE .PP یک شیء \fBVariables\fR همچنین دو مشخصه داده‌ای در دسترس قرار می‌دهد که می‌توانند برای اطلاعات بیشتر خوانده شوند\&. این‌ها تنها در صورتی مقدار دارند که \fBUpdate\fR قبلاً اجرا شده باشد\&. .PP \fIvars\fR\&.\fIdefaulted\fR .RS 4 فهرستی از نام متغیرهایی که در محیط ساخت (construction environment) بر اساس مقادیر پیش‌فرض در توصیفات متغیر تنظیم شده‌اند \- یعنی متغیرهایی که دارای مقدار پیش‌فرض بوده و در منابع ورودی تعریف نشده بودند\&. .RE .PP \fIvars\fR\&.\fIunknown\fR .RS 4 دیکشنری‌ای از متغیرهایی که در منابع ورودی مشخص شده بودند، اما تعاریف متغیر منطبقی برای آن‌ها وجود ندارد\&. این همان اطلاعاتی است که توسط متد \fBUnknownVariables\fR بازگردانده می‌شود\&. .RE .PP \fIاضافه‌شده در 4\&.9\&.0\fR: مشخصه \fIdefaulted\fR\&. .PP ابزار SCons پنج نوع متغیر از پیش تعریف‌شده فراهم می‌کند که از طریق توابع کارخانه‌ای (factory functions) در دسترس هستند؛ این توابع یک چندتایی (tuple) مناسب برای ارسال مستقیم به متدهای \fBAdd\fR یا \fBAddVariables\fR تولید می‌کنند\&. .PP \fBBoolVariable\fR(\fIkey, help, default\fR) .RS 4 یک متغیر بولی با نام \fIkey\fR راه‌اندازی می‌کند\&. این متغیر مقدار پیش‌فرضی برابر با \fIdefault\fR خواهد داشت و \fIhelp\fR بخش توضیحی متن راهنما را تشکیل خواهد داد\&. این متغیر مقادیر خط فرمان \fBy\fR، \fByes\fR، \fBt\fR، \fBtrue\fR، \fB1\fR، \fBon\fR و \fBall\fR را به عنوان true، و مقادیر خط فرمان \fBn\fR، \fBno\fR، \fBf\fR، \fBfalse\fR، \fB0\fR، \fBoff\fR و \fBnone\fR را به عنوان false تفسیر خواهد کرد\&. .RE .PP \fBEnumVariable\fR(\fIkey, help, default, allowed_values, [map, ignorecase]\fR) .RS 4 یک متغیر با نام \fIkey\fR راه‌اندازی می‌کند که مقدار آن تنها می‌تواند از یک فهرست مشخص از مقادیر («شمارش») انتخاب شود\&. متغیر مقدار پیش‌فرضی برابر با \fIdefault\fR خواهد داشت و \fIhelp\fR بخش توضیحی متن راهنما را شکل می‌دهد\&. هر مقداری که در \fIallowed_values\fR نباشد خطایی صادر خواهد کرد، به جز این‌که آرگومان اختیاری \fImap\fR دیکشنری‌ای است که می‌تواند برای نگاشت نام‌های اضافی به یک نام خاص در فهرست \fIallowed_values\fR استفاده شود\&. اگر آرگومان اختیاری \fIignorecase\fR برابر با 0 باشد (پیش‌فرض)، مقادیر حساس به حروف کوچک و بزرگ در نظر گرفته می‌شوند\&. اگر \fIignorecase\fR برابر با 1 باشد، تطبیق مقادیر بدون حساسیت به حروف کوچک و بزرگ انجام می‌شود\&. اگر \fIignorecase\fR برابر با 2 باشد، تطبیق مقادیر بدون حساسیت به حروف کوچک و بزرگ انجام شده و تمام مقادیر ورودی به حروف کوچک تبدیل می‌شوند\&. .RE .PP \fBListVariable\fR(\fIkey, help, default, names, [map, validator]\fR) .RS 4 یک متغیر با نام \fIkey\fR راه‌اندازی می‌کند که مقدار آن می‌تواند یک یا چند انتخاب از فهرستی مشخص از مقادیر باشد\&. متغیر مقدار پیش‌فرضی برابر با \fIdefault\fR خواهد داشت و \fIhelp\fR بخش توضیحی متن راهنما را تشکیل خواهد داد\&. هر مقداری که در \fInames\fR یا مقادیر ویژه \fBall\fR یا \fBnone\fR نباشد، خطایی صادر خواهد کرد\&. برای تعیین چندین مقدار از جداکننده ویرگول استفاده کنید\&. \fIdefault\fR می‌تواند به صورت یک رشته از مقادیر جداشده با ویرگول یا یک فهرست Python از مقادیر مشخص شود\&. .sp آرگومان اختیاری \fImap\fR یک دیکشنری است که می‌تواند برای تبدیل مقادیر ورودی به مقادیر معتبر خاص در فهرست \fInames\fR استفاده شود\&. (توجه داشته باشید که مقادیر اضافیِ پذیرفته‌شده از طریق استفاده از \fImap\fR در پیام راهنمای تولیدشده بازتاب نمی‌یابند)\&. .sp آرگومان اختیاری \fIvalidator\fR می‌تواند برای تعیین یک تابع بازخوان (callback) اعتبارسنج سفارشی، همان‌طور که برای \fBAdd\fR شرح داده شده است، استفاده شود\&. حالت پیش‌فرض، استفاده از یک روتین اعتبارسنج داخلی است\&. .sp \fIاضافه‌شده در 4\&.8\&.0\fR: پارامتر \fIvalidator\fR\&. .RE .PP \fBPackageVariable\fR(\fIkey, help, default\fR) .RS 4 یک متغیر با نام \fIkey\fR برای کمک به کنترل یک مؤلفه ساخت، مانند یک بسته نرم‌افزاری، راه‌اندازی می‌کند\&. مشابه با یک \fBBoolVariable\fR، اما می‌تواند یک رشته مسیر را نیز برای ارائه اطلاعات بیشتر به ساخت مشخص کند؛ مثلاً مسیر یک فایل پیکربندی که بسته را توصیف می‌کند، یا یک دایرکتوری حاوی سرآیندها و کتابخانه‌های بسته\&. این متغیر مقدار پیش‌فرضی برابر با \fIdefault\fR خواهد داشت و پارامتر \fIhelp\fR به عنوان بخش توضیحی متن راهنما به کار خواهد رفت\&. .sp هر یک از رشته‌های (بدون حساسیت به بزرگی و کوچکی حروف) \fB1\fR، \fByes\fR، \fBtrue\fR، \fBon\fR، \fBenable\fR یا \fBsearch\fR می‌توانند برای نشان دادن «فعال بودن» بسته به کار روند و همچنین می‌توانند به عنوان مقدار \fIdefault\fR استفاده شوند\&. به جز در مورد حالت خاصی که برای یک رشته مسیر شرح داده شد، مقدار بولی \fBTrue\fR تولید می‌شود\&. .sp هر یک از رشته‌های (بدون حساسیت به بزرگی و کوچکی حروف) \fB0\fR، \fBno\fR، \fBfalse\fR، \fBoff\fR یا \fBdisable\fR می‌توانند برای نشان دادن «غیرفعال بودن» بسته به کار روند و همچنین می‌توانند به عنوان مقدار \fIdefault\fR استفاده شوند\&. مقدار بولی \fBFalse\fR تولید می‌شود\&. .sp رشته‌ای که نه رشته فعال‌ساز باشد و نه رشته غیرفعال‌ساز، یک «رشته مسیر» در نظر گرفته می‌شود\&. یک رشته مسیر می‌تواند هنگام تعیین متغیر ارائه شود و همچنین می‌تواند به عنوان مقدار \fIdefault\fR به کار رود\&. یک رشته مسیر باید به یک مسیر موجود در فایل‌سیستم اشاره داشته باشد، اما تصمیم‌گیری در مورد معنای بیشتر آن بر عهده سیستم ساخت است\&. رشته مسیر تولید می‌شود\&. به عنوان یک حالت ویژه، اگر \fIdefault\fR یک رشته مسیر باشد و متغیر با یک رشته فعال‌ساز مشخص شود، به جای True، رشته مسیر پیش‌فرض تولید می‌شود\&. .RE .PP \fBPathVariable\fR(\fIkey, help, default, [validator]\fR) .RS 4 متغیری به نام \fIkey\fR را برای نگه‌داری یک رشتهٔ مسیر تنظیم می‌کند\&. این متغیر مقدار پیش‌فرضی برابر با \fIdefault\fR خواهد داشت و از پارامتر \fIhelp\fR به‌عنوان بخش توضیحی متن راهنما استفاده می‌شود\&. .sp پارامتر اختیاری \fIvalidator\fR یک تابع بازخورد (callback) را تعریف می‌کند که برای بررسی پذیرفتنی بودن مسیر مشخص‌شده فراخوانی خواهد شد\&. SCons اعتبارسنج‌های آمادهٔ زیر را ارائه می‌دهد: .PP PathVariable\&.\fBPathExists\fR .RS 4 بررسی می‌کند که مسیر مشخص‌شده وجود داشته باشد (این رفتار پیش‌فرض در صورت عدم ارائهٔ \fIvalidator\fR است)\&. .RE .PP PathVariable\&.\fBPathIsFile\fR .RS 4 بررسی می‌کند که مسیر مشخص‌شده وجود داشته باشد و یک فایل عادی باشد\&. .RE .PP PathVariable\&.\fBPathIsDir\fR .RS 4 بررسی می‌کند که مسیر مشخص‌شده وجود داشته باشد و یک دایرکتوری باشد\&. .RE .PP PathVariable\&.\fBPathIsDirCreate\fR .RS 4 بررسی می‌کند که مسیر مشخص‌شده وجود داشته باشد و یک دایرکتوری باشد؛ اگر وجود نداشته باشد، دایرکتوری را ایجاد می‌کند\&. .RE .PP PathVariable\&.\fBPathAccept\fR .RS 4 آرگومان نام مسیر مشخص‌شده را بدون اعتبارسنجی می‌پذیرد؛ برای مثال مناسب برای شرایطی است که می‌خواهید کاربران بتوانند مسیر دایرکتوری‌ای را مشخص کنند که قرار است در طول فرایند ساخت ایجاد شود\&. .RE .sp می‌توانید تابع \fIvalidator\fR سفارشی خود را ارائه دهید که باید سه آرگومان را بپذیرد: \fIkey\fR، نام متغیری که باید تنظیم شود؛ \fIval\fR، مقدار مشخص‌شده‌ای که بررسی می‌شود؛ و \fIenv\fR، محیط ساخت (construction environment)؛ و در صورتی که مقدار مشخص‌شده پذیرفتنی نباشد، باید یک استثنا (exception) ایجاد کند\&. .RE .PP این توابع ایجاد چندین متغیر با رفتاری یکدست را در قالب یک فراخوانی منفرد به متد \fBAddVariables\fR آسان می‌سازند: .sp .if n \{\ .RS 4 .\} .nf vars\&.AddVariables( BoolVariable( "warnings", help="compilation with \-Wall and similar", default=True, ), EnumVariable( "debug", help="debug output and symbols", default="no", allowed_values=("yes", "no", "full"), map={}, ignorecase=0, # case\-sensitive ), ListVariable( "shared", help="libraries to build as shared libraries", default="all", names=list_of_libs, ), PackageVariable( "x11", help="use X11 installed here (yes = search some places)", default="yes", ), PathVariable( "qtdir", help="where the root of Qt is installed", default=qtdir ), PathVariable( "foopath", help="where the foo library is installed", default=foopath, validator=PathVariable\&.PathIsDir, ), ) .fi .if n \{\ .RE .\} .SS "اشیاء گره (Node Objects)" .PP SCons اشیائی را که منبع یا هدف عملیات ساخت هستند به‌صورت گره‌ها (Nodes)، که ساختارهای داده درونی‌اند، نمایش می‌دهد\&. چندین نوع گره قابل‌مشاهده برای کاربر وجود دارد: گره‌های فایل (File Nodes)، گره‌های دایرکتوری (Directory Nodes)، گره‌های مقدار (Value Nodes) و گره‌های نام مستعار (Alias Nodes)\&. برخی از انواع گره‌ها دارای مشخصه‌ها و متدهای عمومی هستند که در ادامه توضیح داده شده‌اند\&. هر یک از انواع گره یک تابع سراسری و یک متد محیطی متناظر برای ایجاد نمونه‌ها دارند: \fBFile\fR، \fBDir\fR، \fBValue\fR و \fBAlias\fR\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBگره‌های سامانه فایل (Filesystem Nodes)\fR .RS 4 .PP توابع/متدهای \fBFile\fR و \fBDir\fR به‌ترتیب گره‌های فایل و گره‌های دایرکتوری را بازمی‌گردانند\&. چنین گره‌های سامانه فایلی نماینده مؤلفه‌های ساختی هستند که با مدخلی در سامانه فایل رایانه متناظرند، فارغ از اینکه در زمان ایجاد گره چنین مدخلی وجود داشته باشد یا خیر\&. معمولاً نیازی به ایجاد صریح گره‌های سامانه فایل ندارید، زیرا زمانی که رشته‌ای را به‌عنوان هدف یا منبع یک Builder مشخص می‌کنید، SCons گره‌ها را برحسب نیاز برای پر کردن گراف وابستگی ایجاد خواهد کرد\&. سازنده‌ها (Builders) گره(های) هدف را در قالب یک فهرست بازمی‌گردانند که سپس می‌توانید از آن‌ها استفاده کنید\&. با این حال، از آنجا که گره‌های سامانه فایل مشخصه‌ها و متدهای عمومی مفیدی دارند که می‌توانید در فایل‌های SConscript به‌کار گیرید، گاهی مناسب است که آن‌ها را به‌صورت دستی و خارج از روال معمول فراخوانی یک Builder بسازید\&. .PP مشخصه‌های زیر اطلاعاتی درباره یک Node ارائه می‌دهند: .PP \fInode\fR\&.\fIpath\fR .RS 4 مسیر ساخت فایل یا دایرکتوری داده‌شده\&. این مسیر نسبت به دایرکتوری ریشه پروژه سنجیده می‌شود\&. در صورتی که از \fIvariant_dir\fR استفاده نشود، مسیر ساخت با مسیر منبع یکسان خواهد بود\&. .RE .PP \fInode\fR\&.\fIabspath\fR .RS 4 مسیر ساخت مطلق فایل یا دایرکتوری داده‌شده\&. .RE .PP \fInode\fR\&.\fIrelpath\fR .RS 4 مسیر ساخت فایل یا دایرکتوری داده‌شده نسبت به دایرکتوری ریشه پروژه\&. .RE .PP \fInode\fR\&.\fBsrcnode\fR() .RS 4 متد \fBsrcnode\fR گره فایل یا دایرکتوری دیگری را بازمی‌گرداند که نمایانگر مسیر منبع گره فایل یا دایرکتوری داده‌شده است\&. .RE .PP نمونه‌ها: .sp .if n \{\ .RS 4 .\} .nf # دریافت مسیر دایرکتوری ساخت جاری، نسبت به ریشه پروژه\&. Dir(\*(Aq\&.\*(Aq)\&.path # مسیر مطلق دایرکتوری جاری Dir(\*(Aq\&.\*(Aq)\&.abspath # مسیر دایرکتوری جاری نسبت به دایرکتوری ریشه پروژه Dir(\*(Aq\&.\*(Aq)\&.relpath # خط بعدی همیشه \*(Aq\&.\*(Aq است، زیرا مسیر دایرکتوری ریشه نسبت به خودش است\&. Dir(\*(Aq#\&.\*(Aq)\&.path # مسیر منبع فایل منبع داده‌شده\&. File(\*(Aqfoo\&.c\*(Aq)\&.srcnode()\&.path # سازنده‌ها فهرستی از اشیاء File بازمی‌گردانند: foo = env\&.Program(\*(Aqfoo\&.c\*(Aq) print("foo will be built in", foo[0]\&.path) .fi .if n \{\ .RE .\} .PP اشیاء گره سامانه فایل متدهایی برای ایجاد گره‌های سامانه فایل جدید نسبت به گره اصلی دارند\&. همچنین مواقعی وجود دارد که ممکن است نیاز به ارجاع به مدخلی در سامانه فایل داشته باشید بدون اینکه از قبل بدانید آن مدخل یک فایل است یا یک دایرکتوری\&. برای این موقعیت‌ها، متد \fBEntry\fR در اشیاء گره سامانه فایل وجود دارد که گره‌ای را بازمی‌گرداند که می‌تواند نمایانگر یک فایل یا یک دایرکتوری باشد\&. .PP اگر گره اصلی یک گره دایرکتوری باشد، این متدها گره جدید را درون دایرکتوری‌ای قرار می‌دهند که گره اصلی نشان می‌دهد: .PP \fInode\fR\&.\fBDir\fR(\fIname\fR) .RS 4 یک گره دایرکتوری با نام \fIname\fR بازمی‌گرداند که زیردایرکتوری‌ای از دایرکتوری نشان‌داده‌شده توسط \fInode\fR است\&. .RE .PP \fInode\fR\&.\fBFile\fR(\fIname\fR) .RS 4 یک گره فایل با نام \fIname\fR در دایرکتوری نشان‌داده‌شده توسط \fInode\fR بازمی‌گرداند\&. .RE .PP \fInode\fR\&.\fBEntry\fR(\fIname\fR) .RS 4 یک گره حل‌نشده با نام \fIname\fR در دایرکتوری نشان‌داده‌شده توسط \fInode\fR بازمی‌گرداند\&. .RE .PP اگر گره اصلی یک گره فایل باشد، این متدها گره جدید را در همان دایرکتوری‌ای قرار می‌دهند که گره اصلی در آن قرار دارد: .PP \fInode\fR\&.\fBDir\fR(\fIname\fR) .RS 4 یک گره با نام \fIname\fR برای دایرکتوری‌ای در دایرکتوری والدِ فایلِ نشان‌داده‌شده توسط \fInode\fR بازمی‌گرداند\&. .RE .PP \fInode\fR\&.\fBFile\fR(\fIname\fR) .RS 4 یک گره با نام \fIname\fR برای فایلی در دایرکتوری والدِ فایلِ نشان‌داده‌شده توسط \fInode\fR بازمی‌گرداند\&. .RE .PP \fInode\fR\&.\fBEntry\fR(\fIname\fR) .RS 4 یک گره حل‌نشده با نام \fIname\fR در دایرکتوری والدِ فایلِ نشان‌داده‌شده توسط \fInode\fR بازمی‌گرداند\&. .RE .PP برای نمونه: .sp .if n \{\ .RS 4 .\} .nf # دریافت یک Node برای یک فایل درون یک دایرکتوری incl = Dir(\*(Aqinclude\*(Aq) f = incl\&.File(\*(Aqheader\&.h\*(Aq) # دریافت یک Node برای یک زیردایرکتوری درون یک دایرکتوری dist = Dir(\*(Aqproject\-3\&.2\&.1\*(Aq) src = dist\&.Dir(\*(Aqsrc\*(Aq) # دریافت یک Node برای فایلی در همان دایرکتوری cfile = File(\*(Aqsample\&.c\*(Aq) hfile = cfile\&.File(\*(Aqsample\&.h\*(Aq) # نمونه ترکیبی docs = Dir(\*(Aqdocs\*(Aq) html = docs\&.Dir(\*(Aqhtml\*(Aq) index = html\&.File(\*(Aqindex\&.html\*(Aq) css = index\&.File(\*(Aqapp\&.css\*(Aq) .fi .if n \{\ .RE .\} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBگره‌های Value و Alias\fR .RS 4 .PP SCons دو نوع Node دیگر را برای نمایش اشیایی فراهم می‌کند که ورودی معادل در سیستم‌فایل (filesystem) نخواهند داشت\&. چنین Nodeهایی همواره باید به‌صورت صریح ایجاد شوند\&. .PP متد \fBAlias\fR یک Alias Node بازمی‌گرداند\&. نام‌های مستعار (Aliases) اشیایی مجازی هستند \- خود آن‌ها منجر به ساخته شدن اشیاء فیزیکی نمی‌شوند، بلکه به گراف وابستگی مرتبط با منابعشان (sources) وارد می‌شوند\&. به‌روز بودن یک alias با بررسی به‌روز بودن منابع آن سنجیده می‌شود\&. یک alias با اطمینان از این‌که منابعش ساخته شده‌اند ساخته می‌شود و در صورت انجام هرگونه ساخت، هرگونه Action که به عنوان بخشی از alias تعریف شده است اعمال می‌گردد\&. .PP یک فراخوانی \fBAlias\fR مدخلی را در فضای‌نام alias ایجاد می‌کند که برای رفع ابهام به کار می‌رود\&. اگر منبع یک alias نامی با مقدار رشته‌ای داشته باشد، به یک Node مدخل سیستم‌فایل حل (resolve) می‌شود، مگر آن‌که در فضای‌نام alias یافت شود، که در این حالت به Node منطبق از نوع alias حل خواهد شد\&. در نتیجه، ترتیب فراخوانی‌های \fBAlias\fR دارای اهمیت است\&. یک alias می‌تواند به alias دیگری ارجاع دهد، اما تنها در صورتی که آن alias دیگر پیش‌تر ایجاد شده باشد\&. .PP متد \fBValue\fR یک Value Node بازمی‌گرداند\&. گره‌های Value Node اغلب برای داده‌های تولیدشده‌ای استفاده می‌شوند که هیچ مدخل متناظری در سیستم‌فایل ندارند، اما برای تعیین این‌که آیا یک هدف ساخت قدیمی (out\-of\-date) است یا خیر، یا برای گنجانده شدن به عنوان بخشی از یک Action ساخت به کار می‌روند\&. نمونه‌های رایج شامل رشته‌های برچسب زمانی (timestamp)، رشته‌های نسخه سیستم کنترل نگارش و سایر رشته‌های تولیدشده در زمان اجرا (run\-time) هستند\&. .PP یک Value Node می‌تواند همچنین هدف (target) یک builder باشد\&. .RE .SH "گسترش SCONS (EXTENDING SCONS)" .PP SCons به‌گونه‌ای طراحی شده است که از طریق امکانات ارائه‌شده قابل گسترش باشد، بنابراین برای سفارشی‌سازی رفتار آن، به‌ندرت به تغییر کدِ خودِ SCons نیاز است\&. تعدادی از عملیات اصلی از اشیای قابل فراخوانی (callable objects) استفاده می‌کنند که با نوشتن موارد دلخواه خود می‌توانید آن‌ها را تکمیل کنید\&. Builders، Scanners و Tools هر یک از نوعی سامانهٔ افزونه‌ای استفاده می‌کنند که به شما اجازه می‌دهد به‌سادگی موارد جدیدی را به کار بگیرید\&. اطلاعات دربارهٔ ایجاد Builder Objects و Scanner Objects در بخش‌های بعدی آمده است\&. دستورالعمل‌هایی که SCons در عمل برای ساخت چیزها به کار می‌برد Actions نام دارند، و ایجاد Action Objects و سپردن آن‌ها به اشیایی که نیاز به دانستن آن کنش‌ها دارند ساده است (علاوه بر Builders، به \fBAddPostAction\fR، \fBAddPreAction\fR و \fBAlias\fR برای نمونه‌هایی دیگر از بخش‌هایی که Actions را می‌پذیرند مراجعه کنید)\&. Action Objects نیز در ادامه تشریح شده‌اند\&. افزودن پیمانه‌های جدید Tool در Tool Modules توضیح داده شده است\&. .SS "اشیای سازنده (Builder Objects)" .PP \fBscons\fR می‌تواند با افزودن اشیای Builder جدید به یک construction environment (محیط ساخت)، برای ساخت انواع دیگری از هدف‌ها گسترش یابد\&. \fIبه‌طور کلی\fR، تنها زمانی باید یک شیء Builder جدید اضافه کنید که بخواهید نوع جدیدی از فایل یا سایر هدف‌های خارجی را بسازید\&. برای انواع فایل‌های خروجی که \fBscons\fR از پیش آن‌ها را می‌شناسد، معمولاً می‌توانید رفتار Builderهای از پیش‌آماده نظیر \fBProgram\fR، \fBObject\fR یا \fBLibrary\fR را با تغییر construction variables (متغیرهای ساخت) کنترل‌کنندهٔ رفتار آن‌ها (\fB$CC\fR، \fB$LINK\fR و غیره) دستخوش تغییر کنید\&. با این روش می‌توانید برای نمونه کامپایلر مورد استفاده را تغییر دهید، که بسیار ساده‌تر بوده و نسبت به نوشتن یک builder جدید کمتر مستعد خطا است\&. مستندات مربوط به هر Builder فهرست construction variables مورد استفادهٔ آن را آورده است\&. .PP اشیای Builder با استفاده از تابع کارخانه‌ای \fBBuilder\fR ایجاد می‌شوند\&. پس از ایجاد، یک builder با ثبت شدن در دیکشنری \fB$BUILDERS\fR در یک construction environment، به آن محیط افزوده می‌شود (برخی از مثال‌های این بخش این موضوع را نشان می‌دهند)\&. انجام این کار به‌طور خودکار باعث می‌شود SCons متدی با نام آن builder به محیط بیفزاید\&. .PP تابع \fBBuilder\fR آرگومان‌های کلیدواژه‌ای زیر را می‌پذیرد: .PP \fIaction\fR .RS 4 دستوری که برای ساخت هدف از منبع به کار می‌رود\&. \fIaction\fR می‌تواند یک رشته به نشانهٔ یک الگوی خط فرمان برای اجرا، فهرستی از رشته‌ها نمایانگر فرمان و آرگومان‌های آن برای اجرا (مناسب برای گنجاندن فاصله‌ها در یک آرگومان)، یک دیکشنری برای نگاشت پسوندهای نام فایل منبع به هر ترکیبی از رشته‌های خط فرمان (اگر سازنده باید چندین پسوند فایل منبع را بپذیرد)، یک تابع Python، یک شیء Action (بخش Action Objects را ببینید) یا فهرستی از هر یک از موارد بالا باشد\&. .sp یک تابع action باید سه آرگومان را بپذیرد: \fIsource\fR، \fItarget\fR و \fIenv\fR\&. \fIsource\fR فهرستی از گره‌های منبع است؛ \fItarget\fR فهرستی از گره‌های هدف است؛ \fIenv\fR نیز construction environment است که برای زمینه (context) استفاده می‌شود\&. .sp آرگومان‌های \fIaction\fR و \fIgenerator\fR نباید هر دو به‌طور هم‌زمان برای یک Builder استفاده شوند\&. .RE .PP \fIprefix\fR .RS 4 پیشوندی که به ابتدای نام فایل هدف افزوده می‌شود\&. \fIprefix\fR می‌تواند یک رشته، یک تابع (یا شیء قابل فراخوانی دیگر) باشد که دو آرگومان (یک construction environment و یک فهرست از منابع) دریافت کرده و یک رشتهٔ پیشوند بازمی‌گرداند، یا دیکشنری مشخص‌کنندهٔ نگاشت از یک پسوند منبع مشخص (مربوط به نخستین منبع تعیین‌شده) به رشتهٔ پیشوند هدف متناظر باشد\&. برای حالت دیکشنری، هم مشخصات پسوند منبع (کلید) و هم پیشوند هدف (مقدار) می‌توانند از جایگزینی متغیرهای محیطی استفاده کنند، و پیشوند هدف نیز می‌تواند یک شیء قابل فراخوانی باشد\&. پیشوند پیش‌فرض هدف را می‌توان با یک مدخل دیکشنری با کلید \fBNone\fR مشخص کرد\&. .sp .if n \{\ .RS 4 .\} .nf b = Builder("build_it < $SOURCE > $TARGET", prefix="file\-") def gen_prefix(env, sources): return "file\-" + env[\*(AqPLATFORM\*(Aq] + \*(Aq\-\*(Aq b = Builder("build_it < $SOURCE > $TARGET", prefix=gen_prefix) b = Builder( "build_it < $SOURCE > $TARGET", suffix={None: "file\-", "$SRC_SFX_A": gen_prefix}, ) .fi .if n \{\ .RE .\} .RE .PP \fIsuffix\fR .RS 4 پسوندی که به انتهای نام فایل هدف افزوده می‌شود\&. به همان شیوه‌ای که برای \fIprefix\fR در بالا شرح داده شد تعیین می‌شود\&. اگر پسوند یک رشته باشد، چنانچه از پیش دارای \*(Aq\&.\*(Aq نباشد، \fBscons\fR یک \*(Aq\&.\*(Aq به ابتدای پسوند اضافه می‌کند\&. رشته‌ای که توسط شیء قابل فراخوانی برگردانده شده یا از دیکشنری به‌دست می‌آید دست‌نخورده باقی می‌ماند، و در صورت نیاز باید خودتان به‌صورت دستی یک \*(Aq\&.\*(Aq به ابتدای آن اضافه کنید\&. .sp .if n \{\ .RS 4 .\} .nf b = Builder("build_it < $SOURCE > $TARGET", suffix="\-file") def gen_suffix(env, sources): return "\&." + env[\*(AqPLATFORM\*(Aq] + "\-file" b = Builder("build_it < $SOURCE > $TARGET", suffix=gen_suffix) b = Builder( "build_it < $SOURCE > $TARGET", suffix={None: "\&.sfx1", "$SRC_SFX_A": gen_suffix}, ) .fi .if n \{\ .RE .\} .RE .PP \fIensure_suffix\fR .RS 4 اگر روی یک مقدار درست (true) تنظیم شود، تضمین می‌کند که نام هدف‌ها به \fIsuffix\fR ختم شوند\&. بنابراین، این پسوند به هر رشتهٔ هدفی که پسوندی غیر از \fIsuffix\fR داشته باشد نیز افزوده خواهد شد\&. رفتار پیش‌فرض (که با مقدار نادرست یا false نیز مشخص می‌شود) این است که هر رشتهٔ هدفی که به‌نظر می‌رسد از قبل دارای پسوند است، بدون تغییر باقی بماند\&. .sp .if n \{\ .RS 4 .\} .nf b1 = Builder("build_it < $SOURCE > $TARGET", suffix="\&.out") b2 = Builder( "build_it < $SOURCE > $TARGET", suffix="\&.out", ensure_suffix=True ) env = Environment() env[\*(AqBUILDERS\*(Aq][\*(AqB1\*(Aq] = b1 env[\*(AqBUILDERS\*(Aq][\*(AqB2\*(Aq] = b2 # Builds "foo\&.txt" because ensure_suffix is not set\&. env\&.B1(\*(Aqfoo\&.txt\*(Aq, \*(Aqfoo\&.in\*(Aq) # Builds "bar\&.txt\&.out" because ensure_suffix is set\&. env\&.B2(\*(Aqbar\&.txt\*(Aq, \*(Aqbar\&.in\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fIsrc_suffix\fR .RS 4 پسوند مورد انتظار نام فایل منبع\&. \fIsrc_suffix\fR می‌تواند یک رشته یا فهرستی از رشته‌ها باشد\&. .RE .PP \fItarget_scanner\fR .RS 4 یک شیء Scanner که برای یافتن وابستگی‌های ضمنی برای این فایل هدف فراخوانی خواهد شد\&. از این گزینه تنها برای تعیین اشیاء Scanner استفاده کنید که وابستگی‌های ضمنی را بر اساس فایل هدف و construction environment می‌یابند، \fIنه\fR برای وابستگی‌های ضمنی بر اساس فایل‌های منبع (برای آن‌ها از \fIsource_scanner\fR استفاده کنید)\&. برای اطلاعات درباره ساخت اشیاء Scanner سفارشی خود، بخش \(lqScanner Objects\(rq را ببینید\&. .RE .PP \fIsource_scanner\fR .RS 4 یک شیء Scanner که برای یافتن وابستگی‌های ضمنی در هر فایل منبعِ استفاده‌شده برای ساخت این فایل هدف فراخوانی خواهد شد\&. از این گزینه برای تعیین یک پویشگر جهت یافتن مواردی مانند خطوط #include در فایل‌های منبع استفاده کنید\&. شیء پویشگر از پیش‌ساخته‌ی DirScanner ممکن است برای مشخص کردن این به‌کار رود که این Builder باید درخت‌های دایرکتوری را برای تغییراتِ روی دیسکِ فایل‌هایی که \fBscons\fR از فراخوانی‌های دیگر توابع یا Builderها درباره آن‌ها اطلاعی ندارد پویش کند\&. برای اطلاعات درباره ساخت اشیاء Scanner سفارشی خود، بخش \(lqScanner Objects\(rq را ببینید\&. .RE .PP \fItarget_factory\fR .RS 4 یک تابع کارخانه (factory function) که Builder از آن برای تبدیل هر هدفِ مشخص‌شده به‌صورت رشته به گره‌های SCons استفاده خواهد کرد\&. به‌طور پیش‌فرض، SCons فرض می‌کند که همه اهداف فایل هستند (یعنی کارخانه پیش‌فرض \fBFile\fR است)\&. سایر مقادیر مفید \fItarget_factory\fR شامل \fBDir\fR برای زمانی که یک Builder یک هدف دایرکتوری می‌سازد، و \fBEntry\fR برای زمانی که یک Builder می‌تواند یک هدف فایل یا دایرکتوری بسازد، است\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf def my_mkdir(target, source, env): # target[0] will be a Dir node for \*(Aqnew_directory\*(Aq MakeDirectoryBuilder = Builder(action=my_mkdir, target_factory=Dir) env = Environment() env\&.Append(BUILDERS={\*(AqMakeDirectory\*(Aq: MakeDirectoryBuilder}) env\&.MakeDirectory(\*(Aqnew_directory\*(Aq, []) .fi .if n \{\ .RE .\} .sp توجه داشته باشید که فراخوانی به Builder مربوط به \fBMakeDirectory\fR باید یک فهرست منبع خالی را مشخص کند تا رشته نام فایل، هدف builder را مشخص کند\&. SCons فرض می‌کند که یک آرگومان مکانی منفرد داده‌شده به یک builder همان منبع است، و سعی می‌کند نام هدف را از آن استنتاج کند؛ که در صورت نبود یک پیشوند یا پسوند خودکار، به تطابق نام هدف و منبع و ایجاد یک وابستگی دورانی (circular dependency) منجر خواهد شد\&. .RE .PP \fIsource_factory\fR .RS 4 یک تابع کارخانه که Builder از آن برای تبدیل هر منبع مشخص‌شده به‌صورت رشته به گره‌های SCons استفاده خواهد کرد\&. به‌طور پیش‌فرض، SCons فرض می‌کند که همه منابع فایل هستند (یعنی کارخانه پیش‌فرض \fBFile\fR است)\&. سایر مقادیر مفید \fIsource_factory\fR شامل \fBDir\fR برای زمانی که یک Builder از یک دایرکتوری به‌عنوان منبع استفاده می‌کند، و \fBEntry\fR برای زمانی که یک Builder می‌تواند از فایل‌ها یا دایرکتوری‌ها (یا هر دو) به‌عنوان منبع استفاده کند، است\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf def collect(target, source, env): # target[0] will default to a File node for \*(Aqarchive\*(Aq (no target_factory) # source[0] will be a Dir node for \*(Aqdirectory_name\*(Aq CollectBuilder = Builder(action=collect, source_factory=Dir) env = Environment() env\&.Append(BUILDERS={\*(AqCollect\*(Aq: CollectBuilder}) env\&.Collect(\*(Aqarchive\*(Aq, \*(Aqdirectory_name\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fIemitter\fR .RS 4 یک تابع یا فهرستی از توابع برای دستکاری فهرست‌های هدف و منبع، پیش از برقراری وابستگی‌ها و ساخته شدن واقعی هدف(ها)\&. \fIemitter\fR همچنین می‌تواند رشته‌ای شامل یک construction variable باشد تا به یک تابع emitter یا فهرستی از توابع بسط یابد، یا دیکشنری‌ای که پسوندهای فایل منبع را به توابع emitter نگاشت می‌کند\&. (تنها از پسوند نخستین فایل منبع برای انتخاب تابع emitter واقعی از یک دیکشنری emitter استفاده می‌شود\&.) .sp تابعی که به‌صورت \fIemitter\fR ارسال می‌شود باید سه آرگومان بپذیرد: \fIsource\fR، \fItarget\fR و \fIenv\fR\&. \fIsource\fR فهرستی از گره‌های منبع، \fItarget\fR فهرستی از گره‌های هدف، و \fIenv\fR همان construction environment است که برای زمینه (context) استفاده می‌شود\&. .sp یک emitter باید یک چندتایی (tuple) شامل دو فهرست بازگرداند: فهرست اهدافی که باید توسط این builder ساخته شوند، و فهرست منابع برای این builder\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf def e(target, source, env): return target + [\*(Aqfoo\&.foo\*(Aq], source + [\*(Aqfoo\&.src\*(Aq] # Simple association of an emitter function with a Builder\&. b = Builder("my_build < $TARGET > $SOURCE", emitter=e) def e2(target, source, env): return target + [\*(Aqbar\&.foo\*(Aq], source + [\*(Aqbar\&.src\*(Aq] # Simple association of a list of emitter functions with a Builder\&. b = Builder("my_build < $TARGET > $SOURCE", emitter=[e, e2]) # Calling an emitter function through a construction variable\&. env = Environment(MY_EMITTER=e) b = Builder("my_build < $TARGET > $SOURCE", emitter=\*(Aq$MY_EMITTER\*(Aq) # Calling a list of emitter functions through a construction variable\&. env = Environment(EMITTER_LIST=[e, e2]) b = Builder("my_build < $TARGET > $SOURCE", emitter=\*(Aq$EMITTER_LIST\*(Aq) # Associating multiple emitters with different file # suffixes using a dictionary\&. def e_suf1(target, source, env): return target + [\*(Aqanother_target_file\*(Aq], source def e_suf2(target, source, env): return target, source + [\*(Aqanother_source_file\*(Aq] b = Builder( action="my_build < $TARGET > $SOURCE", emitter={\*(Aq\&.suf1\*(Aq: e_suf1, \*(Aq\&.suf2\*(Aq: e_suf2} ) .fi .if n \{\ .RE .\} .RE .PP \fImulti\fR .RS 4 مشخص می‌کند که آیا این سازنده مجاز است چندین بار برای یک فایل (یا چند فایل) هدف یکسان فراخوانی شود یا خیر\&. پیش‌فرض \fBFalse\fR است، به این معنی که سازنده نمی‌تواند چندین بار برای فایل(های) هدف یکسان فراخوانی شود\&. فراخوانی یک سازنده به دفعات متعدد برای یک هدف یکسان، صرفاً فایل‌های منبع بیشتری را به هدف می‌افزاید؛ تغییر محیط مرتبط با هدف، مشخص کردن رونویسی‌های اضافی محیط، یا مرتبط کردن یک سازنده متفاوت با هدف مجاز نیست\&. .RE .PP \fIenv\fR .RS 4 یک محیط ساخت که می‌تواند برای واکشی کد منبع با استفاده از این Builder استفاده شود\&. (توجه داشته باشید که این محیط برای ساخت‌های معمول فایل‌های هدف عادی استفاده \fIنمی‌شود\fR، چرا که آنها از محیطی استفاده می‌کنند که برای فراخوانی Builder جهت فایل هدف به کار رفته بود\&.) .RE .PP \fIgenerator\fR .RS 4 تابعی که فهرستی از کنش‌ها (actions) را بازمی‌گرداند که برای ساخت هدف(ها) از منبع(ها) اجرا خواهند شد\&. کنش(های) بازگردانده‌شده ممکن است یک شیء Action یا هر چیزی باشد که بتواند به یک شیء Action تبدیل شود (بخش بعدی را ببینید)\&. .sp تابعی که به عنوان \fIgenerator\fR ارسال می‌شود باید چهار آرگومان را بپذیرد: \fIsource\fR، \fItarget\fR، \fIenv\fR و \fIfor_signature\fR\&. \fIsource\fR فهرستی از گره‌های منبع است، \fItarget\fR فهرستی از گره‌های هدف است، \fIenv\fR همان محیط ساخت برای استفاده به عنوان زمینه (context) است، و \fIfor_signature\fR یک مقدار بولی است که به تابع اعلام می‌کند آیا به منظور تولید یک امضای ساخت (build signature) فراخوانی شده است (در مقایسه با اجرای واقعی دستور)\&. از آنجا که امضای ساخت برای تعیین نیاز به ساخت مجدد استفاده می‌شود، اگر \fIfor_signature\fR درست (true) باشد، تابع باید آن دسته از عناصری را که بر تحریک ساخت مجدد تأثیری ندارند حذف کند\&. .sp مثال: .sp .if n \{\ .RS 4 .\} .nf def g(source, target, env, for_signature): return [["gcc", "\-c", "\-o"] + target + source] b = Builder(generator=g) .fi .if n \{\ .RE .\} .sp آرگومان‌های \fIgenerator\fR و \fIaction\fR نباید به طور هم‌زمان برای یک Builder یکسان استفاده شوند\&. .RE .PP \fIsrc_builder\fR .RS 4 سازنده‌ای را مشخص می‌کند که در صورت عدم تطابق پسوند نام فایل منبع با هیچ‌یک از پسوندهای این سازنده، مورد استفاده قرار گیرد\&. استفاده از این آرگومان یک سازنده چندمرحله‌ای ایجاد می‌کند\&. .RE .PP \fIsingle_source\fR .RS 4 مشخص می‌کند که این سازنده در هر فراخوانی دقیقاً یک فایل منبع را انتظار دارد\&. تعیین بیش از یک فایل منبع بدون ارائه فایل‌های هدف، منجر به فراخوانی ضمنی سازنده به دفعات متعدد خواهد شد (یک بار به ازای هر منبع داده‌شده)\&. ارائه چندین فایل منبع همراه با فایل‌های هدف منجر به بروز یک استثنای UserError می‌شود\&. .RE .PP \fIsource_ext_match\fR .RS 4 هنگامی که آرگومان \fIaction\fR مشخص‌شده یک دیکشنری باشد، رفتار پیش‌فرض در زمانی که چندین فایل منبع به یک سازنده داده می‌شود این است که اطمینان حاصل شود پسوند تمام فایل‌های منبع همخوانی دارند\&. اگر مجاز باشد که این سازنده با فهرستی از فایل‌های منبع با پسوندهای مختلف فراخوانی شود، می‌توان این بررسی را با تنظیم \fIsource_ext_match\fR روی \fBFalse\fR یا هر مقدار غیرصحیح دیگری غیرفعال کرد\&. در این حالت، \fBscons\fR از پسوند نخستین فایل منبع مشخص‌شده برای انتخاب کنش مناسب از دیکشنری \fIaction\fR استفاده خواهد کرد\&. .sp در مثال زیر، مقداردهی \fIsource_ext_match\fR مانع از خروج \fBscons\fR با خطا به دلیل عدم تطابق پسوندهای foo\&.in و foo\&.extra می‌شود\&. .sp .if n \{\ .RS 4 .\} .nf b = Builder(action={\*(Aq\&.in\*(Aq: \*(Aqbuild $SOURCES > $TARGET\*(Aq}, source_ext_match=False) env = Environment(BUILDERS={\*(AqMyBuild\*(Aq: b}) env\&.MyBuild(\*(Aqfoo\&.out\*(Aq, [\*(Aqfoo\&.in\*(Aq, \*(Aqfoo\&.extra\*(Aq]) .fi .if n \{\ .RE .\} .RE .PP \fIenv\fR .RS 4 یک محیط ساخت که می‌تواند برای دریافت کد منبع با استفاده از این Builder استفاده شود\&. (توجه داشته باشید که این محیط برای ساخت‌های عادی فایل‌های هدف معمول استفاده \fIنمی‌شود\fR، چرا که آنها از محیطی استفاده می‌کنند که برای فراخوانی Builder جهت فایل هدف به کار گرفته شده بود\&.) .sp .if n \{\ .RS 4 .\} .nf b = Builder(action="build < $SOURCE > $TARGET") env = Environment(BUILDERS={\*(AqMyBuild\*(Aq : b}) env\&.MyBuild(\*(Aqfoo\&.out\*(Aq, \*(Aqfoo\&.in\*(Aq, my_arg=\*(Aqxyzzy\*(Aq) .fi .if n \{\ .RE .\} .RE .PP \fIchdir\fR .RS 4 دایرکتوری‌ای که scons کنش(های) مشخص‌شده برای این Builder را از درون آن اجرا خواهد کرد\&. اگر آرگومان \fIchdir\fR یک رشته یا یک گره (Node) دایرکتوری باشد، scons به دایرکتوری مشخص‌شده تغییر مسیر می‌دهد\&. اگر \fIchdir\fR رشته یا Node نبوده و مقداری غیرصفر داشته باشد، آنگاه scons به دایرکتوری فایل هدف تغییر مسیر خواهد داد\&. .sp توجه داشته باشید که scons هنگام استفاده از آرگومان کلیدواژه‌ای \fIchdir\fR بسط متغیرهای ساخت مانند \fB$TARGET\fR و \fB$SOURCE\fR را به طور خودکار اصلاح \fIنخواهد کرد\fR\-\-به این معنی که نام‌های فایل بسط‌یافته همچنان نسبت به دایرکتوری ریشه پروژه نسبی خواهند بود، و در نتیجه نسبت به دایرکتوری chdir نادرست هستند\&. سازندگانی که با استفاده از آرگومان کلیدواژه‌ای \fIchdir\fR ایجاد می‌شوند، نیاز دارند تا از بسط متغیرهای ساخت مانند ${TARGET\&.file} و ${SOURCE\&.file} استفاده کنند تا فقط بخش نام فایل هدف‌ها و منبع به کار گرفته شود\&. .sp .if n \{\ .RS 4 .\} .nf b = Builder(action="build < ${SOURCE\&.file} > ${TARGET\&.file}", chdir=True) env = Environment(BUILDERS={\*(AqMyBuild\*(Aq : b}) env\&.MyBuild(\*(Aqsub/dir/foo\&.out\*(Aq, \*(Aqsub/dir/foo\&.in\*(Aq) .fi .if n \{\ .RE .\} .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBهشدار\fR .ps -1 .br Python تنها یک موقعیت دایرکتوری جاری را دنبال می‌کند، حتی اگر چندین ریسه (thread) در حال اجرا باشند\&. این بدان معناست که استفاده از آرگومان \fIchdir\fR در حالت چندریسه‌ای SCons (گزینه \fB\-j\fR) کار \fIنخواهد کرد\fR، زیرا ریسه‌های کاری مجزایی که توسط SCons ایجاد شده‌اند هنگام شروع به تغییر دایرکتوری با یکدیگر تداخل پیدا می‌کنند\&. .sp .5v .RE .RE .PP هر آرگومان کلیدواژه‌ای اضافی که هنگام ایجاد یک شیء Builder (یعنی هنگام فراخوانی تابع \fBBuilder\fR) مشخص شود، هنگام فراخوانی شیء Builder در محیط ساخت (construction environment) در حال اجرا تنظیم خواهد شد\&. نمونه بارز در اینجا، تنظیم یک متغیر ساخت (construction variable) روی مخزن یک سیستم کنترل نسخه کد منبع است\&. .PP هرگونه آرگومان کلیدواژه‌ای از این دست که هنگام فراخوانی یک شیء Builder ارسال شود، تنها با هدفی که توسط همان فراخوانی بخصوص \fBBuilder\fR ایجاد شده است (و هر فایل دیگری که در نتیجه این فراخوانی ساخته می‌شود) مرتبط خواهد بود\&. این آرگومان‌های کلیدواژه‌ای اضافی به توابع زیر ارسال می‌شوند: توابع تولیدکننده فرمان (command generator functions)، Actionهای تابعی (function Actions)، و توابع emitter\&. .PP هنگام اشکال‌زدایی خطاها در یک متد builder سفارشی، به یاد داشته باشید که Action مربوط به builder به صورت ناهمگام اجرا می‌شود \- فراخوانی builder در SConscript صرفاً به SCons اعلام می‌کند که مایلید چه چیزی ساخته شود، در حالی که ساخت واقعی بعداً (در صورت نیاز) توسط taskmaster زمان‌بندی می‌شود\&. در نتیجه، قرار دادن یک فراخوانی builder درون یک بلوک try مفید نخواهد بود، زیرا موفقیت در فراخوانی builder به معنای موفقیت‌آمیز بودن خودِ ساخت نیست\&. در صورت نیاز، Action یک builder را به گونه‌ای کدنویسی کنید که با یک پیام خطای مفید که نشان‌دهنده مشکل در فایل SConscript است خارج شود\&. تلاش برای بازیابی برنامه‌نویسی‌شده از خطاهای ساخت به ندرت مفید واقع می‌شود\&. .SS "اشیاء Action (Action Objects)" .PP تابع کارخانه‌ای \fBBuilder\fR آرگومان کلیدواژه‌ای \fIaction\fR خود را به یک شیء Action داخلی مناسب تبدیل می‌کند، همان‌گونه که تابع \fBCommand\fR عمل می‌کند\&. همچنین می‌توانید با فراخوانی تابع کارخانه‌ای \fBAction\fR، اشیاء Action را به طور صریح برای ارسال به \fBBuilder\fR، یا سایر توابعی که actionها را به عنوان آرگومان می‌پذیرند، ایجاد کنید\&. هنگامی که چندین شیء Builder نیاز به انجام کار یکسانی دارند، این کار کارآمدتر از این است که به هر یک از آن اشیاء Builder اجازه داده شود یک شیء Action جداگانه بسازند\&. همچنین امکان پیکربندی انعطاف‌پذیرتری را برای یک شیء Action فراهم می‌کند\&. برای نمونه، جهت کنترل پیامی که هنگام انجام اقدام چاپ می‌شود، باید شیء action را با استفاده از \fBAction\fR ایجاد کنید\&. .PP تابع کارخانه‌ای Action بسته به نوع آرگومان \fIaction\fR (نخستین پارامتر موضعی)، شیء مناسبی را برای آن اقدام بازمی‌گرداند: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} اگر \fIaction\fR از قبل یک شیء Action باشد، همان شیء صرفاً بازگردانده می‌شود\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} اگر \fIaction\fR یک رشته باشد، یک Action خط فرمان بازگردانده می‌شود\&. اگر چنین رشته‌ای با @ آغاز شود، خط فرمان چاپ نمی‌شود\&. اگر رشته با خط فاصله (\-) آغاز شود، از وضعیت خروج فرمان مشخص‌شده صرف‌نظر می‌شود و به فرآیند اجرا اجازه می‌دهد حتی در صورت گزارش خطا توسط فرمان ادامه یابد: .sp .if n \{\ .RS 4 .\} .nf Action(\*(Aq$CC \-c \-o $TARGET $SOURCES\*(Aq) # Doesn\*(Aqt print the line being executed\&. Action(\*(Aq@build $TARGET $SOURCES\*(Aq) # Ignores return value Action(\*(Aq\-build $TARGET $SOURCES\*(Aq) .fi .if n \{\ .RE .\} .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} اگر \fIaction\fR یک لیست باشد، فهرستی از اشیاء Action بازگردانده می‌شود\&. برای هر عنصر در لیست، در صورت لزوم یک شیء Action ایجاد می‌شود\&. اگر عنصری درون لیست خود یک لیست باشد، لیست تعبیه‌شده به عنوان فرمان و آرگومان‌هایی در نظر گرفته می‌شود که باید از طریق خط فرمان اجرا شوند\&. این قابلیت اجازه می‌دهد تا با تعریف یک فرمان در یک لیست درون لیستی دیگر، نویسه فاصله (white space) به جای آنکه به عنوان جداکننده تلقی شود، درون یک آرگومان محصور گردد: .sp .if n \{\ .RS 4 .\} .nf Action([[\*(Aqcc\*(Aq, \*(Aq\-c\*(Aq, \*(Aq\-DWHITE SPACE\*(Aq, \*(Aq\-o\*(Aq, \*(Aq$TARGET\*(Aq, \*(Aq$SOURCES\*(Aq]]) .fi .if n \{\ .RE .\} .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} اگر \fIaction\fR یک شیء قابل فراخوانی (callable) باشد، یک Function Action بازگردانده می‌شود\&. این شیء قابل فراخوانی باید سه آرگومان کلیدواژه‌ای را بپذیرد: \fItarget\fR، \fIsource\fR و \fIenv\fR\&. \fItarget\fR یک شیء Node است که فایل هدف را نشان می‌دهد، \fIsource\fR یک شیء Node است که فایل منبع را نشان می‌دهد و \fIenv\fR همان محیط ساخت (construction environment) استفاده‌شده برای ساخت فایل هدف است\&. .sp اگر بیش از یک فایل هدف یا فایل منبع وجود داشته باشد، آرگومان‌های \fItarget\fR و \fIsource\fR می‌توانند لیست‌هایی از اشیاء Node باشند\&. نام(های) واقعی فایل‌های هدف و منبع را می‌توان از طریق تابع توکار \fBstr\fR در Python از اشیاء Node آن‌ها بازیابی کرد: .sp .if n \{\ .RS 4 .\} .nf target_file_name = str(target) source_file_names = [str(x) for x in source] .fi .if n \{\ .RE .\} .sp این تابع برای نشان دادن ساخت موفقیت‌آمیز فایل(های) هدف باید 0 یا \fBNone\fR را بازگرداند\&. تابع ممکن است برای نشان دادن ساخت ناموفق، یک استثنا صادر کند (raise) یا یک وضعیت خروج غیر صفر برگرداند\&. .sp .if n \{\ .RS 4 .\} .nf def build_it(target=None, source=None, env=None): # build the target from the source return 0 a = Action(build_it) .fi .if n \{\ .RE .\} .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} اگر \fIaction\fR یکی از انواع بالا نباشد، هیچ شیء actionای تولید نمی‌شود و \fBAction\fR مقدار \fBNone\fR را بازمی‌گرداند\&. .RE .PP فرم متد محیط \fBenv\&.Action\fR در زمان فراخوانی، متغیرهای ساخت را در تمام رشته‌های آرگومان، از جمله \fIaction\fR، با استفاده از متغیرهای ساخت موجود در محیط ساخت که از طریق آن فراخوانی شده است، بسط می‌دهد\&. فرم تابع سراسری \fBAction\fR بسط متغیرها را تا زمانی که شیء Action واقعاً استفاده شود به تأخیر می‌اندازد\&. .PP آرگومان اختیاری دوم برای \fBAction\fR جهت کنترل خروجی‌ای استفاده می‌شود که هنگام اجرای واقعی Action چاپ می‌گردد\&. اگر این پارامتر حذف شود، یا مقدار آن یک رشتهٔ خالی باشد، یک خروجی پیش‌فرض بسته به نوع action استفاده می‌شود\&. برای مثال، یک action خط فرمانی، دستور اجرا شده را چاپ خواهد کرد\&. انواع آرگومان‌های زیر پذیرفته می‌شوند: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} اگر آرگومان دوم یک رشته باشد، یا اگر آرگومان کلیدواژه‌ای \fIcmdstr\fR داده شده باشد، این رشته مشخص می‌کند چه چیزی چاپ شود\&. جایگزینی متغیرها قبل از چاپ رشته روی آن انجام می‌شود\&. این رشته معمولاً شامل متغیرهای قابل جایگزینی است، به‌ویژه $TARGET(S) و $SOURCE(S)، یا فقط شامل یک متغیر تکی است که به‌صورت اختیاری در جای دیگری تعریف شده است\&. خود SCons به‌طور گسترده‌ای از حالت دوم استفاده می‌کند\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} اگر آرگومان دوم یک تابع باشد، یا اگر آرگومان کلیدواژه‌ای \fIstrfunction\fR داده شده باشد، این تابع فراخوانی خواهد شد تا رشته‌ای را که باید هنگام اجرای action چاپ شود به دست آورد\&. این تابع باید سه آرگومان کلیدواژه‌ای بپذیرد: \fItarget\fR، \fIsource\fR و \fIenv\fR، با همان تفسیری که برای آرگومان قابل فراخوانیِ \fIaction\fR در بالا ذکر شد\&. این تابع مسئول مدیریت هرگونه جایگزینی لازم است\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} اگر آرگومان دوم \fBNone\fR باشد، یا اگر cmdstr=None ارائه شود، خروجی به‌طور کامل متوقف و حذف می‌شود\&. .RE .PP آرگومان‌های کلیدواژه‌ای \fIcmdstr\fR و \fIstrfunction\fR نباید هر دو با هم در یک فراخوانی واحد از \fBAction\fR ارائه شوند\&. .PP چاپ رشته‌های action تحت تأثیر تنظیمات \fB$PRINT_CMD_LINE_FUNC\fR قرار دارد\&. .PP مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf def build_it(target, source, env): # build the target from the source return 0 def string_it(target, source, env): return "building \*(Aq%s\*(Aq from \*(Aq%s\*(Aq" % (target[0], source[0]) # Use a positional argument\&. f = Action(build_it, string_it) s = Action(build_it, "building \*(Aq$TARGET\*(Aq from \*(Aq$SOURCE\*(Aq") # Alternatively, use a keyword argument\&. f = Action(build_it, strfunction=string_it) s = Action(build_it, cmdstr="building \*(Aq$TARGET\*(Aq from \*(Aq$SOURCE\*(Aq") # You can provide a configurable variable\&. l = Action(build_it, \*(Aq$STRINGIT\*(Aq) .fi .if n \{\ .RE .\} .PP هر آرگومان موضعی اضافی در صورت وجود، می‌تواند متغیرهای ساخت یا فهرستی از متغیرهای ساخت باشد که مقادیر آن‌ها در امضای Action (امضای ساخت یا build signature) هنگام تصمیم‌گیری در این مورد که آیا یک هدف باید به دلیل تغییر action مجدداً ساخته شود یا خیر، گنجانده خواهد شد\&. چنین متغیرهایی را می‌توان با استفاده از پارامتر کلیدواژه‌ای \fIvarlist\fR نیز مشخص کرد؛ هر دو شکل موضعی و کلیدواژه‌ای می‌توانند وجود داشته باشند و با یکدیگر ترکیب خواهند شد\&. این امر هر زمان که بخواهید با تغییر یک متغیر ساخت خاص، هدف مجدداً ساخته شود، ضروری است\&. این کار اغلب برای یک رشتهٔ action نیاز نیست، زیرا متغیرهای بسط‌یافته معمولاً بخشی از خط فرمان خواهند بود، اما در صورتی که یک action از نوع تابع Python هنگام تولید خط فرمان از مقدار یک متغیر ساخت استفاده کند، ممکن است لازم باشد\&. .sp .if n \{\ .RS 4 .\} .nf def build_it(target, source, env): # build the target from the \*(AqXXX\*(Aq construction variable with open(target[0], \*(Aqw\*(Aq) as f: f\&.write(env[\*(AqXXX\*(Aq]) return 0 # Use positional arguments\&. a = Action(build_it, \*(Aq$STRINGIT\*(Aq, [\*(AqXXX\*(Aq]) # Alternatively, use a keyword argument\&. a = Action(build_it, varlist=[\*(AqXXX\*(Aq]) .fi .if n \{\ .RE .\} .PP برای تغییر دادن رفتار شیء Action، می‌توان آرگومان‌های کلیدواژه‌ای اختیاری زیر را به تابع کارخانه‌ای Action ارسال کرد: .PP \fIchdir\fR .RS 4 اگر \fIchdir\fR برابر true باشد (پیش‌فرض \fBFalse\fR است)، SCons پیش از اجرای action، دایرکتوری را تغییر می‌دهد\&. اگر مقدار \fIchdir\fR یک رشته یا یک Node دایرکتوری باشد، SCons به دایرکتوری مشخص‌شده خواهد رفت\&. در غیر این صورت، اگر \fIchdir\fR دارای مقدار منطقی true باشد، SCons به دایرکتوری فایلِ هدف تغییر مسیر خواهد داد\&. .sp توجه داشته باشید که هنگام استفاده از پارامتر \fIchdir\fR، SCons بسط متغیرهای ساخت مانند \fB$TARGET\fR و \fB$SOURCE\fR را به‌طور خودکار تغییر \fIنخواهد داد\fR \- بدین معنا که نام‌های بسط‌یافتهٔ فایل‌ها همچنان نسبت به دایرکتوری ریشهٔ پروژه نسبی خواهند بود، و در نتیجه نسبت به دایرکتوری chdir نادرست هستند\&. سازندگانی (Builders) که با استفاده از آرگومان کلیدواژه‌ای \fIchdir\fR ایجاد می‌شوند، برای استفاده از بخش نام فایل اهداف و منبع، باید از بسط متغیرهای ساخت مانند ${TARGET\&.file} و ${SOURCE\&.file} استفاده کنند\&. مثال: .sp .if n \{\ .RS 4 .\} .nf a = Action("build < ${SOURCE\&.file} > ${TARGET\&.file}", chdir=True) .fi .if n \{\ .RE .\} .RE .PP \fIexitstatfunc\fR .RS 4 در صورت ارائه، باید یک شیء فراخوان‌پذیر (callable) باشد که یک پارامتر منفرد، یعنی وضعیت خروج (یا مقدار بازگشتی) حاصل از عملِ مشخص‌شده را می‌پذیرد و مقداری دلخواه یا تغییریافته را برمی‌گرداند\&. این قابلیت می‌تواند برای مثال جهت تعیین این موضوع استفاده شود که مقدار بازگشتی یک شیء Action در شرایطی خاص نادیده گرفته شود و در نتیجه SCons چنین در نظر بگیرد که عمل همواره با موفقیت انجام شده است\&. مثال: .sp .if n \{\ .RS 4 .\} .nf def always_succeed(s): # Always return 0, which indicates success\&. return 0 a = Action("build < ${SOURCE\&.file} > ${TARGET\&.file}", exitstatfunc=always_succeed) .fi .if n \{\ .RE .\} .RE .PP \fIbatch_key\fR .RS 4 در صورت ارائه، نشان می‌دهد که Action می‌تواند با پردازش هم‌زمان چندین فایل منبع مستقل، چندین فایل هدف ایجاد کند\&. (نمونه بارز آن «کامپایل دسته‌ای» چندین فایل آبجکت با ارسال چند فایل منبع به یک‌بار فراخوانی کامپایلری مانند Microsoft Visual C++ است\&.) اگر آرگومان \fIbatch_key\fR برابر با True ارزیابی شود و یک شیء فراخوان‌پذیر نباشد، شیء Action پیکربندی‌شده باعث خواهد شد که \fBscons\fR تمام هدف‌های ساخته‌شده با این شیء Action را که با همان محیط ساخت پیکربندی شده‌اند، در قالب فراخوانی‌های یکتایی از خط فرمان یا تابع شیء Action گردآوری کند\&. خطوط فرمان معمولاً بهتر است از متغیر ساخت \fB$CHANGED_SOURCES\fR (و احتمالاً \fB$CHANGED_TARGETS\fR نیز) استفاده کنند تا تنها آن دسته از منابعی که از زمان آخرین ساخت هدف‌هایشان واقعاً تغییر کرده‌اند، به خط فرمان ارسال شوند\&. مثال: .sp .if n \{\ .RS 4 .\} .nf a = Action(\*(Aqbuild $CHANGED_SOURCES\*(Aq, batch_key=True) .fi .if n \{\ .RE .\} .sp آرگومان \fIbatch_key\fR همچنین می‌تواند یک تابع فراخوان‌پذیر باشد که کلیدی را برای شناسایی «دسته‌ها» (batches) مختلف فایل‌های هدف جهت گردآوری برای ساخت دسته‌ای برمی‌گرداند\&. یک تابع \fIbatch_key\fR باید چهار پارامتر بپذیرد: \fIaction\fR، \fIenv\fR، \fItarget\fR و \fIsource\fR\&. پارامتر اول، \fIaction\fR، شیء Action فعال است\&. پارامتر دوم، \fIenv\fR، محیط ساختی است که برای هدف پیکربندی شده است\&. پارامترهای \fItarget\fR و \fIsource\fR فهرست‌هایی از اهداف و منابع برای عمل پیکربندی‌شده هستند\&. .sp کلید بازگردانده‌شده معمولاً باید یک تاپل از مقادیر به‌دست‌آمده از آرگومان‌ها باشد و با بهره‌گیری از هر منطق مناسبی، تصمیم بگیرد که فراخوانی‌های متعدد چگونه باید دسته‌بندی شوند\&. برای نمونه، یک تابع \fIbatch_key\fR ممکن است تصمیم بگیرد مقدار یک متغیر ساخت خاص را از \fIenv\fR برگرداند که باعث می‌شود \fBscons\fR هدف‌هایی را که دارای مقادیر یکسان از آن متغیر ساخت هستند، به‌صورت دسته‌ای بسازد؛ یا شاید \fBid\fR() پایتون مربوط به کل محیط ساخت را برگرداند، که در این حالت \fBscons\fR تمام هدف‌های پیکربندی‌شده با همان محیط ساخت را به‌صورت دسته‌ای خواهد ساخت\&. بازگرداندن \fBNone\fR نشان می‌دهد که آن هدف خاص نباید \fIبخشی\fR از هیچ ساخت دسته‌ای باشد، بلکه در عوض با یک فراخوانی جداگانه از دستور یا تابع Action ساخته خواهد شد\&. مثال: .sp .if n \{\ .RS 4 .\} .nf def batch_key(action, env, target, source): tdir = target[0]\&.dir if tdir\&.name == \*(Aqspecial\*(Aq: # Don\*(Aqt batch\-build any target # in the special/ subdirectory\&. return None return (id(action), id(env), tdir) a = Action(\*(Aqbuild $CHANGED_SOURCES\*(Aq, batch_key=batch_key) .fi .if n \{\ .RE .\} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBتوابع متفرقه Action\fR .RS 4 .PP SCons توابع Action مختلفی را فراهم می‌کند که امکان انجام انواع عملیات رایج بر روی فایل‌ها و دایرکتوری‌ها را مهیا می‌سازند\&. این توابع از نظر مفهومی شبیه به «tasks» در ابزار ساخت Ant هستند، هرچند پیاده‌سازی آن‌ها کمی متفاوت است\&. این توابع در زمان فراخوانی، در واقع کار مشخص‌شده را اجرا نمی‌کنند، بلکه توابع کارخانه‌ای (factory functions) هستند که یک شیء Action را برمی‌گردانند تا در زمان مناسب اجرا شود\&. .PP دو روش طبیعی برای استفاده از این توابع Action در نظر گرفته شده است\&. .PP نخست، اگر نیاز دارید عمل هم‌زمان با خوانده‌شدن فایل SConscript انجام شود، می‌توانید از تابع سراسری \fBExecute\fR استفاده کنید: .sp .if n \{\ .RS 4 .\} .nf Execute(Touch(\*(Aqfile\*(Aq)) .fi .if n \{\ .RE .\} .PP دوم، می‌توانید از این توابع برای ارائه فهرستی از Actionها جهت استفاده در متد \fBenv\&.Command\fR بهره ببرید\&. این قابلیت به شما امکان می‌دهد توالی‌های پیچیده‌تری از دستکاری فایل‌ها را بدون وابستگی به دستورهای خارجی وابسته به پلتفرم اجرا کنید: .sp .if n \{\ .RS 4 .\} .nf env = Environment(TMPBUILD=\*(Aq/tmp/builddir\*(Aq) env\&.Command( target=\*(Aqfoo\&.out\*(Aq, source=\*(Aqfoo\&.in\*(Aq, action=[ Mkdir(\*(Aq$TMPBUILD\*(Aq), Copy(\*(Aq$TMPBUILD\*(Aq, \*(Aq${SOURCE\&.dir}\*(Aq), "cd $TMPBUILD && make", Delete(\*(Aq$TMPBUILD\*(Aq), ], ) .fi .if n \{\ .RE .\} .PP \fBChmod\fR(\fIdest, mode\fR) .RS 4 یک شیء Action برمی‌گرداند که مجوزهای فایل یا دایرکتوری مشخص‌شده در \fIdest\fR را به \fImode\fR تعیین‌شده تغییر می‌دهد؛ این مقدار مشابه دستور \fBchmod\fR در POSIX می‌تواند یک عدد در مبنای هشت (octal) یا یک رشته باشد\&. مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf Execute(Chmod(\*(Aqfile\*(Aq, 0o755)) env\&.Command( \*(Aqfoo\&.out\*(Aq, \*(Aqfoo\&.in\*(Aq, [Copy(\*(Aq$TARGET\*(Aq, \*(Aq$SOURCE\*(Aq), Chmod(\*(Aq$TARGET\*(Aq, 0o755)], ) Execute(Chmod(\*(Aqfile\*(Aq, "ugo+w")) env\&.Command( \*(Aqfoo\&.out\*(Aq, \*(Aqfoo\&.in\*(Aq, [Copy(\*(Aq$TARGET\*(Aq, \*(Aq$SOURCE\*(Aq), Chmod(\*(Aq$TARGET\*(Aq, "ugo+w")], ) .fi .if n \{\ .RE .\} .sp رفتار \fBChmod\fR در پلتفرم‌های Windows و WebAssembly دارای محدودیت است؛ یادداشت‌های موجود در مستندات Python را برای \m[blue]\fBos\&.chmod\fR\m[]\&\s-2\u[8]\d\s+2 که تابع زیربنایی آن است، ببینید\&. .RE .PP \fBCopy\fR(\fIdest, src\fR) .RS 4 یک شیء Action برمی‌گرداند که فایل یا دایرکتوری مبدأ \fIsrc\fR را در فایل یا دایرکتوری مقصد \fIdest\fR کپی می‌کند\&. اگر \fIsrc\fR یک فهرست باشد، در صورتی که \fIdest\fR از پیش وجود داشته باشد باید حتماً یک دایرکتوری باشد\&. مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf Execute(Copy(\*(Aqfoo\&.output\*(Aq, \*(Aqfoo\&.input\*(Aq)) env\&.Command(\*(Aqbar\&.out\*(Aq, \*(Aqbar\&.in\*(Aq, Copy(\*(Aq$TARGET\*(Aq, \*(Aq$SOURCE\*(Aq)) .fi .if n \{\ .RE .\} .RE .PP \fBDelete\fR(\fIentry, [must_exist]\fR) .RS 4 یک Action برمی‌گرداند که \fIentry\fR مشخص‌شده را که می‌تواند یک فایل یا یک درخت دایرکتوری باشد، حذف می‌کند\&. اگر یک دایرکتوری مشخص شود، کل درخت دایرکتوری پاک خواهد شد\&. اگر پرچم \fImust_exist\fR روی یک مقدار درست (true) تنظیم شده باشد، در صورت عدم وجود مدخل مشخص‌شده، یک خطای Python صادر خواهد شد؛ مقدار پیش‌فرض نادرست (false) است، بدین معنی که اگر مدخل وجود نداشته باشد، Action در سکوت هیچ کاری انجام نمی‌دهد\&. مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf Execute(Delete(\*(Aq/tmp/buildroot\*(Aq)) env\&.Command( \*(Aqfoo\&.out\*(Aq, \*(Aqfoo\&.in\*(Aq, action=[ Delete(\*(Aq${TARGET\&.dir}\*(Aq), MyBuildAction, ], ) Execute(Delete(\*(Aqfile_that_must_exist\*(Aq, must_exist=True)) .fi .if n \{\ .RE .\} .RE .PP \fBMkdir\fR(\fIname\fR) .RS 4 یک Action برمی‌گرداند که دایرکتوری \fIname\fR و تمام دایرکتوری‌های میانی مورد نیاز را ایجاد می‌کند\&. \fIname\fR همچنین می‌تواند فهرستی از دایرکتوری‌ها برای ایجاد باشد\&. مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf Execute(Mkdir(\*(Aq/tmp/outputdir\*(Aq)) env\&.Command( \*(Aqfoo\&.out\*(Aq, \*(Aqfoo\&.in\*(Aq, action=[ Mkdir(\*(Aq/tmp/builddir\*(Aq), Copy(\*(Aq/tmp/builddir/foo\&.in\*(Aq, \*(Aq$SOURCE\*(Aq), "cd /tmp/builddir && make", Copy(\*(Aq$TARGET\*(Aq, \*(Aq/tmp/builddir/foo\&.out\*(Aq), ], ) .fi .if n \{\ .RE .\} .RE .PP \fBMove\fR(\fIdest, src\fR) .RS 4 یک Action برمی‌گرداند که فایل یا دایرکتوری مشخص‌شدهٔ \fIsrc\fR را به فایل یا دایرکتوری مقصد \fIdest\fR منتقل می‌کند\&. مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf Execute(Move(\*(Aqfile\&.destination\*(Aq, \*(Aqfile\&.source\*(Aq)) env\&.Command( \*(Aqoutput_file\*(Aq, \*(Aqinput_file\*(Aq, action=[MyBuildAction, Move(\*(Aq$TARGET\*(Aq, \*(Aqfile_created_by_MyBuildAction\*(Aq)], ) .fi .if n \{\ .RE .\} .RE .PP \fBTouch\fR(\fIfile\fR) .RS 4 یک Action برمی‌گرداند که زمان اصلاح (modification time) را روی \fIfile\fR مشخص‌شده به‌روزرسانی می‌کند\&. مثال‌ها: .sp .if n \{\ .RS 4 .\} .nf Execute(Touch(\*(Aqfile_to_be_touched\*(Aq)) env\&.Command(\*(Aqmarker\*(Aq, \*(Aqinput_file\*(Aq, action=[MyBuildAction, Touch(\*(Aq$TARGET\*(Aq)]) .fi .if n \{\ .RE .\} .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBجایگزینی متغیرها (Variable Substitution)\fR .RS 4 .PP پیش از اجرای یک دستور، \fBscons\fR بسط پارامتر (جایگزینی) را روی رشته‌ای که بخش کُنش (action) سازنده را تشکیل می‌دهد انجام می‌دهد\&. قالب یک پارامتر قابل جایگزینی به صورت ${\fIexpression\fR}\& است\&. اگر \fIexpression\fR به یک متغیر اشاره کند، آکولادها در ${\fIexpression\fR} می‌توانند حذف شوند \fIمگر آن‌که\fR بلافاصله پس از نام متغیر، نویسه‌ای بیاید که بتواند به عنوان بخشی از نام تفسیر شود، یا از نحو Python مانند \fB[\fR (برای نمایه‌گذاری/برش) یا \fB\&.\fR (برای دسترسی به مشخصه‌ها \- بخش Special Attributes در زیر را ببینید) باشد\&. .PP اگر \fIexpression\fR به یک construction variable اشاره کند، آن عبارت (شامل $ یا ${ }) با مقدار آن متغیر در construction environment در زمان اجرا جایگزین می‌شود\&. اگر \fIexpression\fR شبیه به نام یک متغیر باشد اما در construction environment تعریف نشده باشد، با یک رشتهٔ خالی جایگزین خواهد شد\&. اگر \fIexpression\fR به یکی از Special Variables (زیر را ببینید) اشاره داشته باشد، مقدار متناظر آن متغیر جایگزین می‌شود\&. \fIexpression\fR همچنین می‌تواند یک عبارت Python برای ارزیابی باشد\&. برای توضیحات به بخش Python Code Substitution در زیر مراجعه کنید\&. .PP SCons هنگام تبدیل construction variables به رشته‌های خط فرمان، از قوانین زیر پیروی می‌کند: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} اگر مقدار یک رشته باشد، به عنوان آرگومان‌های خط فرمان که با فاصله جدا شده‌اند تفسیر می‌شود\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} اگر مقدار یک لیست باشد، به عنوان فهرستی از آرگومان‌های خط فرمان تفسیر می‌شود\&. هر عنصر از لیست به یک رشته تبدیل می‌شود\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} هر چیزی که لیست یا رشته نباشد، به رشته تبدیل شده و به عنوان یک آرگومان خط فرمان تکی تفسیر می‌شود\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} نویسه‌های خط جدید (\en) خطوط را از هم جدا می‌کنند\&. تجزیهٔ خط جدید پس از تمام تجزیه‌های دیگر انجام می‌شود، بنابراین ممکن نیست آرگومان‌ها (مانند نام فایل‌ها) حاوی نویسه‌های خط جدید توکار باشند\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} برای یک نویسهٔ واقعی \fB$\fR از \fB$$\fR استفاده کنید\&. برای مثال، $$FOO در رشتهٔ نهایی به صورت $FOO باقی خواهد ماند\&. .RE .PP هنگامی که یک کُنش ساخت (build action) اجرا می‌شود، هشی از خط فرمان به همراه سایر اطلاعات مربوط به هدف(های) ساخته‌شده توسط آن کُنش، برای استفاده‌های بعدی در تعیین لزوم ساخت مجدد ذخیره می‌شود\&. این مقدار build signature (یا build action signature) نامیده می‌شود\&. توالی گریز \fB$(\fR \fIsubexpression\fR \fB$)\fR می‌تواند برای مشخص کردن بخش‌هایی از خط فرمان استفاده شود که ممکن است بدون نیاز به ساخت مجدد تغییر کنند\-\-یعنی بخش‌هایی که نباید در هنگام محاسبهٔ build signature لحاظ شوند\&. تمام متن از \fB$(\fR تا و با احتساب \fB$)\fR متناظر، پیش از اضافه شدن به build signature از خط فرمان حذف خواهد شد، در حالی که پیش از اجرای دستور فقط \fB$(\fR و \fB$)\fR حذف خواهند شد\&. برای مثال، رشتهٔ خط فرمان: .sp .if n \{\ .RS 4 .\} .nf "echo Last build occurred $( $TODAY $)\&. > $TARGET" .fi .if n \{\ .RE .\} .PP دستور زیر را اجرا خواهد کرد: .sp .if n \{\ .RS 4 .\} .nf echo Last build occurred $TODAY\&. > $TARGET .fi .if n \{\ .RE .\} .PP اما امضای ساخت (build signature) اضافه‌شده به هر فایل هدف از این عبارت محاسبه خواهد شد: .sp .if n \{\ .RS 4 .\} .nf echo Last build occurred \&. > $TARGET .fi .if n \{\ .RE .\} .PP در حالی که متغیرهای ساخت معمولاً به‌طور مستقیم جایگزین می‌شوند، اگر یک متغیر ساخت دارای مقداری باشد که یک شیء قابل فراخوانی (callable) در Python است (یک تابع، یا کلاسی با متد __call__\c )، آن شیء در طول جایگزینی فراخوانی می‌شود\&. شیء قابل فراخوانی باید چهار آرگومان بپذیرد: \fItarget\fR، \fIsource\fR، \fIenv\fR و \fIfor_signature\fR\&. \fIsource\fR فهرستی از گره‌های منبع است، \fItarget\fR فهرستی از گره‌های هدف است، \fIenv\fR همان محیط ساخت مورد استفاده برای زمینه است، و \fIfor_signature\fR یک مقدار بولی است که به شیء قابل فراخوانی اعلام می‌کند آیا به منظور تولید یک امضای ساخت فراخوانی شده است یا خیر\&. از آنجا که امضای ساخت برای تعیین لزوم ساخت مجدد به کار می‌رود، مؤلفه‌های متغیری که بر راه‌اندازی ساخت مجدد بی‌تأثیر هستند، در صورت صادق (true) بودن \fIfor_signature\fR باید از رشته بازگردانده شده حذف شوند\&. برای ساختار نحوی به بخش‌های \fB$(\fR و \fB$)\fR در بالا مراجعه کنید\&. .PP SCons هر آنچه را که شیء قابل فراخوانی بازمی‌گرداند در رشته بسط‌یافته قرار می‌دهد: .sp .if n \{\ .RS 4 .\} .nf def foo(target, source, env, for_signature): return "bar" # Will expand $BAR to "bar baz" env = Environment(FOO=foo, BAR="$FOO baz") .fi .if n \{\ .RE .\} .PP جهت یادآوری، جایگزینی زمانی رخ می‌دهد که $BAR در عمل در یک کنش سازنده استفاده شود\&. مقدار env[\*(AqBAR\*(Aq] دقیقاً همان مقداری خواهد بود که تنظیم شده بود: "$FOO baz"\&. این موضوع می‌تواند اشکال‌زدایی را دشوار سازد، زیرا نتیجه جایگزین‌شده در زمان تفسیر فایل‌های SConscript در دسترس نیست و از این رو برای تابع print قابل دسترسی نخواهد بود\&. با این حال، می‌توانید در صورت نیاز با فراخوانی متد \fBenv\&.subst\fR به این منظور، جایگزینی را بر حسب تقاضا انجام دهید\&. .PP می‌توانید از این ویژگی برای ارسال آرگومان‌ها به یک متغیر قابل فراخوانی استفاده کنید؛ بدین صورت که یک کلاس قابل فراخوانی بسازید که آرگومان‌های ارسالی را در نمونه ذخیره کرده و سپس هنگام فراخوانی نمونه (در متد __call__\c ) از آن‌ها استفاده کند\&. توجه داشته باشید که در این حالت، کل بسط متغیر باید درون آکولاد محصور شود تا آرگومان‌ها به نمونه‌سازی کلاس مرتبط شوند: .sp .if n \{\ .RS 4 .\} .nf class foo: def __init__(self, arg): self\&.arg = arg def __call__(self, target, source, env, for_signature): return self\&.arg + " bar" # Will expand $BAR to "my argument bar baz" env=Environment(FOO=foo, BAR="${FOO(\*(Aqmy argument\*(Aq)} baz") .fi .if n \{\ .RE .\} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBجایگزینی: متغیرهای ویژه (Substitution: Special Variables)\fR .RS 4 .PP علاوه بر متغیرهای ساخت معمولی، scons متغیرهای ویژه (Special Variables) زیر را برای استفاده در بسط دادن دستورها ارائه می‌کند: .PP \fB$CHANGED_SOURCES\fR .RS 4 نام فایل‌های تمام منابع دستور ساخت که از زمان آخرین ساخت هدف تغییر کرده‌اند\&. .RE .PP \fB$CHANGED_TARGETS\fR .RS 4 نام فایل‌های تمام اهدافی که از منابع تغییریافته از زمان آخرین ساخت هدف، ساخته خواهند شد\&. .RE .PP \fB$SOURCE\fR .RS 4 نام فایل منبعِ دستور ساخت، یا در صورت وجود چندین منبع در حال ساخت، نام فایل نخستین منبع\&. .RE .PP \fB$SOURCES\fR .RS 4 نام فایل‌های منابع دستور ساخت\&. .RE .PP \fB$TARGET\fR .RS 4 نام فایل هدف در حال ساخت، یا در صورت وجود چندین هدف در حال ساخت، نام فایل نخستین هدف\&. .RE .PP \fB$TARGETS\fR .RS 4 نام فایل‌های تمام هدف‌هایی که در حال ساخت هستند\&. .RE .PP \fB$UNCHANGED_SOURCES\fR .RS 4 نام فایل‌های تمام منبع‌های دستور ساخت که از زمان آخرین ساخت هدف، تغییر \fIنکرده‌اند\fR\&. .RE .PP \fB$UNCHANGED_TARGETS\fR .RS 4 نام فایل‌های تمام هدف‌هایی که از منبع‌هایی ساخته می‌شدند که از زمان آخرین ساخت هدف تغییر \fIنکرده‌اند\fR\&. .RE .PP این نام‌ها رزرو شده‌اند و نمی‌توان به آن‌ها مقداری تخصیص داد یا به عنوان متغیرهای ساخت استفاده کرد\&. SCons آن‌ها را به روشی وابسته به زمینه (context\-dependent) محاسبه می‌کند و از یک محیط ساخت بازیابی نمی‌شوند\&. .PP برای نمونه، فراخوانی سازنده زیر: .sp .if n \{\ .RS 4 .\} .nf env = Environment(CC=\*(Aqcc\*(Aq) env\&.Command( target=[\*(Aqfoo\*(Aq], source=[\*(Aqfoo\&.c\*(Aq, \*(Aqbar\&.c\*(Aq], action=\*(Aq@echo $CC \-c \-o $TARGET $SOURCES\*(Aq ) .fi .if n \{\ .RE .\} .PP خروجی زیر را تولید خواهد کرد: .sp .if n \{\ .RS 4 .\} .nf cc \-c \-o foo foo\&.c bar\&.c .fi .if n \{\ .RE .\} .PP در مثال قبلی، رشته ${SOURCES[1]} به صورت زیر باز خواهد شد: bar\&.c\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBجایگزینی: صفت‌های ویژه (Substitution: Special Attributes)\fR .RS 4 .PP یک نام متغیر ممکن است شامل اصلاح‌کننده‌های زیر درون آکولادهای دربرگیرنده باشد تا به ویژگی‌های رشته درونیابی‌شده دسترسی پیدا کند\&. این‌ها به عنوان صفت‌های ویژه (special attributes) شناخته می‌شوند\&. .RS 4 \fIbase\fR \- مسیر پایه نام فایل، شامل مسیر دایرکتوری اما بدون هیچ‌گونه پسوندی\&. .RE .RS 4 \fIdir\fR \- نام دایرکتوری‌ای که فایل در آن قرار دارد\&. .RE .RS 4 \fIfile\fR \- نام فایل، بدون بخش دایرکتوری\&. .RE .RS 4 \fIfilebase\fR \- مانند \fIfile\fR اما بدون پسوند آن\&. .RE .RS 4 \fIsuffix\fR \- تنها پسوند فایل\&. .RE .RS 4 \fIabspath\fR \- نام مسیر مطلق فایل\&. .RE .RS 4 \fIrelpath\fR \- نام مسیر فایل به صورت نسبی نسبت به بالاترین دایرکتوری پروژه\&. .RE .RS 4 \fIposix\fR \- مسیری که در آن دایرکتوری‌ها با اسلش رو به جلو (\fB/\fR) از هم جدا شده‌اند\&. گاهی اوقات در سیستم‌های Windows ضروری است، هنگامی که یک مسیر به فایلی در سایر سیستم‌ها (POSIX) ارجاع می‌دهد\&. .RE .RS 4 \fIwindows\fR \- مسیری که در آن دایرکتوری‌ها با بک‌اسلش (\fB\e\e\fR) از هم جدا شده‌اند\&. گاهی اوقات در سیستم‌های سبک POSIX ضروری است، هنگامی که یک مسیر به فایلی در سایر سیستم‌ها (Windows) ارجاع می‌دهد\&. \fIwin32\fR یک مترادف (منسوخ‌شده) برای \fIwindows\fR است\&. .RE .RS 4 \fIsrcpath\fR \- دایرکتوری و نام فایل برای فایل منبعی که از طریق \fBVariantDir\fR() به این فایل پیوند خورده است\&. اگر این فایل پیوند نخورده باشد، صرفاً دایرکتوری و نام فایل را بدون تغییر بازمی‌گرداند\&. .RE .RS 4 \fIsrcdir\fR \- دایرکتوری حاوی فایل منبعی که از طریق \fBVariantDir\fR() به این فایل پیوند خورده است\&. اگر این فایل پیوند نخورده باشد، تنها بخش دایرکتوریِ نام فایل را بازمی‌گرداند\&. .RE .RS 4 \fIrsrcpath\fR \- دایرکتوری و نام فایل برای فایل منبعی که از طریق \fBVariantDir\fR() به این فایل پیوند خورده است\&. اگر فایل به صورت محلی وجود نداشته باشد اما در یک مخزن (Repository) موجود باشد، مسیر موجود در مخزن بازگردانده می‌شود\&. اگر این فایل پیوند نخورده باشد، صرفاً دایرکتوری و نام فایل را بدون تغییر بازمی‌گرداند\&. .RE .RS 4 \fIrsrcdir\fR \- دایرکتوری مخزن (Repository) حاوی فایل منبعی که از طریق \fBVariantDir\fR() به این فایل پیوند خورده است\&. اگر این فایل پیوند نخورده باشد، تنها بخش دایرکتوریِ نام فایل را بازمی‌گرداند\&. .RE .PP برای نمونه، هدف مشخص‌شده برای اصلاح‌کننده‌های متناظر به صورت زیر باز خواهد شد: .sp .if n \{\ .RS 4 .\} .nf $TARGET => sub/dir/file\&.x ${TARGET\&.base} => sub/dir/file ${TARGET\&.dir} => sub/dir ${TARGET\&.file} => file\&.x ${TARGET\&.filebase} => file ${TARGET\&.suffix} => \&.x ${TARGET\&.abspath} => /top/dir/sub/dir/file\&.x ${TARGET\&.relpath} => sub/dir/file\&.x $TARGET => \&.\&./dir2/file\&.x ${TARGET\&.abspath} => /top/dir2/file\&.x ${TARGET\&.relpath} => \&.\&./dir2/file\&.x SConscript(\*(Aqsrc/SConscript\*(Aq, variant_dir=\*(Aqsub/dir\*(Aq) $SOURCE => sub/dir/file\&.x ${SOURCE\&.srcpath} => src/file\&.x ${SOURCE\&.srcdir} => src Repository(\*(Aq/usr/repository\*(Aq) $SOURCE => sub/dir/file\&.x ${SOURCE\&.rsrcpath} => /usr/repository/src/file\&.x ${SOURCE\&.rsrcdir} => /usr/repository/src .fi .if n \{\ .RE .\} .PP برخی از اصلاح‌کننده‌ها می‌توانند ترکیب شوند، مانند ${TARGET\&.srcpath\&.base), ${TARGET\&.file\&.suffix} و غیره\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBجایگزینی کد Python (Python Code Substitution)\fR .RS 4 .PP اگر عبارت قابل‌جایگزینی با استفاده از نشانه‌گذاری ${\fIexpression\fR} با هیچ‌یک از الگوهای جایگزینی دیگر مطابقت نداشته باشد، به عنوان یک عبارت Python ارزیابی می‌شود\&. این کار با استفاده از تابع \fBeval\fR در Python انجام می‌پذیرد، در حالی که پارامتر \fIglobals\fR روی مجموعه متغیرهای ساخت محیط فعلی تنظیم شده و نتیجه در آن جایگزین می‌شود\&. بنابراین در حالت زیر: .sp .if n \{\ .RS 4 .\} .nf env\&.Command( \*(Aqfoo\&.out\*(Aq, \*(Aqfoo\&.in\*(Aq, "echo ${COND==1 and \*(AqFOO\*(Aq or \*(AqBAR\*(Aq} > $TARGET" ) .fi .if n \{\ .RE .\} .PP دستور اجراشده یکی از موارد زیر خواهد بود: .sp .if n \{\ .RS 4 .\} .nf echo FOO > foo\&.out .fi .if n \{\ .RE .\} .PP یا .sp .if n \{\ .RS 4 .\} .nf echo BAR > foo\&.out .fi .if n \{\ .RE .\} .PP که بستگی به مقدار فعلی env[\*(AqCOND\*(Aq] در زمان اجرای دستور دارد\&. ارزیابی در زمانی انجام می‌شود که هدف در حال ساخت است، نه زمانی که SConscript خوانده می‌شود\&. بنابراین اگر env[\*(AqCOND\*(Aq] بعداً در SConscript تغییر کند، مقدار نهایی استفاده خواهد شد\&. .PP در اینجا یک مثال کامل‌تر آمده است\&. توجه داشته باشید که تمام موارد \fBCOND\fR، \fBFOO\fR و \fBBAR\fR متغیرهای ساخت هستند و مقادیر آن‌ها در دستور نهایی جایگزین می‌شود\&. \fBFOO\fR یک لیست است، بنابراین عناصر آن با فاصله‌های جداکننده درج می‌شوند\&. .sp .if n \{\ .RS 4 .\} .nf env=Environment() env[\*(AqCOND\*(Aq] = 1 env[\*(AqFOO\*(Aq] = [\*(Aqfoo1\*(Aq, \*(Aqfoo2\*(Aq] env[\*(AqBAR\*(Aq] = \*(Aqbarbar\*(Aq env\&.Command( \*(Aqfoo\&.out\*(Aq, \*(Aqfoo\&.in\*(Aq, "echo ${COND==1 and FOO or BAR} > $TARGET" ) .fi .if n \{\ .RE .\} .PP دستور زیر را اجرا خواهد کرد: .sp .if n \{\ .RS 4 .\} .nf echo foo1 foo2 > foo\&.out .fi .if n \{\ .RE .\} .PP در واقع، ارزیابی عبارت Python همان روشی است که ویژگی‌های خاص جایگزین می‌شوند: آن‌ها صرفاً ویژگی‌های شیءهای Python هستند که \fB$TARGET\fR، \fB$SOURCES\fR و غیره را نشان می‌دهند، که SCons آن‌ها را به \fBeval\fR ارسال کرده تا مقدار را بازگرداند\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBهشدار (Caution)\fR .ps -1 .br .PP استفاده از تابع \fBeval\fR در Python دارای پیامدهای امنیتی در نظر گرفته می‌شود، زیرا بسته به منابع ورودی، رشته‌های دلخواه و بررسی‌نشده‌ای از کد می‌توانند توسط مفسر Python اجرا شوند\&. اگرچه SCons از آن در بستری تا حدی محدود استفاده می‌کند، اما هنگام استفاده از ساختار ${python\-expression\-for\-subst} باید از این مسئله آگاه باشید\&. .sp .5v .RE .RE .SS "اشیاء Scanner (Scanner Objects)" .PP اشیاء Scanner برای پویش انواع خاصی از فایل‌ها به منظور یافتن وابستگی‌های ضمنی استفاده می‌شوند؛ برای نمونه، دستورهای تعبیه‌شدهٔ پیش‌پردازنده/کامپایلر که موجب می‌شوند فایل‌های دیگر در حین پردازش ضمیمه (include) شوند\&. SCons دارای تعدادی شیء Scanner از پیش ساخته شده است، بنابراین معمولاً تنها تنظیم Scannerها برای انواع فایل‌های جدید ضروری است\&. شما این کار را با فراخوانی تابع کارخانه‌ای (factory function) \fBScanner\fR انجام می‌دهید\&. \fBScanner\fR آرگومان‌های زیر را می‌پذیرد\&. تنها \fIfunction\fR الزامی است؛ باقی اختیاری هستند: .PP \fIfunction\fR .RS 4 تابعی که می‌تواند یک Node مشخص (معمولاً یک فایل) را پردازش («پویش») کرده و فهرستی از Nodeها را بازگرداند که نشان‌دهندهٔ هرگونه وابستگی ضمنی (معمولاً فایل‌ها) است که برای آن Node ردگیری خواهند شد\&. این تابع باید سه آرگومان اجباری را بپذیرد: \fInode\fR، \fIenv\fR و \fIpath\fR، و یک آرگومان اختیاری چهارم: \fIarg\fR\&. \fInode\fR گره داخلی SCons است که نمایانگر فایل مورد پویش می‌باشد، \fIenv\fR محیط ساخت (construction environment) مورد استفاده در حین پویش است، و \fIpath\fR تاپلی از دایرکتوری‌ها است که می‌توان در آن‌ها برای یافتن فایل‌ها جستجو کرد، همان‌طور که توسط \fIpath_function\fR اختیاریِ پویشگر تولید می‌شود\&. اگر پارامتر \fIargument\fR هنگام ایجاد شیء Scanner مشخص شده باشد، هنگام فراخوانی تابع پویشگر به عنوان پارامتر \fIarg\fR به آن فرستاده می‌شود\&. از آنجا که \fIargument\fR اختیاری است، تابع پویشگر \fIممکن است\fR بدون پارامتر \fIarg\fR فراخوانی شود\&. .sp تابع پویشگر می‌تواند از \fBstr\fR(\fInode\fR) برای دریافت نام فایل، از \fInode\fR\&.dir برای دریافت دایرکتوری قرارگیری فایل، از \fInode\fR\&.get_contents() برای دریافت محتویات فایل به صورت بایت، یا از \fInode\fR\&.get_text_contents() برای دریافت محتویات فایل به صورت متن استفاده کند\&. .sp تابع پویشگر باید هنگام تعیین وجود وابستگی‌های احتمالی، دایرکتوری‌های فهرست‌شده در پارامتر \fIpath\fR را در نظر بگیرد\&. به ابزارهای خارجی مانند پیش‌پردازندهٔ C/C++ فهرستی از دایرکتوری‌ها داده می‌شود تا در آن‌ها به دنبال دستورهای گنجاندن فایل منبع بگردند (برای نمونه #include "myheader\&.h")\&. این فهرست از متغیر مسیر مربوطه (برای نمونه \fB$CPPPATH\fR برای C/C++) تولید می‌شود\&. می‌توان Scanner را هدایت کرد تا همان فهرست را از طریق پارامتر \fIpath\fR به تابع پویشگر منتقل کند تا بتواند در همان مکان‌ها جستجو نماید\&. امکان ارسال این فهرست توسط Scanner، از طریق آرگومان \fIpath_function\fR در زمان ایجاد Scanner فعال می‌شود\&. .sp به جای یک تابع پویشگر، می‌توانید یک دیکشنری به عنوان پارامتر \fIfunction\fR ارائه دهید\&. این دیکشنری باید کلیدها (مانند پسوندهای فایل) را به اشیاء Scanner دیگر نگاشت کند\&. اسکنری که به این شیوه ساخته شود به عنوان توزیع‌کننده (dispatcher) عمل می‌کند: پارامتر \fIskeys\fR مربوط به Scanner به طور خودکار با کلیدهای دیکشنری پر می‌شود، که نشان می‌دهد این Scanner، گره‌های Nodeای را که با آن کلیدها مطابقت دارند مدیریت می‌کند؛ سپس از این نگاشت برای واگذاری فایل به یک Scanner دیگر استفاده می‌شود که بر اساس \fIskeys\fR خودش برای مدیریت آن Node انتخاب نمی‌شده است\&. .sp توجه داشته باشید که تضمینی وجود ندارد که فایل مورد پویش در زمان فراخوانی پویشگر \fIوجود داشته باشد\fR \- ممکن است فایلی تولیدی باشد که هنوز ایجاد نشده است \- بنابراین تابع پویشگر باید در برابر این موضوع انعطاف‌پذیر باشد\&. .sp اگرچه بسیاری از توابع پویشگر با جستجوی الگوهای شناخته‌شده در کد، بر روی فایل‌های کد منبع عمل می‌کنند، اما در واقع می‌توانند هر کاری را که لازم است انجام دهند\&. به عنوان مثال، به سازندهٔ \fBProgram\fR یک \fItarget_scanner\fR اختصاص داده شده است که فهرست کتابخانه‌های ارائه‌شده برای ساخت (\fB$LIBS\fR) را بررسی می‌کند و در مورد افزودن آن‌ها به عنوان وابستگی تصمیم می‌گیرد؛ این پویشگر به \fIدرون\fR باینری ساخته‌شده نگاه نمی‌کند\&. .sp تصمیم‌گیری در این مورد که آیا برای موارد شناسایی‌شده توسط پویش، یک وابستگی در SCons ایجاد شود یا خیر، بر عهدهٔ تابع پویشگر است\&. وابستگی‌ها بخشی کلیدی از سازوکار SCons هستند که هم تعیین بازسازی و هم ترتیب درست ساخت‌ها را امکان‌پذیر می‌کنند\&. به‌ویژه مهم است که فایل‌های تولیدی که وابستگی هستند به گراف Node افزوده شوند، در غیر این صورت خطاهای استفاده پیش از ایجاد (use\-before\-create) محتمل خواهد بود\&. با این حال، ممکن است نیازی نباشد همه چیز به عنوان وابستگی ردگیری شود\&. در برخی موارد، فایل‌های سرآیند ارائه‌شده توسط پیاده‌سازی به ندرت تغییر می‌کنند ولی به طور بسیار گسترده ضمیمه می‌شوند، بنابراین ردگیری آن‌ها در گراف گره SCons می‌تواند در ازای فایده‌ای اندک، بسیار پرهزینه باشد \- برای مثال فایل سرآیند استاندارد C یعنی string\&.h را در نظر بگیرید\&. هیچ اطلاعات ویژه‌ای برای کمک به این تصمیم‌گیری به تابع پویشگر داده نمی‌شود، بنابراین منطق تصمیم‌گیری کدنویسی‌شده در تابع پویشگر باید به دقت سنجیده شود\&. .RE .PP \fIname\fR .RS 4 نامی که برای Scanner استفاده می‌شود\&. این نام عمدتاً برای شناسایی داخلی Scanner به کار می‌رود\&. مقدار پیش‌فرض "NONE" است\&. .RE .PP \fIargument\fR .RS 4 در صورت تعیین شدن، هنگام فراخوانی تابع پویشگر \fIfunction\fR و تابع مسیر \fIpath_function\fR، به عنوان پارامتر اختیاری که هر یک از این توابع می‌گیرند، به آن‌ها ارسال خواهد شد\&. .RE .PP \fIskeys\fR .RS 4 کلید(های) Scanner که انواع فایل‌های مرتبط با این پویشگر را مشخص می‌کند\&. به صورت داخلی برای انتخاب یک پویشگر مناسب به کار می‌رود\&. در حالت معمولِ پویش نام فایل‌ها، این آرگومان فهرستی از پسوندها برای انواع فایل‌های مختلفی خواهد بود که این Scanner نحوهٔ پویش آن‌ها را می‌داند\&. اگر \fIskeys\fR یک رشته باشد، توسط محیط جاری به یک فهرست بسط داده می‌شود\&. .RE .PP \fIpath_function\fR .RS 4 در صورت مشخص شدن، تابعی است برای تولید مسیرهایی که جهت جستجو در حین تولید وابستگی‌ها به تابع پویشگر فرستاده می‌شوند\&. این تابع باید پنج آرگومان دریافت کند: یک محیط ساخت (construction environment)، یک Node برای دایرکتوریِ حاوی فایل SConscript که نخستین هدف در آن تعریف شده است، فهرستی از گره‌های هدف، فهرستی از گره‌های منبع، و مقدار \fIargument\fR در صورتی که هنگام ایجاد Scanner تعیین شده باشد (از آنجا که \fIargument\fR اختیاری است، ممکن است تابع بدون این آرگومان فراخوانی شود و \fIpath_function\fR باید برای این حالت آماده باشد)\&. این تابع باید تاپلی از دایرکتوری‌ها را بازگرداند که بتوان در آن‌ها به جستجوی فایل‌هایی پرداخت که توسط این شیء Scanner بازگردانده می‌شوند\&. .sp تابع \fBFindPathDirs\fR می‌تواند فراخوانی شود تا یک \fIpath_function\fR آماده برای یک نام متغیر ساخت (construction variable) مشخص برگرداند، که معمولاً آسان‌تر از نوشتن تابع از ابتدا است\&. برای نمونه، \fBpath_function=FindPathDirs(\*(AqCPPPATH\*(Aq)\fR بدین معناست که تابع پویشگر با مسیرهای استخراج‌شده از \fB$CPPPATH\fR در محیط ساخت \fIenv\fR فراخوانی می‌شود و به عنوان پارامتر \fIpath\fR به تابع پویشگر ارسال می‌گردد\&. .RE .PP \fInode_class\fR .RS 4 کلاس گره‌ای (Node) که باید توسط این شیء Scanner بازگردانده شود\&. هرگونه رشته یا شیء دیگری که توسط تابع پویشگر بازگردانده شود و از این کلاس نباشد، از طریق تابع مشخص‌شده در آرگومان \fInode_factory\fR پردازش خواهد شد\&. مقدار \fBNone\fR می‌تواند برای نشان دادن عدم تبدیل ارسال شود؛ حالت پیش‌فرض، بازگرداندن گره‌های File است\&. .RE .PP \fInode_factory\fR .RS 4 یک تابع Python که یک رشته یا شیء دیگر را گرفته و آن را طبق آنچه توسط \fInode_class\fR مشخص شده است، به کلاس مناسبی از Node جهت بازگردانده شدن توسط این شیء Scanner تبدیل می‌کند\&. .RE .PP \fIscan_check\fR .RS 4 یک تابع Python که دو آرگومان می‌گیرد، یک Node (فایل) و یک محیط ساخت، و بازمی‌گرداند که آیا در واقع Node باید برای وابستگی‌ها پویش شود یا خیر\&. از این بررسی می‌توان برای حذف فراخوانی‌های غیرضروری به تابع scanner استفاده کرد، برای نمونه زمانی که فایل زیربنایی مشخص‌شده توسط یک Node هنوز وجود ندارد\&. .RE .PP \fIrecursive\fR .RS 4 مشخص می‌کند که آیا این scanner باید مجدداً روی فایل‌های وابستگی بازگردانده‌شده توسط scanner فراخوانی شود یا خیر\&. در صورت حذف، زیرسیستم Node فقط scanner را روی فایل در حال پویش فراخوانی می‌کند و به صورت بازگشتی عمل نخواهد کرد\&. بازگشت زمانی لازم است که فایل‌های بازگردانده‌شده توسط scanner ممکن است خود شامل وابستگی‌های فایلی بیشتری باشند، همانند خطوط #include پیش‌پردازنده\&. مقداری که به درستی (true) ارزیابی شود بازگشت را فعال می‌کند؛ \fIrecursive\fR می‌تواند یک تابع قابل فراخوانی باشد، که در این صورت با فهرستی از Nodeهای یافت‌شده فراخوانی خواهد شد و باید فهرستی از Nodeهایی را بازگرداند که باید به صورت بازگشتی پویش شوند؛ از این قابلیت می‌توان برای انتخاب زیرمجموعه مشخصی از Nodeها جهت پویش اضافی استفاده کرد\&. .RE .PP یک Scanner پس از ایجاد، می‌تواند با قرار گرفتن در فهرست \fB$SCANNERS\fR به یک محیط افزوده شود، که این امر به طور خودکار باعث می‌شود SCons آن را به عنوان یک متد نیز به محیط اضافه کند\&. با این حال، معمولاً یک scanner واقعاً مستقل نیست، بلکه باید به سازوکار انتخاب موجود متصل شود تا تصمیم بگیرد که فایل‌های منبع را چگونه بر اساس پسوند نام فایل پویش کند\&. برای این منظور، SCons دارای یک شیء سراسری SourceFileScanner است که توسط سازنده‌های \fBObject\fR، \fBSharedObject\fR و \fBStaticObject\fR استفاده می‌شود تا تصمیم بگیرند کدام scanner باید به کار گرفته شود\&. شما می‌توانید از متد SourceFileScanner\&.add_scanner() برای افزودن شیء Scanner خود به زیرساخت SCons که برنامه‌ها یا کتابخانه‌های هدف را از فهرستی از فایل‌های منبع با انواع مختلف می‌سازد استفاده کنید: .sp .if n \{\ .RS 4 .\} .nf def xyz_scan(node, env, path): contents = node\&.get_text_contents() # Scan the contents and return the included files\&. XYZScanner = Scanner(xyz_scan) SourceFileScanner\&.add_scanner(\*(Aq\&.xyz\*(Aq, XYZScanner) env\&.Program(\*(Aqmy_prog\*(Aq, [\*(Aqfile1\&.c\*(Aq, \*(Aqfile2\&.f\*(Aq, \*(Aqfile3\&.xyz\*(Aq]) .fi .if n \{\ .RE .\} .SS "ماژول‌های ابزار (Tool Modules)" .PP ابزارهای سفارشی را می‌توان یا با قرار دادن آن‌ها در زیردایرکتوری site_tools یک دایرکتوری site پیکربندی‌شده، یا در مکانی که توسط آرگومان کلیدواژه‌ای \fItoolpath\fR در \fBEnvironment\fR مشخص شده است به پروژه افزود\&. شما باید ترتیبی دهید که ابزار برای اثرگذاری فراخوانی شود، یا به عنوان بخشی از فهرست ارائه‌شده به آرگومان کلیدواژه‌ای \fItools\fR در هنگام مقداردهی اولیه محیط ساخت، یا با فراخوانی \fBenv\&.Tool\fR\&. .PP پارامتر \fItoolpath\fR فهرستی از رشته‌های مسیر، و پارامتر \fItools\fR فهرستی از ابزارها را می‌پذیرد که اغلب رشته هستند: .sp .if n \{\ .RS 4 .\} .nf env = Environment(tools=[\*(Aqdefault\*(Aq, \*(Aqfoo\*(Aq], toolpath=[\*(Aqtools\*(Aq]) .fi .if n \{\ .RE .\} .PP این دستور یک ماژول مشخصات ابزار به نام foo را در دایرکتوری tools و در مکان‌های استاندارد جستجو می‌کند، و علاوه بر این از ابزارهای پیش‌فرض معمول برای پلتفرم مربوطه استفاده می‌نماید\&. .PP هنگام جستجوی ماژول‌های مشخصات ابزار، دایرکتوری‌های مشخص‌شده از طریق \fItoolpath\fR پیش از مسیر ابزار موجود (زیردایرکتوری‌های site_tools دایرکتوری‌های site پیش‌فرض یا مشخص‌شده) در نظر گرفته می‌شوند، که آن‌ها نیز به نوبه خود پیش از ابزارهای توکار (built\-in) بررسی می‌شوند\&. به عنوان مثال، افزودن یک ماژول مشخصات ابزار gcc\&.py به دایرکتوری toolpath، ابزار توکار gcc را بازنویسی (override) خواهد کرد\&. پارامتر \fItoolpath\fR در محیط ذخیره شده و در فراخوانی‌های بعدی متد \fBenv\&.Tool\fR و همچنین توسط \fBenv\&.Clone\fR استفاده خواهد شد\&. .sp .if n \{\ .RS 4 .\} .nf base = Environment(toolpath=[\*(Aqcustom_path\*(Aq]) derived = base\&.Clone(tools=[\*(Aqcustom_tool\*(Aq]) derived\&.CustomBuilder() .fi .if n \{\ .RE .\} .PP یک ماژول مشخصات ابزار شکلی از ماژول Python است که در داخل با استفاده از سازوکار import در Python جستجو می‌شود، بنابراین یک ابزار می‌تواند شامل یک فایل Python تکی با نام ابزار (مانند mytool\&.py) یا یک دایرکتوری با نام ابزار (مانند mytool/) که حداقل دارای یک فایل __init__\&.py است باشد\&. یک ماژول مشخصات ابزار دارای دو نقطه ورود الزامی است: .PP \fBgenerate\fR(\fIenv, **kwargs\fR) .RS 4 محیط ساخت \fIenv\fR را تغییر دهید تا متغیرهای ساخت، Builders، Emitters و غیره ضروری تنظیم شوند تا امکاناتی که توسط ابزار ارائه شده‌اند قابل اجرا باشند\&. دقت کنید متغیرهای ساختی را که ممکن است به طور صریح توسط کاربر تنظیم شده باشند بازنویسی نکنید؛ در عوض آن‌ها را حفظ کرده و/یا الحاق کنید\&. برای مثال: .sp .if n \{\ .RS 4 .\} .nf def generate(env): \&.\&.\&. if \*(AqMYTOOL\*(Aq not in env: env[\*(AqMYTOOL\*(Aq] = env\&.Detect("mytool") flags = env\&.get(\*(AqMYTOOLFLAGS\*(Aq, SCons\&.Util\&.CLVar()) env\&.AppendUnique(MYTOOLFLAGS=\*(Aq\-\-myarg\*(Aq) \&.\&.\&. .fi .if n \{\ .RE .\} .sp تابع \fBgenerate\fR می‌تواند از هر آرگومان کلیدواژه‌ای که کاربر از طریق \fIkwargs\fR ارائه می‌دهد برای تغییر در مقداردهی اولیه خود استفاده کند\&. .RE .PP \fBexists\fR(\fIenv\fR) .RS 4 اگر ابزار بتواند در زمینهٔ (context) \fIenv\fR فراخوانی شود، یک مقدار درست‌نما (truthy) و در غیر این صورت یک مقدار نادرست‌نما (falsy) برمی‌گرداند\&. معمولاً این به معنای جستجوی یک یا چند برنامهٔ شناخته‌شده با استفاده از \fIPATH\fR از \fIenv\fR داده‌شده است، اما ابزار می‌تواند تصمیم‌گیری \fIexists\fR را به هر روش دلخواهی انجام دهد\&. .RE .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBنکته\fR .ps -1 .br .PP در حال حاضر، تابع \fBexists\fR ابزارهای افزوده‌شده توسط کاربر به‌طور خودکار فراخوانی نمی‌شود\&. در نتیجه، توصیه می‌شود که تابع \fBgenerate\fR به‌صورت تدافعی کدنویسی شود \- یعنی به این‌که بررسی‌های لازم برای وجود ابزار از قبل انجام شده است تکیه نکند\&. انتظار می‌رود این یک محدودیت موقت باشد و تابع \fBexists\fR همچنان باید ارائه شود\&. .sp .5v .RE .PP یک عنصر از فهرست \fItools\fR همچنین می‌تواند یک تابع یا شیء قابل فراخوانی دیگر (شامل یک شیء Tool حاصل از فراخوانی قبلی \fBTool\fR) باشد که در این صورت، تابع \fBEnvironment\fR مستقیماً آن شیء را برای به‌روزرسانی محیط ساخت (construction environment) جدید فراخوانی خواهد کرد\&. در این حالت هیچ جستجویی برای ابزار انجام نمی‌شود\&. .sp .if n \{\ .RS 4 .\} .nf def my_tool(env): env[\*(AqXYZZY\*(Aq] = \*(Aqxyzzy\*(Aq env = Environment(tools=[my_tool]) .fi .if n \{\ .RE .\} .PP یک عنصر از فهرست \fItools\fR همچنین می‌تواند یک فهرست یا تاپل دو عنصری به شکل (toolname, kw_dict) باشد\&. SCons ماژول مشخصات ابزار \fItoolname\fR را همان‌طور که در بالا شرح داده شد جستجو می‌کند، و \fIkw_dict\fR را که باید یک دیکشنری باشد، به عنوان آرگومان‌های کلیدواژه‌ای به تابع \fBgenerate\fR ابزار ارسال می‌کند\&. تابع \fBgenerate\fR می‌تواند از آن آرگومان‌ها برای تغییر رفتار ابزار با برپاسازی محیط به روش‌های گوناگون یا تغییر در مقداردهی اولیهٔ آن استفاده کند\&. .sp .if n \{\ .RS 4 .\} .nf # in tools/my_tool\&.py: def generate(env, **kwargs): # Sets MY_TOOL to the value of keyword \*(Aqarg1\*(Aq or \*(Aq1\*(Aq if not supplied env[\*(AqMY_TOOL\*(Aq] = kwargs\&.get(\*(Aqarg1\*(Aq, \*(Aq1\*(Aq) def exists(env): return True # in SConstruct: env = Environment( tools=[\*(Aqdefault\*(Aq, (\*(Aqmy_tool\*(Aq, {\*(Aqarg1\*(Aq: \*(Aqabc\*(Aq})], toolpath=[\*(Aqtools\*(Aq] ) .fi .if n \{\ .RE .\} .PP مشخصات ابزار (\fBmy_tool\fR در این مثال) می‌تواند از متغیر \fB$PLATFORM\fR از محیط ساخت که به آن فرستاده شده برای سفارشی‌سازی ابزار برای پلتفرم‌های مختلف استفاده کند\&. .PP ابزارها می‌توانند «تودرتو» (nested) باشند \- بدین معنی که می‌توانند درون یک زیردایرکتوری در toolpath قرار گیرند\&. نام یک ابزار تودرتو از نقطه به عنوان جداکنندهٔ دایرکتوری استفاده می‌کند\&. .sp .if n \{\ .RS 4 .\} .nf # namespaced builder env = Environment(ENV=os\&.environ\&.copy(), tools=[\*(AqSubDir1\&.SubDir2\&.SomeTool\*(Aq]) env\&.SomeTool(targets, sources) # Search Paths # SCons\eTool\eSubDir1\eSubDir2\eSomeTool\&.py # SCons\eTool\eSubDir1\eSubDir2\eSomeTool\e__init__\&.py # \&.\esite_scons\esite_tools\eSubDir1\eSubDir2\eSomeTool\&.py # \&.\esite_scons\esite_tools\eSubDir1\eSubDir2\eSomeTool\e__init__\&.py .fi .if n \{\ .RE .\} .SH "رفتار وابسته به سیستم (SYSTEM-SPECIFIC BEHAVIOR)" .PP \fBscons\fR و فایل‌های پیکربندی آن تا حد زیادی به دلیل پیاده‌سازی با Python\& بسیار سازگار و قابل‌حمل هستند\&. با این حال، چند مسئله در زمینهٔ سازگاری وجود دارد که ممکن است افراد ناآگاه را به دام بیندازد\&. .SS "پسوند فایل \&.C (\&.C File Suffix)" .PP \fBscons\fR بسته به قابلیت‌های سیستم زیربنایی، با پسوند فایل بزرگ \&.C به‌طور متفاوتی رفتار می‌کند\&. در یک سیستم حساس به کوچک و بزرگی حروف مانند Linux یا UNIX، \fBscons\fR با فایلی دارای پسوند \&.C مانند یک فایل منبع C++ برخورد می‌کند\&. در یک سیستم غیرحساس به بزرگی و کوچکی حروف مانند Windows، \fBscons\fR با فایلی با پسوند \&.C مانند یک فایل منبع C رفتار می‌کند\&. .SS "پسوندهای فایل فرترن (Fortran File Suffixes)" .PP پسوندهای فایل‌های منبع هنگام کار با کدهای زبان Fortran به چند روش بر رفتار SCons اثر می‌گذارند (همهٔ آن‌ها وابسته به سیستم نیستند، اما برای کامل بودن در اینجا ذکر شده‌اند)\&. .PP از آنجا که زبان Fortran در طول نگارش‌های استاندارد متعددی تکامل یافته است، پروژه‌ها ممکن است نیاز داشته باشند که با فایل‌های مربوط به نسل‌های مختلف زبان، به شکل متفاوتی رفتار کنند\&. بدین منظور، SCons بسته به پسوند فایل، کار را به پیکربندی لهجهٔ کامپایلر متفاوتی (که به صورت مجموعه‌ای از متغیرهای ساخت بیان می‌شود) ارسال می‌کند\&. به‌طور پیش‌فرض، همهٔ این پیکربندی‌ها یکسان آغاز می‌شوند، اما متغیرهای ساخت را می‌توان بر اساس نیاز برای تنظیم دقیق یک لهجهٔ مشخص تغییر داد\&. هر یک از این لهجه‌ها دارای یک ماژول مشخصات ابزار است که مستندات آن متغیرهای ساخت مرتبط با آن لهجه را توصیف می‌کند: \&.f (و همچنین \&.for و \&.ftn) در fortran؛ (متغیرهای ساخت با FORTRAN آغاز می‌شوند) \&.f77 در f77؛ (متغیرهای ساخت با F77 آغاز می‌شوند) \&.f90 در f90؛ (متغیرهای ساخت با F90 آغاز می‌شوند) \&.f95 در f95؛ (متغیرهای ساخت با F95 آغاز می‌شوند) \&.f03 در f03؛ (متغیرهای ساخت با F03 آغاز می‌شوند) \&.f08 در f08 (متغیرهای ساخت با F08 آغاز می‌شوند)\&. .PP اگرچه SCons چندین لهجهٔ داخلی را بر اساس پسوندهای نام فایل شناسایی می‌کند، اما عرف کامپایلرهای مختلف موجود Fortran این است که تنها به دو مورد از این پسوندها معنای واقعی اختصاص می‌دهند: \&.f (و همچنین \&.for و \&.ftn) به کد منبع با قالب ثابت (fixed\-format) اشاره دارد که تنها گزینهٔ موجود در FORTRAN 77 و پیش از آن بود، و \&.f90 به کد منبع با قالب آزاد (free\-format) اشاره دارد که از استاندارد Fortran 90 به بعد در دسترس قرار گرفت\&. برخی از کامپایلرها پسوندهایی را که با مشخصات Fortran پس از F90 مطابقت دارند، برای این منظور معادل با \&.f90 می‌دانند، در حالی که برخی دیگر چنین نیستند \- مستندات کامپایلر خود را بررسی کنید\&. یک سیاست که گهگاه پیشنهاد می‌شود، استفادهٔ انحصاری از \&.f و \&.f90 به عنوان پسوندهای نام فایل Fortran است\&. تعیین قالب ثابت/آزاد معمولاً می‌تواند به‌طور صریح با پرچم‌های کامپایلر (مانند \fB\-ffixed\-form\fR برای gfortran) کنترل شود و هر فرضیه‌ای را که ممکن است بر اساس پسوند فایل منبع ایجاد شده باشد لغو کند\&. .PP پسوند فایل منبع متضمن انطباق با استاندارد فرترن هم‌نام آن نیست \- پسوند \&.f08 به این معنی نیست که شما لزوماً برای Fortran 2008 کامپایل می‌کنید\&. معمولاً کامپایلرها گزینه‌های خط فرمانی را برای اعمال این انتخاب ارائه می‌دهند (مانند \fB\-std=f2008\fR برای gfortran)\&. .PP برای لهجه‌های از F90 به بعد (از جمله لهجهٔ عمومی FORTRAN)، پسوند \&.mod برای ماژول‌های Fortran شناخته می‌شود\&. این فایل‌ها اثر جانبی کامپایل یک فایل منبع Fortran شامل اعلان‌های ماژول هستند و هنگام پردازش کدهای دیگری که اعلام کرده‌اند از ماژول استفاده می‌کنند، باید در دسترس باشند\&. SCons در حال حاضر پشتیبانی یکپارچه‌ای از زیرماژول‌ها (submodules) ندارد که در استاندارد Fortran 2008 معرفی شدند \- کامپایلر فراخوانی‌شده نتایج را تولید خواهد کرد، اما SCons فایل‌های \&.smod را به عنوان اشیاء رهگیری‌شده نخواهد شناخت\&. .PP در یک سیستم حساس به کوچک و بزرگی حروف مانند Linux یا UNIX، فایلی با پسوند با حروف بزرگ از مجموعهٔ \&.F، \&.FOR، \&.FTN، \&.F90، \&.F95، \&.F03 و \&.F08 به عنوان یک فایل منبع Fortran در نظر گرفته می‌شود که باید ابتدا از پیش‌پردازندهٔ استاندارد C عبور داده شود\&. نگارش‌های حروف کوچک این پسوندها باعث چنین رفتاری نمی‌شوند\&. در سیستم‌هایی که تفاوتی میان حروف کوچک و بزرگ در نام فایل‌ها قائل نمی‌شوند، این رفتار در دسترس نیست، اما فایل‌هایی با پسوند \&.FPP یا \&.fpp همواره ابتدا به پیش‌پردازنده ارسال می‌شوند\&. این رفتار با عرف \fBgfortran\fR از کلکسیون کامپایلرهای گنو (GNU Compiler Collection) همخوانی دارد و همچنین توسط برخی کامپایلرهای دیگر Fortran نیز دنبال می‌شود\&. برای این دو پسوند، لهجهٔ عمومی \fIFORTRAN\fR انتخاب خواهد شد\&. .PP خود SCons پیش‌پردازنده را فراخوانی نمی‌کند و این کار توسط کامپایلر انجام می‌شود، اما متغیرهای ساختی را اضافه می‌کند که برای اجرای پیش‌پردازنده کاربرد دارند\&. شما می‌توانید این تفاوت را با بررسی \fB$FORTRANPPCOM\fR و \fB$FORTRANPPCOMSTR\fR مشاهده کنید که به جای \fB$FORTRANCOM\fR و \fB$FORTRANCOMSTR\fR برای آن لهجه استفاده می‌شوند\&. .SS "ویندوز: ابزارهای Cygwin و Cygwin Python در برابر Pythonهای ویندوز" .PP محیط Cygwin مجموعه‌ای از ابزارها و برنامه‌های کمکی را فراهم می‌کند که به کاربران امکان می‌دهد در یک سیستم ویندوز با استفاده از محیطی شبه\-POSIX کار کنند\&. ابزارهای Cygwin، از جمله Cygwin Python، این کار را تا حدی با داشتن توانایی مشترک در تفسیر نام مسیرها به سبک POSIX انجام می‌دهند\&. به عنوان مثال، ابزارهای Cygwin به صورت درونی یک نام مسیر Cygwin مانند /cygdrive/c/mydir را به نام مسیر معادل در ویندوز مانند C:/mydir (معادل با C:\emydir) ترجمه می‌کنند\&. .PP نسخه‌هایی از Python که برای اجرای بومی (native) در ویندوز ساخته شده‌اند، مانند نسخه‌های python\&.org و ActiveState، معناشناسی نام مسیرهای Cygwin را متوجه نمی‌شوند\&. این بدان معناست که استفاده از نسخه بومی ویندوز Python برای ساخت برنامه‌های کامپایل‌شده با ابزارهای Cygwin (مانند gcc، bison و flex) ممکن است نتایج غیرقابل‌پیش‌بینی به بار آورد\&. «ترکیب و تطبیق» به این شیوه می‌تواند کارساز باشد، اما نیازمند توجه دقیق به استفاده از نام مسیرها در فایل‌های SConscript شما است\&. .PP در عمل، کاربران می‌توانند با رعایت رهنمودهای زیر از این مشکل اجتناب کنند: هنگام استفاده از gcc مربوط به Cygwin برای کامپایل، از مفسر Python ارائه‌شده توسط Cygwin برای اجرای \fBscons\fR استفاده کنید؛ هنگام استفاده از Microsoft Visual C++ (یا یک کامپایلر «بومی» دیگر ویندوز) از نسخه‌های python\&.org، Microsoft Store، ActiveState یا دیگر نسخه‌های بومی Python برای اجرای \fBscons\fR استفاده نمایید\&. .PP این بحث تا حد زیادی برای محیط msys2 نیز صدق می‌کند (با استفاده از زنجیره ابزار کامپایلر mingw)، به ویژه توصیه می‌شود در صورت اجرای \fBscons\fR از داخل یک پوسته msys2، از نسخه msys2 مفسر Python استفاده شود\&. .SS "ویندوز: فایل scons\&.bat" .PP در ویندوز، اگر \fBscons\fR از طریق یک فایل دسته‌ای (batch file) واسط به نام scons\&.bat اجرا شود، (دست‌کم) دو پیامد به دنبال دارد\&. توجه داشته باشید که این حالت دیگر پیش‌فرض نیست \- \fBscons\fR که از طریق نصاب \fBpip\fR مربوط به Python نصب شده باشد دارای یک \fBscons\&.exe\fR خواهد بود که این محدودیت‌ها را ندارد: .PP نخست، کاربران خط فرمان ویندوز که مایلند از تخصیص متغیر در خط فرمان استفاده کنند، ممکن است مجبور شوند تخصیص‌ها را داخل علامت‌های نقل‌قول دوتایی قرار دهند؛ در غیر این صورت پوسته خط فرمان ویندوز آن‌ها را به عنوان آرگومان‌های خودش مصرف می‌کند، نه آرگومان‌های \fBscons\fR: .sp .if n \{\ .RS 4 .\} .nf \fBscons "FOO=BAR" "BAZ=BLEH"\fR .fi .if n \{\ .RE .\} .PP دوم، پوسته Cygwin تایپ کردن \fBscons\fR در اعلان خط فرمان را به عنوان اشاره به این فایل واسط تشخیص نمی‌دهد\&. می‌توانید با اجرای \fBscons\&.bat\fR (همراه با پسوند) از خط فرمان Cygwin، یا با ایجاد یک اسکریپت پوسته واسط به نام scons که scons\&.bat را فراخوانی می‌کند، این مشکل را برطرف نمایید\&. .SS "MinGW" .PP دایرکتوری bin مربوط به MinGW باید در متغیر محیطی \fBPATH\fR شما یا متغیر ساخت \fI[\*(AqENV\*(Aq][\*(AqPATH\*(Aq]\fR قرار داشته باشد تا \fBscons\fR بتواند ابزارهای MinGW را شناسایی کرده و به کار گیرد\&. هنگام اجرا تحت مفسر بومی Python در Windows، اگر هر دو نصب شده باشند، \fBscons\fR ابزارهای MinGW را بدون در نظر گرفتن ترتیب دایرکتوری‌های bin در متغیر \fBPATH\fR به ابزارهای Cygwin ترجیح می‌دهد\&. اگر هم MSVC و هم MinGW را نصب کرده‌اید و می‌خواهید به جای MSVC از MinGW استفاده کنید، باید صریحاً با ارسال tools=[\*(Aqmingw\*(Aq] به تابع \fBEnvironment\fR به \fBscons\fR اعلام کنید که از MinGW استفاده کند، زیرا \fBscons\fR ابزارهای MSVC را به ابزارهای MinGW ترجیح خواهد داد\&. .SH "محیط (ENVIRONMENT)" .PP به‌طور کلی، \fBscons\fR توسط متغیرهای محیطیِ تنظیم‌شده در شلی که برای فراخوانی آن استفاده شده کنترل نمی‌شود و تصمیم برای وارد کردن (import) آن‌ها را در صورت تمایل، بر عهدهٔ نویسندهٔ فایل SConscript می‌گذارد\&. با این حال، متغیرهای زیر در صورت تنظیم شدن، توسط خود \fBscons\fR وارد می‌شوند: .PP \fBSCONS_LIB_DIR\fR .RS 4 دایرکتوری حاوی دایرکتوری ماژول Python مربوط به \fBscons\fR را مشخص می‌کند\&. معمولاً \fBscons\fR می‌تواند این مورد را استنتاج کند، اما در برخی شرایط، مانند کار با یک نسخهٔ سورس‌کد، ممکن است تعیین آن لازم باشد (برای مثال، /home/aroach/scons\-src\-0\&.01/src/engine)\&. .RE .PP \fBSCONSFLAGS\fR .RS 4 رشته‌ای حاوی گزینه‌هایی که علاوه بر گزینه‌های ارسال‌شده در خط فرمان، توسط \fBscons\fR استفاده خواهند شد\&. می‌تواند برای کاهش تایپ مکرر گزینه‌های متداول به کار رود\&. محتویات \fBSCONSFLAGS\fR پیش از هر گزینهٔ ارسالی در خط فرمان بررسی می‌شوند، بنابراین در صورت نیاز می‌توان از خط فرمان برای بازنویسی گزینه‌های \fBSCONSFLAGS\fR استفاده کرد\&. .RE .PP \fBSCONS_CACHE_MSVC_CONFIG\fR .RS 4 (فقط در Windows)\&. در صورت تنظیم، متغیرهای محیطی شل را که هنگام راه‌اندازی کامپایلر Microsoft Visual C++ (یا Build Tools) تولید می‌شوند، در یک فایل کش ذخیره می‌کند تا این تنظیمات در طول فراخوانی‌های بعدی \fBscons\fR پایدار بمانند\&. تولید این اطلاعات نسبتاً هزینه‌بر است، بنابراین استفاده از این گزینه می‌تواند به بهبود کارایی در جاهایی که \fBscons\fR به‌طور مکرر اجرا می‌شود، مانند محیط‌های یکپارچه‌سازی مداوم (CI)، کمک کند\&. .sp اگر روی یک مقدار شبه‌درست ("1"، "true" یا "True") تنظیم شود، اطلاعات را در فایلی به نام scons_msvc_cache\&.json در دایرکتوری خانگی کاربر کش می‌کند\&. اگر روی یک مسیر فایل تنظیم شود، از همان مسیر برای کش استفاده خواهد کرد\&. .sp نکته: این پیاده‌سازی ممکن است هنوز تا حدی شکننده باشد\&. در صورت بروز مشکل، فایل کش را حذف کنید \- ایجاد مجدد با اطلاعات تازه معمولاً هرگونه مشکلی را حل می‌کند\&. SCons خطاهای خواندن یا نوشتن فایل کش را نادیده می‌گیرد و در چنین مواردی بدون سر و صدا به رفتار بدون کش بازمی‌گردد\&. .sp \fIجدید در نسخهٔ 3\&.1 (آزمایشی)\&. نام پیش‌فرض فایل کش در نسخهٔ 4\&.4 به مقدار فعلی تغییر یافت و محتویات آن گسترش پیدا کرد\&.\fR .RE .SH "همچنین ببینید (SEE ALSO)" .RS 4 راهنمای کاربر SCons در \m[blue]\fB\%https://scons.org/doc/production/HTML/scons-user.html\fR\m[] .RE .RS 4 مستند طراحی SCons (قدیمی) .RE .RS 4 دستورالعمل‌های SCons (SCons Cookbook) در \m[blue]\fB\%https://scons-cookbook.readthedocs.io\fR\m[] برای مثال‌هایی از نحوه حل مسائل گوناگون با SCons\&. .RE .RS 4 کد منبع SCons \m[blue]\fBدر GitHub\fR\m[]\&\s-2\u[9]\d\s+2 .RE .RS 4 مرجع API نرم‌افزار SCons \m[blue]\fB\%https://scons.org/doc/production/HTML/scons-api/index.html\fR\m[] (برای جزئیات داخلی) .RE .SH "نویسندگان (AUTHORS)" .PP در ابتدا: Steven Knight knight@baldmt\&.com و Anthony Roach aroach@electriceyeball\&.com\&. .PP از ۲۰۱۰ تاکنون: The SCons Development Team scons\-dev@python\&.org\&. .SH "نویسنده (AUTHOR)" .PP \fBThe SCons Development Team\fR .SH "حق نشر (COPYRIGHT)" .br حق نشر \(co 2001 - 2026 The SCons Foundation .br .SH "نکات (NOTES)" .IP " 1." 4 مشخصات LLVM .RS 4 \%https://clang.llvm.org/docs/JSONCompilationDatabase.html .RE .IP " 2." 4 JEP 313 .RS 4 \%https:openjdk.java.net/jeps/313 .RE .IP " 3." 4 https://learn.microsoft.com/en-us/cpp/build/reference/vcxproj-file-structure .RS 4 \%https://learn.microsoft.com/en-us/cpp/build/reference/vcxproj-file-structure .RE .IP " 4." 4 https://learn.microsoft.com/en-us/visualstudio/extensibility/internals/solution-dot-sln-file .RS 4 \%https://learn.microsoft.com/en-us/visualstudio/extensibility/internals/solution-dot-sln-file .RE .IP " 5." 4 مستندات optparse .RS 4 \%https://docs.python.org/3/library/optparse.html .RE .IP " 6." 4 اگر \fIno_progress\fR از طریق \fBSetOption\fR در یک فایل SConscript تنظیم شده باشد (اما نه در صورتی که در یک فایل site_init.py تنظیم شده باشد)، همچنان یک پیام وضعیت اولیه درباره خواندن فایل‌های SConscript نمایش داده خواهد شد، زیرا SCons باید خواندن آن‌ها را پیش از دیدن \fBSetOption\fR آغاز کند. .IP " 7." 4 http://www.opensource.org/licenses/alphabetical .RS 4 \%http://www.opensource.org/licenses/alphabetical .RE .IP " 8." 4 os.chmod .RS 4 \%https://docs.python.org/3/library/os.html#os.chmod .RE .IP " 9." 4 در GitHub .RS 4 \%https://github.com/SCons/scons .RE