Temos um conjunto de scripts de construção CMake de plataforma cruzada e oferecemos suporte à criação com Visual C ++ e GCC .
Estamos testando o Clang , mas não consigo descobrir como testar se o compilador é ou não o Clang com nosso script CMake.
O que devo testar para ver se o compilador é Clang ou não? No momento, estamos usando MSVC
e CMAKE_COMPILER_IS_GNU<LANG>
para testar o Visual C ++ e o GCC, respectivamente.
__GNUC__
e_MSC_VER
, mas não pode consumir os mesmos programas que qualquer compilador. A detecção do LLVM Clang e do Apple Clang é crucial para garantir que o código seja compilado e executado conforme o esperado. Estou tão cansado de lidar com o BS de Clang que acabamos de quebrar a compilação no Windows . Adotamos a política de permitir que os usuários se queixem ao LLVM para que os desenvolvedores do Clang alterem seu comportamento. Veja também Como dizer ao Clang para parar de fingir ser outros compiladores?Respostas:
Uma verificação confiável é usar as
CMAKE_<LANG>_COMPILER_ID
variáveis. Por exemplo, para verificar o compilador C ++:Eles também funcionam corretamente se um wrapper de compilador como o ccache for usado.
A partir do CMake 3.0.0, o
CMAKE_<LANG>_COMPILER_ID
valor do Clang fornecido pela Apple é agoraAppleClang
. Para testar o Clang fornecido pela Apple e o Clang normal, use o seguinte se a condição:Consulte também a descrição da política AppleClang .
O CMake 3.15 adicionou suporte para o front-end clang-cl e o clang regular. Você pode determinar a variante do front-end inspecionando a variável
CMAKE_CXX_COMPILER_FRONTEND_VARIANT
:fonte
CMAKE_CXX_COMPILER_ID
variável está disponível apenas após o comandoproject(Foo CXX)
.if (CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") ... endif()
AppleClang
especificamente, @sakra indica que foicmake 3.0.0
lançadoAppleClang
. No entanto, apenas porque oscmake --version
relatórios iguais ou superiores não são suficientes - você precisa fazer issocmake_minimum_required(VERSION 3.0.0)
para que os3.0.0
padrões sejam usados!O código-fonte do mecanismo OGRE 3D usa a seguinte verificação :
fonte
export CXX="ccache clang++"
)if ("${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}" MATCHES ".*clang")
lidar com o caso ccache.${CMAKE_CXX_COMPILER} == /Library/Developer/CommandLineTools/usr/bin/c++
. A resposta aceita funciona.Apenas para evitar qualquer problema de ortografia incorreta, estou usando a comparação que não diferencia maiúsculas de minúsculas, como:
Para tornar a expressão regular sem distinção entre
MATCHES
maiúsculas e minúsculas, tentei de tudo aqui sem sucesso (não parece ser suportado no CMake).fonte
Esta é uma resposta um pouco mais detalhada para iniciantes cmake, modificada a partir da resposta do sakra, basta anexar as seguintes linhas a
CMakeLists.txt
:Em seguida, execute
cmake .
a pasta onde está o CMakeLists.txt. Então você verá várias saídas junto com sua resposta.fonte