icmbuild(1) Icmake’s generic program maintenance facility icmbuild(1)

icmbuild - ابزاری عمومی برای نگهداری برنامه‌های C++/C

icmbuild [-h] [-c] args

Icmbuild یک برنامه کوچک C++ است که icmake(1) را برای انجام نگهداری برنامه، بر اساس آنچه در اسکریپت icmbuild (معمولاً واقع در /usr/libexec/icmake) تعریف شده است، فراخوانی می‌کند.

اقدامات icmbuild از طریق یک فایل پیکربندی (icmconf) که باید در دایرکتوری محل درخواست نگهداری برنامه موجود باشد، تنظیم می‌شود. این فایل به‌طور خودکار توسط icmstart(1) نصب می‌گردد. برای جزئیات بیشتر درباره این فایل به صفحه راهنمای icmconf(7) مراجعه کنید.

Icmbuild فرض می‌کند که کدهای منبع شما در دایرکتوری کاری فعلی و زیرشاخه‌های آن قرار دارند. فایل icmconf در توزیع icmake(1) نمونه‌ای از یک فایل icmconf را ارائه می‌دهد که می‌تواند توسط icmbuild استفاده شود. در آن مثال فرض شده است که یک پروژه C++ نگهداری می‌شود، اما نگهداری برنامه برای پروژه‌های دیگر مثلاً C نیز به‌آسانی قابل پیکربندی است. اگر icmbuild فراخوانی شود اما icmconf در دسترس نباشد، خلاصه‌ای از نحوه استفاده را نمایش داده و سپس خاتمه می‌یابد.

Icmbuild() نگهداری تمام کدهای منبع را در هر یک از زیردایرکتوری‌های نام‌برده در فایل CLASSES و همچنین تمام منابع موجود در دایرکتوری کاری فعلی مدیریت می‌کند. «نگهداری» شامل کامپایل تمام فایل‌های منبع کامپایل‌نشده، کامپایل مجدد فایل‌های منبع تغییریافته، نگهداری اختیاری کتابخانه و در صورت تمایل ساخت یک هدر از پیش کامپایل‌شده منفرد (Single Pre-Compiled Header یا SPCH) و کامپایل چندنخی فایل‌های منبع است که منجر به کاهش چشمگیر زمان کامپایل سورس‌ها می‌شود.

هنگامی که فایل‌های منبع کامپایل می‌شوند، فایل‌های شیء حاصل می‌شوند که ممکن است در یک کتابخانه ذخیره گردند، و سپس فایل شیء تابع main برنامه با آن پیوند (link) داده می‌شود. همچنین امکان مشخص کردن کتابخانه‌های اضافی برای پیوند خوردن برنامه با آن‌ها وجود دارد.

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

برای استفاده از icmbuild به صورت زیر عمل کنید:

برنامه icmbuild را در مسیر (PATH) خود نصب کنید (فرایند نصب icmake باید قبلاً این کار را انجام داده باشد)؛
فایل icmconf (و احتمالاً فایل CLASSES) را در دایرکتوری پایه پروژه خود (یعنی دایرکتوری‌ای که سورس‌های پروژه در آن و زیرشاخه‌های آن قرار دارند) کپی کنید. معمولاً این کار از پیش توسط اسکریپت (icmstart) انجام شده است؛

سپس:

دستورات #define را در فایل icmconf بر اساس نیاز خود تغییر دهید؛
نام‌های زیردایرکتوری‌های حاوی کدهای منبع را در خطوط جداگانه در فایل CLASSES وارد کنید
توجه داشته باشید که ترتیب کلاس‌های ذکر شده در CLASSES مهم است، به این صورت که نام کلاس‌های (زیردایرکتوری‌های) جدید همیشه می‌توانند به انتهای فایل CLASSES اضافه شوند. از تغییر ترتیب خطوط در فایل CLASSES باید خودداری شود، زیرا این کار به‌احتمال زیاد باعث بازنویسی فایل‌های شیء هم‌نام از دایرکتوری‌های موجود می‌شود.
اگر تغییر ترتیب ضروری است، ابتدا دستور icmbuild clean را اجرا کنید تا تمام فایل‌هایی که تاکنون توسط icmbuild ایجاد شده‌اند حذف شوند. کامپایل مجدد از این جهت لازم است که نام فایل‌های شیء برای شناسایی، شامل شماره ترتیب کلاس‌ها هستند. این شماره‌های ترتیبی از تداخل نام فایل‌ها جلوگیری می‌کنند (مثلاً دو کلاس ممکن است از فایلی به نام data.cc استفاده کنند) و به دلیل این پیشوندهای عددی، از جایگزینی فایل x.o کلاس A با فایل x.o کلاس B جلوگیری می‌شود؛
دستور icmbuild را آغاز کنید.

