Saya biasanya memiliki kebijakan dalam proyek saya, untuk tidak pernah membuat baris dalam file teks yang melebihi panjang baris 80, sehingga mudah diedit di semua jenis editor (Anda tahu kesepakatannya). Tetapi dengan CMake saya mendapatkan masalah bahwa saya tidak tahu bagaimana membagi string sederhana menjadi beberapa baris untuk menghindari satu baris besar. Pertimbangkan kode dasar ini:
set(MYPROJ_VERSION_MAJOR "1")
set(MYPROJ_VERSION_MINOR "0")
set(MYPROJ_VERSION_PATCH "0")
set(MYPROJ_VERSION_EXTRA "rc1")
set(MYPROJ_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_EXTRA}")
Itu sudah melebihi batas 80 baris. Jadi, bagaimana cara memecah baris di CMake menjadi beberapa baris tanpa menjadi verbose (banyak list(APPEND ...)
atau sejenisnya)?
CMake 3.0 dan yang lebih baru
Gunakan
string(CONCAT)
perintah:Meskipun CMake 3.0 dan baris dukungan yang lebih baru merupakan kelanjutan dari argumen kutipan , Anda tidak dapat membuat indentasi baris kedua atau berikutnya tanpa memasukkan spasi lekukan dalam string Anda.
CMake 2.8 dan yang lebih tua
Anda dapat menggunakan daftar. Setiap elemen dari daftar dapat diletakkan di baris baru:
Daftar yang digunakan tanpa tanda kutip digabungkan tanpa spasi:
Jika Anda benar-benar membutuhkan string, Anda dapat mengonversi daftar menjadi string terlebih dahulu:
Setiap titik koma di string asli Anda akan dilihat sebagai pemisah elemen daftar, dan dihapus. Mereka harus di-escape:
sumber
Ini masih sedikit bertele-tele, tetapi jika batas 80 karakter benar-benar mengganggu Anda, maka Anda dapat berulang kali menambahkan variabel yang sama:
Memberikan keluaran:
sumber
Tidak ada cara untuk membagi string literal menjadi beberapa baris dalam file CMakeLists.txt atau dalam skrip CMake. Jika Anda menyertakan baris baru dalam string, akan ada baris baru literal di string itu sendiri.
Namun, CMake menggunakan spasi putih untuk memisahkan argumen, sehingga Anda bisa mengubah spasi yang merupakan pemisah argumen menjadi baris baru di mana pun Anda suka, tanpa mengubah perilakunya.
Anda dapat menyusun ulang baris yang lebih panjang ini:
sebagai dua garis pendek berikut:
Mereka sepenuhnya setara.
sumber
Contoh pada pertanyaan awal hanya tentang string yang relatif pendek. Untuk string yang lebih panjang (termasuk contoh yang diberikan dalam jawaban lain), argumen braket bisa lebih baik. Dari dokumentasi:
sumber
\n
s. Jika Anda tidak menginginkannya, menurut saya argumen braket bukanlah solusi Anda.Bagi mereka yang dibawa ke sini dari Bagaimana cara membagi ekspresi generator CMake menjadi beberapa baris? Saya ingin menambahkan beberapa catatan.
Metode kelanjutan baris tidak akan berfungsi, CMake tidak dapat mengurai daftar generator yang dibuat dengan spasi (indentasi) dan kelanjutan baris.
Sementara solusi string (CONCAT) akan memberikan ekspresi generator yang dapat dievaluasi, ekspresi yang dievaluasi akan diapit oleh tanda kutip jika hasilnya berisi spasi.
Untuk setiap opsi individu yang akan ditambahkan, daftar generator terpisah harus dibuat, jadi opsi susun seperti yang telah saya lakukan berikut ini akan menyebabkan build gagal:
Ini karena opsi yang dihasilkan diteruskan ke kompiler dalam tanda kutip
Untuk mengevaluasi ekspresi generator yang panjang yang direpresentasikan menggunakan solusi string (CONCAT), setiap ekspresi generator harus mengevaluasi ke satu opsi tanpa spasi:
Ini mungkin tidak terkait dengan pertanyaan yang saya posting jawabannya, sayangnya pertanyaan yang saya jawab salah ditandai sebagai duplikat dari pertanyaan ini.
Daftar generator tidak ditangani dan diurai dengan cara yang sama seperti string, dan karena itu, ada tindakan tambahan yang harus diambil untuk memisahkan daftar generator menjadi beberapa baris.
sumber
Untuk mempertahankan indentasi yang baik dalam kode Anda, cukup mudah dilakukan
Atau bentuk string langsung dengan
seperti dalam jawaban Douglas yang memiliki lebih banyak detail. Namun saya pikir ini mungkin hanya meringkas poin penting.
sumber