CMake اور C++ ہمیشہ کے لیے بھائی ہیں۔

CMake اور C++ ہمیشہ کے لیے بھائی ہیں۔

ترقی کے دوران، میں کمپائلرز کو تبدیل کرنا، موڈز بنانا، انحصاری ورژن بنانا، جامد تجزیہ کرنا، کارکردگی کی پیمائش کرنا، کوریج اکٹھا کرنا، دستاویزات بنانا وغیرہ پسند کرتا ہوں۔ اور میں واقعی CMake سے محبت کرتا ہوں کیونکہ یہ مجھے ہر وہ کام کرنے کی اجازت دیتا ہے جو میں چاہتا ہوں۔

بہت سے لوگ CMake پر تنقید کرتے ہیں، اور اکثر اس کے مستحق ہیں، لیکن اگر آپ اسے دیکھیں تو سب کچھ اتنا برا نہیں ہے، اور حال ہی میں بالکل برا نہیں، اور ترقی کی سمت کافی مثبت ہے۔

اس نوٹ میں، میں آپ کو بتانا چاہتا ہوں کہ درج ذیل فعالیت کو حاصل کرنے کے لیے C++ میں C++ میں ہیڈر لائبریری کو کس طرح منظم کیا جائے:

  1. اسمبلی;
  2. آٹورن ٹیسٹ؛
  3. کوڈ کوریج کی پیمائش؛
  4. تنصیب؛
  5. خودکار دستاویزات؛
  6. آن لائن سینڈ باکس جنریشن؛
  7. جامد تجزیہ۔

کوئی بھی جو پہلے سے ہی فوائد کو سمجھتا ہے اور سی میک کر سکتا ہے۔ پروجیکٹ ٹیمپلیٹ ڈاؤن لوڈ کریں۔ اور اسے استعمال کرنا شروع کریں۔


مواد

  1. اندر سے پروجیکٹ
    1. پروجیکٹ کا ڈھانچہ
    2. مین سی میک فائل (./CMakeLists.txt)
      1. پروجیکٹ کی معلومات
      2. پروجیکٹ کے اختیارات
      3. تالیف کے اختیارات
      4. اہم مقصد
      5. تنصیب
      6. ٹیسٹ
      7. ریکارڈز
      8. آن لائن سینڈ باکس
    3. ٹیسٹ اسکرپٹ (test/CMakeLists.txt)
      1. ٹیسٹنگ
      2. کوریج
    4. دستاویزات کے لیے اسکرپٹ (doc/CMakeLists.txt)
    5. آن لائن سینڈ باکس کے لیے اسکرپٹ (online/CMakeLists.txt)
  2. باہر پروجیکٹ
    1. اسمبلی
      1. جنریشن
      2. اسمبلی
    2. اختیارات
      1. MYLIB_COVERAGE
      2. MYLIB_TESTING
      3. MYLIB_DOXYGEN_LANGUAGE
    3. اسمبلی کے اہداف
      1. умолчанию По
      2. mylib-unit-tests
      3. چیک کریں
      4. کوریج
      5. DOC
      6. چھڑی کا باکس
    4. مثالیں
  3. فورم کے اوزار
  4. جامد تجزیہ
  5. بعد میں

اندر سے پروجیکٹ

پروجیکٹ کا ڈھانچہ

.
├── CMakeLists.txt
├── README.en.md
├── README.md
├── doc
│   ├── CMakeLists.txt
│   └── Doxyfile.in
├── include
│   └── mylib
│       └── myfeature.hpp
├── online
│   ├── CMakeLists.txt
│   ├── mylib-example.cpp
│   └── wandbox.py
└── test
    ├── CMakeLists.txt
    ├── mylib
    │   └── myfeature.cpp
    └── test_main.cpp

ہم بنیادی طور پر اس بارے میں بات کریں گے کہ CMake اسکرپٹس کو کیسے ترتیب دیا جائے، اس لیے ان پر تفصیل سے بات کی جائے گی۔ کوئی بھی باقی فائلوں کو براہ راست دیکھ سکتا ہے۔ ٹیمپلیٹ پروجیکٹ کے صفحے پر.

