Menyiapkan proyek C ++ baru biasanya membutuhkan sejumlah besar persiapan dan kode boilerplate, bahkan lebih untuk proyek C ++ modern dengan tes, executable dan integrasi berkelanjutan. Template ini adalah hasil dari pembelajaran dari banyak proyek sebelumnya dan harus membantu mengurangi pekerjaan yang diperlukan untuk mengatur proyek C ++ modern.
Greeter berarti nama proyek, sementara greeter digunakan dalam nama file.include/greeter untuk menggunakan nama kecil proyek Anda dan perbarui semua #include s yang relevan.CODECOV_TOKENAkhirnya, Anda dapat menghapus file yang tidak digunakan, seperti direktori mandiri atau alur kerja GitHub yang tidak relevan untuk proyek Anda. Jangan ragu untuk mengganti lisensi dengan satu cocok untuk proyek Anda.
Untuk memisahkan kode perpustakaan dan subproyject dengan bersih, CMakeList.txt luar hanya mendefinisikan perpustakaan itu sendiri sementara tes dan subproyject lainnya mandiri di direktori mereka sendiri. Selama pengembangan biasanya lebih mudah untuk membangun semua subproyek sekaligus.
Gunakan perintah berikut untuk membangun dan menjalankan target yang dapat dieksekusi.
cmake -S standalone -B build/standalone
cmake --build build/standalone
./build/standalone/Greeter --helpGunakan perintah berikut dari direktori root proyek untuk menjalankan suite test.
cmake -S test -B build/test
cmake --build build/test
CTEST_OUTPUT_ON_FAILURE=1 cmake --build build/test --target test
# or simply call the executable:
./build/test/GreeterTests Untuk mengumpulkan informasi cakupan kode, jalankan CMake dengan opsi -DENABLE_TEST_COVERAGE=1 .
Gunakan perintah berikut dari direktori root proyek untuk memeriksa dan memperbaiki gaya sumber C ++ dan CMake. Ini membutuhkan format dentang , format CMake dan pyyaml untuk dipasang pada sistem saat ini.
cmake -S test -B build/test
# view changes
cmake --build build/test --target format
# apply changes
cmake --build build/test --target fix-formatLihat Format.CMake untuk detailnya. Ketergantungan ini dapat dengan mudah dipasang menggunakan PIP.
pip install clang-format==14.0.6 cmake_format==0.6.11 pyyamlDokumentasi dibangun secara otomatis dan diterbitkan setiap kali rilis GitHub dibuat. Untuk membangun dokumentasi secara manual, hubungi perintah berikut.
cmake -S documentation -B build/doc
cmake --build build/doc --target GenerateDocs
# view the docs
open build/doc/doxygen/html/index.htmlUntuk membangun dokumentasi secara lokal, Anda akan memerlukan Doxygen, Jinja2 dan Pygments yang diinstal pada sistem Anda.
Proyek ini juga mencakup all direktori yang memungkinkan membangun semua target secara bersamaan. Ini berguna selama pengembangan, karena memaparkan semua subproyek ke IDE Anda dan menghindari bangunan perpustakaan yang berlebihan.
cmake -S all -B build
cmake --build build
# run tests
./build/test/GreeterTests
# format code
cmake --build build --target fix-format
# run standalone
./build/standalone/Greeter --help
# build docs
cmake --build build --target GenerateDocsSubproyon tes dan mandiri mencakup file alat. Berikut ini saat ini didukung.
Sanitizers dapat diaktifkan dengan mengonfigurasi cmake dengan -DUSE_SANITIZER=<Address | Memory | MemoryWithOrigins | Undefined | Thread | Leak | 'Address;Undefined'> .
Analisis statis dapat diaktifkan dengan pengaturan -DUSE_STATIC_ANALYZER=<clang-tidy | iwyu | cppcheck> , atau kombinasi dari yang ada di tanda kutip, dipisahkan oleh titik koma. Secara default, analisis akan secara otomatis menemukan file konfigurasi seperti .clang-format . Argumen tambahan dapat diteruskan ke analisis dengan mengatur variabel CLANG_TIDY_ARGS , IWYU_ARGS atau CPPCHECK_ARGS .
CCACHE dapat diaktifkan dengan mengonfigurasi dengan -DUSE_CCACHE=<ON | OFF> .
Bisakah saya menggunakan ini untuk perpustakaan header saja?
Ya, namun Anda perlu mengubah jenis perpustakaan ke perpustakaan INTERFACE seperti yang didokumentasikan di cmakelists.txt. Lihat di sini untuk contoh perpustakaan header-only berdasarkan templat.
Saya tidak membutuhkan target / dokumentasi mandiri. Bagaimana saya bisa menyingkirkannya?
Cukup hapus direktori mandiri / dokumentasi dan menurut file alur kerja GitHub.
Bisakah saya membangun mandiri dan tes secara bersamaan? / Bagaimana saya bisa menceritakan IDE saya tentang semua subproyek?
Untuk menjaga modular template, semua subproyject yang berasal dari perpustakaan telah dipisahkan menjadi modul CMake mereka sendiri. Pendekatan ini membuatnya sepele bagi proyek-proyek pihak ketiga untuk menggunakan kembali kode perpustakaan proyek. Untuk mengizinkan IDE untuk melihat ruang lingkup penuh proyek, template mencakup all direktori yang akan membuat satu build tunggal untuk semua subproyek. Gunakan ini sebagai direktori utama untuk dukungan IDE terbaik.
Saya melihat Anda menggunakan
GLOBuntuk menambahkan file sumber di cmakelists.txt. Bukankah itu jahat?
Glob dianggap buruk karena setiap perubahan pada struktur file sumber mungkin tidak ditangkap secara otomatis oleh pembangun CMake dan Anda perlu secara manual memohon CMake pada perubahan. Saya pribadi lebih suka solusi GLOB untuk kesederhanaannya, tetapi jangan ragu untuk mengubahnya menjadi mendaftarkan sumber secara eksplisit.
Saya ingin membuat target tambahan yang bergantung pada perpustakaan saya. Haruskah saya memodifikasi cmakelist utama untuk memasukkannya?
Hindari memasukkan proyek yang diturunkan dari perpustakaan CMakelists (meskipun itu adalah pemandangan umum di dunia C ++), karena ini secara efektif membalikkan pohon ketergantungan dan membuat sistem pembangunan sulit untuk bernalar. Sebaliknya, buat direktori atau proyek baru dengan CMakelists yang menambahkan perpustakaan sebagai ketergantungan (misalnya seperti direktori mandiri). Bergantung pada tipe, mungkin masuk akal memindahkan komponen -komponen ini ke repositori terpisah dan merujuk komit atau versi spesifik perpustakaan. Ini memiliki keuntungan bahwa perpustakaan dan komponen individu dapat ditingkatkan dan diperbarui secara mandiri.
Anda merekomendasikan untuk menambahkan dependensi eksternal menggunakan CPM.CMake. Apakah ini memaksa pengguna perpustakaan saya untuk menggunakan cpm.cmake juga?
CPM.CMake harus tidak terlihat oleh pengguna perpustakaan karena ini adalah skrip CMake mandiri. Jika masalah muncul, pengguna selalu dapat memilih-keluar dengan mendefinisikan CMake atau Env variabel CPM_USE_LOCAL_PACKAGES , yang akan mengganti semua panggilan ke CPMAddPackage dengan panggilan find_package menurut. Ini juga harus memungkinkan pengguna untuk menggunakan proyek dengan manajer ketergantungan C ++ eksternal favorit mereka, seperti VCPKG atau Conan.
Dapatkah saya mengonfigurasi dan membangun proyek saya secara offline?
Tidak diperlukan koneksi internet untuk membangun proyek, namun saat menggunakan dependensi yang hilang CPM diunduh pada waktu konfigurasi. Untuk menghindari unduhan yang berlebihan, sangat disarankan untuk mengatur direktori cache CPM.CMake, misalnya: export CPM_SOURCE_CACHE=$HOME/.cache/CPM . Ini akan memungkinkan klon dangkal dan memungkinkan dependensi konfigurasi offline sudah tersedia di cache.
Dapatkah saya menggunakan CPACK untuk membuat penginstal paket untuk proyek saya?
Karena ada banyak opsi dan konfigurasi yang mungkin, ini belum (belum) dalam ruang lingkup templat ini. Lihat dokumentasi CPACK untuk informasi lebih lanjut tentang pengaturan installer CPACK.
Ini terlalu banyak, saya hanya ingin bermain dengan kode C ++ dan menguji beberapa perpustakaan.
Mungkin minicppstarter adalah sesuatu untuk Anda!