بخش بعدی به حالت‌های عملیاتی icmbuild می‌پردازد.

دستور Icmbuild سه گزینه را شناسایی می‌کند که تنها یکی از آن‌ها می‌تواند مشخص شود. برای اطلاعات بیشتر در مورد اینکه کدام گزینه توسط کدام دستور icmbuild پشتیبانی می‌شود، به بخش بعدی مراجعه کنید.

-h: نمایش اطلاعات نحوه استفاده (که در صورت نبود فایل icmconf در دایرکتوری فعلی نیز به‌طور خودکار نشان داده می‌شود) و پایان دادن به اجرای icmbuild؛
-c: پاک کردن صفحه نمایش (با فراخوانی tput clear) قبل از شروع فرایند کامپایل؛
-s: پیراستن (strip) برنامه یا کتابخانه کامپایل‌شده در دایرکتوری نصب آن (حالت‌های گوناگون install را در ادامه ببینید).

دستور Icmbuild دستورات زیر را می‌شناسد (گزینه‌های احتمالی درون کروشه نشان داده شده‌اند). با دستورات install باید یک آرگومان path مشخص شود که باید یک دایرکتوری موجود با قابلیت نوشتن برای کاربر باشد:

clean
پاکسازی بقایای عملیات‌های قبلی (دایرکتوری مشخص‌شده توسط تعریف TMP_DIR در icmconf حذف می‌شود). اگر هدرهای از پیش کامپایل‌شده ایجاد شده باشند (یعنی PRECOMP در icmconf مشخص شده باشد)، تمام فایل‌های دارای پسوند .gch در دایرکتوری اصلی و در دایرکتوری‌های فهرست‌شده در فایل CLASSES نیز حذف می‌شوند. اگر USE_ALL مشخص شده باشد، آن فایل‌ها نیز حذف می‌شوند؛
cleangch
تمام فایل‌های .gch که از پیش کامپایل شده بودند حذف می‌شوند (خواه در زیردایرکتوری gch از دایرکتوری TMP_DIR (مشخص‌شده در icmconf) موجود باشند، خواه در دایرکتوری‌های مشخص‌شده در فایل CLASSES، یا در دایرکتوری اصلی پروژه). اگر در icmconf پارامتر PRECOMP مشخص نشده باشد، هیچ عملی انجام نمی‌شود؛
cleantmp
مشابه icmbuild clean، اما فایل‌های .gch و فایل‌های مشخص‌شده توسط تعریف USE_ALL در icmconf حذف نمی‌شوند؛
[-s] install program path
نصب برنامه ساخته‌شده در path مشخص‌شده (برای استفاده پس از اجرای دستور icmbuild program، در ادامه را ببینید). مسیر می‌تواند مطلق یا نسبی باشد و می‌تواند به‌طور اختیاری نام برنامه نصب‌شده را نیز تعیین کند. مثال:
icmbuild install program ~/bin/prog
این کار، برنامه باینری ساخته‌شده را در دایرکتوری bin کاربر و با نام prog نصب می‌کند؛
[-s] install static path
نصب کتابخانه ایستای ساخته‌شده در مسیر مشخص‌شده (برای استفاده پس از اجرای icmbuild library، در ادامه را ببینید). مسیر می‌تواند مطلق یا نسبی باشد و به‌طور اختیاری نام کتابخانه نصب‌شده را مشخص کند. مثال:
icmbuild install static /usr/lib/
این کار، کتابخانه ایستای ساخته‌شده را (با فرض اینکه نام آن libspecial.a باشد) در /usr/lib به‌صورت /usr/lib/libspecial.a نصب می‌کند.
[-s] install shared path هنگام استفاده از این دستور نصب، icmconf باید شامل #define SHARED باشد (ر.ک به icmconf(7)). این دستور کتابخانه اشتراکی ساخته‌شده را در مسیر مشخص‌شده نصب می‌کند (برای استفاده پس از اجرای icmbuild library). مسیر می‌تواند مطلق یا نسبی باشد و باید یک دایرکتوری موجود را مشخص کند. مثال:
icmbuild install shared /usr/lib/
این کار، کتابخانه اشتراکی باینری ساخته‌شده (مانند libspecial.so) را در /usr/lib به‌صورت /usr/lib/libspecial.so نصب می‌کند. علاوه بر این، پیوندهای نمادین (soft-links)
libspecial.so -> libspecial.so.X
libspecial.so.X -> libspecial.so.X.Y.Y.Z 
در /usr/lib تعریف می‌شوند که در آن X.Y.Z نسخه‌های اصلی (major)، فرعی (minor) و زیرفرعی (subminor) تعریف‌شده در فایل VERSION هستند.
[-c] library
انجام نگهداری کتابخانه (یک کتابخانه ایستا و در صورت تمایل (اگر icmconf مقدار SHARED را تعریف کرده باشد) یک کتابخانه اشتراکی (پویا) می‌سازد)؛
[-c] program
انجام نگهداری برنامه (برنامه‌ای را از روی سورس‌های موجود در دایرکتوری کاری فعلی و سورس‌های موجود در دایرکتوری‌های مشخص‌شده در فایل CLASSES می‌سازد)؛
اگر هیچ دستوری مشخص نشده باشد (اما به صورت اختیاری تنها -c مشخص شده باشد)، مشخصه DEFCOM در icmconf بررسی می‌شود. مشخصه‌های شناخته‌شده عبارتند از:
#define DEFCOM "program"
که معادل دستور icmbuild [-c] program است؛
اگر DEFCOM به صورت زیر مشخص شده باشد:
#define DEFCOM "library"
در این صورت معادل دستور icmbuild [-c] library خواهد بود.
اگر یک دستور صریح به icmbuild داده شود، مشخصات DEFCOM نادیده گرفته می‌شوند.

