Entah bagaimana saya benar-benar bingung dengan cara kerja CMake. Setiap kali saya berpikir bahwa saya semakin dekat untuk memahami bagaimana CMake dimaksudkan untuk ditulis, itu menghilang dalam contoh berikutnya yang saya baca. Yang ingin saya ketahui adalah, bagaimana saya harus menyusun proyek saya, sehingga CMake saya memerlukan paling sedikit pemeliharaan di masa mendatang. Misalnya, saya tidak ingin memperbarui CMakeList.txt saya ketika saya menambahkan folder baru di pohon src saya, yang berfungsi persis seperti semua folder src lainnya.
Ini adalah bagaimana saya membayangkan struktur proyek saya, tapi tolong ini hanya sebuah contoh. Jika cara yang disarankan berbeda, tolong beri tahu saya, dan beri tahu saya cara melakukannya.
myProject
src/
module1/
module1.h
module1.cpp
module2/
[...]
main.cpp
test/
test1.cpp
resources/
file.png
bin
[execute cmake ..]
Ngomong-ngomong, penting bahwa program saya tahu di mana sumber daya itu berada. Saya ingin mengetahui cara yang direkomendasikan untuk mengelola sumber daya. Saya tidak ingin mengakses sumber daya saya dengan "../resources/file.png"
sumber
For example I don't want to update my CMakeList.txt when I am adding a new folder in my src tree
dapatkah Anda memberikan contoh IDE yang mengumpulkan sumber secara otomatis?Jawaban:
setelah beberapa penelitian saya sekarang memiliki versi saya sendiri dari contoh cmake yang paling sederhana tapi lengkap. Ini dia, dan mencoba untuk mencakup sebagian besar hal mendasar, termasuk sumber daya dan pengemasan.
satu hal yang tidak standar adalah penanganan sumber daya. Secara default, cmake ingin meletakkannya di / usr / share /, / usr / local / share / dan sesuatu yang setara di windows. Saya ingin memiliki zip / tar.gz sederhana yang dapat Anda ekstrak di mana saja dan dijalankan. Oleh karena itu sumber daya dimuat relatif terhadap yang dapat dieksekusi.
aturan dasar untuk memahami perintah cmake adalah sintaks berikut:
<function-name>(<arg1> [<arg2> ...])
tanpa koma atau semicolor. Setiap argumen adalah string.foobar(3.0)
danfoobar("3.0")
sama. Anda dapat mengatur daftar / variabel denganset(args arg1 arg2)
. Dengan kumpulan variabel inifoobar(${args})
danfoobar(arg1 arg2)
secara efektif sama. Variabel yang tidak ada setara dengan daftar kosong. Sebuah daftar secara internal hanyalah sebuah string dengan titik koma untuk memisahkan elemennya. Oleh karena itu daftar dengan hanya satu elemen adalah menurut definisi elemen itu, tidak ada tinju yang terjadi. Variabel bersifat global. Fungsi builtin menawarkan beberapa bentuk argumen bernama oleh fakta bahwa mereka mengharapkan beberapa id sepertiPUBLIC
atauDESTINATION
dalam daftar argumen mereka, untuk mengelompokkan argumen. Tapi itu bukan fitur bahasa, id tersebut juga hanya string, dan diurai oleh implementasi fungsi.Anda dapat mengkloning semuanya dari github
sumber
set(sources src/main.cpp)
.CMakeLists.txt
, maka make (atau ninja) normal akan memicu pencabutan kembali cmake, jadi Anda tidak bisa melupakannya. Ini juga sedikit lebih ramah tim, karena dengan demikian anggota tim juga tidak boleh lupa untuk mengeksekusi cmake. Tapi menurut saya makefile tidak perlu disentuh, hanya karena seseorang menambahkan file. Tuliskan sekali, dan tidak ada yang perlu memikirkannya lagi.Contoh paling dasar tetapi lengkap dapat ditemukan di tutorial CMake :
Untuk contoh proyek Anda, Anda mungkin memiliki:
Untuk pertanyaan tambahan Anda, satu cara untuk melanjutkan adalah lagi di tutorial: buat file header yang dapat dikonfigurasi yang Anda sertakan dalam kode Anda. Untuk ini, buat file
configuration.h.in
dengan konten berikut:Kemudian di
CMakeLists.txt
tambahkan:Terakhir, jika Anda membutuhkan jalur dalam kode Anda, Anda dapat melakukan:
sumber
string resourcePath = string(RESOURCE_PATH) + "file.png"
IMHO itu ide yang buruk untuk hardcode path absolut ke direktori sumber. Bagaimana jika Anda perlu menginstal proyek Anda?Di sini saya menulis contoh file CMakeLists.txt yang paling sederhana namun lengkap.
Kode sumber
Setelah itu, saya menawarkan dokumen untuk detailnya.
Jika Anda memiliki pertanyaan, Anda dapat menghubungi saya dan saya ingin menjelaskannya.
sumber