Wakati wa usanidi, napenda kubadilisha vikusanyaji, kuunda hali, matoleo ya utegemezi, kufanya uchanganuzi tuli, kupima utendakazi, kukusanya chanjo, kuunda hati, n.k. Na ninaipenda sana CMake kwa sababu inaniruhusu kufanya kila kitu ninachotaka.
Watu wengi wanamkosoa CMake, na mara nyingi inastahili, lakini ukiiangalia, sio kila kitu ni mbaya sana, na hivi karibuni. sio mbaya hata kidogo, na mwelekeo wa maendeleo ni chanya kabisa.
Katika dokezo hili, nataka kukuambia jinsi ya kupanga tu maktaba ya kichwa katika C++ kwenye mfumo wa CMake kupata utendaji ufuatao:
Mkutano;
Vipimo vya Autorun;
Kipimo cha chanjo ya kanuni;
Ufungaji;
Hati otomatiki;
Uzalishaji wa sanduku la mchanga mtandaoni;
Uchambuzi tuli.
Mtu yeyote ambaye tayari anaelewa faida na C-make anaweza kwa urahisi pakua kiolezo cha mradi na kuanza kuitumia.
Hasa tutazungumza juu ya jinsi ya kupanga maandishi ya CMake, kwa hivyo yatajadiliwa kwa undani. Mtu yeyote anaweza kutazama faili zingine moja kwa moja kwenye ukurasa wa mradi wa kiolezo.
Kwanza kabisa, unahitaji kuomba toleo linalohitajika la mfumo wa CMake. CMake inabadilika, saini za amri na tabia katika hali tofauti zinabadilika. Ili CMake ielewe mara moja tunachotaka kutoka kwayo, tunahitaji kurekodi mahitaji yetu mara moja.
cmake_minimum_required(VERSION 3.13)
Kisha tutateua mradi wetu, jina lake, toleo, lugha zinazotumiwa, nk (tazama. ΠΊΠΎΠΌΠ°Π½Π΄Ρ project).
Katika kesi hii, tunaonyesha lugha CXX (na hii inamaanisha C++) ili CMake isisumbue na kutafuta mkusanyaji wa lugha C (kwa chaguo-msingi, CMake inajumuisha lugha mbili: C na C++).
project(Mylib VERSION 1.0 LANGUAGES CXX)
Hapa unaweza kuangalia mara moja ikiwa mradi wetu umejumuishwa katika mradi mwingine kama mradi mdogo. Hii itasaidia sana katika siku zijazo.
Chaguo la kwanza ni MYLIB_TESTING - kuzima majaribio ya kitengo. Hii inaweza kuwa muhimu ikiwa tuna hakika kwamba kila kitu kiko sawa na vipimo, lakini tunataka tu, kwa mfano, kufunga au kufunga mradi wetu. Au mradi wetu umejumuishwa kama mradi mdogo - katika kesi hii, mtumiaji wa mradi wetu hapendi kuendesha majaribio yetu. Hujaribu vitegemezi unavyotumia, sivyo?
Kwa kuongeza, tutafanya chaguo tofauti MYLIB_COVERAGE kwa kupima ufunikaji wa msimbo kwa majaribio, lakini itahitaji zana za ziada, kwa hivyo itahitaji kuwezeshwa kwa uwazi.
Bila shaka, sisi ni watengenezaji programu bora, kwa hivyo tunataka kiwango cha juu zaidi cha uchunguzi wa wakati kutoka kwa mkusanyaji. Hakuna panya hata mmoja atakayeteleza.
Maktaba yetu ina faili za vichwa pekee, ambayo ina maana kwamba hatuna moshi wowote kwa njia ya maktaba tuli au zinazobadilika. Kwa upande mwingine, ili kutumia maktaba yetu nje, inahitaji kusakinishwa, inahitaji kugunduliwa kwenye mfumo na kuunganishwa na mradi wako, na wakati huo huo vichwa hivi hivi, na labda vingine vya ziada, zimeunganishwa nayo mali.
Kwa kusudi hili, tunaunda maktaba ya interface.
add_library(mylib INTERFACE)
Tunafunga vichwa kwenye maktaba yetu ya kiolesura.
Matumizi ya kisasa, ya mtindo, ya vijana ya CMake inamaanisha kuwa vichwa, mali, nk. hupitishwa kupitia lengo moja. Kwa hiyo inatosha kusema target_link_libraries(target PRIVATE dependency), na vichwa vyote vinavyohusishwa na lengo dependency, itapatikana kwa vyanzo vya walengwa target. Na hauitaji yoyote [target_]include_directories. Hii itaonyeshwa hapa chini katika uchambuzi CMake script kwa ajili ya vipimo vya kitengo.
Amri hii inahusisha vichwa tunavyohitaji na maktaba yetu ya kiolesura, na ikiwa maktaba yetu imeunganishwa kwa lengo lolote ndani ya uongozi huo wa CMake, basi vichwa kutoka kwenye saraka vitahusishwa nayo. ${CMAKE_CURRENT_SOURCE_DIR}/include, na ikiwa maktaba yetu imewekwa kwenye mfumo na kushikamana na mradi mwingine kwa kutumia amri find_package, basi vichwa kutoka kwenye saraka vitahusishwa nayo include kuhusiana na saraka ya usakinishaji.
Hebu tuweke kiwango cha lugha. Bila shaka, ya mwisho kabisa. Wakati huo huo, sisi sio tu ni pamoja na kiwango, lakini pia kupanua kwa wale ambao watatumia maktaba yetu. Hii inafanikiwa kutokana na ukweli kwamba mali iliyowekwa ina kategoria INTERFACE (tazama target_compile_features amri).
Hebu tuunde lakabu kwa maktaba yetu. Zaidi ya hayo, kwa uzuri, itakuwa katika "nafasi ya jina" maalum. Hii itakuwa muhimu wakati moduli tofauti zinaonekana kwenye maktaba yetu, na tunaenda kuziunganisha kwa kujitegemea. Kama katika Busta, kwa mfano.
Kusakinisha vichwa vyetu kwenye mfumo. Kila kitu ni rahisi hapa. Tunasema kwamba folda iliyo na vichwa vyote inapaswa kuingia kwenye saraka include kuhusiana na eneo la ufungaji.
Ifuatayo, tunafahamisha mfumo wa ujenzi ambao tunataka kuwa na uwezo wa kuita amri katika miradi ya watu wengine find_package(Mylib) na kupata lengo Mylib::mylib.
Spell inayofuata inapaswa kueleweka kwa njia hii. Wakati katika mradi wa tatu tunaita amri find_package(Mylib 1.2.3 REQUIRED), na toleo halisi la maktaba iliyosakinishwa halitaambatana na toleo hilo 1.2.3CMake itazalisha kosa kiotomatiki. Hiyo ni, hutahitaji kufuatilia matoleo kwa mikono.
Ikiwa majaribio yamezimwa kwa kutumia chaguo sambamba au mradi wetu ni mradi mdogo, yaani, umeunganishwa na mradi mwingine wa CMake kwa kutumia amri add_subdirectory, hatusogei zaidi kwenye uongozi, na hati, ambayo inaelezea amri za kutengeneza na kuendesha vipimo, haifanyi kazi.
Kwanza kabisa, tunapata kifurushi kilicho na mfumo wa mtihani unaohitajika (badilisha na uipendayo).
find_package(doctest 2.3.3 REQUIRED)
Wacha tuunde faili yetu inayoweza kutekelezwa na majaribio. Kawaida mimi huongeza moja kwa moja kwenye binary inayoweza kutekelezwa tu faili ambayo itakuwa na kazi main.
add_executable(mylib-unit-tests test_main.cpp)
Na ninaongeza faili ambazo vipimo vyenyewe vinaelezewa baadaye. Lakini si lazima ufanye hivyo.
Tunaunganisha utegemezi. Tafadhali kumbuka kuwa tuliunganisha shabaha za CMake pekee tulizohitaji kwenye mfumo wetu wa jozi na hatukuita amri target_include_directories. Vichwa kutoka kwa mfumo wa majaribio na kutoka kwa mfumo wetu Mylib::mylib, pamoja na vigezo vya kujenga (kwa upande wetu, hii ni kiwango cha lugha ya C ++) ilipitia pamoja na malengo haya.
Hatimaye, tunaunda lengo la dummy, "muundo" ambao ni sawa na kufanya majaribio, na kuongeza lengo hili kwa muundo chaguo-msingi (sifa inawajibika kwa hili. ALL) Hii ina maana kwamba muundo chaguomsingi huanzisha majaribio kufanya, kumaanisha kwamba hatutasahau kuyaendesha.
add_custom_target(check ALL COMMAND mylib-unit-tests)
Ifuatayo, tunawezesha kipimo cha chanjo cha msimbo ikiwa chaguo sahihi limebainishwa. Sitaingia katika maelezo, kwa sababu yanahusiana zaidi na zana ya kupima chanjo kuliko CMake. Ni muhimu tu kutambua kwamba kulingana na matokeo lengo litaundwa coverage, ambayo ni rahisi kuanza kupima chanjo.
Ifuatayo, tunaangalia ikiwa mtumiaji ameweka tofauti ya lugha. Ikiwa ndiyo, basi hatuigusa, ikiwa sio, basi tunachukua Kirusi. Kisha tunasanidi faili za mfumo wa Doxygen. Vigezo vyote muhimu, pamoja na lugha, huenda huko wakati wa mchakato wa usanidi (ona. ΠΊΠΎΠΌΠ°Π½Π΄Ρ configure_file).
Kisha tunaunda lengo doc, ambayo itaanza kutoa hati. Kwa kuwa kutoa hati sio hitaji kubwa zaidi katika mchakato wa ukuzaji, lengo halitawezeshwa kwa chaguo-msingi; italazimika kuzinduliwa kwa uwazi.
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 ()
Hapa tunapata Python ya tatu na kuunda lengo wandbox, ambayo hutoa ombi linalolingana na API ya huduma Wandbox, na kumfukuza. Jibu linakuja na kiunga cha sanduku la mchanga lililomalizika.
Hutoa uwezo wa kuzima muundo na lengo la jaribio la kitengo check. Kama matokeo, kipimo cha chanjo ya nambari na majaribio kimezimwa (tazama. MYLIB_COVERAGE).
Jaribio pia huzimwa kiotomatiki ikiwa mradi umeunganishwa kwa mradi mwingine kama mradi mdogo kwa kutumia amri add_subdirectory.
Kwa kweli, toleo la CMake 3.13 linahitajika tu kutekeleza baadhi ya amri za kiweko zilizoelezewa katika usaidizi huu. Kwa mtazamo wa syntax ya maandishi ya CMake, toleo la 3.8 linatosha ikiwa kizazi kinaitwa kwa njia zingine.
Baada ya hayo, uchanganuzi tuli utazinduliwa kiotomatiki kila wakati chanzo kinapokusanywa na kukusanywa tena. Hakuna haja ya kufanya chochote cha ziada.
kelele
Kwa msaada wa chombo cha ajabu scan-build Unaweza pia kufanya uchanganuzi tuli kwa muda mfupi:
CMake ni mfumo wenye nguvu sana na rahisi unaokuruhusu kutekeleza utendakazi kwa kila ladha na rangi. Na, ingawa sintaksia wakati mwingine huacha kuhitajika, shetani bado sio mbaya kama alivyochorwa. Tumia mfumo wa kujenga wa CMake kwa manufaa ya jamii na afya.