IMAKE(1) General Commands Manual IMAKE(1)

imake - رابط پیش‌پردازنده C برای ابزار make

imake [ -Ddefine ] [ -Idir ] [ -Udefine ] [ -Ttemplate ] [ -f filename ] [ -C filename ] [ -s filename ] [ -e ] [ -v ]

ابزار Imake برای تولید Makefileها از روی یک قالب (template)، مجموعه‌ای از توابع ماکروی cpp و یک فایل ورودی به ازای هر دایرکتوری به نام Imakefile به کار می‌رود. این سازوکار اجازه می‌دهد تا وابستگی‌های وابسته به ماشین (مانند گزینه‌های کامپایلر، نام‌های جایگزین دستورات و قواعد خاص make) از توصیف مؤلفه‌های مختلفی که باید ساخته شوند، جدا نگه داشته شوند.

گزینه‌های خط فرمان زیر را می‌توان به imake ارسال کرد:

این گزینه مستقیماً به cpp ارسال می‌شود. معمولاً برای تنظیم متغیرهای مختص هر دایرکتوری استفاده می‌شود. به عنوان مثال، سامانه پنجره X (X Window System) از این پرچم برای تنظیم TOPDIR به نام دایرکتوری حاوی ریشه توزیع اصلی و CURDIR به نام دایرکتوری جاری نسبت به ریشه استفاده می‌کرد.
این گزینه مستقیماً به cpp ارسال می‌شود. معمولاً برای مشخص کردن دایرکتوری‌ای که قالب و فایل‌های پیکربندی imake در آن قرار دارند، به کار می‌رود.
این گزینه مستقیماً به cpp ارسال می‌شود. معمولاً برای لغو تعریف متغیرها در هنگام اشکال‌زدایی فایل‌های پیکربندی imake استفاده می‌شود.
این گزینه نام فایل قالب اصلی مورد استفاده توسط cpp را تعیین می‌کند (که معمولاً در دایرکتوری مشخص‌شده با -I قرار دارد). پیش‌فرض Imake.tmpl است.
این گزینه نام فایل ورودی مختص هر دایرکتوری را مشخص می‌کند. پیش‌فرض Imakefile است.
این گزینه نام فایل .c ساخته‌شده در دایرکتوری جاری را مشخص می‌کند. پیش‌فرض Imakefile.c است.
این گزینه نام فایل توصیف make تولیدی را مشخص می‌کند، بدون اینکه make اجرا شود. اگر filename یک خط تیره (-) باشد، خروجی در stdout نوشته می‌شود. حالت پیش‌فرض، تولید Makefile بدون اجرای آن است.
این گزینه مشخص می‌کند که imake باید Makefile تولیدشده را اجرا کند. پیش‌فرض این است که اجرای آن به کاربر واگذار شود.
این گزینه مشخص می‌کند که imake باید خط فرمان cpp مورد استفاده برای تولید Makefile را چاپ کند.

دستور Imake، برنامه cpp را همراه با هرگونه پرچم -I یا -D ارسال‌شده در خط فرمان فراخوانی کرده و نام فایلی حاوی ۳ سطر زیر را به آن ارسال می‌کند:

#define IMAKE_TEMPLATE "Imake.tmpl"
#define INCLUDE_IMAKEFILE <Imakefile>
#include IMAKE_TEMPLATE

که در آن Imake.tmpl و Imakefile می‌توانند به ترتیب با گزینه‌های خط فرمان -T و -f جایگزین شوند.

قالب IMAKE_TEMPLATE معمولاً فایلی حاوی پارامترهای وابسته به ماشین (مشخص‌شده به صورت نمادهای cpp)، یک فایل پارامترهای مختص سایت، یک فایل تعریف متغیرها، یک فایل حاوی توابع ماکروی cpp برای تولید قواعد make، و در نهایت Imakefile (مشخص‌شده با INCLUDE_IMAKEFILE) در دایرکتوری جاری را فراخوانی می‌کند. فایل Imakefile از این توابع ماکرو برای تعیین اهدافی که باید ساخته شوند استفاده می‌کند؛ سپس imake وظیفه تولید قواعد مناسب را بر عهده می‌گیرد.

فایل‌های پیکربندی Imake شامل دو نوع متغیر هستند: متغیرهای imake و متغیرهای make. متغیرهای imake هنگام اجرای imake توسط cpp تفسیر می‌شوند. بر اساس قرارداد، این متغیرها به صورت ترکیبی از حروف بزرگ و کوچک (mixed case) نوشته می‌شوند. متغیرهای make برای تفسیر بعدی توسط make درون Makefile نوشته می‌شوند. بر اساس قرارداد، متغیرهای make با حروف بزرگ (upper case) نوشته می‌شوند.

فایل قواعد (که معمولاً در دایرکتوری پیکربندی Imake.rules نام دارد) شامل انواع توابع ماکروی cpp است که متناسب با بستر جاری پیکربندی شده‌اند. Imake هر بار وقوع رشته «@@» را با یک خط جدید (newline) جایگزین می‌کند تا امکان تعریف ماکروهایی که بیش از یک خط از قواعد make را تولید می‌کنند فراهم شود. برای مثال، ماکروی

#define      program_target(program, objlist)        @@\
program:        objlist         @@\
        $(CC)  -o  $@  objlist  $(LDFLAGS)
هنگامی که به شکل زیر فراخوانی شود: program_target(foo, foo1.o foo2.o) به این صورت بسط می‌یابد:
foo:    foo1.o  foo2.o
        $(CC)  -o  $@  foo1.o  foo2.o  $(LDFLAGS)