مین سی میک فائل (./CMakeLists.txt)

پروجیکٹ کی معلومات

سب سے پہلے، آپ کو CMake سسٹم کے مطلوبہ ورژن کی درخواست کرنے کی ضرورت ہے۔ CMake تیار ہو رہا ہے، مختلف حالات میں کمانڈ کے دستخط اور برتاؤ تبدیل ہو رہا ہے۔ CMake کو فوری طور پر سمجھنے کے لیے کہ ہم اس سے کیا چاہتے ہیں، ہمیں فوری طور پر اس کے لیے اپنی ضروریات کو ریکارڈ کرنے کی ضرورت ہے۔

cmake_minimum_required(VERSION 3.13)

پھر ہم اپنے پروجیکٹ، اس کا نام، ورژن، استعمال ہونے والی زبانیں، وغیرہ کا تعین کریں گے (دیکھیں۔ команду project).

اس صورت میں ہم زبان کی طرف اشارہ کرتے ہیں۔ CXX (اور اس کا مطلب ہے C++) تاکہ CMake C زبان کے مرتب کرنے والے کو دبانے اور تلاش نہ کرے (بطور ڈیفالٹ، CMake میں دو زبانیں شامل ہیں: C اور C++)۔

project(Mylib VERSION 1.0 LANGUAGES CXX)

یہاں آپ فوری طور پر چیک کر سکتے ہیں کہ آیا ہمارا پروجیکٹ کسی دوسرے پروجیکٹ میں بطور ذیلی پروجیکٹ شامل ہے۔ اس سے مستقبل میں بہت مدد ملے گی۔

get_directory_property(IS_SUBPROJECT PARENT_DIRECTORY)

پروجیکٹ کے اختیارات

ہم دو اختیارات فراہم کریں گے۔

پہلا آپشن ہے۔ MYLIB_TESTING - یونٹ ٹیسٹ کو غیر فعال کرنے کے لیے۔ یہ ضروری ہو سکتا ہے اگر ہمیں یقین ہو کہ ٹیسٹ کے ساتھ سب کچھ ٹھیک ہے، لیکن ہم صرف یہ چاہتے ہیں، مثال کے طور پر، اپنے پروجیکٹ کو انسٹال یا پیک کرنا۔ یا ہمارا پروجیکٹ ایک ذیلی پروجیکٹ کے طور پر شامل ہے - اس صورت میں، ہمارے پروجیکٹ کا صارف ہمارے ٹیسٹ چلانے میں دلچسپی نہیں رکھتا ہے۔ آپ ان انحصاروں کی جانچ نہیں کرتے جو آپ استعمال کرتے ہیں، کیا آپ؟

option(MYLIB_TESTING "Включить модульное тестирование" ON)

اس کے علاوہ، ہم ایک علیحدہ آپشن بنائیں گے۔ MYLIB_COVERAGE ٹیسٹ کے ذریعے کوڈ کوریج کی پیمائش کے لیے، لیکن اس کے لیے اضافی ٹولز کی ضرورت ہوگی، اس لیے اسے واضح طور پر فعال کرنے کی ضرورت ہوگی۔

option(MYLIB_COVERAGE "Включить измерение покрытия кода тестами" OFF)

تالیف کے اختیارات

بلاشبہ، ہم ٹھنڈے پلس پروگرامرز ہیں، لہذا ہم مرتب کرنے والے سے زیادہ سے زیادہ مرتب وقت کی تشخیص چاہتے ہیں۔ ایک چوہا بھی نہیں پھسلے گا۔

add_compile_options(
    -Werror

    -Wall
    -Wextra
    -Wpedantic

    -Wcast-align
    -Wcast-qual
    -Wconversion
    -Wctor-dtor-privacy
    -Wenum-compare
    -Wfloat-equal
    -Wnon-virtual-dtor
    -Wold-style-cast
    -Woverloaded-virtual
    -Wredundant-decls
    -Wsign-conversion
    -Wsign-promo
)