وابستگی‌های کلاس توسط برنامه پشتیبان icmake به نام icm-dep مدیریت می‌شوند. هنگامی که گزینه -d مشخص شده باشد، این برنامه می‌تواند از icmake فراخوانی شود. تمام گزینه‌ها و آرگومان‌های پس از -d به icm-dep فرستاده می‌شوند.

برنامه icm-dep به‌طور خودکار توسط icmbuild برای مدیریت وابستگی‌های کلاس فراخوانی می‌شود. برای توضیحات مربوط به برنامه icm-dep به صفحه راهنمای icmake(1)، بخش ICM-DEP مراجعه کنید.

به‌طور پیش‌فرض، icmbuild دستور icmake -d -V go را فراخوانی می‌کند: icm_dep برای انجام وظایف خود و نمایش اقداماتش در جریان خروجی استاندارد فراخوانی می‌شود. با تعیین پارامتر #define ICM_DEP در فایل icmconf، می‌توان این پیش‌فرض را لغو کرد (ر.ک به icmconf(7)).

مسیرهای ذکرشده صرفاً جنبه پیشنهادی دارند و ممکن است بسته به نحوه نصب متغیر باشند:

/usr/share/icmake/icmconf نمونه کامل و مشروح از یک فایل پیکربندی icmbuild؛
/usr/share/icmake/CLASSES نمونه‌ای از یک فایل CLASSES برای icmbuild.

در اینجا نمونه‌ای از فایل پیکربندی icmconf برای یک برنامه واقعی آورده شده است که از امکانات کتابخانه bobcat استفاده می‌کند:

#define CLS
#define LIBRARY             "ofiles"
#define MAIN                "main.cc"
#define SOURCES             "*.cc"
#define OBJ_EXT             ".o"
#define SHAREDREQ           ""
#define TMP_DIR             "tmp"
#define USE_ALL             "a"
#define USE_ECHO              ON
#define CXX                 "g++"
#define CXXFLAGS            "-Wall -Werror -O2"
#define IH                  ".ih"
#define MULTICOMP           "jobs -q"
#define SPCH                ""
#define REFRESH
#define LDFLAGS             ""
#define ADD_LIBRARIES       "bobcat"
#define ADD_LIBRARY_PATHS   ""
#define DEFCOM              "program"

icmake(1), icmconf(7), icmstart(1), icmstart.rc(7)

هیچ موردی گزارش نشده است.

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

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

1992-2025 icmake.13.00.03