Skip to content

Latest commit

 

History

History
42 lines (27 loc) · 3.92 KB

jop-cmake-introduction.md

File metadata and controls

42 lines (27 loc) · 3.92 KB

اینم یه تجربه پراکنده دیگه!

متاسفانه یه مدت میشه که سرم بیش از اندازه شلوغ شده و نرسیدم خوب وبلاگ بنویسم. اما این هفته یه کار خوبی انجام دادم که گفتم اینجا مستندش کنم.

خب همونطور که ممکنه بدونید من توسعه اصلی کارهام در زبان‌های c و c++ هست. یکی از ویژگی‌هایی که این زبان‌ها دارن این هست که شما بایستی برای کامپایل شدن برنامه همیشه از یک IDE استفاده کنی یا از ابزارهایی مثل make برای لینوکس یا مثلا nmake در ویندوز. خب وقتی شما بخوای یه کد رو بین پلتفروم‌های مختلف و برنامه نویس‌های مختلف به اشتراک بگذاری همیشه این سوال وجود داره که دقیقا چطور میشه روند build رو یه جوری از وابستگی به سیستم عامل و حتی پلتفرم آزاد کرد. یه موضوع دیگه‌هم اینه که چطور میشه برای برنامه نویسان این آزادی رو ایجاد کرد که از IDE مورد علاقه‌شون استفاده کنند.

برای جواب به این سوالات و خیلی سوالات دیگه جامعه متن باز پروژه‌ای به نام cmake ایجاد کرده که ویژگی‌های خیلی خوبی داره و همچنین یادگیریش به نسبت آسونه!

ویژگی‌های cmake

خب اگه بگم ویژگی‌های cmake رو بصورت خلاصه بگم اینها هستن

  • امکان کامپایل‌کردن کد بدون در نظر گرفتن محل کد
  • امکان کامپایل‌کردن کد روی سیستم‌عاملهای مختلف
  • امکان تشخیص محل فایل‌ها، کتابخانه‌ها
  • مدیریت وابستگی ها
  • امکان تولید فایل‌های make برای سیستم‌های مختلف و تولید پروژه برای IDEهای مختلف

کاری که من با cmake انجام دادم

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

  • ابتدا پروژه فعلی رو تنها برای یک پلتفرم به cmake تبدیل کردم
    • کامپایلر استاندارد رو به کامپایلر دلخواه تبدیل کردم
    • آدرس کتابخانه‌ها و header فایلهای استاندارد رو عوض کردم
    • بصورت اتوماتیک لیست تمام فایلهای پروژه استخراج میشه
  • با استفاده از پارامترها و ساختار منطقی که cmake ساپورت میکنه دو تا پلتفرم دیگه رو اضافه کردم
    • یه متغیر کنترلی تعریف کردم
    • با استفاده از متغیر کنترلی و if همه موارد بالا رو برای هر پلتفرم تعریف کردم
    • اسم خروجی باینری و فولدر اون رو بر اساس متغیر کنترلی تعیین کردم.

حالا با این حال من تنها یک فایل دارم که باهاش کار سه تا پروژه رو انجام میدم که خب این خیلی جالب و جذابه

همین!