C++ زبان کے معیار کی مکمل تعمیل کرنے کے لیے ہم ایکسٹینشن کو بھی غیر فعال کر دیں گے۔ وہ CMake میں بطور ڈیفالٹ فعال ہیں۔

if(NOT CMAKE_CXX_EXTENSIONS)
    set(CMAKE_CXX_EXTENSIONS OFF)
endif()

اہم مقصد

ہماری لائبریری صرف ہیڈر فائلوں پر مشتمل ہے، جس کا مطلب ہے کہ ہمارے پاس جامد یا متحرک لائبریریوں کی شکل میں کوئی ایگزاسٹ نہیں ہے۔ دوسری طرف، ہماری لائبریری کو بیرونی طور پر استعمال کرنے کے لیے، اسے انسٹال کرنے کی ضرورت ہے، اسے سسٹم میں قابل شناخت ہونے اور آپ کے پروجیکٹ سے منسلک ہونے کی ضرورت ہے، اور ساتھ ہی ساتھ یہ وہی ہیڈرز، نیز ممکنہ طور پر کچھ اضافی، اس کی خصوصیات سے منسلک ہیں۔

اس مقصد کے لیے ہم ایک انٹرفیس لائبریری بناتے ہیں۔

add_library(mylib INTERFACE)

ہم ہیڈر کو اپنی انٹرفیس لائبریری سے باندھتے ہیں۔

CMake کے جدید، فیشن ایبل، نوجوانوں کے استعمال کا مطلب ہے کہ ہیڈرز، پراپرٹیز وغیرہ۔ ایک ہی ہدف کے ذریعے منتقل کیا جاتا ہے۔ تو اتنا کہنا کافی ہے۔ target_link_libraries(target PRIVATE dependency)، اور تمام ہیڈر جو ہدف سے وابستہ ہیں۔ dependency، ہدف سے تعلق رکھنے والے ذرائع کے لئے دستیاب ہوگا۔ target. اور آپ کو کسی کی ضرورت نہیں ہے۔ [target_]include_directories. ذیل میں تجزیہ میں اس کا مظاہرہ کیا جائے گا۔ یونٹ ٹیسٹ کے لیے CMake اسکرپٹ.

یہ نام نہاد پر توجہ دینے کے قابل بھی ہے۔ выражения-генераторы: $<...>.

یہ کمانڈ ہماری انٹرفیس لائبریری کے ساتھ مطلوبہ ہیڈرز کو جوڑتی ہے، اور اگر ہماری لائبریری اسی CMake درجہ بندی کے اندر کسی بھی ہدف سے منسلک ہے، تو ڈائریکٹری کے ہیڈر اس کے ساتھ منسلک ہوں گے۔ ${CMAKE_CURRENT_SOURCE_DIR}/include، اور اگر ہماری لائبریری سسٹم پر انسٹال ہے اور کمانڈ کا استعمال کرتے ہوئے کسی دوسرے پروجیکٹ سے منسلک ہے۔ find_package، پھر ڈائریکٹری کے ہیڈر اس کے ساتھ منسلک ہوں گے۔ include انسٹالیشن ڈائرکٹری سے متعلق۔

target_include_directories(mylib INTERFACE
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include>
)

آئیے ایک زبان کا معیار طے کریں۔ بالکل، بہت آخری ایک. ایک ہی وقت میں، ہم نہ صرف معیار کو شامل کرتے ہیں، بلکہ اسے ان لوگوں تک بھی پھیلاتے ہیں جو ہماری لائبریری کا استعمال کریں گے۔ یہ اس حقیقت کی وجہ سے حاصل کیا گیا ہے کہ سیٹ پراپرٹی کا ایک زمرہ ہے۔ INTERFACE (ملاحظہ کریں target_compile_features کمانڈ).

target_compile_features(mylib INTERFACE cxx_std_17)

