چرا واجب است CMake یاد بگیریم؟

اگر به زبانهای برنامه نویسی C یا C++ برنامه نویسی میکنید و برحسب اتفاق نیاز بوده که از کتابخانه ای دیگری در برنامه تان استفاده کنید احتمال خیلی زیاد با CMake روبرو بوده اید. اما خب بزارید از یکم بعدش شروع کنم.اینکه CMake چیه؟ خب میشه گفت مدیر اجرایی برای کمپایلر هست که شما میتونید باهاش به کامپایلر بگید پشت سر هم چیکار کنه و چه فایلهایی رو با چه فایلهای دیگه ترکیب کنه تا در نهایت شما برنامه خروجی اجراییتون رو داشته باشید اما نکته جالب و خوب ماجرا اینه که برای CMake فرقی نمیکنه که شما دارید با چه کمپایلری صحبت میکنید... ازین بهتر میشه؟ چه MSVC باشه چه GCC باشه چه هر کمپایلر مرسوم دیگه ای شما میتونید یه سری دستورات خاص رو که به زبان CMake مشخص کردید براش بفرستید و آدرس فایلهای کدهاتون و کتابخونه هایی که نیازه رو هم بهش بدید و در نهایت خروجی مربوط به سیستم عاملی که دوست دارید رو ازش بگیرید.در واقع به زبان فنی تر اگر شما قرار باشه کدهایی که به زبان C++ نوشتید رو کامپایل کنید و تبدیل به فایل اجرایی کنید مثلا نیازه مستقیم به کامپایلر (فرضا gcc) دستور بدید که آهای بیا این فایل من رو بگیر کامپایل کن، خروجی اون رو هم بریز توی این فایل اجرایی تا من بتونم اجراش کنم، این شکلی:g++ main.cpp -o mainاما خب میدونید همیشه شما توی پروژه تون یه دونه فایل کد main.cpp ندارید و کدهای پروژه شما شامل کلی فایل سورس و هدر هستن که باید بزنیدشون سر هم و دوتا کتابخونه دیگه هم بیارید از بیرون (مثلا گیت هاب) با اینا همه رو با هم کامپایل کنید و در نهایت کلی کتابخونه دیگه بسازید و یه فایل خروجی اجرایی رو با اینا لینک کنید و چک کنید که آیا فلان پکیج رو سیستم نصب شده و اگر نصب نیست خودش بره دانلود کنه یا هزارتا کار دیگه خیلی پیچیده تر از یه دستور ساده کامپایل مثل دستور بالاست. چاره چیه؟ خب بزرگترهامون برای این مشکل یک چیزی داشتن که همچین تو دل نرو بود و خیلی چغر بود به اسم Makefile، اون عزیزان دستورات پیچیده ای که میخواستن رو تا جای ممکن توی Makefile وارد میکردن و در نهایت یک برنامه ای مثل make یا nmake بود که اون دستورات رو میدونست و کامپایلرش هم براش مشخص میشد و میرفت دنبال پروسه کامپایل کردن و ساختن برنامه شما، اما مشکل چیه هنوز؟ گفتم که Makefile خیلی چیز چغریه و چیزهای چغر تو دنیای سانتی مانتال الان آنچنان جایی ندارن پس در نتیجه باید یک زبان راحت الحلقوم تری بیاد مثل CMake که فی الواقع میدونه چطوری Makefile بسازه و بشه باهاش کارهای خفن تری کرد و دستورات خفن تری به کامپایلر داد و در نهایت برامون یه فایل Makefile خوشکل و تمیز درست کنه که خودمون عمرا میتونستیم درست کنیم.تا اینجا رو اگه دنبال کرده باشین خب متوجه میشیم که CMake در واقع یک Make Makefile هست یعنی بلده چطوری واسمون Makefile درست کنه و ما در نهایت این Makefile رو میدیم به make و اونم بلده چطوری رو دستورات Makefile به کامپایلر دستور بده و واسمون پروژه مون رو بسازه.تا اینجاش خیلی ساده گفتم که CMake چرا خوبه اما واقعا از بزرگترین خوبیهاش که نباید غافل باشید اینه که:به شما اجازه میده که پروژه تون رو توی هر IDE ببرین و اونجا توسعه بدین و خب طبیعتا میتونین از تمام امکانات اون محیط توسعه بهره ببرید. میدونید چی میگم؟ محیطهای توسعه مثل Visual Studio، Jetbrains CLion, Eclipse, Qt Creator و یا هر محیط دیگه مرسوم که از CMake پشتیبانی میکنه و خب این چیز کمی نیست.شما میتونید باهاش به صورت Cross Platform واسه هر سیستم عاملی که بخواید عملیات کامپایل رو انجام بدید و فایل خروجی مربوط به اون سیستم عامل رو بگیرید. یعنی مثلا شما روی ویندوز میتونید خروجی اجرایی مربوط به لینوکس رو ازش بخواید بدون اینکه روی اون سیستم عامل باشید. این قابلیت خیلی توی توسعه نرم افزارهای embedded کمکتون میکنه. بسیاری از کتابخانه های open source از جمله تمام برنامه های KDE به زبان C/C++ از CMake به عنوان build system خودشون استفاده میکنن و وقتی شما بخواید ازشون استفاده کنید دیگه نیازی نیست لزوما ساختار اون کتابخونه رو بشناسید. شما با یه دستور ساده مثلا کتابخونه اصغرآقا رو برنامه تون اضافه میکنید و مستقیم میرید تو کار استفاده ازش تو کدهاتون. چی ازین راحت تر؟add_subdirectory(asgharLib)۴. شما میتونید باهاش تمام environment variable های سیستم رو چک کنید و حتی تشخیص بدید که آیا پکیج خاصی که شما برای کامپایل برنامه تون نیاز دارید روی سیستم نصب هست یا نه؟ اگر نصب نبود چی؟ میتونید با دستورات CMake اون پکیج رو از اینترنت دانلود کنید و در جای مخصوص خودش قرار بدید و بعد پروسه کامپایل رو جلو برید. این ویژگی واسه پروژه های بزرگی که وابستگی های زیادی به دیگر برنامه ها دارن خیلی چیز خفن و بدرد بخوریه۵. تازه Qt که یکی از فریمورک های خفن C++ هست قراره روی نسخه 6 خودش کلا از QMake سوییچ کنه روی CMake و به صورت native این build system رو پشتیبانی کنه.۶. هنوز قانع نشدید که یادگیری CMake خیلی برای یه برنامه نویس C/C++ واجبه؟ بهتون بگم که آخه یادگیریش کاری هم نداره علاوه بر کلی داکیومنت خیلی خوب که برای خود CMake هست و کلی سوالات متداولی که توی فروم ها جواب داده شده میتونید به گذاشتن دو ساعت از وقت گرانبهاتون از آموزش های تصویری فارسی خوبی که دوستمون گذاشته توی آپارات استفاده کنید و این مهارت رو هم توی رزومه تون داشته باشید. مطمئن باشید بدردتون میخوره.منم اینجا هر سوالی داشتید خوشحال میشم بهتون کمک کنم توی build کردن پروژه هاتون یا حتی ایمیل بدید : sherafati.morteza@gmail.com