CMake ۽ C++ هميشه لاءِ ڀائر آهن

CMake ۽ C++ هميشه لاءِ ڀائر آهن

ڊولپمينٽ دوران، مان ڪمپلرز کي تبديل ڪرڻ، موڊس ٺاهڻ، انحصار ورزن، جامد تجزيو ڪرڻ، ڪارڪردگي کي ماپڻ، ڪوريج گڏ ڪرڻ، دستاويز تيار ڪرڻ، وغيره ڪرڻ پسند ڪندو آهيان. ۽ مان واقعي CMake سان پيار ڪريان ٿو ڇاڪاڻ ته اها مون کي هر شي ڪرڻ جي اجازت ڏئي ٿي جيڪا مان چاهيان ٿو.

ڪيترائي ماڻهو CMake تي تنقيد ڪن ٿا، ۽ اڪثر ڪري مستحق طور تي، پر جيڪڏهن توهان ان کي ڏسندا، هر شيء ايترو خراب ناهي، ۽ تازو بلڪل خراب ناهي، ۽ ترقي جي هدايت ڪافي مثبت آهي.

هن نوٽ ۾، مان توهان کي ٻڌائڻ چاهيان ٿو ته هيٺ ڏنل ڪارڪردگي حاصل ڪرڻ لاءِ C++ CMake سسٽم ۾ هيڊر لائبريري کي ڪيئن منظم ڪجي:

  1. اسيمبلي؛
  2. خودڪار ٽيسٽ؛
  3. ڪوڊ ڪوريج جي ماپ؛
  4. تنصيب؛
  5. خودڪار دستاويز؛
  6. آن لائين سينڊ باڪس نسل؛
  7. جامد تجزيو.

ڪو به ماڻهو جيڪو اڳ ۾ ئي فائدن کي سمجهي ٿو ۽ C-make ڪري سگهي ٿو پروجيڪٽ ٽيمپليٽ ڊائون لوڊ ڪريو ۽ ان کي استعمال ڪرڻ شروع ڪريو.


Contents

  1. اندر کان پروجيڪٽ
    1. منصوبي جي جوڙجڪ
    2. مکيه CMake فائل (./CMakeLists.txt)
      1. پروجيڪٽ جي ڄاڻ
      2. پروجيڪٽ جا اختيار
      3. گڏ ڪرڻ جا اختيار
      4. مين مقصد
      5. تنصيب
      6. ٽيسٽ
      7. دستاويزي
      8. آن لائن سينڊ باڪس
    3. ٽيسٽ اسڪرپٽ (test/CMakeLists.txt)
      1. جاچ
      2. ڪوٽنگ
    4. دستاويزن لاء اسڪرپٽ (doc/CMakeLists.txt)
    5. آن لائن سينڊ باڪس لاءِ اسڪرپٽ (آن لائن/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. ڌنڌو
      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_minimum_required(VERSION 3.13)

پوءِ اسان پنھنجي پروجيڪٽ، ان جو نالو، ورجن، استعمال ٿيل ٻوليون، وغيره مقرر ڪنداسين (ڏسو. команду project).

انهي صورت ۾ اسان ٻولي کي اشارو ڪريون ٿا CXX (۽ ان جو مطلب آهي C++) ته جيئن CMak تنگ نه ٿئي ۽ سي ٻولي ڪمپلر جي ڳولا ڪريو (ڊفالٽ طور، CMak ۾ ٻه ٻوليون شامل آهن: 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)

اڳيون، اسان چيڪ ڪريون ٿا ته ڇا صارف ٻولي متغير مقرر ڪيو آهي. جيڪڏهن ها، ته پوءِ اسان ان کي هٿ نه ٿا لڳايو، جيڪڏهن نه، ته پوءِ اسان روسي وٺون ٿا. پوء اسان ڊڪسيجن سسٽم فائلن کي ترتيب ڏيو. سڀ ضروري متغير، ٻولي سميت، اتي وڃو ترتيب جي عمل دوران (ڏسو. команду 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 ()

آن لائن سينڊ باڪس لاءِ اسڪرپٽ (آن لائن/CMakeLists.txt)

هتي اسان ٽيون پٿون ڳوليون ٿا ۽ هڪ ٽارگيٽ ٺاهيو 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 ڏنل هڪ ڏانهن. دستياب ٻولين جي فهرست لاءِ، ڏسو Doxygen سسٽم ويب سائيٽ.

روسي ڊفالٽ طور تي فعال آهي.

اسيمبلي جا مقصد

ھونئن جي

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.

ڌنڌو

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. ٽيسٽ لائبريري ڊاڪٽرياڻي

    جاچ کي بند ڪري سگھجي ٿو (ڏسو опцию MYLIB_TESTING).

  3. ڊائي آڪسجن

    ٻولي کي تبديل ڪرڻ لاءِ جنهن ۾ دستاويز ٺاهيا ويندا، هڪ اختيار مهيا ڪيو ويو آهي MYLIB_DOXYGEN_LANGUAGE.

  4. ٻوليءَ جو مترجم Python 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

تبصرو شامل ڪريو