CMake
المعلوماتية >>>> عام
يشير مصطلح البناء السابق إلى العملية التي يتم بموجبها تحويل الكود المصدري إلى صيغة مستقلةٍ (stand-alone form) قابلةٍ للتشغيل على الحاسوب. من المراحل المهمة في عملية البناء هي عملية التجميع (compilation) التي يتم إثرها تحويلُ الكود المصدريِّ إلى كودٍ تنفيذيٍّ (executable code). في أغلب الاحيان يتم البناء باستخدام برنامجٍ خاص.
يستطيع CMake القيام بالعديد من الوظائف كـ:
- توليد بيئةِ عملٍ محليةٍ للقيام بتجميع (compile) الكود المصدري (source code).
- توليد مكتبات (Libraries) وأغلفة (Wrappers).
- توليد/بناء الملفات التنفيذية (executable files).
- إدارة المشاريع التي تتكون من أدواتٍ متعددة (multiple toolkits) حيث تحتوي كل أداةٍ على المستندات (directories) والتطبيقات (applications) وكودٍ إضافي.
- معالجةُ الحالاتِ التي على الملفاتِ التنفيذيةِ (executables) أن تكون فيها مبنيةً مسبقاً (built) لتوليد كودٍ يتم تجميعه وربطه نحو التطبيق النهائي.
- توليد ملفاتِ تخزينٍ مؤقّتة* (cache files) مصممةٍ ليتم استخدامها مع محررٍ نصيٍّ ذي واجهةٍ رسومية (GUI text editor).
- البناء المحلي وعن بعد وأيضاً البناء المتعدد من شجرةِ مصدر واحدة. كما يدعم أيضاً البناءَ من المكتبات الثابتة (static library) والديناميكية (dynamic library).
- دعم التسلسلات الهرمية المركِّبة للمستندات (complex directory hierarchies) والتطبيقات التي تعتمد على مكتباتٍ متعددة.
عندما يبدأ CMake بالعمل يقوم أولاً بتحديد مكانِ كلٍّ من الملفات والمكتبات والملفات التنفيذية (executables)، تُوجَّهُ هذه المعلوماتُ تلقائياً نحو ملفاتِ التخزين المؤقت، والتي بدورها تظلُّ متاحةً للمستخدم في حالِ أرادَ أن يعدِّلها قبل توليد ملفات البناء البدئية.
Image: http://www.abclinuxu.cz/clanky/programovani/cmake-zjednodus-si-zivot
تُوضَع ملفات الإعداد داخل كلِّ مجلد (تحت اسم CMakeLists.txt) وتُستعمل هذه الملفات لتوليد:
- ملفات بناء** makefiles بالنسبة لأنظمة يونكس Unix (لينكس Linux وOS X وأنظمة أخرى).
- projects/workspaces (مشاريع/بيئات عمل) بالنسبة لويندوز Windows MVSC.
Image: http://www.kitware.com/media/html/TheCMakingOfAHumanoid.html
يتم التحكم في عملية البناء (build process) عبر إنشاء ملف CMakeLists.txt أو أكثرَ داخلَ كلِّ مستندٍ حتى الفرعية منها (directory & sub-directory) التي تكوِّن المشروع. كلُّ ملفٍ من CMakeLists.txt يحتوي على أمرِ أو مجموعة أوامر، كلٌّ منها يُكتب على الشكل:
Command (args...)
حيث Command هو إسم الأمر - args المُدخلات والتخصيصات المتعلقة بالأمر منفصلة عن بعضها بمسافة Space.
يتيح CMake مجموعةَ أوامرٍ محددةً سلفاً (pre-defined)، ولكن في نفس الوقت يمكنك تخصيص (customize) أمرٍ خاصٍّ بك إذا احتجت لذلك.
يستطيع المطوّر (Advanced User) أن يُضيف مولِّداتٍ (generators) لـ makefiles لمختلف تركيبات المجمع/نظام التشغيل Compiler/OS combinations.
نموذج من ملف CMakeLists.txt:
1 cmake_minimun_required(VERSION 2.8)
2 project(“TestProj”)
3 add_definitions(-Wall -g3 -std=c++11)
4 include_directories(${CMAKE_CURRENT_SOURCE_DIR})
- يحتوي السطر الأول على الأمر cmake_minimum_required مع المدخل VERSION 2.8: وهنا يتم تحديد الإصدار الأدنى من CMake الذي يجب توفّره لمواصلة العمليات.
- في السطر الثاني تم تحديد اسم المشروع "TestProj".
- يحدد المبرمج في السطر الثالث مجموعةً من التخصيصات (arguments) والتقييدات التي تؤخذ بعين الاعتبار أثناء عملية التجميع (compilation)، ويتوجب أن تكون دائماً مسبوقةً بـ واصلة "-" (hyphen) ومنفصلة فيما بينها بمسافة " " (space):
+ Wall يقوم هذا التخصيص بتفعيل التحذيرات والتنبيهات أثناء عملية التجميع.
+ std=c++11 إضافةُ دعمٍ لخواص إصدار C++11.
+ g3 لعرضِ معلوماتٍ إضافيةٍ حول سير عملية التجميع (Debug information).
- في السطر الرابع تم استخدام الأمر add_directories لضمِّ مستنداتٍ إضافيةٍ للتي يَبحث داخلَها المجمع عن ملفات المشروع، وبالنسبة للمدخلات تم استعمال "CMAKE_CURRENT_SOURCE_DIR" وهو متغيّرُ بيئةٍ (Environment variable)، القيمةُ التي يحتوي عليها هذا المتغير هي المسار إلى المستند الذي يتواجد به ملف CMakeLists.txt، وللوصول إلى قيمة هذا المتغير نقوم بكتابته بين معقوفتين "{}" مسبوقةٍ برمز "$": {CMAKE_CURRENT_SOURCE_DIR}$.
تم الاعتماد بشكلٍ أساسيٍّ على لغة البرمجة C و C++ في برمجة وتطوير CMake.
Image: https://cmake.org/statistics/
هامش:
* ملفات التخزين المؤقت cache files: هي ملفاتٌ تحتوي على مجموعةٍ من البيانات؛ الهدف الأساسي منها هو تسهيل عملية الوصول للمعلومات المتعلقةِ بعمليةٍ ما، مما يزيد من سرعة وكفاءة العملية، في أغلب الأحيان تكون هذه الملفات مؤقتةً ويتم حذفها بمجرد انتهاء العملية.
** ملف بناء Makefile: هو ملفٌ يحتوي على مجموعةٍ من التعليمات والأوامر التي توجّه عمليةَ تجميع (compile) ملفات البرنامج وأيضاً عمليةَ ربطِ (link) الملفات مع المكتبات التي تعتمد عليها.
المصدر:
هنا
ملف CMakeLists.txt:
هنا