icmake(1) ابزار نگهداری برنامه icmake(1)

icmake - ابزار نگهداری و ساخت برنامه (make) با استفاده از گرامری شبیه به C

icmake option(s) [source [dest]] [args]

ابزار Icmake(1) یک ابزار عمومی برای نگهداری و ساخت برنامه‌هاست که می‌تواند به عنوان جایگزینی برای ابزارهایی مانند make(1) استفاده شود. این ابزار از این جهت عمومی است که اسکریپت‌های icmake، نوشته‌شده به زبانی بسیار شبیه به زبان برنامه‌نویسی C، می‌توانند وظایفی را انجام دهند که به طور سنتی در حیطه زبان‌های اسکریپت‌نویسی قرار دارند.

این صفحه راهنما شامل بخش‌های زیر است:

بخش ICMAKE V. 13.00.00 تغییرات اعمال‌شده از نسخه 12.03.00 icmake را پوشش می‌دهد؛
بخش گزینه‌ها (OPTIONS) گزینه‌های خط فرمان icmake را توضیح می‌دهد؛
بخش اجرای اسکریپت‌های ICMAKE (EXECUTING ICMAKE SCRIPTS) نحوه فراخوانی اسکریپت‌های icmake را شرح می‌دهد؛
بخش ICM-DEP برنامه کمکی icm-dep را توصیف می‌کند؛
بخش ICM-MULTICOMP برنامه کمکی icm-multicomp را توصیف می‌کند؛
بخش ICM-SPCH برنامه کمکی icm-spch را توصیف می‌کند؛
بخش ICM-UN برنامه کمکی icm-un را توصیف می‌کند؛
بخش فایل‌ها (FILES) نمایی کلی از محل قرارگیری icmake و برنامه‌های کمکی آن (همان‌طور که در توزیع دبیان لینوکس استفاده می‌شود) ارائه می‌دهد؛
بخش مثال‌ها (EXAMPLES) حاوی ارجاعاتی به مکان‌های شامل نمونه اسکریپت‌ها است؛
بخش همچنین ببینید (SEE ALSO) شامل ارجاعاتی به صفحات راهنمای برنامه‌های کمکی icmake و برنامه‌های مرتبط با آن است، به‌ویژه:
صفحه راهنمای icmstart(1)، که نحوه مقداردهی اولیه یک دایرکتوری را برای توسعه برنامه‌های (C++ یا C) شرح می‌دهد؛
صفحه راهنمای icmbuild(1)، که نحوه استفاده از icmake را برای نگهداری و ساخت چنین برنامه‌هایی پوشش می‌دهد؛
صفحه راهنمای icmscript(7)، که قواعد نحوی و امکانات زبان اسکریپت‌نویسی icmake را توضیح می‌دهد و به شما اجازه می‌دهد اسکریپت‌های سفارشی icmake خود را بنویسید.

برنامه Icmake به برنامه‌نویسان امکان می‌دهد از یک زبان اسکریپت‌نویسی (که بسیار شبیه زبان برنامه‌نویسی شناخته‌شده C است) برای تعریف اقداماتی که برای نگهداری و ساخت برنامه‌های (پیچیده) نیاز است، استفاده کنند. برای این منظور، icmake عملگرهای ویژه متعددی و همچنین مجموعه‌ای از توابع کمکی ارائه می‌دهد که کارآمدی خود را در مدیریت ساخت برنامه‌ها ثابت کرده‌اند.

برنامه Icmake نباید با یک محیط توسعه یکپارچه (IDE) اشتباه گرفته شود. Icmake صرفاً وظایفی را انجام می‌دهد که برای آن‌ها می‌توان اسکریپت نوشت، و حداقل مجموعه‌ای از اسکریپت‌های از پیش تعریف‌شده (icmstart و icmbuild) که سودمندی آن‌ها هنگام توسعه و نگهداری برنامه‌ها اثبات شده، در بسته توزیع icmake گنجانده شده است.

هنگام استفاده از icmbuild(1) برای نگهداری برنامه، برنامه‌های کمکی زیر از icmake به کار گرفته می‌شوند:

برنامه icm-comp برای کامپایل اسکریپت icmake به بایت‌کد؛
برنامه icm-dep برای مدیریت وابستگی‌های میان کلاس‌ها؛
برنامه icm-exec برای اجرای اسکریپت بایت‌کد کامپایل‌شده icmake؛
برنامه icm-multicomp برای کامپایل چندنخی (اختیاری) فایل‌های منبع؛
برنامه icm-pp برای پیش‌پردازش اسکریپت icmake؛
برنامه icm-spch برای ساختن (اختیاری) یک فایل هدر پیش‌کامپایل‌شده منفرد در سطح کل پروژه (SPCH).

علاوه بر برنامه‌های فوق، پروژه icmake موارد زیر را نیز ارائه می‌کند:

برنامه icmodmap که هنگام توسعه برنامه‌های C++ با استفاده از ماژول‌ها قابل استفاده است (ر.ک. صفحه راهنمای icmodmap(1))؛
برنامه icm-un برای دیس‌اسمبل کردن فایل‌های بایت‌کد کامپایل‌شده icmake (معروف به «bim-files»). برنامه icm-un عمدتاً برای نمایش، آموزش و اشکال‌زدایی کاربرد دارد و هنگام مشخص کردن گزینه --unassemble یا -u توسط icmake فراخوانی می‌شود (همچنین بخش ICM-UN را ببینید).

