RMKDEPEND(1) General Commands Manual RMKDEPEND(1)

rmkdepend - ایجاد وابستگی‌ها در makefileها (نسخه ROOT)

rmkdepend [ -Dname=def ] [ -Dname ] [ -Iincludedir ] [ -Yincludedir ] [ -a ] [ -fmakefile ] [ -oobjsuffix ] [ -pobjprefix ] [ -sstring ] [ -wwidth ] [ -v ] [ -m ] [ -- otheroptions -- ] sourcefile [ -ttargetfilename ] ...

برنامهٔ rmkdepend هر sourcefile را به ترتیب خوانده و آن را مانند یک پیش‌پردازندهٔ C تجزیه می‌کند، و تمامی دستورهای #include، #define، #undef، #ifdef، #ifndef، #endif، #if، #elif و #else را پردازش می‌نماید تا بتواند به‌درستی تشخیص دهد چه دستورهای #include در حین کامپایل استفاده خواهند شد. هر دستور #include می‌تواند به فایل‌هایی ارجاع دهد که خود دارای دستورهای #include دیگری هستند، و تجزیه بر روی این فایل‌ها نیز انجام خواهد شد.

هر فایلی که یک sourcefile به‌طور مستقیم یا غیرمستقیم شامل می‌شود، چیزی است که rmkdepend آن را یک وابستگی (dependency) می‌نامد. این وابستگی‌ها سپس در یک makefile به‌گونه‌ای نوشته می‌شوند که make(1) بداند هنگام تغییر یک وابستگی، کدام فایل‌های شیء (object files) باید دوباره کامپایل شوند.

به‌طور پیش‌فرض، rmkdepend خروجی خود را در فایلی به نام makefile در صورت وجود، و در غیر این صورت در Makefile قرار می‌دهد. یک makefile جایگزین می‌تواند با گزینهٔ -f مشخص شود. این برنامه ابتدا makefile را برای یافتن خطِ


# DO NOT DELETE THIS LINE -- make depend depends on it.

یا خطی که با گزینهٔ -s تعیین شده است، به عنوان جداکننده برای خروجی وابستگی‌ها جستجو می‌کند. اگر آن را بیابد، تمام موارد پس از این خط را تا انتهای makefile حذف کرده و خروجی را پس از این خط قرار می‌دهد. اگر آن را نیابد، برنامه این رشته را به انتهای makefile الحاق می‌کند و خروجی را پس از آن می‌نویسد. به ازای هر sourcefile که در خط فرمان ظاهر می‌شود، rmkdepend خطوطی را به فرم زیر در makefile قرار می‌دهد:


sourcefile.o: dfile ...

که در آن sourcefile.o نام گرفته‌شده از خط فرمان است که پسوند آن با «.o» جایگزین شده، و dfile وابستگی کشف‌شده در یک دستور #include در حین تجزیهٔ sourcefile یا یکی از فایل‌های شامل‌شده در آن است. برنامه rmkdepend بر پایه makedepend(1) از X Consortium توسعه یافته است، اما برای رفع نیازهای سامانه ROOT اندکی تغییر یافته است. این صفحه راهنما (man(1)) کم‌وبیش با صفحه راهنمای makedepend(1) یکسان است، به جز این یادداشت و بخش‌های همچنین ببینید (SEE ALSO) و نویسندگان (AUTHORS).

به‌طور معمول، rmkdepend در یک هدف makefile استفاده می‌شود تا با وارد کردن دستور «make depend»، وابستگی‌ها برای makefile به‌روزرسانی شوند. برای نمونه:

SRCS = file1.c file2.c ...
CFLAGS = -O -DHACK -I../foobar -xyz
depend:
        rmkdepend -- $(CFLAGS) -- $(SRCS)

این برنامه هر گزینه‌ای را که تشخیص ندهد نادیده می‌گیرد تا بتوانید از همان آرگومان‌هایی که برای cc(1) استفاده می‌کنید، بهره ببرید.

