یه makefile کلی برای پروژه‌های ‪C++

اگه makefile پروژه‌های ‪C++‬ رو با روش‌های معمول بنویسیم، مجبوریم که مرتب با هر بار اضافه کردن یه فایل به پروژه makefile رو هم به روز رسانی کنیم. هر بار هم که وابستگی اون فایل تغییر می‌کنه ناچاریم این کار رو دوباره انجام بدیم. دنبال راه حل این مساله بودم که با سوییچ‌های خانواده M کامپایلر گنو آشنا شدم. این سوییچ‌ها به کامپایلر می‌گن که وابستگی یه برنامه رو به فرمت makefile بیرون بکشه. اگه این وابستگی‌ها رو تو یه فایل ذخیره کنیم می‌تونیم بعدا با دستور include از اون‌ها برای معرفی وابستگی‌ها استفاده کنیم.

  • سوییچ M این وابستگی‌ها رو بیرون می‌کشه
  • سوییچ MM مثل M اما فایل‌هایی که تو دایرکتوری‌های سیستم هستن رو به عنوان وابستگی معرفی نمی‌کنه.
  • سوییچ MF خروجی رو تو یه فایل می‌ریزه
  • سوییچ MT هم target مربوط به rule رو عوض می‌کنه. به طور پیش‌فرض قاعده تولید شده به اسم فایل ورودی منهای اسم و دایرکتوری و پسونده. در حالتی که بخوایم قاعدمون اسم دیگه‌ای داشته باشه از این سوییچ استفاده می‌کنیم. مثلا اینجا اسم قاعدمون رو به اسم آبجکت فایل با دایرکتوریش تغییر دادم.

دیگه؟ با اون ‪.PHONY‬ هم به make می‌گم که قاعده‌هایی که بعدش اومده اسم فایل نیست.
این هم makefile ما:

GCC 4.7 تو ابونتو ۱۱.۰۴: از نصب برنامه‌ها از سورس نباید ترسید

توجه بسیار مهم: نصب gcc بر اساس این آموزش ممکنه موجب بعضی اشکالات بشه. خود gnu توصیه میکنه gcc رو تو یه دایرکتوری کاملا جدا نصب کنیم تا بشه راحت هم پاکش کرد. بعدا مفصل تر راجع به این قضیه صحبت می‌کنم.

من رو لپتاپم اوبونتو ۱۱.۰۴ دارم. خیلی هم ابزار و خنزر پنزر روش دارم. حال آپدیت هم ندارم. از طرف دیگه می‌خوام که از ورژن ۴.۷ جی سی سی استفاده کنم. بنا به عادت اولین کار تو مخازن محترم دنبالش گشتم و نیافتم. بعدش تو ppa ها. اما متاسفانه برای نگارش اوبونتوی من جی سی سی رو نداشتن. (یه سوال همینجا بپرسم: مگه نگارشای مختلف اوبونتو چقد با هم فرق میکنن که یه بسته واسه ۱۱.۱۰ هست ولی واسه ۱۱.۰۴ نیست؟)

نتیجه اخلاقی شماره یک:
نباید بیش از حد به بسته‌های توزیعی که استفاده می‌کنم متکی باشم.

راه حل؟ کامپایل دستی:
۱- از اینجا آخرین ورژن کامپایلر محترم رو گرفتم.
۲- بعد از باز کردن آرشیو و ورود به دایرکتوری مربوطه، تو خط فرمان زدم:
[bash light=”true”]
./configure
[/bash]
اما این خطا رو داد:
configure: error: Building GCC requires GMP 4.2+, MPFR 2.3.1+ and MPC 0.8.0+.
اول چک کردم دیدم بسته‌های اینایی که میگه نصبن. بعد خود خطا رو گوگل کردم ولی چیز به درد بخوری پیدا نکردم. آخر خود خطا رو که خوندم دیدم گفته اگه این بسته‌ها رو روی توزیعتون دارین، اما سورسش رو ندارین، سورسش رو هم نصب کنین. منم رفتم و از تو سیناپتک سورسشون رو نصب کردم. (تو مخازن اوبونتو، سورس بسته‌ها معمولا با یه ‪-dev‬ در انتهاشون مشخص می‌شن)
و این دفعه با اجرای
[bash light=”true”]
./configure
[/bash]
فایل make ساخته شد.

نتیجه اخلاقی شماره دو:
گوگل یه موتور جستجوی خیلی عالیه، اما قرار نیست جای من فکر کنه.

۳- همونجا زدم:
[bash light=”true”]
make
[/bash]
و شروع کرد به کامپایل دوست عزیز. کار کامپایل زیاد طول میکشه واسه همین من هم تو این فاصله تیکه اول پست تا اینجا رو نوشتم. الانم میخوام برم ناهار. اوپس: اما باز یه اشکال پیش اومد:
/usr/include/linux/errno.h:4:23: fatal error: asm/errno.h: No such file or directory
compilation terminated.
ایندفعه با گوگل جواب پیدا میشه: باید gcc-multilib رو نصب کنم. بعد از نصب فرمان make رو اجرا می‌کنم. و این دفعه واقعا میرم ناهار…. از نهار برگشتم. اما هنوز کامپایل تموم نشده….
هاه. بالاخره تموم شد. حدود یک ساعت و پنجاه دقیقه طول کشید.
۴- خوب مرحله آخره. تو این مرحله هرچی کامپایل شده رو میریزیم سر جاهاش. واسه اینکه احتمال می‌دم برای کپی کردن فایل‌ها تو بعضی دایرکتوری‌ها مجوز روت بخواد با سودو اجراش می‌کنم:
[bash light=”true”]
sudo make install
[/bash]

… و تمام. الان نسخه ۴.۷ جی سی سی رو دستگاهم نصبه. کافیه امتحانش کنم:
[bash light=”true”]
gcc –version
[/bash]

نتیجه اخلاقی شماره سه:
از نصب برنامه‌ها از سورس نباید ترسید.