MAKEDEPEND(1) General Commands Manual MAKEDEPEND(1)

makedepend - ایجاد وابستگی‌ها در makefileها

makedepend [ -Dname=def ] [ -Dname ] [ -Iincludedir ] [ -Yincludedir ]
[ -a ] [ -fmakefile ] [ -include file ] [ -oobjsuffix ]
[ -pobjprefix ] [ -sstring ] [ -wwidth ] [ -v ] [ -m ]
[ -- otheroptions -- ] sourcefile ...

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

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

به‌طور پیش‌فرض، makedepend خروجی خود را در فایلی به نام makefile (در صورت وجود) قرار می‌دهد، وگرنه در Makefile می‌نویسد. یک makefile جایگزین می‌تواند با گزینه -f مشخص شود. این برنامه ابتدا makefile را برای یافتن خط زیر جستجو می‌کند:

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

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


sourcefile.o: dfile ...

که در آن sourcefile.o همان نام برگرفته از خط فرمان با پسوند جایگزین‌شده با «.o» است، و dfile وابستگی کشف‌شده در یک دستور #include هنگام تجزیه sourcefile یا یکی از فایل‌های شامل‌شده در آن است.

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

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

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

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

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

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

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


makedepend file1.c file2.c

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


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

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

cc(1), make(1)

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

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

Todd Brunhoff, Tektronix, Inc. and MIT Project Athena

makedepend 1.0.9 4th Berkeley Distribution