icmodmap(1) initializes C++ projects using modules icmodmap(1)

icmodmap - مقداردهی اولیه نگهداری پروژه‌های ++C مبتنی بر ماژول‌ها

icmodmap [گزینه‌ها] start-directory

اگرچه ماژول‌ها مدت قابل‌توجهی است که در دسترس هستند، اما کامپایلر g++ گنو همچنان تعدادی باگ مربوط به ماژول‌های ++C نشان می‌دهد (ر.ک. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103524). بنابراین این احتمال وجود دارد که هنگام استفاده از ماژول‌ها با برخی از این باگ‌ها (یا باگ‌های جدید) مواجه شوید. این اشکالات احتمالاً در نگارش‌های آینده کامپایلر رفع خواهند شد و وضعیت کنونی حداقل به شما اجازه می‌دهد تا در استفاده از ماژول‌ها تجربه کسب کنید.

ماژول‌ها نمی‌توانند متقابلاً یکدیگر را وارد (import) کنند. در نتیجه، همواره یک سلسله‌مراتب خطی و غیرحلقوی میان ماژول‌ها وجود دارد که باید هنگام کامپایل فایل‌های تعریف‌کننده و استفاده‌کننده از ماژول‌ها رعایت شود. برنامه icmodmap این ترتیب را تعیین کرده و زمینه ساخت ماژول‌های مورد استفاده برنامه‌ها را آماده می‌سازد.

برنامه Icmodmap فرض می‌کند که ماژول‌ها در زیردایرکتوری‌های مجزا تعریف شده‌اند و رابط‌های ماژول (به‌طور پیش‌فرض) در فایل‌هایی با نام module.cc قرار دارند. اگر برنامه‌ای دو ماژول با نام‌های First و Second تعریف کند (برای مثال در زیردایرکتوری‌های first و second) و فایل second/module.cc ماژول First را وارد نماید، آن‌گاه فایل first/module.cc باید پیش از کامپایل second/module.cc کامپایل شود. این فرایند توسط icmodmap مدیریت می‌شود. پس از کامپایل فایل‌های module.cc، مابقی فایل‌های منبع برنامه می‌توانند طبق روال همیشگی کامپایل شوند.

برنامه Icmodmap انتظار دارد پروژه‌های مبتنی بر ماژول به شکل زیر سازماندهی شده باشند:

دایرکتوری ریشه پروژه حاوی فایلی به نام CLASSES است که در آن هر خط (با نادیده گرفتن توضیحات C++) نام زیردایرکتوری پیاده‌سازی‌کننده یکی از مؤلفه‌های پروژه را مشخص می‌کند. همچنین می‌توان (زیرمجموعه‌ای از) زیردایرکتوری‌های پروژه را مشخص کرد. هر زیردایرکتوری می‌تواند یک ماژول، یک افراز ماژول (partition)، یک کلاس (که عضوی از ماژول نیست اما شاید از ماژول‌ها استفاده کند)، یا توابعی در سطح سراسری (که آن‌ها هم شاید از ماژول‌ها استفاده کنند) تعریف نماید؛
اگر پروژه یک برنامه اجرایی تعریف کند، دایرکتوری ریشه پروژه شامل فایل‌های منبع (مانند main.cc) تعریف‌کننده تابع main خواهد بود. دایرکتوری ریشه ماژولی تعریف نمی‌کند، اما سورس‌های آن می‌توانند از ماژول‌ها استفاده کنند؛
زیردایرکتوری‌های تعریف‌کننده ماژول‌ها یا افرازها به‌طور پیش‌فرض حاوی یک فایل module.cc هستند که نام ماژول و رابط آن را تعریف می‌کند (به‌جای module.cc می‌توان نام فایل دیگری را مشخص کرد)؛
ماژول‌ها و افرازها می‌توانند کلاس‌هایی تعریف کنند (یک کلاس به ازای هر ماژول، یک کلاس به ازای هر افراز). در این صورت توابع عضو آن کلاس‌ها در زیردایرکتوری همان ماژول یا افراز تعریف می‌شوند.

برنامه Icmodmap(1) هر یک از زیردایرکتوری‌های مشخص‌شده را بررسی می‌کند. اگر حاوی فایل module.cc (یا نام جایگزین آن) باشد، آن فایل (که ساختار زیر را دارد) مورد بازبینی قرار می‌گیرد:

اولین خط غیرخالی آن: نام ماژول یا افراز را تعیین می‌کند؛
خطوط import می‌توانند هدرهای سیستمی، ماژول‌ها و/یا افرازها را مشخص کنند.

برنامه Icmodmap از گزینه‌های زیر پشتیبانی می‌کند:

--colors (-c)
به‌طور پیش‌فرض کامپایلر با استفاده از گزینه -fdiagnostics-color=never فراخوانی می‌شود. از این گزینه برای غیرفعال کردن این حالت و فعال‌سازی رنگ‌ها استفاده کنید؛
--dependencies (-d)
با این گزینه وابستگی‌های میان ماژول‌ها نمایش داده می‌شود. فایل‌های منبع تعریف‌کننده ماژول کامپایل نمی‌شوند. خروجی Icmodmap ممکن است شبیه به این باشد:
Square:l
DepSquare: Square
در اینجا، پسوند :l نشان می‌دهد که Square ماژولی است که توسط پروژه تعریف شده و به ماژول‌های دیگر وابسته نیست. هنگامی که تعاریف ماژول به ماژول‌های دیگر وابسته باشند، در ادامه فهرست می‌شوند: DepSquare ماژول دیگری است که توسط پروژه تعریف شده و به ماژول Square وابسته است.
همچنین این امکان وجود دارد که ماژول‌ها به ماژول‌های تعریف‌شده توسط پروژه‌های دیگر وابسته باشند. در این حالت ممکن است خروجی بدین صورت باشد:
Square:e
Mod1: Square:e
Mod2: Square:e Mod1 
Mod3: Square:e Mod1  Mod2
در این مثال، ماژول Square یک ماژول خارجی است که با پسوند :e مشخص شده است. تمام ماژول‌های دیگر به Square وابسته هستند و (برای مثال) Mod3 علاوه بر آن به ماژول‌های محلی Mod1 و Mod2 نیز وابسته است. در این مثال اخیر، فایل Square.gcm باید در دایرکتوری gcm.cache پروژه در دسترس باشد (می‌تواند یک پیوند نمادین به فایل اصلی باشد)؛
--help (-h)
اطلاعات نحوه استفاده را ارائه کرده و مقدار 0 را به سیستم‌عامل بازمی‌گرداند؛
--module=file (-m)
به‌طور پیش‌فرض ماژول‌ها در فایل‌های منبع module.cc تعریف می‌شوند. اگر ماژول‌ها در فایل‌های منبعی با نام‌های دیگر تعریف شده باشند، می‌توان آن نام‌ها را با استفاده از این گزینه مشخص کرد. برای مثال، هنگامی که ماژول‌ها در فایل‌های interface.cc تعریف شده‌اند، گزینه --module interface.cc را مشخص کنید. استفاده از نام‌های متفاوت برای فایل‌های تعریف ماژول در یک پروژه پشتیبانی نمی‌شود؛
--subdir (-s)
به‌طور پیش‌فرض فایل‌های کامپایل‌شده تعریف ماژول در زیردایرکتوری tmp/o پروژه قرار می‌گیرند که در آن هر فایل کامپایل‌شده پیشوند شماره ترتیب کامپایل را دریافت کرده است (مانند tmp/o/1module.o، tmp/o/2module.o و غیره). با تعیین گزینه --subdir، فایل‌های کامپایل‌شده در همان زیردایرکتوری فایل‌های تعریف ماژول قرار می‌گیرند (بدون پیشوند شماره ترتیب)؛
--version (-v)
نسخه icmodmap را نمایش می‌دهد.
--verbose (-V)
هنگام تعیین ترتیب کامپایل ماژول‌ها و کامپایل فایل‌های تعریف ماژول، خروجی‌های بیشتری را نمایش می‌دهد.

برنامه زیر ماژول Square را در زیردایرکتوری square خود تعریف می‌کند که حاوی فایل module.cc زیر است:

export module Square;
export
{
    double square(double value);
    class Square
    {
        double d_amount;
        public:
            Square(double amount = 0);          // initialize
            void amount(double value);          // change d_amount
            double amount() const;              // return d_amount
            double lastSquared() const;         // returns g_squared
            double square() const;              // returns sqr(d_amount)
    };
}
double g_squared;

تابع main ماژول Square را وارد کرده و از امکانات آن استفاده می‌کند. همچنین هدر سیستمی کامپایل‌شده ماژول iostream را نیز وارد می‌کند. آن هدر توسط icmodmap بررسی نمی‌شود و باید پیش از امکان کامپایل فایل main.cc در دسترس باشد. در اینجا فایل منبع main.cc آمده است:

import Square;
import <iostream>;
int main(int argc, char **argv)
{
    std::cout << "the square of " << argc << " is " 
                                         << square(argc) << ’\n’;
    Square obj{12};
    std::cout << "the square of 12 is " << obj.square() << "\n"
                "the last computed square is " << 
                obj.lastSquared() << ’\n’;
}

اجرای دستور icmodmap -d . ماژول Square را به عنوان یک ماژول محلی نشان می‌دهد:

Square:l

اجرای دستور icmodmap -V . کامپایل فایل square/module.cc را نشان می‌دهد:

Module: Square
square:
/bin/g++ --std=c++26 -fdiagnostics-color=never  -c -fmodules-ts 
        -Wall -o ../tmp/o/1module.o module.cc

همچنین زیردایرکتوری gcm.cache را تعریف می‌کند که حاوی Square.gcm و پیوند نمادین usr -> /usr است، و به دلیل این پیوند نمادین، کامپایلر فایل‌های هدر سیستمی کامپایل‌شده ماژول را پیدا می‌کند. همچنین پیوند نمادین square/gcm.cache -> ../gcm.cache را ایجاد می‌کند: این پیوندهای نمادین در تمام زیردایرکتوری‌های مورد استفاده برنامه تعریف می‌شوند و به تمام فایل‌های منبع در همه زیردایرکتوری‌های برنامه اجازه می‌دهند تا تمام ماژول‌های تعریف‌شده در دایرکتوری gcm.cache دایرکتوری اصلی را وارد کنند.

icmake(1).

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

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

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

1992-2025 icmake.13.00.03