برخی از ابزارهای make به طور پیش‌فرض پس از تغییر فایل‌های هدر، فایل‌های منبع را دوباره کامپایل می‌کنند. هنگام توسعه برنامه‌های C++ این کار اغلب لازم نیست، زیرا افزودن توابع عضو جدید به کلاس‌ها لزوماً نیازمند کامپایل مجدد تمام فایل‌های منبع آن کلاس‌ها نیست. وابستگی‌های کلاس‌ها به طور اختیاری توسط icmbuild(1) بررسی می‌شوند (این بررسی زمانی انجام می‌گیرد که دستورهای #define مربوط به USE_ALL, SPCH و/یا دستور منسوخ‌شده PRECOMP در فایل icmconf فعال باشند؛ برای جزئیات به صفحه راهنمای icmconf(7) مراجعه فرمایید).

در نسخه 13.00.00 icmake تغییرات زیر نسبت به نسخه 12.03.00 اعمال شده است:

گزینه --all (-a) به برنامه icm-spch اضافه شد که اقدامات گزینه‌های --list, --precompile و --soft-link آن را به ترتیب انجام می‌دهد. همچنین چند گزینه موجود تغییر یافتند. برای جزئیات بخش ICM-SPCH را ببینید.
هدرهای (داخلی) بررسی‌شده توسط icmake --spch (یا -S) دیگر دستکاری و ویرایش نمی‌شوند.
جهت حذف مشخصه‌های (اکنون منسوخ‌شده) #ifndef SPCH_ از فایل‌های فهرست‌شده در فایل‌های spch موجود که توسط نسخه‌های پیشین icm-spch نوشته شده بودند، می‌توان از برنامه noifndef.cc موجود در زیردایرکتوری support/ بسته کد منبع icmake برای حذف بخش‌های #ifndef SPCH_ از فایل‌های .ih پروژه استفاده کرد؛
گزینه icmake --source اسکریپت icmake را در یک فایل موقت .bim کامپایل می‌کند؛
برنامه کمکی icmun به icm-un تغییر نام یافت (این برنامه توسط icmake هنگام تعیین گزینه --unassemble (-u) فراخوانی می‌شود، بنابراین در عمل تغییر نام به طور خودکار مدیریت می‌گردد).
اسکریپت icmconf(7) می‌تواند از -o در تعریف #define SPCH خود استفاده کند. تمام کلمات (جداشده با فاصله) پس از -o به عنوان گزینه‌های جداگانه «-o word» به icm-spch ارسال می‌شوند؛
هنگام توسعه برنامه‌های C++، متغیر محیطی ICMAKE_CXXFLAGS دیگر استفاده نمی‌شود. در عوض متغیر محیطی ICMAKE_CPPSTD به کار می‌رود. از این متغیر محیطی برای تعریف یک نقطه مدیریت واحد جهت مشخص کردن نسخه استاندارد C++ مورد استفاده هنگام کامپایل منابع استفاده کنید؛
هنگام استفاده از دبیان (یا توزیع‌های مشابه)، می‌توان از اسکریپت «rebuild» برای بازسازی باینری‌های icmake پس از نصب «libbobcat-dev» استفاده کرد که باعث کاهش اندازه آن‌ها تا حدود ۴۰٪ می‌شود.
خود برنامه icmake بازطراحی شد.

در صورت وجود، گزینه‌های تک‌حرفی داخل پرانتز در کنار معادل بلند آن‌ها آورده شده‌اند. ابزار Icmake گزینه‌های «عملیاتی» (action) و «غیرعملیاتی» (non-action) را تعریف می‌کند. نخستین گزینه عملیاتی که با آن مواجه شود به کار گرفته خواهد شد.

هنگام استفاده از icmbuild(1) برای نگهداری و ساخت برنامه، icmake به طور خودکار فراخوانی می‌شود و کاربر نیازی به تعیین هیچ‌یک از گزینه‌های icmake ندارد.

--about (-a)
پس از نمایش اطلاعاتی درباره icmake، به اجرای برنامه پایان می‌دهد؛
--compile (-c) [options] source [bim-file]
اسکریپت icmake ابتدا پیش‌پردازش می‌شود (گزینه --preprocess را در ادامه ببینید) و سپس فایل پیش‌پردازش‌شده توسط icm-comp کامپایل شده و یک bim-file تولید می‌کند. اگر نام bim-file مشخص نشده باشد، نام پایه source با پسوند .bim استفاده می‌شود.
اگر source فایلی باشد که از قبل پیش‌پردازش شده است، می‌توان گزینه -P را برای جلوگیری از پیش‌پردازش مجدد آن مشخص کرد. به عنوان مثال:
icmake -c -P source dest.bim
اگر bim-file وجود داشته باشد و تاریخ ویرایش آن جدیدتر از source باشد، source کامپایل نخواهد شد؛
--dependencies (-d) [options] action
برنامه icm-dep برای تعیین وابستگی‌های میان کلاس‌ها فراخوانی می‌شود. تمامی گزینه‌ها و آرگومان‌های پس از این گزینه به icm-dep هدایت می‌شوند. برای اطلاعات بیشتر درباره icm-dep به بخش ICM-DEP در همین صفحه راهنما مراجعه کنید؛
--execute (-e) [option] bim-file [arguments]
فایل bim را اجرا می‌کند. پیش از تعیین bim-file می‌توان گزینه --no-version-check (در ادامه شرح داده شده، یا گزینه کوتاه معادل -n) را برای نادیده گرفتن عدم تطابق نسخه اصلی icmake و نسخه‌ای از icmake که برای کامپایل فایل bim استفاده شده است مشخص کرد.
آرگومان‌های خط فرمان که پس از bim-file مشخص می‌شوند به عنوان آرگومان به تابع main فایل bim ارسال می‌گردند (برای جزئیات درباره نگارش اسکریپت‌های icmake به صفحه راهنمای icmscript(7) مراجعه فرمایید)؛
--force (-f) [options] source [bim-file]
مانند گزینه --compile عمل می‌کند، اما کامپایل همیشه انجام می‌شود، حتی اگر فایل bim به‌روز باشد؛
--help (-h)
پس از نمایش اطلاعات نحوه استفاده، به اجرای icmake پایان می‌دهد. در صورتی که icmake بدون هیچ آرگومانی اجرا شود نیز اطلاعات نحوه استفاده نمایش داده می‌شود؛
--multicomp (-m) [options] jobs ’compiler-spec’
بخش اختیاری options گزینه‌هایی هستند که به برنامه icm-multicomp ارسال می‌شوند (ر.ک. بخش ICM-MULTICOMP در ادامه).
همچنین به دستور #define MULTICOMP در صفحه راهنمای icmconf(7) مراجعه کنید: در صورت مشخص شدن، کامپایل چندنخی به طور خودکار به کار گرفته می‌شود؛
--no-process (-N)
به طور ضمنی گزینه --verbose را فعال می‌کند (در ادامه ببینید). این گزینه توسط گزینه‌های --dependencies, --execute, --source و -t شناسایی می‌شود (چه به صورت دو گزینه جداگانه یا با چسباندن هر دو گزینه به هم مانند -Ne). در صورت تعیین، برنامه کمکی اجرا نمی‌شود، اما دستور(هایی) که قرار بود اجرا شوند در خروجی استاندارد نمایش داده می‌شوند؛
--no-version-check (-n)
این گزینه با گزینه‌های عملیاتی --execute, --source, --unassemble و -t در دسترس است. هنگام تعیین این گزینه، نسخه اصلی ذخیره‌شده در فایل icm-bim و نسخه خود icmake می‌توانند با هم متفاوت باشند. به طور معمول نیازی به این گزینه نیست و در درجه اول برای اهداف توسعه اضافه شده است؛
--preprocess (-p) [options] source [pim-file]
فایل مشخص‌شده به عنوان آرگومان اول پیش‌پردازش شده و یک فایل «.pim» تولید می‌کند. اگر نام فایل دومی به عنوان آرگومان ارائه شود، آن فایل تبدیل به فایل .pim می‌شود. در صورت عدم تعیین، نام فایل اول با پسوند .pim استفاده می‌گردد.
با این گزینه می‌توان از گزینه‌های تعریف نماد پیش‌پردازنده استفاده کرد: نمادهایی که مقادیر آن‌ها را می‌توان در source به کار برد. برای مثال، هنگام اجرای دستور:
icmake -p -d one --define two source dest.pim
برنامه icmake فایل source را پیش‌پردازش کرده، نمادهای پیش‌پردازنده one و two (هر کدام با مقدار ۱) را تعریف می‌کند و فایل pim با نام dest.pim را تولید می‌نماید. توجه داشته باشید که به جای گزینه بلند --define می‌توان از گزینه کوتاه -d نیز استفاده کرد؛
--spch (-S) ...
یک SPCH ساخته می‌شود. تمام گزینه‌ها و آرگومان‌های پس از --spch به برنامه کمکی icm-spch هدایت می‌شوند (ر.ک. بخش ICM-SPCH در ادامه).
همچنین به دستور #define SPCH در صفحه راهنمای icmconf(7) مراجعه کنید: در صورت مشخص شدن، یک SPCH به طور خودکار ساخته می‌شود؛
--source (-s) [options] source [arguments]
برنامه Icmake از --compile برای کامپایل فایل منبع icmake مشخص‌شده در آرگومان اول (و ساخت یک فایل موقت bim) استفاده می‌کند و سپس از --execute برای اجرای فایل bim بهره می‌گیرد و هرگونه arguments بعدی را به عنوان آرگومان به تابع main فایل bim ارسال می‌کند.
پس از گزینه --source می‌توان گزینه‌های در دسترس برای دستور --compile icmake را مشخص کرد. پس از آن گزینه‌ها نیز می‌توان گزینه‌های --execute را مشخص نمود. این گزینه‌های اخیر باید با --execute یا -e آغاز شوند. برای مثال، هنگام اجرای دستور:
icmake -s -d one -en source 
برنامه icmake ابتدا source را پس از تعریف نماد پیش‌پردازنده one کامپایل کرده و سپس فایل bim را با ارسال --no-version-check به icm-exec اجرا می‌کند؛
-t tmpspec [options] source [arguments]
این گزینه در درجه اول برای اسکریپت‌های اجرایی icmake در نظر گرفته شده است، اگرچه می‌توان آن را در فراخوانی‌های خط فرمان icmake نیز استفاده کرد. گزینه -t به روش‌های متعددی قابل استفاده است که در بخش بعدی (اجرای اسکریپت‌های ICMAKE) توضیح داده شده است.
--tmpdir=directory (-T)
به طور پیش‌فرض فایل‌های موقت در زیردایرکتوری /tmp ایجاد می‌شوند، یا در دایرکتوری خانگی کاربر (${HOME}) اگر /tmp/ قابل استفاده نباشد. برای تعیین دایرکتوری دیگر جهت نوشتن فایل‌های موقت، می‌توان از گزینه --tmpdir (یا -T) icmake به همراه نام یک دایرکتوری (موجود) استفاده کرد.
به عنوان مثال، هنگام کامپایل یک فایل main.im مربوط به icmake، خروجی پیش‌پردازنده در یک فایل موقت نوشته می‌شود که پس از کامپایل حذف می‌گردد. برای نوشتن فایل موقت در ~/.icmake، دستور icmake می‌تواند به این صورت فراخوانی شود:
icmake -T ~/.icmake -c main.im
--unassemble (-u)
فایل مشخص‌شده به عنوان آرگومان اول یک فایل bim متعلق به icmake است که دیس‌اسمبل می‌شود (ر.ک. بخش ICM-UN در ادامه برای اطلاعات بیشتر درباره دیس‌اسمبل کردن فایل‌های bim)؛
--verbose (-V)
فرآیندهای فرزند Icmake و آرگومان‌های آن‌ها پیش از فراخوانی در جریان خروجی استاندارد نوشته می‌شوند. این گزینه می‌تواند قبل از گزینه‌های عملیاتی (-c, -d, -e, -s و -u) بیاید، چه به صورت دو گزینه جداگانه و چه به صورت پیوسته مانند -Ve.
--version (-v)
پس از نمایش نسخه icmake، به اجرای آن پایان می‌دهد.

گزینه -t در درجه اول برای استفاده در اسکریپت‌های اجرایی icmake فراهم شده است. خط اول اسکریپت‌های اجرایی icmake شامل مؤلفه‌های زیر است:

یک مشخصه شَبنگ (shebang یا #!) و به دنبال آن محل نصب icmake؛
گزینه -t به همراه آرگومان آن (در ادامه ببینید)؛

و به صورت اختیاری:

گزینه‌های کامپایل و اجرا (مشخص‌شده همان‌گونه که در گزینه --source شرح داده شد)؛
یک مؤلفه غیرگزینه‌ای (مانند :) که با مسیر اسکریپت اجرایی icmake جایگزین خواهد شد؛
مؤلفه‌های باقی‌مانده در خط اول همان‌طور که هستند به تابع main اسکریپت icmake ارسال می‌شوند؛

برای مثال، اسکریپت اجرایی ساده icm زیر با نام «args» می‌تواند در ~/bin تعریف شود:

#!/usr/bin/icmake -t. -d one : two --dir three
void main(int argc, list argv)
{
    #ifdef one
        printf << "one is defined\n";
    #endif
    printf << argc << " arguments: " << argv << ’\n’;
}
هنگامی که این اسکریپت به صورت ~/bin/args four five فراخوانی شود، آرگومان‌های four و five به آرگومان‌های two --dir three که از قبل توسط خود اسکریپت مشخص شده‌اند اضافه می‌شوند. در این حالت خروجی اسکریپت به این صورت خواهد بود (آرگومان اول نام یک فایل موقت .bim است که در هر بار فراخوانی جدید متفاوت است):
one is defined
/tmp/F04dgh two --dir three four five

آرگومان گزینه -t برای مشخص کردن محل فایل‌های مورد استفاده گزینه -t icmake به کار می‌رود (/dir می‌تواند چند دایرکتوری تو در تو مانند /dir/sub1/sub2 نیز باشد):

اگر یک نقطه تکی باشد (-t.)، فایل bim کامپایل‌شده (موقت) در دایرکتوری مورد استفاده icmake برای فایل‌های موقت نوشته می‌شود (مثلاً /tmp یا $HOME)؛
اگر ~/dir یا /dir باشد، icmake فایل‌های موقت را در دایرکتوری مشخص‌شده می‌نویسد و علامت ~ را با دایرکتوری $HOME کاربر جایگزین می‌کند؛
اگر ~/dir/name یا /dir/name باشد، آن‌گاه [~]/dir/name مسیر فایل .bim کامپایل‌شده را مشخص می‌کند و تمامی فایل‌های موقت دیگر در همان دایرکتوری فایل .bim نوشته می‌شوند. فایل .bim پس از اجرا حفظ می‌شود (که اجازه می‌دهد بارها با دستور «icmake -e» اجرا شود). اگر فایل .bim جدیدتر از اسکریپت باشد، اسکریپت icmake مجدداً کامپایل نخواهد شد.

ابزار Icm-dep یک برنامه کمکی است که توسط icmake --dependencies (یا معادل کوتاه آن -d) فراخوانی می‌شود تا وابستگی‌های فایل‌های منبع و فایل‌های هدر پیش‌کامپایل‌شده را تعیین کند.

هنگام استفاده از icmbuild(1) و در صورتی که فایل icmconf حاوی دستور #define SPCH باشد، از icmake -d استفاده نمی‌شود؛ در عوض، دایرکتوری‌های بررسی‌شده هنگام استفاده از SPCH به طور خودکار توسط icmake -S بررسی (و در صورت لزوم به‌روزرسانی) می‌شوند.

خلاصه نحوه فراخوانی Icmake -d عبارت است از:

icmake -d [options] argument
مشخصه‌های پس از -d به icm-dep هدایت می‌شوند. گزینه‌های زیر می‌توانند پس از -d تعیین گردند:
--classes=filename (-c)
به طور پیش‌فرض، icm-dep وابستگی‌های دایرکتوری‌های ذکرشده در فایل CLASSES را بررسی می‌کند. اگر فایل icmconf(7) مقادیر PARSER_DIR و/یا SCANNER_DIR را مشخص کند، آن دایرکتوری‌ها نیز در نظر گرفته می‌شوند. از این گزینه برای مشخص کردن فایل حاوی نام دایرکتوری‌های مورد بررسی توسط icm-dep استفاده کنید.
--gch
اگر فایل icmconf دستور (منسوخ‌شده) #define PRECOMP را مشخص کند، icmake -d بررسی می‌کند که آیا هدرهای پیش‌کامپایل‌شده باید نوسازی شوند یا خیر. اگر فایل icmconf فاقد دستور #define PRECOMP باشد، اما با این وجود هدرهای پیش‌کامپایل‌شده باید بررسی شوند، می‌توان گزینه --gch را مشخص کرد؛
--help (-h)
خلاصه‌ای از نحوه استفاده icm-dep در خروجی استاندارد نوشته شده و icmake با بازگرداندن مقدار 0 به سیستم‌عامل پایان می‌یابد؛
--icmconf=filename (-i)
به طور پیش‌فرض icmake -d محتوای فایل‌های icmconf را بررسی می‌کند. این گزینه زمانی استفاده می‌شود که به جای icmconf فایل دیگری باید بررسی شود؛
--mainih=mainheader (-m)
در فایل icmconf، دستور #define IH برای تعیین پسوند فایل‌های هدر کلاسی که باید پیش‌کامپایل شوند به کار می‌رود، با این فرض که نام فایل آن‌ها برابر با نام دایرکتوری‌های فهرست‌شده در فایل CLASSES است. اما CLASSES نام دایرکتوری سطح بالای برنامه را مشخص نمی‌کند. این گزینه برای تعیین نام فایل هدر سطح بالا جهت پیش‌کامپایل استفاده می‌شود. به طور پیش‌فرض main.ih به کار می‌رود؛
--no-gch
اگر یک فایل icmconf حاوی دستور (منسوخ‌شده) #define PRECOMP باشد اما icmake -d نباید نوسازی هدرهای پیش‌کامپایل‌شده را بررسی کند، گزینه --no-gch را مشخص کنید؛
--no-use-all
در صورت تعیین این گزینه، دستور #define USE_ALL "filename" در فایل icmconf (ر.ک. icmconf(7)) نادیده گرفته می‌شود؛
--use-all=filename
در صورت تعیین این گزینه، تمام فایل‌های موجود در دایرکتوری‌های حاوی فایل filename و فایل‌های منبع در دایرکتوری‌هایی که (به صورت بازگشتی) به فایل‌های آن دایرکتوری‌ها وابسته‌اند، دوباره کامپایل می‌شوند؛
--verbose (-V)
این گزینه می‌تواند چندین بار مشخص شود. تعداد دفعات تعیین آن، میزان جزئیات خروجی icmake -d را مشخص می‌کند. اگر تعیین نشود، icmake -d وظایف خود را در سکوت انجام می‌دهد. اگر یک بار مشخص شود (که حالت پیش‌فرض است)، اقداماتی را که انجام می‌دهد در خروجی استاندارد می‌نویسد؛ اگر دو بار مشخص شود، گزینه‌های غیرپیش‌فرض و دایرکتوری‌های اضافه شده به طور خودکار را نیز گزارش می‌کند؛ اگر سه بار مشخص شود، وابستگی‌های کلاس‌ها را نیز گزارش می‌دهد؛ و اگر بیشتر از آن مشخص شود، فایل‌هایی را که با آن‌ها مواجه شده و تصمیمی را که در صورت تعیین go اتخاذ می‌کرد گزارش می‌نماید؛
--version (-v)
دستور Icmake -d شماره نسخه icm-dep را در خروجی استاندارد نوشته و با بازگرداندن مقدار 0 به سیستم‌عامل پایان می‌یابد.

پس از گزینه‌های غیرپایان‌دهنده، آرگومان go باید مشخص شود تا به icmake -d اجازه دهد اقدامات خود را اجرا کند. مشخص کردن هر آرگومان دیگری منجر به یک «اجرای آزمایشی» (dry run) می‌شود: وابستگی‌ها را تحلیل می‌کند اما هیچ فایلی را حذف نکرده یا تغییر نمی‌دهد.

دستور Icmake -d می‌تواند برای پروژه‌های نرم‌افزاری توسعه‌یافته بر اساس ساختار ارائه‌شده در C++ Annotations، بخش سازماندهی فایل هدر (Header file organization) در فصل کلاس‌ها (Classes) استفاده شود. در این پروژه‌ها کلاس‌ها در دایرکتوری‌های مستقل خود توسعه می‌یابند که زیردایرکتوری‌های مستقیم دایرکتوری اصلی برنامه هستند. رابط‌های کلاس آن‌ها در فایل‌های هدر کلاسی هم‌نام با دایرکتوری‌های کلاس ارائه می‌شوند، و تمامی هدرهای مورد نیاز منابع کلاس در یک فایل هدر داخلی (internal header) مجزا اعلام می‌گردند که معمولاً پسوند .ih دارد.

ابزار Icmake از کامپایل چندنخی فایل‌های منبع پشتیبانی می‌کند که اغلب زمان کامپایل فایل‌های منبع پروژه‌ها را به میزان چشمگیری کاهش می‌دهد. هنگام استفاده از icmbuild(1)، در صورتی که فایل‌های icmconf حاوی دستور #define MULTICOMP باشند (ر.ک. icmconf(7))، کامپایل چندنخی به طور خودکار مورد استفاده قرار می‌گیرد. همچنین می‌توان آن را مستقل از icmconf با استفاده از گزینه --multicomp (یا -m) icmake فراخوانی کرد.

خلاصه نحوه فراخوانی Icmake -m عبارت است از:

icmake -m [options] arguments

دستور Icmake -m گزینه‌های زیر را می‌پذیرد:

--help (-h)
دستور Icmake -m خلاصه‌ای از نحوه استفاده خود را در خروجی استاندارد نوشته و با بازگرداندن مقدار 0 به سیستم‌عامل پایان می‌یابد؛
--nr (-n)
هنگام کامپایل فایل‌های منبع و در صورت تعیین گزینه --nr، شماره نخی که در حال کامپایل یک فایل منبع است در جریان خروجی استاندارد نوشته می‌شود.
--quiet (-q)
هنگامی که این گزینه مشخص نشود، نام مسیر فایل‌های شیء و منبع کامپایل‌شده در جریان خروجی استاندارد نوشته می‌شود. اگر یک بار مشخص شود، تنها دایرکتوری‌ها و نام فایل‌های منبع در جریان خروجی استاندارد نوشته می‌شوند، و اگر بیش از یک بار مشخص شود، هیچ اطلاعاتی در مورد فایل‌های کامپایل‌شده در جریان خروجی استاندارد نوشته نخواهد شد.
--threads=nThreads (-t)
به طور پیش‌فرض تعداد هسته‌های پردازنده رایانه تعداد نخ‌های مورد استفاده هنگام کامپایل فایل‌های منبع را تعیین می‌کند. می‌توان تعداد متفاوتی از نخ‌ها را با استفاده از این گزینه درخواست کرد، مثلاً --threads 5.
--version (-v)
دستور Icmake -m شماره نسخه خود را به خروجی استاندارد گزارش کرده و با بازگرداندن مقدار 0 به سیستم‌عامل پایان می‌یابد.

دستور Icmake -m به یک آرگومان خط فرمان و یک آرگومان اختیاری دوم نیاز دارد:

آرگومان اول نام فایلی است که مشخص می‌کند کدام فایل‌ها باید کامپایل شوند. از icmbuild(1) برای نوشتن این فایل استفاده کنید. همچنین می‌توان آن را به روش دیگری ساخت:
فایل مشخص‌شده باید حاوی گروه‌هایی از مشخصات فایل باشد که در آن هر گروه با خطی مانند : support tmp/o 5 آغاز می‌شود، که عنصر دوم (در اینجا: support) (زیر)دایرکتوری فایل‌های منبع را مشخص می‌کند (از . برای اشاره به دایرکتوری سطح بالای پروژه استفاده کنید)؛ عنصر سوم (در اینجا: tmp/o) دایرکتوری مقصد فایل‌های کامپایل‌شده را مشخص می‌کند (که در صورت عدم وجود ایجاد می‌شود)؛ و عنصر چهارم (در اینجا: 5) پیشوندی را مشخص می‌کند که باید قبل از فایل‌های شیء کامپایل‌شده اضافه شود.
به دنبال این خط، خطوط باقی‌مانده یک گروه، نام فایل‌های منبع (واقع در (زیر)دایرکتوری مشخص‌شده) را جهت کامپایل تعیین می‌کنند.
پس از پایان کامپایل (خواه به دلیل کامپایل موفقیت‌آمیز تمام فایل‌ها یا به دلیل شکست یک کامپایل)، فایل مشخصات حذف می‌شود؛
آرگومان دوم اختیاری است. به طور پیش‌فرض مشخصه زیر استفاده می‌شود (همگی در یک خط):
g++ -c -o $2 ${ICMAKE_CPPSTD} --Wall -Werror $1
در اینجا $1 با مکان فایل منبع مورد کامپایل و $2 با مکان فایل شیء کامپایل‌شده جایگزین می‌شود. اگر متغیر محیطی ICMAKE_CPPSTD تعریف شده باشد (که استاندارد C++ مورد استفاده را مشخص می‌کند، مثلاً ICMAKE_CPPSTD=--std=c++26)، مقدار آن جایگزین ${ICMAKE_CPPSTD} در مشخصه می‌شود.
اگر نتوان از مشخصه کامپایلر پیش‌فرض استفاده کرد، دستور کامپایل فایل‌های منبع را می‌توان به عنوان دومین آرگومان خط فرمان icmake -m ارائه داد که باید نقل‌قول شود، مانند:
’g++ -c -o $2 ’${ICMAKE_CPPSTD}’ --Wall -Werror $1’
یا آرگومان دوم خط فرمان می‌تواند به صورت f:file باشد، که در آن file نام فایلی است که خط اول آن حاوی مشخصه دستور کامپایل فایل‌های منبع است (که باید $1 و $2 و در صورت تمایل $ICMAKE_CPPSTD را مشخص کند).
متغیر محیطی PATH برای یافتن کامپایلر به کار می‌رود؛ همچنین می‌توان مسیر مطلق کامپایلر را مشخص نمود.

هدرهای پیش‌کامپایل‌شده منفرد (SPCH) با استفاده از icmake --spch (یا -S) در دسترس هستند.

خلاصه نحوه فراخوانی Icmake -S عبارت است از:

icmake -S [options] arguments

دستور Icmake -S گزینه‌های زیر را می‌پذیرد:

--all=file (-a)
فراخوانی متوالی گزینه‌های --list, --precompile و --soft-links دستور icm -S (در ادامه شرح داده شده)، که در آن file توسط گزینه --list نوشته شده و به عنوان آرگومان گزینه‌های --precompile و --soft-links به کار می‌رود؛
--classes=filename (-c)
فایل filename نام فایلی است که حاوی فهرستی از دایرکتوری‌های بررسی‌شده توسط گزینه --list است (به طور پیش‌فرض CLASSES). دایرکتوری سطح بالای پروژه به طور خودکار بررسی می‌شود مگر اینکه گزینه --no-topdir مشخص شده باشد؛
--help (-h)
دستور Icmake -S خلاصه‌ای از نحوه استفاده خود را در خروجی استاندارد نوشته و با بازگرداندن مقدار 0 به سیستم‌عامل پایان می‌یابد؛
--internal=.ext (-i)
مقدار .ext پسوند مورد استفاده برای هدرهای داخلی است (شامل نقطه). به طور پیش‌فرض .ih استفاده می‌شود؛
--list (-l)
در صورت تعیین گزینه --all نادیده گرفته می‌شود.
نوشتن نام فایل‌هایی که باید هنگام ساخت SPCH پردازش شوند در فایلی که به عنوان اولین آرگومان خط فرمان icmake -S مشخص شده است. نام فایل مشخص‌شده نباید پسوند یا مشخصات دایرکتوری داشته باشد (مثلاً spch)؛
--no-topdir (-n)
نادیده گرفتن هدر داخلی یافت‌شده در دایرکتوری سطح بالای پروژه. این گزینه برای مثال زمانی استفاده می‌شود که صرفاً یک کتابخانه ساخته می‌شود نه یک برنامه کامل؛
--precompile=file (-p)
پیش‌کامپایل کردن file (نام فایل مشخص‌شده در گزینه --list) به فایل SPCH مشخص‌شده به عنوان آرگومان اول خط فرمان icmake -S. اگر آن آرگومان به / ختم شود، SPCH با نام ’argument’file.gch نوشته می‌شود.
به طور پیش‌فرض، SPCH با دستور زیر ساخته می‌شود (همگی در یک خط):
g++ -c -o $2 ${ICMAKE_CPPSTD} -Wall -Werror -O2 -x c++-header $1
در اینجا $1 با نام فایل («file») و $2 با نام SPCH جایگزین می‌شود، در حالی که $ICMAKE_CPPSTD به مقدار متغیر محیطی ICMAKE_CPPSTD اشاره دارد (که استاندارد C++ مورد استفاده را تعیین می‌کند، مثلاً ICMAKE_CPPSTD=--std=c++26).
همچنین، دستور ساخت SPCH می‌تواند به عنوان آرگومان دوم خط فرمان ارائه شود که باید نقل‌قول شود، مانند:
’g++ -c -o $2 ’${ICMAKE_CPPSTD}’ -Wall -Werror -O2 -x c++-header $1’
یا آرگومان دوم خط فرمان می‌تواند به صورت f:file باشد، که در آن file نام فایلی است که خط اول آن دستور ساخت SPCH را مشخص می‌کند (که باید $1 و $2 و در صورت تمایل $ICMAKE_CPPSTD را مشخص کند).
متغیر محیطی PATH برای یافتن کامپایلر استفاده می‌شود؛ مسیر مطلق کامپایلر نیز قابل استفاده است.
--soft-links=file (-s)
در صورت تعیین گزینه --all نادیده گرفته می‌شود.
این گزینه از همان آرگومان‌های مورد استفاده در گزینه --precompile استفاده می‌کند. این گزینه پیوندهای نمادین .gch را از فایل‌های هدر فهرست‌شده در file به فایل SPCH تولیدشده ایجاد می‌نماید؛
--unused=regex (-u)
در عمل احتمالاً نیازی به این گزینه نیست، اما فایل‌های منطبق با عبارت باقاعده (POSIX extended) regex توسط icmake -S بررسی نمی‌شوند. در صورت استفاده می‌توان از مشخصاتی مانند (...)|(...) برای تعیین چند عبارت باقاعده استفاده کرد. همچنین می‌توان از f:file به عنوان آرگومان گزینه برای تعیین فایلی که خطوط غیرخالی آن حاوی عبارات باقاعده هستند بهره برد؛
--version (-v)
دستور Icmake -S شماره نسخه خود را در خروجی استاندارد نوشته و با بازگرداندن مقدار 0 به سیستم‌عامل پایان می‌یابد؛
--warn (-w)
هنگامی که فایل‌های هدر موجود در شرف تغییر هستند، به صورت تعاملی هشدار داده و تغییرات را می‌پذیرد یا رد می‌کند. در صورت رد کردن، icm-spch پایان می‌یابد.

دستور Icmake -S به یک و در صورت تمایل دو آرگومان نیاز دارد که در توضیحات گزینه‌های --list, --precompile و soft-links شرح داده شدند.

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

هنگام استفاده از SPCHها، از ساخت هدرهای پیش‌کامپایل‌شده تقریباً یکسان برای دایرکتوری‌های مجزا جلوگیری می‌شود: تنها یک هدر پیش‌کامپایل‌شده ساخته می‌شود که سپس توسط تمامی مؤلفه‌های پروژه استفاده می‌گردد. از آنجا که از بخش‌های تکراری اجتناب می‌شود، اندازه (و زمان ساخت) SPCHها بسیار کمتر است و معمولاً تنها به ۵ تا ۱۰ درصد فضا (و زمان ساخت) نسبت به هدرهای پیش‌کامپایل‌شده مجزا نیاز دارد.

هدرهای SPCH به راحتی در ترکیب با icmbuild(1) قابل استفاده هستند. اغلب یک مشخصه در فایل icmconf پروژه مانند #define SPCH "" تمام چیزی است که لازم است (ر.ک. icmconf(7)).

برنامه کمکی icm-un توسط icmake -u فراخوانی می‌شود و انتظار یک آرگومان، یعنی یک فایل bim را دارد. این برنامه فایل باینری را دیس‌اسمبل کرده و دستورالعمل‌های اسمبلی و ساختار فایل bim را نمایش می‌دهد.

به عنوان مثال، فرض کنید اسکریپت زیر با دستور icmake -c demo.im کامپایل شده است:

void main()
{
    printf << "hello world\n";
}
فایل حاصل به نام demo.bim با دستور icmake -u demo.bim دیس‌اسمبل شده و موارد زیر را در جریان خروجی استاندارد می‌نویسد:
icm-un by Frank B. Brokken (f.b.brokken@rug.nl)
icm-un V12.04.00
Copyright (c) GPL 1992-2024. NO WARRANTY.
Binary file statistics:
    strings      at offset  0x0025
    variables    at offset  0x0033
    filename     at offset  0x0033
    code         at offset  0x0014
    first opcode at offset  0x0021
String constants dump:
    [0025 (0000)] ""
    [0026 (0001)] "hello world."
Disassembled code:
    [0014] 06 01 00   push string "hello world."
    [0017] 05 01 00   push int 0001
    [001a] 1b 1d      callrss 1d (printf)
    [001c] 1c 02      add sp, 02
    [001e] 04         push int 0
    [001f] 24         pop reg
    [0020] 23         ret
    [0021] 21 14 00   call [0014]
    [0024] 1d         exit

آفست‌ها با استفاده از دستگاه اعداد هگزادسیمال نمایش داده می‌شوند و آفست‌های بایتی مطلق درون فایل bim هستند. روگرفت (dump) ثوابت رشته‌ای همچنین در داخل پرانتز، آفست‌های رشته‌های منفرد را نسبت به ابتدای بخش رشته‌ها نشان می‌دهد. خروجی همچنین کدهای عملیاتی (opcodes) دستورالعمل‌های فایل‌های منبع .im کامپایل‌شده را نمایش می‌دهد. اگر آپ‌کدها از آرگومان‌ها استفاده کنند، مقادیر این آرگومان‌ها پس از آپ‌کد آن‌ها نمایش داده می‌شود. هر خط آپ‌کد با نمایش نماد یادافزا (mnemonic) آپ‌کد به اضافه (در صورت وجود) ماهیت آرگومان آن خاتمه می‌یابد.

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

برنامه‌های باینری:

/usr/bin/icmake: برنامه اصلی icmake؛
/usr/bin/icmbuild: برنامه پوششی پیرامون اسکریپت icmbuild که نگهداری استاندارد برنامه‌ها را مدیریت می‌کند؛
/usr/bin/icmodmap: نگاشت‌دهنده ماژول که نگهداری برنامه‌های C++ مبتنی بر ماژول را مقداردهی اولیه می‌کند؛
/usr/bin/icmstart: یک اسکریپت icmake که می‌تواند برای ایجاد فایل‌های راه‌اندازی پروژه‌های جدید استفاده شود؛

برنامه‌های کمکی:

/usr/libexec/icmake/icm-comp: کامپایلر فراخوانی‌شده توسط icmake؛
/usr/libexec/icmake/icm-dep: برنامه کمکی مدیریت وابستگی‌های کلاس؛
/usr/libexec/icmake/icm-exec: مفسر بایت‌کد؛
/usr/libexec/icmake/icm-multicomp: کامپایلر چندنخی فایل‌های منبع؛
/usr/libexec/icmake/icm-pp: پیش‌پردازنده فراخوانی‌شده توسط icmake؛
/usr/libexec/icmake/icm-spch: برنامه آماده‌سازی SPCHها؛
/usr/libexec/icmake/icm-un: دیس‌اسمبلر icmake.

بسته توزیع (معمولاً در /usr/share/doc/icmake) حاوی یک دایرکتوری examples شامل نمونه‌های تکمیلی اسکریپت‌های icmake است. اسکریپت icmstart خود یک اسکریپت icmake است، همانند /usr/libexec/icmake/icmbuild که توسط برنامه /usr/bin/icmbuild فراخوانی می‌شود. همچنین بخش مثال‌ها (EXAMPLES) را در صفحه راهنمای icmscript(7) ببینید.

chmod(1), icmbuild(1), icmconf(7), icmodmap(1), icmscript(7), icmstart(1), icmstart.rc(7), make(1)

گزارش نشده است.

این نرم‌افزار آزاد است که تحت شرایط مجوز عمومی همگانی گنو (GPL) توزیع شده است.

Frank B. Brokken (f.b.brokken@rug.nl).

1992-2025 icmake.13.00.03