Saya memiliki sejumlah proyek yang dibangun menggunakan CMake dan saya ingin dapat dengan mudah beralih antara menggunakan GCC atau Dentang / LLVM untuk mengkompilasinya. Saya percaya (tolong perbaiki saya jika saya salah!) Bahwa untuk menggunakan Dentang saya perlu mengatur yang berikut:
SET (CMAKE_C_COMPILER "/usr/bin/clang")
SET (CMAKE_C_FLAGS "-Wall -std=c99")
SET (CMAKE_C_FLAGS_DEBUG "-g")
SET (CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG")
SET (CMAKE_C_FLAGS_RELEASE "-O4 -DNDEBUG")
SET (CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")
SET (CMAKE_CXX_COMPILER "/usr/bin/clang++")
SET (CMAKE_CXX_FLAGS "-Wall")
SET (CMAKE_CXX_FLAGS_DEBUG "-g")
SET (CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELEASE "-O4 -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
SET (CMAKE_AR "/usr/bin/llvm-ar")
SET (CMAKE_LINKER "/usr/bin/llvm-ld")
SET (CMAKE_NM "/usr/bin/llvm-nm")
SET (CMAKE_OBJDUMP "/usr/bin/llvm-objdump")
SET (CMAKE_RANLIB "/usr/bin/llvm-ranlib")
Apakah ada cara mudah untuk beralih antara ini dan variabel GCC default, lebih disukai sebagai perubahan seluruh sistem daripada spesifik proyek (yaitu tidak hanya menambahkannya ke dalam CMakeLists.txt proyek)?
Juga, apakah perlu menggunakan llvm-*
program daripada sistem default saat kompilasi menggunakan dentang bukan gcc? Apa bedanya?
CMAKE_USER_MAKE_RULES_OVERRIDE
karya. Tampaknya file tersebut diabaikan (yaitu meskipunCMAKE_C_FLAGS_RELEASE
diatur ke-O4
dalam file yang diganti, itu menunjukkan nilai default-O3 -DNDEBUG
dalam cmake).src/build-clang
direktori baru , pengabaiannya diabaikan.CC
danCXX
, itu mungkin karena Anda harus menghapus semua file dari direktori build terlebih dahulu.rm CMakeCache.txt
mungkin tidak cukup.C ++ seluruh sistem berubah pada Ubuntu:
Akan mencetak sesuatu seperti ini:
Kemudian cukup pilih dentang ++.
sumber
There is only one alternative in link group cc (providing /usr/bin/cc): /usr/bin/gcc
Anda dapat menggunakan perintah opsi:
dan kemudian bungkus pengaturan clang-compiler di if () s:
Dengan cara ini ditampilkan sebagai opsi cmake di alat konfigurasi gui.
Untuk membuatnya menjadi sistem Anda tentu saja dapat menggunakan variabel lingkungan sebagai nilai default atau tetap dengan jawaban Ferruccio.
sumber
cmake -DCMAKE_COMPILER_DEFINITIONS=MyLlvmDefinitions.cmake
.Perubahan sistem C yang lebar di Ubuntu:
sudo update-alternatives --config cc
C ++ seluruh sistem berubah pada Ubuntu:
sudo update-alternatives --config c++
Untuk masing-masing di atas, tekan Nomor pilihan (1) dan Enter untuk memilih Dentang:
sumber
/opt/clang-llvm-3.5/
maka instal dulu alternatif baru:sudo update-alternatives --install /usr/bin/c++ c++ /opt/clang-llvm-3.5/bin/clang++ 30
Anda dapat menggunakan mekanisme file toolchain cmake untuk tujuan ini, lihat misalnya di sini . Anda menulis file toolchain untuk setiap kompiler yang berisi definisi yang sesuai. Pada waktu konfigurasi, Anda menjalankan mis
dan semua informasi kompiler akan ditetapkan selama panggilan proyek () dari file toolchain. Meskipun dalam dokumentasi disebutkan hanya dalam konteks kompilasi silang, ia berfungsi juga untuk kompiler yang berbeda pada sistem yang sama.
sumber
Anda pasti tidak perlu menggunakan berbagai program dll llvm-ar yang berbeda:
Ini dibuat untuk bekerja pada format internal llvm dan karena itu tidak berguna untuk membangun aplikasi Anda.
Sebagai catatan -O4 akan menjalankan LTO pada program Anda yang mungkin tidak Anda inginkan (ini akan sangat meningkatkan waktu kompilasi) dan menempelkan default ke mode c99 sehingga flag juga tidak diperlukan.
sumber
Jika kompiler default dipilih oleh
cmake
adalahgcc
dan Anda telah menginstalclang
, Anda dapat menggunakan cara mudah untuk mengkompilasi proyek Anda denganclang
:sumber
Menurut bantuan dari
cmake
:Anda dapat membuat file seperti
gcc_compiler.txt
danclang_compiler.txt
memasukkan semua konfigurasi relatif dalam sintaks CMake.Contoh Dentang (clang_compiler.txt):
Kemudian jalankan sebagai
GCC:
Dentang:
sumber
Anda dapat menggunakan sintaks:
$ENV{environment-variable}
di AndaCMakeLists.txt
untuk mengakses variabel lingkungan. Anda bisa membuat skrip yang menginisialisasi seperangkat variabel lingkungan dengan tepat dan hanya memiliki referensi ke variabel-variabel tersebut diCMakeLists.txt
file Anda .sumber
-DCMAKE_C_COMPILER ...
dll?CMakeLists.txt
setiap proyek dan meminta permintaan variabel baru. Saya berharap akan ada cara yang nyaman untuk melakukannya di seluruh sistem, tanpa harus memodifikasi file proyek apa pun. Mirip dengan melewati aCMAKE_TOOLCHAIN_FILE
.