آئیے اپنی لائبریری کے لیے ایک عرف بنائیں۔ اس کے علاوہ، خوبصورتی کے لئے، یہ ایک خاص "نام کی جگہ" میں ہوگا. یہ اس وقت مفید ہو گا جب ہماری لائبریری میں مختلف ماڈیول ظاہر ہوں گے، اور ہم انہیں ایک دوسرے سے آزادانہ طور پر جوڑنے کے لیے جائیں گے۔ جیسے بسٹا میں، مثال کے طور پر.

add_library(Mylib::mylib ALIAS mylib)

تنصیب

سسٹم میں ہمارے ہیڈر انسٹال کرنا۔ یہاں سب کچھ آسان ہے۔ ہم کہتے ہیں کہ تمام ہیڈر والے فولڈر کو ڈائریکٹری میں جانا چاہیے۔ include تنصیب کے مقام سے متعلق۔

install(DIRECTORY include/mylib DESTINATION include)

اگلا، ہم بلڈ سسٹم کو مطلع کرتے ہیں کہ ہم تھرڈ پارٹی پروجیکٹس میں کمانڈ کو کال کرنے کے قابل ہونا چاہتے ہیں۔ find_package(Mylib) اور ایک مقصد حاصل کریں Mylib::mylib.

install(TARGETS mylib EXPORT MylibConfig)
install(EXPORT MylibConfig NAMESPACE Mylib:: DESTINATION share/Mylib/cmake)

اگلے ہجے کو اس طرح سمجھنا چاہیے۔ جب تھرڈ پارٹی پروجیکٹ میں ہم کمانڈ کو کال کرتے ہیں۔ find_package(Mylib 1.2.3 REQUIRED)، اور انسٹال شدہ لائبریری کا اصل ورژن ورژن سے مطابقت نہیں رکھتا 1.2.3CMake خود بخود ایک خرابی پیدا کرے گا۔ یعنی، آپ کو دستی طور پر ورژن کو ٹریک کرنے کی ضرورت نہیں ہوگی۔

include(CMakePackageConfigHelpers)
write_basic_package_version_file("${PROJECT_BINARY_DIR}/MylibConfigVersion.cmake"
    VERSION
        ${PROJECT_VERSION}
    COMPATIBILITY
        AnyNewerVersion
)
install(FILES "${PROJECT_BINARY_DIR}/MylibConfigVersion.cmake" DESTINATION share/Mylib/cmake)

ٹیسٹ

اگر ٹیسٹ واضح طور پر استعمال کرنے سے معذور ہیں۔ متعلقہ اختیار یا ہمارا پروجیکٹ ایک ذیلی پروجیکٹ ہے، یعنی یہ کمانڈ کا استعمال کرتے ہوئے دوسرے CMake پروجیکٹ سے منسلک ہے۔ add_subdirectory، ہم درجہ بندی کے ساتھ مزید آگے نہیں بڑھتے ہیں، اور اسکرپٹ، جو ٹیسٹ بنانے اور چلانے کے لیے کمانڈز کی وضاحت کرتی ہے، بس نہیں چلتی۔

if(NOT MYLIB_TESTING)
    message(STATUS "Тестирование проекта Mylib выключено")
elseif(IS_SUBPROJECT)
    message(STATUS "Mylib не тестируется в режиме подмодуля")
else()
    add_subdirectory(test)
endif()

ریکارڈز

ذیلی پروجیکٹ کے معاملے میں بھی دستاویزات تیار نہیں کی جائیں گی۔

if(NOT IS_SUBPROJECT)
    add_subdirectory(doc)
endif()

آن لائن سینڈ باکس

اسی طرح، ذیلی پروجیکٹ میں آن لائن سینڈ باکس بھی نہیں ہوگا۔

if(NOT IS_SUBPROJECT)
    add_subdirectory(online)
endif()

ٹیسٹ اسکرپٹ (test/CMakeLists.txt)

ٹیسٹنگ