تعریف کردن نماد. این گزینه تعریفی برای name در جدول نمادهای rmkdepend قرار می‌دهد. بدون =def نماد به صورت «1» تعریف می‌شود.
دایرکتوری include. این گزینه به rmkdepend می‌گوید که هنگام مواجهه با دستور #include دایرکتوری includedir را به ابتدای فهرست دایرکتوری‌های جستجوی خود اضافه کند. به‌طور پیش‌فرض، rmkdepend تنها دایرکتوری‌های استاندارد include (معمولاً /usr/include و احتمالاً یک دایرکتوری وابسته به کامپایلر) را جستجو می‌کند.
تمام دایرکتوری‌های استاندارد include را با تنها دایرکتوری include مشخص‌شده جایگزین می‌کند؛ می‌توانید includedir را حذف کنید تا صرفاً از جستجو در دایرکتوری‌های استاندارد include جلوگیری شود.
وابستگی‌ها را به جای جایگزین کردن، به انتهای فایل الحاق می‌کند.
نام فایل. به شما امکان می‌دهد یک makefile جایگزین را مشخص کنید تا rmkdepend خروجی خود را در آن قرار دهد. مشخص کردن «-» به عنوان نام فایل (یعنی -f-) خروجی را به جای تغییر یک فایل موجود، به خروجی استاندارد ارسال می‌کند.
پسوند فایل هدف (object). برخی سیستم‌ها ممکن است فایل‌های هدفی داشته باشند که پسوند آن‌ها چیزی غیر از «.o» باشد. این گزینه به شما امکان می‌دهد پسوند دیگری را تعیین کنید، مانند «.b» با -o.b یا «:obj» با -o:obj و غیره.
پیشوند فایل هدف (object). این پیشوند به ابتدای نام فایل هدف اضافه می‌شود. این گزینه معمولاً برای تعیین یک دایرکتوری متفاوت برای فایل هدف استفاده می‌شود. مقدار پیش‌فرض، رشته خالی است.
جداکننده رشته آغازین. این گزینه به شما امکان می‌دهد رشته متفاوتی را برای rmkdepend مشخص کنید تا در makefile به دنبال آن بگردد.
عرض خط. به‌طور معمول، rmkdepend برای حفظ خوانایی تضمین می‌کند که هیچ خط خروجی بیش از ۷۸ نویسه نباشد. این گزینه به شما امکان می‌دهد این عرض را تغییر دهید.
عملیات پرگو (verbose). این گزینه باعث می‌شود که rmkdepend فهرست فایل‌های include شده توسط هر فایل ورودی را در خروجی استاندارد چاپ کند.
هشدار در مورد درج چندباره (multiple inclusion). این گزینه باعث می‌شود که اگر فایلی ورودی بیش از یک بار فایل دیگری را include کند، rmkdepend یک هشدار صادر کند. در نسخه‌های پیشین rmkdepend این رفتار پیش‌فرض بود؛ اما برای مطابقت بهتر با رفتار کامپایلر C (که درج چندباره را خطا در نظر نمی‌گیرد)، مقدار پیش‌فرض تغییر یافته است. این گزینه برای سازگاری با نسخه‌های گذشته و کمک به اشکال‌زدایی مشکلات مربوط به درج چندباره ارائه شده است.
اگر rmkdepend در فهرست آرگومان‌ها با یک خط تیره دوگانه (--) مواجه شود، هر آرگومان ناشناخته پس از آن بدون هیچ هشداری نادیده گرفته می‌شود؛ خط تیره دوگانه دوم به این رفتار ویژه پایان می‌دهد. به این ترتیب، می‌توان rmkdepend را طوری تنظیم کرد که آرگومان‌های خاص کامپایلر را که معمولاً در ماکروی CFLAGS در make یافت می‌شوند، به شکلی امن نادیده بگیرد (به بخش مثال‌ها (EXAMPLES) در بالا مراجعه کنید). تمام گزینه‌هایی که rmkdepend آن‌ها را می‌شناسد و میان جفت خط تیره دوگانه قرار دارند، به‌طور معمول پردازش می‌شوند.
نام فایل. به شما امکان می‌دهد یک نام فایل هدف جایگزین برای فایل قبلی تعیین کنید. برای مثال اگر دستور زیر را اجرا کنید:


rmkdepend -sobj -pbuild file.cxx -tlibrary.so

به جای درج خط:


build/file.obj: ...

برنامه rmkdepend این خط را درج خواهد کرد:


library.so: ... رویکرد به‌کاررفته در این برنامه، اجرای آن را یک مرتبه بزرگی سریع‌تر از هر «تولیدکنندهٔ وابستگی» دیگری که تاکنون دیده‌ام می‌سازد. اساس این عملکرد بر دو فرض استوار است: این‌که تمام فایل‌هایی که توسط یک makefile کامپایل می‌شوند، تقریباً با گزینه‌های یکسان -I و -D کامپایل خواهند شد؛ و این‌که بیشتر فایل‌های موجود در یک دایرکتوری تا حد زیادی فایل‌های یکسانی را درج (include) می‌کنند.

با در نظر گرفتن این فرض‌ها، rmkdepend انتظار دارد برای هر makefile یک بار فراخوانی شود، به‌طوری که تمام فایل‌های منبع مدیریت‌شده توسط آن makefile در خط فرمان ظاهر شوند. این برنامه هر فایل منبع و فایل درج‌شده را دقیقاً یک بار تجزیه کرده و یک جدول نمادهای داخلی را برای هر یک نگهداری می‌کند. بنابراین، نخستین فایل در خط فرمان زمانی متناسب با زمان مورد نیاز یک پیش‌پردازندهٔ معمولی C صرف خواهد کرد. اما در فایل‌های بعدی، چنانچه با فایل درج‌شده‌ای روبه‌رو شود که قبلاً آن را تجزیه کرده است، دیگر آن را دوباره تجزیه نمی‌کند.

برای نمونه، فرض کنید در حال کامپایل دو فایل file1.c و file2.c هستید؛ هر دوی آن‌ها فایل سرآیند header.h را درج می‌کنند، و فایل header.h نیز به نوبهٔ خود فایل‌های def1.h و def2.h را در بر دارد. هنگامی که دستور


rmkdepend file1.c file2.c

را اجرا می‌کنید، rmkdepend فایل file1.c و متعاقباً header.h و سپس def1.h و def2.h را تجزیه خواهد کرد. سپس تعیین می‌کند که وابستگی‌های این فایل عبارت‌اند از:


file1.o: header.h def1.h def2.h

اما هنگامی که برنامه فایل file2.c را تجزیه می‌کند و متوجه می‌شود که این فایل نیز header.h را درج کرده است، آن فایل را دوباره تجزیه نمی‌کند، بلکه صرفاً header.h، def1.h و def2.h را به فهرست وابستگی‌های file2.o می‌افزاید.

cc(1), make(1), root(1), root-cint(1)

همچنین صفحات وب ROOT را ببینید: http://root.cern

دستور rmkdepend عبارت پیش‌پردازندهٔ SVR4 به‌صورت #predicate(token-list) را تجزیه می‌کند، اما در حال حاضر آن را ارزیابی نمی‌کند؛ چنین عبارت‌هایی صرفاً درست فرض می‌شوند. این امر ممکن است باعث ارزیابی نادرست دستورالعمل‌های #include شود.

تصور کنید در حال تجزیهٔ دو فایل هستید، مثلاً file1.c و file2.c، که هر کدام فایل def.h را درج می‌کنند. فهرست فایل‌هایی که def.h درج می‌کند ممکن است هنگامی که def.h توسط file1.c درج می‌شود، واقعاً نسبت به زمانی که توسط file2.c درج می‌شود متفاوت باشد. اما به محض این‌که rmkdepend به فهرستی از وابستگی‌ها برای یک فایل برسد، آن را قطعی و تغییرناپذیر در نظر می‌گیرد.

Todd Brunhoff، از Tektronix, Inc. و MIT Project Athena. اصلاح‌شده توسط Christian Holm Christensen <cholm@nbi.dk> برای توزیع ROOT.

Version 3 4th Berkeley Distribution