Jangan menimpa CMAKE_C_COMPILER
, tapi ekspor CC
(dan CXX
) sebelum memanggil cmake:
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
cmake /path/to/your/project
make
Ekspor hanya perlu dilakukan satu kali, pertama kali Anda mengonfigurasi proyek, nilai tersebut akan dibaca dari cache CMake.
UPDATE : penjelasan lebih panjang tentang mengapa tidak menimpa CMAKE_C(XX)_COMPILER
setelah komentar Jake
Saya merekomendasikan untuk tidak menimpa CMAKE_C(XX)_COMPILER
nilai karena dua alasan utama: karena itu tidak akan berfungsi dengan baik dengan cache CMake dan karena itu merusak pemeriksaan kompiler dan deteksi perkakas.
Saat menggunakan set
perintah, Anda memiliki tiga opsi:
- tanpa cache, untuk membuat variabel normal
- dengan cache, untuk membuat variabel cache
- memaksa cache, untuk selalu memaksa nilai cache saat mengkonfigurasi
Mari kita lihat apa yang terjadi untuk tiga kemungkinan panggilan ke set
:
Tanpa cache
set(CMAKE_C_COMPILER /usr/bin/clang)
set(CMAKE_CXX_COMPILER /usr/bin/clang++)
Saat melakukan ini, Anda membuat variabel "normal" CMAKE_C(XX)_COMPILER
yang menyembunyikan variabel cache dengan nama yang sama. Artinya, compiler Anda sekarang telah di-hardcode dalam skrip build Anda dan Anda tidak dapat memberikannya nilai kustom. Ini akan menjadi masalah jika Anda memiliki beberapa lingkungan build dengan kompiler berbeda. Anda bisa memperbarui skrip Anda setiap kali Anda ingin menggunakan kompiler yang berbeda, tetapi itu menghapus nilai menggunakan CMake di tempat pertama.
Oke, kalau begitu, mari perbarui cache ...
Dengan cache
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "")
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "")
Versi ini hanya akan "tidak berfungsi". The CMAKE_C(XX)_COMPILER
variabel sudah dalam cache, sehingga tidak akan diperbarui kecuali Anda memaksa itu.
Ah ... ayo gunakan kekuatan, lalu ...
Paksa cache
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "" FORCE)
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "" FORCE)
Ini hampir sama dengan versi variabel "normal", satu-satunya perbedaan adalah nilai Anda akan disetel di cache, sehingga pengguna dapat melihatnya. Tetapi setiap perubahan akan ditimpa oleh set
perintah.
Memecah pemeriksaan dan perkakas kompiler
Pada awal proses konfigurasi, CMake melakukan pemeriksaan pada kompiler: Apakah berhasil? Apakah itu mampu menghasilkan executable? dll. Ia juga menggunakan kompiler untuk mendeteksi perkakas terkait, seperti ar
dan ranlib
. Saat Anda mengganti nilai compiler dalam skrip, ini "terlambat", semua pemeriksaan dan deteksi sudah selesai.
Misalnya, di komputer saya dengan gcc sebagai kompilator default, saat menggunakan set
perintah ke /usr/bin/clang
, ar
disetel ke /usr/bin/gcc-ar-7
. Saat menggunakan ekspor sebelum menjalankan CMake, ini disetel ke /usr/lib/llvm-3.8/bin/llvm-ar
.
/opt
daripada/usr/local
. Lebih disukai/opt/gcc-x.y.z
. Dengan cara ini, jika Anda membutuhkan versi yang lebih baru, Anda tidak akan kesulitan mencopot pemasangan yang sebelumnya.