سب سے پہلے، ہمیں مطلوبہ ٹیسٹ فریم ورک کے ساتھ ایک پیکج ملتا ہے (اپنے پسندیدہ سے بدل دیں)۔

find_package(doctest 2.3.3 REQUIRED)

آئیے ٹیسٹ کے ساتھ اپنی ایگزیکیوٹیبل فائل بنائیں۔ عام طور پر میں براہ راست ایگزیکیوٹیبل بائنری میں صرف وہی فائل شامل کرتا ہوں جس میں فنکشن ہوتا ہے۔ main.

add_executable(mylib-unit-tests test_main.cpp)

اور میں ایسی فائلیں شامل کرتا ہوں جن میں ٹیسٹ خود بعد میں بیان کیے جاتے ہیں۔ لیکن آپ کو ایسا کرنے کی ضرورت نہیں ہے۔

target_sources(mylib-unit-tests PRIVATE mylib/myfeature.cpp)

ہم انحصار کو جوڑتے ہیں۔ براہ کرم نوٹ کریں کہ ہم نے صرف CMake اہداف کو اپنی بائنری سے منسلک کیا اور کمانڈ کو کال نہیں کیا۔ target_include_directories. ٹیسٹ فریم ورک اور ہماری طرف سے سرخیاں Mylib::mylib، نیز تعمیراتی پیرامیٹرز (ہمارے معاملے میں، یہ C++ زبان کا معیار ہے) ان اہداف کے ساتھ سامنے آیا۔

target_link_libraries(mylib-unit-tests
    PRIVATE
        Mylib::mylib
        doctest::doctest
)

آخر میں، ہم ایک ڈمی ٹارگٹ بناتے ہیں، جس کا "تعمیر" ٹیسٹ چلانے کے برابر ہے، اور اس ہدف کو ڈیفالٹ بلڈ میں شامل کرتے ہیں (وصف اس کے لیے ذمہ دار ہے۔ ALL)۔ اس کا مطلب یہ ہے کہ ڈیفالٹ بلڈ ٹیسٹوں کو چلانے کے لیے متحرک کرتی ہے، یعنی ہم انہیں چلانا کبھی نہیں بھولیں گے۔

add_custom_target(check ALL COMMAND mylib-unit-tests)

کوریج

اگلا، اگر مناسب آپشن بیان کیا گیا ہو تو ہم کوڈ کوریج کی پیمائش کو فعال کرتے ہیں۔ میں تفصیلات میں نہیں جاؤں گا، کیونکہ ان کا تعلق CMake سے زیادہ کوریج کی پیمائش کے ٹول سے ہے۔ صرف یہ نوٹ کرنا ضروری ہے کہ نتائج کی بنیاد پر ایک مقصد بنایا جائے گا۔ coverage، جس کے ساتھ کوریج کی پیمائش شروع کرنا آسان ہے۔

find_program(GCOVR_EXECUTABLE gcovr)
if(MYLIB_COVERAGE AND GCOVR_EXECUTABLE)
    message(STATUS "Измерение покрытия кода тестами включено")

    target_compile_options(mylib-unit-tests PRIVATE --coverage)
    target_link_libraries(mylib-unit-tests PRIVATE gcov)

    add_custom_target(coverage
        COMMAND
            ${GCOVR_EXECUTABLE}
                --root=${PROJECT_SOURCE_DIR}/include/
                --object-directory=${CMAKE_CURRENT_BINARY_DIR}
        DEPENDS
            check
    )
elseif(MYLIB_COVERAGE AND NOT GCOVR_EXECUTABLE)
    set(MYLIB_COVERAGE OFF)
    message(WARNING "Для замеров покрытия кода тестами требуется программа gcovr")
endif()

دستاویزات کے لیے اسکرپٹ (doc/CMakeLists.txt)

Doxygen ملا.

find_package(Doxygen)

