Panduan Lengkap CMake. Bagian Tiga: Pengujian dan Pengemasan


Pendahuluan


Artikel ini menceritakan tentang pengujian dan program pengemasan menggunakan CMake, satu set utilitas yang fleksibel dan serbaguna untuk mengembangkan berbagai produk perangkat lunak. Sangat disarankan agar Anda membaca bagian pertama dan kedua dari manual ini untuk menghindari kesalahpahaman pada sintaks dan bagaimana CMake bekerja.


Peluncuran CMake


Berikut ini adalah contoh penggunaan bahasa CMake yang harus Anda praktikkan. Eksperimen dengan kode sumber dengan memodifikasi perintah yang ada dan menambahkan yang baru. Untuk menjalankan contoh-contoh ini, instal CMake dari situs web resmi .


Contoh uji


Seperti disebutkan sebelumnya, CMake mendukung pengujian otomatis program. Fitur ini sangat mudah digunakan - cukup tulis beberapa perintah di CMakeLists.txt biasa, lalu jalankan tes menggunakan ctest atau make test . Yang Anda inginkan ada cek output program, analisis memori dinamis dan banyak lagi.


Kami akan mempertimbangkan proses pengujian program dengan contoh spesifik. File sumber Multiply.c berisi kode berikut:


 #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; } 

Kode ini menampilkan hasil dari mengalikan dua argumen ke konsol. Harap dicatat bahwa situasi terjadinya kesalahan juga dimungkinkan jika jumlah argumen aktual tidak memenuhi yang diharapkan: dalam hal ini, Kesalahan akan dihasilkan ke aliran kesalahan Error! .


Dalam direktori yang sama adalah file CMakeLists.txt dengan deskripsi proses build, yang berisi kode di bawah ini:


 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!") 

Mari kita pertimbangkan segalanya secara berurutan. Empat perintah pertama harus familier bagi Anda dari artikel sebelumnya , dan perintah enable_testing berikutnya menimbulkan sejumlah pertanyaan. Intinya, perintah ini hanya memberi tahu CMake tentang niat Anda untuk menguji program, secara bersamaan menghasilkan beberapa file konfigurasi, yang keberadaannya tidak perlu Anda ketahui.


Tiga add_test berikut menambah tes ke proyek saat ini. Bentuk pendek dari perintah ini mengambil nama tes sebagai argumen pertama, dan argumen berikutnya membentuk perintah shell untuk menjalankan tes.


Serangkaian perintah set_tests_properties menetapkan perilaku pengujian individual. Setelah daftar item pengujian, PROPERTIES kata kunci berikut, menandakan awal daftar properti yang memiliki bentuk < > < > dan ditetapkan untuk tes yang dipilih. Daftar lengkap properti yang tersedia ada di sini .


Untuk semua tes, waktu eksekusi maksimum diatur ke satu detik dengan properti TIMEOUT , dan kemudian untuk tes berikutnya output yang diharapkan diatur dengan properti PASS_REGULAR_EXPRESSION dan FAIL_REGULAR_EXPRESSION (misalnya, jika pertandingan dengan The result is: 3105 reguler The result is: 3105 terjadi, kemudian tes FirstTest berlanjut, dan jika cocok) dengan ekspresi Error! tes berhenti dan dianggap gagal).


Cara mengaktifkan pengujian


Ada analog dari enable_testing - ini adalah penyertaan modul CTest melalui perintah include . Secara umum, penyertaan modul lebih universal, tetapi masih ada perbedaan di antara mereka.


Perintah enable_testing memungkinkan pengujian untuk direktori saat ini, serta untuk semua yang berikutnya. Itu harus terletak di root CMakeLists.txt , karena CTest mengharapkan file uji di root majelis.


Mengaktifkan modul CTest mengkonfigurasi proyek untuk pengujian menggunakan CTest / CDash, dan juga secara otomatis menentukan opsi BUILD_TESTING , yang menerima true ketika pengujian dimungkinkan (defaultnya adalah ON ). Jadi, ketika menggunakan perintah ini, masuk akal untuk menggambarkan proses pengujian dengan cara ini:


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

Eksekusi uji


Serangkaian perintah cmake . && cmake --build . && ctest . cmake . && cmake --build . && ctest . ketiga tes dijalankan. Perintah ctest -R <RegularExpression> mengeksekusi serangkaian tes yang memenuhi ekspresi reguler yang diberikan. Sebagai contoh, perintah ctest -R ThirdTest hanya menjalankan tes ketiga.


Contoh pengemasan


Untuk membuat paket file sumber, pustaka dan file yang dapat dieksekusi, Anda hanya perlu menjelaskan instalasi file yang diperlukan menggunakan perintah install , dan kemudian aktifkan modul CPack perintah 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) 

Dalam hal ini, perintah install memberitahukan generator paket dari direktori instalasi target Multiply . Tanpa menulis perintah instalasi, pembuatan paket tidak dimungkinkan.


Berikut ini daftar karakteristik paket dengan menetapkan beberapa variabel. Bahkan, ada banyak variabel seperti itu yang benar paket paket. Kebanyakan dari mereka adalah opsional, tetapi beberapa generator paket memerlukan definisi mereka. Daftar variabel yang umum untuk semua generator paket tersedia di sini .


Definisi variabel CPACK_GENERATOR - ini adalah daftar generator paket yang dipanggil oleh utilitas cpack . Dalam hal ini, dibutuhkan nilai DEB , oleh karena itu, paket debian dihasilkan di direktori root aplikasi ikhtisar.


Akhirnya, modul CPack , mengkonfigurasi paket proyek masa depan menggunakan variabel yang ditentukan sebelumnya dan perintah instalasi untuk file yang dapat dieksekusi, serta menambahkan dua target rakitan - package dan package_source (rakitan biner dan rakitan sumber, masing-masing).


Eksekusi Pengepakan


Serangkaian perintah cmake . && cmake --build . && cmake --build . --target package cmake . && cmake --build . && cmake --build . --target package cmake . && cmake --build . && cmake --build . --target package diluncurkan untuk menjalankan generator yang dipilih untuk membuat paket biner, dan perintah cmake . && cmake --build . && cmake --build . --target package_source cmake . && cmake --build . && cmake --build . --target package_source cmake . && cmake --build . && cmake --build . --target package_source menghasilkan paket sumber tepat di direktori root.


Penyelesaian


Pada titik ini, seri tutorial lengkap CMake telah berakhir. Saya harap Anda telah mempelajari banyak materi berguna, serta meningkatkan keterampilan pemrograman Anda. Semoga beruntung

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


All Articles