Sajrone pangembangan, aku seneng ngganti kompiler, mbangun mode, versi dependensi, nindakake analisis statis, ngukur kinerja, ngumpulake jangkoan, ngasilake dokumentasi, lsp. Lan aku seneng banget karo CMake amarga ngidini aku nindakake kabeh sing dakkarepake.
Akeh wong sing ngritik CMake, lan asring pantes, nanging yen sampeyan ndeleng, ora kabeh ala, lan bubar. ora ala babar pisan, lan arah pembangunan cukup positif.
Ing cathetan iki, aku pengin menehi pitutur marang kowe carane mung ngatur perpustakaan header ing C ++ ing sistem CMake kanggo entuk fungsi ing ngisor iki:
Majelis;
tes Autorun;
Pangukuran jangkoan kode;
Instalasi;
Dokumentasi otomatis;
Generasi kothak wedhi online;
Analisis statis.
Sapa wae sing wis ngerti kaluwihan lan C-make mung bisa download template proyek lan miwiti nggunakake.
Kita bakal ngomong babagan cara ngatur skrip CMake, mula bakal dibahas kanthi rinci. Sapa wae bisa ndeleng file liyane kanthi langsung ing kaca proyek cithakan.
Kaping pisanan, sampeyan kudu njaluk versi sistem CMake sing dikarepake. CMake berkembang, teken printah lan prilaku ing macem-macem kahanan ganti. Supaya CMake langsung ngerti apa sing dikarepake, kita kudu langsung nyathet syarat kasebut.
cmake_minimum_required(VERSION 3.13)
Banjur kita bakal nemtokake proyek kita, jenenge, versi, basa sing digunakake, lsp. ΠΊΠΎΠΌΠ°Π½Π΄Ρ project).
Ing kasus iki kita nuduhake basa CXX (lan iki tegese C ++) supaya CMake ora ketegangan lan nelusuri compiler basa C (kanthi standar, CMake kalebu rong basa: C lan C ++).
project(Mylib VERSION 1.0 LANGUAGES CXX)
Ing kene sampeyan bisa langsung mriksa apa proyek kita kalebu ing proyek liyane minangka subproyek. Iki bakal mbantu akeh ing mangsa ngarep.
Pilihan pisanan yaiku MYLIB_TESTING - kanggo mateni tes unit. Iki bisa uga perlu yen kita yakin manawa kabeh wis cocog karo tes, nanging mung pengin, contone, nginstal utawa ngemas proyek kita. Utawa proyek kita kalebu minangka subproyek - ing kasus iki, pangguna proyek kita ora kasengsem nglakokake tes kita. Sampeyan ora nyoba dependensi sing sampeyan gunakake, ta?
Kajaba iku, kita bakal nggawe pilihan sing kapisah MYLIB_COVERAGE kanggo ngukur jangkoan kode kanthi tes, nanging mbutuhake alat tambahan, mula kudu diaktifake kanthi jelas.
Mesthi, kita kelangan plus programer, supaya kita pengin tingkat maksimum kompilasi-wektu diagnostik saka compiler. Ora ana mouse siji sing bakal mlebu.
Pustaka kita mung kasusun saka file header, tegese kita ora duwe exhaust ing wangun perpustakaan statis utawa dinamis. Ing sisih liya, kanggo nggunakake perpustakaan eksternal, kudu diinstal, kudu dideteksi ing sistem lan disambungake menyang proyek sampeyan, lan ing wektu sing padha, header sing padha, uga sawetara tambahan, digandhengake karo sifat-sifat kasebut.
Kanggo maksud iki, kita nggawe perpustakaan antarmuka.
add_library(mylib INTERFACE)
Kita ikatan header menyang perpustakaan antarmuka.
Panggunaan CMake sing modern, modern, lan modern nuduhake manawa header, properti, lsp. ditularake liwat siji target. Dadi cukup kanggo ngomong target_link_libraries(target PRIVATE dependency), lan kabeh header sing ana gandhengane karo target dependency, bakal kasedhiya kanggo sumber sing duwe target target. Lan sampeyan ora butuh [target_]include_directories. Iki bakal dituduhake ing analisis ing ngisor iki Skrip CMake kanggo tes unit.
Printah iki nggandhengake header sing dibutuhake karo perpustakaan antarmuka, lan yen perpustakaan kita disambungake menyang target ing hierarki CMake sing padha, mula header saka direktori kasebut bakal digandhengake. ${CMAKE_CURRENT_SOURCE_DIR}/include, lan yen perpustakaan kita wis diinstal ing sistem lan disambungake menyang project liyane nggunakake printah find_package, banjur header saka direktori bakal digandhengake karo include relatif kanggo direktori instalasi.
Ayo netepake standar basa. Mesthi, sing paling pungkasan. Ing wektu sing padha, kita ora mung kalebu standar, nanging uga ngluwihi kanggo wong-wong sing bakal nggunakake perpustakaan kita. Iki digayuh amarga kasunyatan manawa properti sing disetel duwe kategori INTERFACE (ndeleng printah target_compile_features).
Ayo nggawe alias kanggo perpustakaan kita. Kajaba iku, kanggo kaendahan, bakal ana ing "ruang jeneng" khusus. Iki bakal migunani nalika modul beda katon ing perpustakaan kita, lan kita pindhah menyang nyambungake independen saka saben liyane. Kaya ing Busta, contone.
Nginstal header kita menyang sistem. Kabeh iku prasaja ing kene. Kita ngomong yen folder karo kabeh header kudu pindhah menyang direktori include relatif kanggo lokasi instalasi.
Sabanjure, kita ngandhani sistem mbangun yen kita pengin bisa nelpon perintah kasebut ing proyek pihak katelu find_package(Mylib) lan entuk gol Mylib::mylib.
Mantra sabanjure kudu dimangerteni kanthi cara iki. Nalika ing proyek pihak katelu kita nelpon printah find_package(Mylib 1.2.3 REQUIRED), lan versi nyata saka perpustakaan diinstal bakal ora kompatibel karo versi 1.2.3CMake bakal nggawe kesalahan kanthi otomatis. Tegese, sampeyan ora perlu nglacak versi kanthi manual.
Kita nyambungake dependensi. Wigati dimangerteni manawa kita mung ngubungake target CMake sing dibutuhake kanggo binar lan ora nelpon perintah kasebut target_include_directories. Judhul saka kerangka test lan saka kita Mylib::mylib, uga mbangun paramèter (ing kasus kita, iki standar basa C ++) teka bebarengan karo gol iki.
Pungkasan, kita nggawe target goblok, "mbangun" sing padha karo tes sing mlaku, lan nambah target iki menyang bangunan standar (atribut tanggung jawab kanggo iki. ALL). Iki tegese mbangun gawan micu tes kanggo mbukak, tegese kita ora bakal lali kanggo mbukak.
add_custom_target(check ALL COMMAND mylib-unit-tests)
Sabanjure, priksa manawa pangguna wis nyetel variabel basa. Yen ya, banjur kita ora ndemek, yen ora, banjur njupuk basa Rusia. Banjur kita ngatur file sistem Doxygen. Kabeh variabel sing dibutuhake, kalebu basa, mlebu sajrone proses konfigurasi (pirsani. ΠΊΠΎΠΌΠ°Π½Π΄Ρ configure_file).
Banjur kita nggawe gol doc, sing bakal miwiti ngasilake dokumentasi. Amarga nggawe dokumentasi dudu kabutuhan paling gedhe ing proses pangembangan, target kasebut ora bakal diaktifake kanthi standar; kudu diluncurake kanthi jelas.
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 ()
Ing kene kita nemokake Python katelu lan nggawe target wandbox, sing ngasilake panjalukan sing cocog karo API layanan Wandbox, lan dikongkon lunga. Tanggepan nerangake karo link menyang kothak wedhi rampung.
Nyatane, CMake versi 3.13 mung dibutuhake kanggo mbukak sawetara printah console diterangake ing bantuan iki. Saka sudut pandang sintaks skrip CMake, versi 3.8 cukup yen generasi diarani kanthi cara liya.
CMake minangka sistem sing kuat lan fleksibel sing ngidini sampeyan ngetrapake fungsi kanggo saben rasa lan warna. Lan, sanajan sintaksis kadhangkala ninggalake akeh sing dikarepake, setan isih ora nggegirisi kaya sing dicet. Gunakake sistem mbangun CMake kanggo entuk manfaat saka masyarakat lan kesehatan.