اگلا، ہم چیک کرتے ہیں کہ آیا صارف نے زبان کا متغیر سیٹ کیا ہے۔ اگر ہاں، تو ہم اسے ہاتھ نہیں لگاتے، اگر نہیں، تو ہم روسی زبان لیتے ہیں۔ پھر ہم Doxygen سسٹم فائلوں کو ترتیب دیتے ہیں۔ تمام ضروری متغیرات، بشمول زبان، ترتیب کے عمل کے دوران وہاں جاتے ہیں (دیکھیں۔ команду configure_file).

پھر ہم ایک مقصد بناتے ہیں۔ doc، جو دستاویزات تیار کرنا شروع کردے گا۔ چونکہ ڈویلپمنٹ کے عمل میں دستاویزات بنانا سب سے بڑی ضرورت نہیں ہے، اس لیے ہدف کو بطور ڈیفالٹ فعال نہیں کیا جائے گا؛ اسے واضح طور پر شروع کرنا ہوگا۔

if (Doxygen_FOUND)
    if (NOT MYLIB_DOXYGEN_LANGUAGE)
        set(MYLIB_DOXYGEN_LANGUAGE Russian)
    endif()
    message(STATUS "Doxygen documentation will be generated in ${MYLIB_DOXYGEN_LANGUAGE}")
    configure_file(Doxyfile.in Doxyfile)
    add_custom_target(doc COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
endif ()

آن لائن سینڈ باکس کے لیے اسکرپٹ (online/CMakeLists.txt)

یہاں ہم تیسرا Python تلاش کرتے ہیں اور ایک ہدف بناتے ہیں۔ wandbox، جو سروس API کے مطابق ایک درخواست تیار کرتا ہے۔ وینڈ باکس، اور اسے بھیج دیتا ہے۔ جواب تیار شدہ سینڈ باکس کے لنک کے ساتھ آتا ہے۔

find_program(PYTHON3_EXECUTABLE python3)
if(PYTHON3_EXECUTABLE)
    set(WANDBOX_URL "https://wandbox.org/api/compile.json")

    add_custom_target(wandbox
        COMMAND
            ${PYTHON3_EXECUTABLE} wandbox.py mylib-example.cpp "${PROJECT_SOURCE_DIR}" include |
            curl -H "Content-type: application/json" -d @- ${WANDBOX_URL}
        WORKING_DIRECTORY
            ${CMAKE_CURRENT_SOURCE_DIR}
        DEPENDS
            mylib-unit-tests
    )
else()
    message(WARNING "Для создания онлайн-песочницы требуется интерпретатор ЯП python 3-й версии")
endif()

باہر پروجیکٹ

اب دیکھتے ہیں کہ یہ سب کیسے استعمال کیا جائے۔

اسمبلی

اس پروجیکٹ کی تعمیر، CMake بلڈ سسٹم پر کسی دوسرے پروجیکٹ کی طرح، دو مراحل پر مشتمل ہے:

جنریشن

cmake -S путь/к/исходникам -B путь/к/сборочной/директории [опции ...]

اگر اوپر کی کمانڈ CMake کے پرانے ورژن کی وجہ سے کام نہیں کرتی ہے، تو اسے چھوڑنے کی کوشش کریں۔ -S:

cmake путь/к/исходникам -B путь/к/сборочной/директории [опции ...]

اختیارات کے بارے میں مزید.

منصوبے کی تعمیر

cmake --build путь/к/сборочной/директории [--target target]

اسمبلی کے اہداف کے بارے میں مزید.

اختیارات

MYLIB_COVERAGE

cmake -S ... -B ... -DMYLIB_COVERAGE=ON [прочие опции ...]

ہدف پر مشتمل ہے۔ coverage، جس کے ساتھ آپ ٹیسٹ کے ذریعہ کوڈ کوریج کی پیمائش شروع کر سکتے ہیں۔

MYLIB_TESTING

cmake -S ... -B ... -DMYLIB_TESTING=OFF [прочие опции ...]

یونٹ ٹیسٹ کی تعمیر اور ہدف کو غیر فعال کرنے کی صلاحیت فراہم کرتا ہے۔ check. نتیجے کے طور پر، ٹیسٹ کے ذریعے کوڈ کوریج کی پیمائش بند کر دی گئی ہے (دیکھیں۔ MYLIB_COVERAGE).

اگر پروجیکٹ کمانڈ کا استعمال کرتے ہوئے ذیلی پروجیکٹ کے طور پر کسی دوسرے پروجیکٹ سے منسلک ہے تو جانچ بھی خود بخود غیر فعال ہوجاتی ہے۔ add_subdirectory.

MYLIB_DOXYGEN_LANGUAGE

cmake -S ... -B ... -DMYLIB_DOXYGEN_LANGUAGE=English [прочие опции ...]

دستاویز کی زبان کو تبدیل کرتا ہے جو ہدف تیار کرتا ہے۔ doc دیئے گئے کو دستیاب زبانوں کی فہرست کے لیے، دیکھیں ڈوکسیجن سسٹم کی ویب سائٹ.

روسی بطور ڈیفالٹ فعال ہے۔

اسمبلی کے اہداف

умолчанию По

cmake --build path/to/build/directory
cmake --build path/to/build/directory --target all

اگر ہدف کی وضاحت نہیں کی گئی ہے (جو ہدف کے برابر ہے۔ all)، وہ سب کچھ جمع کرتا ہے جو یہ کر سکتا ہے، اور ہدف کو بھی کال کرتا ہے۔ check.

mylib-unit-tests

cmake --build path/to/build/directory --target mylib-unit-tests

یونٹ ٹیسٹ مرتب کرتا ہے۔ بطور ڈیفالٹ فعال۔

چیک کریں

cmake --build путь/к/сборочной/директории --target check

اکٹھا کیے گئے (اگر پہلے سے نہیں تو) یونٹ ٹیسٹ چلاتا ہے۔ بطور ڈیفالٹ فعال۔

یہ بھی ملاحظہ کریں۔ mylib-unit-tests.

کوریج

cmake --build путь/к/сборочной/директории --target coverage

پروگرام کا استعمال کرتے ہوئے ٹیسٹ کے ذریعے کوڈ کوریج کے لیے یونٹ ٹیسٹ چلانے (رن، اگر پہلے سے نہیں) کا تجزیہ کرتا ہے۔ gcovr.

کوٹنگ کا راستہ کچھ اس طرح نظر آئے گا:

------------------------------------------------------------------------------
                           GCC Code Coverage Report
Directory: /path/to/cmakecpptemplate/include/
------------------------------------------------------------------------------
File                                       Lines    Exec  Cover   Missing
------------------------------------------------------------------------------
mylib/myfeature.hpp                            2       2   100%   
------------------------------------------------------------------------------
TOTAL                                          2       2   100%
------------------------------------------------------------------------------

ہدف صرف اس وقت دستیاب ہوتا ہے جب آپشن فعال ہو۔ MYLIB_COVERAGE.

یہ بھی ملاحظہ کریں۔ check.

DOC

cmake --build путь/к/сборочной/директории --target doc

سسٹم کا استعمال کرتے ہوئے کوڈ دستاویزات کی تیاری شروع کرتا ہے۔ آکسیجن.

چھڑی کا باکس

cmake --build путь/к/сборочной/директории --target wandbox

سروس سے جواب کچھ اس طرح لگتا ہے:

{
    "permlink" :    "QElvxuMzHgL9fqci",
    "status" :  "0",
    "url" : "https://wandbox.org/permlink/QElvxuMzHgL9fqci"
}

اس کے لیے سروس استعمال کی جاتی ہے۔ وینڈ باکس. میں نہیں جانتا کہ ان کے سرور کتنے لچکدار ہیں، لیکن میں سمجھتا ہوں کہ اس موقع کا غلط استعمال نہیں کیا جانا چاہیے۔

مثالیں

کوریج کی پیمائش کے ساتھ پروجیکٹ کو ڈیبگ موڈ میں بنائیں

cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DCMAKE_BUILD_TYPE=Debug -DMYLIB_COVERAGE=ON
cmake --build путь/к/сборочной/директории --target coverage --parallel 16

ابتدائی اسمبلی اور جانچ کے بغیر ایک پروجیکٹ کو انسٹال کرنا

cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DMYLIB_TESTING=OFF -DCMAKE_INSTALL_PREFIX=путь/к/установойной/директории
cmake --build путь/к/сборочной/директории --target install

دیئے گئے کمپائلر کے ساتھ ریلیز موڈ میں بنائیں

cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=g++-8 -DCMAKE_PREFIX_PATH=путь/к/директории/куда/установлены/зависимости
cmake --build путь/к/сборочной/директории --parallel 4

انگریزی میں دستاویزات تیار کرنا

cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DCMAKE_BUILD_TYPE=Release -DMYLIB_DOXYGEN_LANGUAGE=English
cmake --build путь/к/сборочной/директории --target doc

فورم کے اوزار

  1. وزیراعلیٰ 3.13

    درحقیقت، CMake ورژن 3.13 صرف اس مدد میں بیان کردہ کچھ کنسول کمانڈز کو چلانے کے لیے درکار ہے۔ CMake اسکرپٹس کے نحو کے نقطہ نظر سے، اگر جنریشن کو دوسرے طریقوں سے بلایا جائے تو ورژن 3.8 کافی ہے۔

  2. ٹیسٹنگ لائبریری doctest

    جانچ کو غیر فعال کیا جا سکتا ہے (دیکھیں۔ опцию MYLIB_TESTING).

  3. آکسیجن

    اس زبان کو تبدیل کرنے کے لیے جس میں دستاویزات تیار کی جائیں گی، ایک آپشن فراہم کیا گیا ہے۔ MYLIB_DOXYGEN_LANGUAGE.

  4. زبان کا ترجمان ازگر 3

    خودکار نسل کے لیے آن لائن سینڈ باکسز.

جامد تجزیہ

CMake اور چند اچھے ٹولز کے ساتھ، آپ کم سے کم کوشش کے ساتھ جامد تجزیہ فراہم کر سکتے ہیں۔

سی پی پی چیک

CMake کے پاس ایک مستحکم تجزیہ ٹول کے لیے بلٹ ان سپورٹ ہے۔ سی پی پی چیک.

ایسا کرنے کے لیے آپ کو آپشن استعمال کرنے کی ضرورت ہے۔ CMAKE_CXX_CPPCHECK:

cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_CPPCHECK="cppcheck;--enable=all;-Iпуть/к/исходникам/include"

اس کے بعد، جب بھی ماخذ کو مرتب اور دوبارہ مرتب کیا جائے گا، جامد تجزیہ خود بخود شروع ہو جائے گا۔ اضافی کچھ کرنے کی ضرورت نہیں ہے۔

بجنا

ایک شاندار آلے کی مدد سے scan-build آپ بغیر کسی وقت کے جامد تجزیہ بھی چلا سکتے ہیں:

scan-build cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DCMAKE_BUILD_TYPE=Debug
scan-build cmake --build путь/к/сборочной/директории

یہاں، Cppcheck کے معاملے کے برعکس، آپ کو ہر بار تعمیر کو چلانے کی ضرورت ہے۔ scan-build.

بعد میں

CMake ایک بہت طاقتور اور لچکدار نظام ہے جو آپ کو ہر ذائقہ اور رنگ کے لیے فعالیت کو نافذ کرنے کی اجازت دیتا ہے۔ اور، اگرچہ نحو بعض اوقات مطلوبہ حد تک بہت کچھ چھوڑ دیتا ہے، لیکن شیطان اب بھی اتنا خوفناک نہیں ہے جتنا اسے پینٹ کیا گیا ہے۔ معاشرے اور صحت کے فائدے کے لیے CMake بلڈ سسٹم کا استعمال کریں۔

پروجیکٹ ٹیمپلیٹ ڈاؤن لوڈ کریں۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں