Kami memiliki serangkaian skrip build CMake lintas-platform , dan kami mendukung pembangunan dengan Visual C ++ dan GCC .
Kami mencoba Clang , tetapi saya tidak tahu bagaimana cara menguji apakah kompilernya Clang dengan skrip CMake kami.
Apa yang harus saya uji untuk melihat apakah kompilernya Dentang atau tidak? Kami saat ini menggunakan MSVC
dan CMAKE_COMPILER_IS_GNU<LANG>
untuk menguji Visual C ++ dan GCC, masing-masing.
__GNUC__
dan_MSC_VER
, tetapi tidak dapat mengkonsumsi program yang sama seperti kompiler. Mendeteksi LLVM Clang dan Apple Clang sangat penting untuk memastikan kompilasi dan eksekusi kode seperti yang diharapkan. Saya sangat lelah berurusan dengan BS Clang, kami hanya memecahkan kompilasi pada Windows . Kami telah mengadopsi kebijakan membiarkan pengguna mengeluh ke LLVM sehingga pengembang Dentang mengubah perilaku mereka. Lihat juga Bagaimana cara memberitahu Dentang untuk berhenti berpura-pura menjadi kompiler lain?Jawaban:
Pemeriksaan yang andal adalah menggunakan
CMAKE_<LANG>_COMPILER_ID
variabel. Misalnya, untuk memeriksa kompiler C ++:Ini juga berfungsi dengan benar jika pembungkus kompiler seperti ccache digunakan.
Pada CMake 3.0.0
CMAKE_<LANG>_COMPILER_ID
nilai untuk Dentang yang disediakan Apple sekarangAppleClang
. Untuk menguji baik Dentang yang disediakan Apple maupun Dentang biasa, gunakan kondisi jika berikut:Lihat juga deskripsi kebijakan AppleClang .
CMake 3.15 telah menambahkan dukungan untuk clang-cl dan front end clang biasa. Anda dapat menentukan varian ujung depan dengan memeriksa variabel
CMAKE_CXX_COMPILER_FRONTEND_VARIANT
:sumber
CMAKE_CXX_COMPILER_ID
variabel hanya tersedia setelah perintahproject(Foo CXX)
.if (CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") ... endif()
AppleClang
secara khusus, @sakra menunjukkan bahwacmake 3.0.0
dilepaskanAppleClang
. Namun, hanya karenacmake --version
laporan yang sama atau lebih tinggi tidak cukup - Anda haruscmake_minimum_required(VERSION 3.0.0)
menggunakan3.0.0
standar!Kode sumber mesin OGRE 3D menggunakan pemeriksaan berikut :
sumber
export CXX="ccache clang++"
)if ("${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}" MATCHES ".*clang")
menangani kasut ccache.${CMAKE_CXX_COMPILER} == /Library/Developer/CommandLineTools/usr/bin/c++
. Jawaban yang diterima bekerja.Untuk menghindari masalah kesalahan ejaan, saya menggunakan perbandingan yang tidak sensitif terhadap kasus, seperti:
Untuk membuat regex dari
MATCHES
case-insensitive, saya mencoba semuanya di sini tanpa hasil (sepertinya tidak didukung di CMake).sumber
Ini adalah jawaban yang sedikit lebih rinci untuk pemula cmake, dimodifikasi dari jawaban sakra, tambahkan saja baris berikut ke
CMakeLists.txt
:Kemudian jalankan
cmake .
di folder di mana CMakeLists.txt berada. Kemudian Anda akan melihat banyak output beserta jawaban Anda.sumber