دليل CMake الكامل. الجزء الثالث: الاختبار والتعبئة والتغليف


مقدمة


يحكي هذا المقال عن برامج الاختبار والتعبئة باستخدام CMake ، وهي مجموعة مرنة ومتنوعة من الأدوات المساعدة لتطوير منتجات البرامج المختلفة. يوصى بشدة بقراءة الجزءين الأول والثاني من الدليل لتجنب سوء فهم بناء الجملة وكيفية عمل CMake.


إطلاق CMake


فيما يلي أمثلة لاستخدام لغة CMake التي يجب عليك ممارستها. تجربة مع شفرة المصدر عن طريق تعديل الأوامر الحالية وإضافة جديدة. لتشغيل هذه الأمثلة ، قم بتثبيت CMake من الموقع الرسمي .


مثال الاختبار


كما ذكرنا سابقًا ، يدعم CMake الاختبار التلقائي للبرامج. هذه الميزة سهلة الاستخدام - ما عليك سوى كتابة بعض الأوامر في CMakeLists.txt المعتاد ، ثم قم بإجراء الاختبارات باستخدام ctest أو قم make test . تحت تصرفكم هناك فحص لمخرجات البرامج ، والتحليل الديناميكي للذاكرة وأكثر من ذلك بكثير.


سننظر في عملية اختبار البرنامج بمثال محدد. يحتوي الملف المصدر Multiply.c على التعليمات البرمجية التالية:


 #include <stdio.h> #include <stdlib.h> #define ARG_COUNT 3 int main(const int argc, const char *argv[]) { if (argc != ARG_COUNT) { fprintf(stderr, "Error!\n"); return EXIT_FAILURE; } const int first = atoi(argv[1]); const int second = atoi(argv[2]); printf("The result is: %d\n", first * second); return EXIT_SUCCESS; } 

يعرض هذا الرمز نتيجة ضرب وسيطين في وحدة التحكم. يرجى ملاحظة أنه من الممكن حدوث حالة حدوث خطأ إذا كان العدد الفعلي للوسيطات لا يفي بما هو متوقع: في هذه الحالة ، سيتم إخراج الخطأ في دفق الخطأ Error! .


في نفس الدليل يوجد ملف CMakeLists.txt مع وصف لعملية CMakeLists.txt ، يحتوي على الكود أدناه:


 cmake_minimum_required(VERSION 3.0) project(MyProgram) add_executable(Multiply Multiply.c) set(MULTIPLY_TIMEOUT 1) #   : enable_testing() #  : add_test(FirstTest Multiply 15 207) add_test(SecondTest Multiply -54 -785) add_test(ThirdTest Multiply 85234) #   : set_tests_properties(FirstTest SecondTest ThirdTest PROPERTIES TIMEOUT ${MULTIPLY_TIMEOUT}) set_tests_properties(FirstTest PROPERTIES PASS_REGULAR_EXPRESSION "The result is: 3105" FAIL_REGULAR_EXPRESSION "Error!") set_tests_properties(SecondTest PROPERTIES PASS_REGULAR_EXPRESSION "The result is: 42390" FAIL_REGULAR_EXPRESSION "Error!") set_tests_properties(ThirdTest PROPERTIES PASS_REGULAR_EXPRESSION "Error!") 

لننظر في كل شيء بالترتيب. يجب أن تكون الأوامر الأربعة الأولى مألوفة بالنسبة لك من المقالة السابقة ، ويثير الأمر enable_testing التالي عددًا من الأسئلة. في جوهر الأمر ، يخطر هذا الأمر CMake فقط بنيتك في اختبار البرنامج ، مع إنشاء بعض ملفات التكوين في وقت واحد ، والتي لا تحتاج إلى معرفتها.


تضيف add_test الثلاثة التالية اختبارات للمشروع الحالي. يأخذ النموذج القصير من هذا الأمر اسم الاختبار كوسيطة أولى ، وتشكل الوسائط التالية أمر shell لتشغيل الاختبار.


set_tests_properties سلسلة من أوامر set_tests_properties سلوك الاختبارات الفردية. بعد قائمة عناصر الاختبار ، تتبع الكلمة PROPERTIES ، مشيرة إلى بداية قائمة الخصائص ، مع وجود نموذج < > < > وتعيين للاختبارات المحددة. قائمة كاملة من الخصائص المتاحة هنا .


بالنسبة لجميع الاختبارات ، يتم تعيين الحد الأقصى لوقت التنفيذ على ثانية واحدة مع خاصية TIMEOUT ، ثم بالنسبة للاختبارات اللاحقة ، يتم تعيين الإخراج المتوقع PASS_REGULAR_EXPRESSION و FAIL_REGULAR_EXPRESSION (على سبيل المثال ، إذا كان التعبير العادي يطابق The result is: 3105 ، ثم FirstTest اختبار FirstTest ، مع تعبير Error! يتوقف الاختبار ويعتبر فشلًا).


