Pengungkapan penuh: Saya awalnya lebih suka pendekatan globbing karena kesederhanaannya, tetapi selama bertahun-tahun saya menyadari bahwa secara eksplisit daftar file tidak terlalu rentan kesalahan untuk proyek-proyek besar, multi-developer.
Jawaban asli:
Keuntungan dari globbing adalah:
Sangat mudah untuk menambahkan file baru karena hanya terdaftar di satu tempat: pada disk. Tidak globbing menciptakan duplikasi.
File CMakeLists.txt Anda akan lebih pendek. Ini merupakan nilai tambah besar jika Anda memiliki banyak file. Tidak menggumpal menyebabkan Anda kehilangan logika CMake di antara daftar besar file.
Keuntungan menggunakan daftar file hardcoded adalah:
CMake akan melacak dependensi file baru pada disk dengan benar - jika kita menggunakan glob maka file tidak menggumpal pertama kali ketika Anda menjalankan CMake tidak akan diambil
Anda memastikan bahwa hanya file yang Anda inginkan yang ditambahkan. Globbing dapat mengambil file liar yang tidak Anda inginkan.
Untuk mengatasi masalah pertama, Anda cukup "menyentuh" CMakeLists.txt yang melakukan glob, baik dengan menggunakan perintah sentuh atau dengan menulis file tanpa perubahan. Ini akan memaksa CMake untuk menjalankan kembali dan mengambil file baru.
Untuk memperbaiki masalah kedua, Anda dapat mengatur kode Anda dengan hati-hati ke dalam direktori, yang mungkin Anda lakukan. Dalam kasus terburuk, Anda dapat menggunakan list(REMOVE_ITEM)
perintah untuk membersihkan daftar berkas globbed:
file(GLOB to_remove file_to_remove.cpp)
list(REMOVE_ITEM list ${to_remove})
Satu-satunya situasi nyata di mana ini dapat menggigit Anda adalah jika Anda menggunakan sesuatu seperti git-bisect untuk mencoba versi kode Anda yang lebih lama di direktori build yang sama. Dalam hal ini, Anda mungkin harus membersihkan dan mengkompilasi lebih dari yang diperlukan untuk memastikan Anda mendapatkan file yang tepat dalam daftar. Ini adalah kasus sudut, dan di mana Anda sudah berada di kaki Anda, bahwa itu tidak benar-benar masalah.
Simply "touch" the CMakeLists.txt
tidak apa-apa jika Anda adalah pengembang, tetapi bagi orang lain membangun perangkat lunak Anda itu benar-benar dapat menjadi titik sakit yang membangun Anda gagal setelah memperbarui dan beban ada pada mereka untuk menyelidiki Mengapa.Cara terbaik untuk menentukan sourcefile di CMake adalah dengan mendaftar secara eksplisit .
Pembuat CMake sendiri menyarankan untuk tidak menggunakan globbing.
Lihat: https://cmake.org/cmake/help/v3.15/command/file.html?highlight=glob#file
Tentu saja, Anda mungkin ingin tahu apa kerugiannya - baca terus!
Ketika Globbing Gagal:
Kerugian besar dari globbing adalah membuat / menghapus file tidak akan secara otomatis memperbarui sistem build.
Jika Anda adalah orang yang menambahkan file, ini mungkin merupakan trade-off yang dapat diterima, namun hal ini menyebabkan masalah bagi orang lain yang membangun kode Anda, mereka memperbarui proyek dari kontrol versi, menjalankan build, kemudian menghubungi Anda, mengeluh bahwa
"build's rusak".
Untuk membuat keadaan menjadi lebih buruk, kegagalan biasanya memberikan beberapa kesalahan penghubung yang tidak memberikan petunjuk apa pun tentang penyebab masalah dan waktu hilang pemecahan masalah itu.
Dalam sebuah proyek yang saya kerjakan, kami memulai globbing tetapi mendapat begitu banyak keluhan ketika file baru ditambahkan, bahwa itu adalah alasan yang cukup untuk secara eksplisit mendaftar file daripada globbing.
Ini juga memecah alur kerja git yang umum
(
git bisect
dan beralih di antara cabang fitur).Jadi saya tidak bisa merekomendasikan ini, masalah yang disebabkannya jauh melebihi kenyamanan, ketika seseorang tidak dapat membangun perangkat lunak Anda karena ini, mereka mungkin kehilangan banyak waktu untuk melacak masalah atau menyerah begitu saja.
Dan catatan lain, Hanya ingat untuk menyentuh
CMakeLists.txt
tidak selalu cukup, dengan build otomatis yang menggunakan globbing, saya harus menjalankancmake
sebelum setiap build karena file mungkin telah ditambahkan / dihapus sejak bangunan terakhir *.Pengecualian terhadap aturan:
Ada saat-saat globbing lebih disukai:
CMakeLists.txt
file untuk proyek yang ada yang tidak menggunakan CMake.Ini cara cepat untuk mendapatkan semua sumber yang direferensikan (setelah sistem build berjalan - ganti globbing dengan daftar file yang eksplisit).
cmake
untuk menghasilkan file-file build setiap kali untuk mendapatkan build yang andal / benar (yang bertentangan dengan niat CMake - kemampuan untuk memisahkan konfigurasi dari gedung) .* Ya, saya bisa menulis kode untuk membandingkan pohon file pada disk sebelum dan sesudah pembaruan, tetapi ini bukan solusi yang baik dan sesuatu yang lebih baik diserahkan kepada sistem build.
sumber
Dalam CMake 3.12, perintah
file(GLOB ...)
danfile(GLOB_RECURSE ...)
memperolehCONFIGURE_DEPENDS
opsi yang menjalankan kembali cmake jika nilai glob berubah. Karena itu adalah kelemahan utama dari globbing untuk file sumber, sekarang boleh saja melakukannya:Namun, beberapa orang masih merekomendasikan menghindari globbing untuk sumber. Memang, dokumentasi menyatakan:
Secara pribadi, saya menganggap manfaat dari tidak harus mengelola secara manual daftar file sumber untuk lebih besar daripada kemungkinan kelemahannya. Jika Anda harus beralih kembali ke file yang terdaftar secara manual, ini dapat dengan mudah dicapai dengan hanya mencetak daftar sumber globbed dan menempelkannya kembali.
sumber
Anda dapat dengan aman glob (dan mungkin harus) dengan mengorbankan file tambahan untuk menahan dependensi.
Tambahkan fungsi seperti ini di suatu tempat:
Dan kemudian pergi globbing:
Anda masih menggunakan dependensi eksplisit (dan memicu semua build otomatis!) Seperti sebelumnya, hanya saja dalam dua file, bukan satu.
Satu-satunya perubahan dalam prosedur adalah setelah Anda membuat file baru. Jika Anda tidak glob, alur kerjanya adalah memodifikasi CMakeLists.txt dari dalam Visual Studio dan membangun kembali, jika Anda melakukan glob, Anda menjalankan cmake secara eksplisit - atau cukup sentuh CMakeLists.txt.
sumber
make
memberikan kesalahan linker aneh.Tentukan setiap file secara individual!
Saya menggunakan CMakeLists.txt konvensional dan skrip python untuk memperbaruinya. Saya menjalankan skrip python secara manual setelah menambahkan file.
Lihat jawaban saya di sini: https://stackoverflow.com/a/48318388/3929196
sumber