it-swarm.dev

كيف بالضبط CMake العمل؟

أنا لا أطلب هذا فقط لنفسي. آمل أن يكون هذا السؤال مرجعًا للعديد من المبتدئين الذين مثلي ، فقد وجدوا الأمر محيرًا تمامًا بشأن ما كان يحدث بالضبط وراء الكواليس عندما يكون مثل هذا الملف الصغير CMakeLists.txt

cmake_minimum_required (VERSION 2.6)
project(Tutorial)
add_executable(Tutorial tutorial.cpp)

و tutorial.cpp الصغير

int main() { return 0; } 

هناك الكثير من الملفات التي تم إنشاؤها

CMakeCache.txt  cmake_install.cmake  Makefile
CMakeLists.txt  tutorial.cpp

ومجلد CMakeFiles مع الكثير من الملفات والمجلدات

CMakeCCompiler.cmake               CMakeOutput.log    Makefile.cmake
cmake.check_cache                  CMakeSystem.cmake  progress.marks
CMakeCXXCompiler.cmake             CMakeTmp           TargetDirectories.txt
CMakeDetermineCompilerABI_C.bin    CompilerIdC        Tutorial.dir
CMakeDetermineCompilerABI_CXX.bin  CompilerIdCXX
CMakeDirectoryInformation.cmake    Makefile2

لم يكن فهم ما يجري وراء الكواليس (أي: لماذا قد يتم إنشاء الملفات وما الغرض منها) ، أكبر عقبة أمام القدرة على تعلم CMake.

إذا كان أحد يعرف ، هل يمكن أن تشرح ذلك من أجل الأجيال القادمة؟ ما هو الغرض من هذه الملفات ، وعندما أكتب cmake . ، ما هو بالضبط تكوين وتكوين cmake قبل أن يبني المشروع؟

128
Nav

السر هو أنك لست مضطرًا لفهم ما تفعله الملفات التي تم إنشاؤها.

يقدم CMake الكثير من التعقيد في نظام الإنشاء ، ومعظمه لا يؤتي ثماره إلا إذا كنت تستخدمه لبناء مشاريع برامج معقدة.

والخبر السار هو أن CMake يقوم بعمل جيد في الحفاظ على الكثير من هذه الفوضى بعيدًا عنك: استخدام بنيات خارج المصدر وأنت لست مضطرًا حتى إلى إلقاء نظرة على الملفات التي تم إنشاؤها. إذا لم تقم بذلك حتى الآن (على ما أعتقد ، فهذه هي الحالة ، بما أنك كتبت cmake .) ، يرجى التحقق منها قبل المتابعة. خلط دليل الإنشاء والمصدر أمر مؤلم حقًا مع CMake وليس كيف من المفترض استخدام النظام.

باختصار: بدلاً من

cd <source_dir>
cmake .

دائما يستخدم

cd <build_dir_different_from_source_dir>
cmake <source_dir>

في حين أن. عادةً ما أستخدم مجلد فرعي فارغ build داخل دليل المصدر الخاص بي كدليل بناء.

لتخفيف ألمك ، اسمحوا لي أن أقدم لمحة سريعة عن الملفات ذات الصلة التي يولدها CMake:

  • ملفات المشروع/Makefiles - ما يهمك فعلاً في: الملفات المطلوبة لإنشاء المشروع الخاص بك تحت المولد المحدد. يمكن أن يكون هذا أي شيء من Unix Makefile إلى حل Visual Studio.
  • CMakeCache.txt - هذا تخزين سلسلة مفتاح/قيمة مستمر يُستخدم للتخزين المؤقت القيمة بين عمليات التشغيل. يمكن أن تكون القيم المخزنة هنا هي مسارات تبعيات المكتبة أو ما إذا كان سيتم إنشاء مكون اختياري على الإطلاق. تتطابق قائمة المتغيرات في الغالب مع تلك التي تراها عند تشغيل ccmake أو cmake-gui. قد يكون هذا مفيدًا للنظر من وقت لآخر ، لكنني أوصي باستخدام الأدوات المذكورة أعلاه لتغيير أي من القيم إن أمكن.
  • الملفات التي تم إنشاؤها - هذا يمكن أن يكون أي شيء من ملفات المصدر autogenerated لتصدير وحدات الماكرو التي تساعدك على إعادة دمج مشروعك المدمج مع مشاريع CMake الأخرى. يتم إنشاء معظم هذه فقط عند الطلب ولن تظهر في مشروع بسيط مثل المشروع من سؤالك.
  • أي شيء آخر هو ضجيج كبير للحفاظ على نظام البناء سعيدا. على وجه الخصوص ، لم أكن بحاجة أبدًا إلى الاهتمام بأي شيء يجري داخل الدليل الفرعي CMakeFiles.

بشكل عام ، يجب ألا تعبث مع أي من الملفات التي تنشئها CMake نيابة عنك. يمكن حل جميع المشكلات من داخل CMakeLists.txt بطريقة أو بأخرى. طالما أن النتيجة تبني مشروعك كما هو متوقع ، فمن المحتمل أنك بخير. لا تقلق كثيرًا بشأن التفاصيل المذهلة - لأن هذا هو ما كان CMake يحاول إعفائك منه في المقام الأول.

76
ComicSansMS

كما هو مذكور على موقعها على الإنترنت:

Cmake هو نظام بناء مفتوح المصدر عبر النظام الأساسي لإدارة عملية إنشاء البرنامج باستخدام طريقة مترجم مستقل

في معظم الحالات ، يتم استخدامه لإنشاء ملفات مشروع/إنشاء - في المثال الخاص بك ، أنتجت Makefile والتي تستخدم لبناء برنامجك (غالبًا على نظام Linux/Unix).

يسمح Cmake بتوفير ملفات بناء عبر النظام الأساسي التي من شأنها إنشاء مشروع/إنشاء ملفات خاصة بالنظام الأساسي لتجميع/نظام أساسي معين.

على سبيل المثال ، قد تحاول ترجمة برنامجك على Windows باستخدام Visual Studio ثم باستخدام بناء الجملة الصحيح في ملف CMakeLists.txt الذي يمكنك تشغيله

cmake .

داخل دليل المشروع الخاص بك على نظام Windows الأساسي ، ستنشئ Cmake جميع ملفات المشروع/الحلول الضرورية (.sln إلخ).

إذا كنت ترغب في إنشاء البرنامج على نظام Linux/Unix الأساسي ، فببساطة تذهب إلى الدليل المصدر حيث لديك ملف CMakeLists.txt الخاص بك وتقوم بتشغيل نفس cmake . وسيؤدي ذلك إلى إنشاء جميع الملفات اللازمة لإنشاء برنامج عبر make أو make all.

هنا لديك عرض تقديمي جيد للغاية حول وظائف Cmake الرئيسية http://www.elpauer.org/stuff/learning_cmake.pdf

EDIT

إذا كنت ترغب في جعل مكتبة تعتمد على النظام الأساسي تتضمن/تعريفات متغيرة وما إلى ذلك ، يمكنك استخدام بناء الجملة هذا في ملف CMakeLists.txt

IF(WIN32)
   ...do something...
 ELSE(WIN32)
   ...do something else...
 ENDIF(WIN32)

هناك أيضًا الكثير من الأوامر التي يمكنك استخدامها لمنع فشل الإنشاء ، وسيقوم Cmake بإعلامك على سبيل المثال أنه ليس لديك مكتبات معززة filesystem و regex مثبتة على نظامك. للقيام بذلك ، يمكنك استخدام بناء الجملة التالي:

find_package(Boost 1.45.0 COMPONENTS filesystem regex)

بعد التحقق من أنه سيتم إنشاء ملفات التعريف للنظام/IDE/برنامج التحويل البرمجي المناسب.

11
Patryk