همچنین Imake هر بار وقوع کلمه «XCOMM» را با نویسه «#» جایگزین می‌کند تا امکان قرار دادن کامنت در Makefile بدون ایجاد خطاهای «invalid directive» از سوی پیش‌پردازنده فراهم شود.

برخی ماکروهای پیچیده imake نیازمند تولید متغیرهای make هستند که مختص هر بار فراخوانی ماکرو باشند، اغلب به این دلیل که مقدار آن‌ها به پارامترهای ارسال‌شده به ماکرو بستگی دارد. چنین متغیرهایی را می‌توان با استفاده از یک متغیر imake به شکل XVARdefn ایجاد کرد که در آن n یک رقم تکی است. در این حالت یک متغیر make یکتا جایگزین خواهد شد. تکرارهای بعدی متغیر XVARusen با متغیر ایجادشده توسط XVARdefn متناظر جایگزین می‌شوند.

در سامانه‌هایی که cpp آن‌ها چندین نویسه tab و فاصله متوالی را به یک فاصله تبدیل می‌کند، imake تلاش می‌کند تا تب‌های لازم را بازگرداند (make نسبت به تفاوت میان tab و فاصله بسیار حساس است). به همین دلیل، دونقطه‌ها (:) در خطوط فرمان باید با یک بک‌اسلش (\) همراه باشند.

سامانه پنجره X تا نسخه X11R6.9 از imake به طور گسترده، هم برای ساخت‌های کامل درون درخت منبع و هم برای نرم‌افزارهای خارجی، استفاده می‌کرد. از نسخه X11R7.0 به بعد، X سامانه ساخت خود را به GNU autoconf و automake تغییر داد، اما همچنان imake را برای ساخت برنامه‌های خارجی موجود که هنوز تبدیل نشده‌اند، نگهداری می‌کند.

همان‌طور که در بالا اشاره شد، دو متغیر ویژه به نام‌های TOPDIR و CURDIR تنظیم می‌شوند تا ارجاع به فایل‌ها با استفاده از مسیرهای نسبی آسان‌تر شود. برای مثال، دستور زیر به طور خودکار برای ساخت Makefile در دایرکتوری lib/X/ (نسبت به ریشه سورس‌کدها) تولید می‌شود:

%  ../.././config/imake  -I../.././config  \
	-DTOPDIR=../../.   -DCURDIR=./lib/X
هنگام ساخت برنامه‌های X در خارج از درخت منبع، نماد ویژه UseInstalled تعریف شده و TOPDIR و CURDIR نادیده گرفته می‌شوند. اگر فایل‌های پیکربندی به درستی نصب شده باشند، می‌توان از اسکریپت xmkmf(1) استفاده کرد.

در ادامه خلاصه‌ای از فایل‌های خوانده‌شده توسط imake به ترتیبی که در X استفاده می‌شوند، آورده شده است. میزان تورفتگی نشان می‌دهد که کدام فایل‌ها فایل‌های دیگر را شامل (include) می‌شوند.

Imake.tmpl  generic variables
    site.def        site-specific, BeforeVendorCF defined
    *.cf    machine-specific
        *Lib.rules  shared library rules
    site.def        site-specific, AfterVendorCF defined
    Imake.rules     rules
    Project.tmpl    X-specific variables
        *Lib.tmpl   shared library variables
    Imakefile
        Library.tmpl        library rules
        Server.tmpl server rules
        Threads.tmpl        multi-threaded rules

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

اولین باری که site.def گنجانده می‌شود، متغیر BeforeVendorCF تعریف شده و در بار دوم، متغیر AfterVendorCF تعریف می‌شود. تمام کدها در site.def باید درون یک #ifdef برای یکی از این نمادها قرار داشته باشند.

متغیرهای محیطی زیر را می‌توان مقداردهی کرد، با این حال استفاده از آن‌ها توصیه نمی‌شود زیرا وابستگی‌هایی ایجاد می‌کنند که در هنگام اجرای imake به راحتی آشکار نیستند:

در صورت تعریف، یک آرگومان «-I» را برای ارسال به پیش‌پردازنده C مشخص می‌کند؛ مانند «-I/usr/X11/config».
در صورت تعریف، باید یک مسیر معتبر به برنامه پیش‌پردازنده باشد؛ مانند «/usr/local/cpp». به طور پیش‌فرض، imake بسته به پیکربندی مختص سیستم‌عامل، از cc -E یا /usr/bin/cpp استفاده خواهد کرد.
در صورت تعریف، باید یک مسیر معتبر به یک برنامه make باشد، مانند «/usr/local/make». به طور پیش‌فرض، imake از هر برنامه make که با استفاده از execvp(3) یافت شود استفاده خواهد کرد. این متغیر تنها در صورتی استفاده می‌شود که گزینه «-e» مشخص شده باشد.

فایل ورودی موقت برای cpp
/tmp/Imf.XXXXXX
فایل Makefile موقت برای گزینه -s
/tmp/IIf.XXXXXX
فایل Imakefile موقت در صورتی که Imakefile مشخص‌شده از کامنت‌های # استفاده کند
/usr/bin/cpp
پیش‌پردازنده پیش‌فرض C

cpp(1), make(1), xmkmf(1)

imake-Related Software and Documentation, http://www.snake.net/software/imake-stuff
Software Portability with imake, Second Edition, O'Reilly & Associates, 1996.
Make — A Program for Maintaining Computer Programs

Todd Brunhoff، Tektronix و MIT Project Athena؛ Jim Fulton، MIT X Consortium

2009-06-22 imake 1.0.11