طرق لتمكين الاختبار


يوجد enable_testing - هذا هو تضمين وحدة CTest خلال أمر include . بشكل عام ، إدراج وحدة نمطية هو أكثر عالمية ، ولكن لا يزال هناك فرق بينهما.


يتيح الأمر enable_testing اختبار الدليل الحالي ، وكذلك لجميع الأدلة اللاحقة. يجب أن يكون موجودًا في الجذر CMakeLists.txt ، نظرًا لأن CTest يتوقع ملف اختبار في جذر التجميع.


يؤدي تمكين وحدة CTest تكوين المشروع للاختبار باستخدام CTest / CDash ، كما يحدد تلقائيًا خيار BUILD_TESTING ، والذي يقبل بشكل صحيح عندما يكون الاختبار ممكنًا (الافتراضي هو ON ). وبالتالي ، عند استخدام هذا الأمر ، من المنطقي وصف عملية الاختبار بهذه الطريقة:


 if(BUILD_TESTING) add_test(FirstTest Test 1) add_test(SecondTest Test 2) add_test(ThirdTest Test 3) #  ... endif() 

اختبار التنفيذ


سلسلة من أوامر cmake . && cmake --build . && ctest . cmake . && cmake --build . && ctest . يتم تشغيل جميع الاختبارات الثلاثة. ينفذ ctest -R <RegularExpression> مجموعة من الاختبارات التي تلبي تعبيرًا منتظمًا معينًا. على سبيل المثال ، يعمل ctest -R ThirdTest على الاختبار الثالث فقط.


مثال التعبئة والتغليف


لإنشاء حزمة من الملفات المصدر والمكتبات والملفات القابلة للتنفيذ ، عليك فقط وصف تثبيت الملفات الضرورية باستخدام أمر install ، ثم تمكين وحدة CPack أمر include :


 #    "Multiply"   "bin": install(TARGETS Multiply DESTINATION bin) #    : set(CPACK_PACKAGE_NAME "Multiply") set(CPACK_PACKAGE_VENDOR "MyCompany") set(CPACK_PACKAGE_CONTACT "https://myprojectsite.org") set(CPACK_DEBIAN_PACKAGE_MAINTAINER "mycontacts@gmail.com") set(CPACK_PACKAGE_DESCRIPTION "The most stupid program ever written") #    : set(CPACK_GENERATOR "DEB") #    "CPack": include(CPack) 

في هذه الحالة ، يقوم أمر install بإخطار منشئ الحزمة في دليل تثبيت هدف Multiply . بدون كتابة أوامر التثبيت ، لا يمكن إنشاء حزمة.


فيما يلي يسرد خصائص الحزمة عن طريق تعيين العديد من المتغيرات. في الواقع ، هناك العديد من هذه المتغيرات التي حزم الحزم بشكل صحيح. معظمهم اختياري ، لكن بعض مولدات الحزم تتطلب تعريفهم. تتوفر هنا قائمة بالمتغيرات الشائعة لجميع مولدات الحزم.


تعريف المتغير CPACK_GENERATOR - إنه قائمة بمولدات الحزم التي تسمى الأداة المساعدة cpack . في هذه الحالة ، يأخذ القيمة DEB ، لذلك ، يتم إنشاء حزمة دبيان في الدليل الجذر لتطبيق النظرة العامة.


أخيرًا ، يتم CPack وحدة CPack ، وتكوين حزمة المشروع المستقبلية باستخدام المتغيرات المحددة مسبقًا وأمر التثبيت للملف القابل للتنفيذ ، بالإضافة إلى إضافة هدفين للتجميع - package و package_source (التجميع الثنائي والمصدر المصدر ، على التوالي).


تنفيذ التعبئة


سلسلة من أوامر cmake . && cmake --build . && cmake --build . --target package cmake . && cmake --build . && cmake --build . --target package cmake . && cmake --build . && cmake --build . --target package إطلاق cmake . && cmake --build . && cmake --build . --target package لتنفيذ المولد المحدد لإنشاء حزمة ثنائية وأوامر cmake . && cmake --build . && cmake --build . --target package_source cmake . && cmake --build . && cmake --build . --target package_source cmake . && cmake --build . && cmake --build . --target package_source إنشاء حزمة مصدر مباشرة في الدليل الجذر.


الانتهاء


في هذه المرحلة ، وصلت سلسلة دروس CMake الكاملة إلى نهايتها. آمل أن تكون قد تعلمت الكثير من المواد المفيدة ، بالإضافة إلى تحسين مهارات البرمجة لديك. حظا سعيدا

Source: https://habr.com/ru/post/ar433822/


All Articles