Eu tenho vários projetos criados usando o CMake e gostaria de poder alternar facilmente entre usar o GCC ou o Clang / LLVM para compilá-los. Acredito (por favor, corrija-me se estiver enganado!) Que, para usar o Clang, preciso definir o seguinte:
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")
Existe uma maneira fácil de alternar entre essas e as variáveis padrão do GCC, preferencialmente como uma alteração em todo o sistema, em vez de específica do projeto (ou seja, não apenas adicioná-las ao CMakeLists.txt do projeto)?
Além disso, é necessário usar os llvm-*
programas em vez dos padrões do sistema ao compilar usando clang em vez de gcc? Qual é a diferença?
CMAKE_USER_MAKE_RULES_OVERRIDE
obras. Parece que o arquivo está sendo ignorado (ou seja, apesar deCMAKE_C_FLAGS_RELEASE
estar definido-O4
no arquivo de substituição, está mostrando o valor padrão-O3 -DNDEBUG
em cmake).src/build-clang
diretório, as substituições estão sendo ignoradas.CC
eCXX
, pode ser porque você precisa excluir todos os arquivos do diretório de compilação primeiro.rm CMakeCache.txt
pode não ser suficiente.Alteração de C ++ em todo o sistema no Ubuntu:
Irá imprimir algo como isto:
Depois, selecione clang ++.
fonte
There is only one alternative in link group cc (providing /usr/bin/cc): /usr/bin/gcc
Você pode usar o comando option:
e, em seguida, agrupe as configurações do clang-compiler em if () s:
Dessa forma, ele é exibido como uma opção cmake nas ferramentas de configuração da GUI.
Para torná-lo abrangente, é claro que você pode usar uma variável de ambiente como valor padrão ou ficar com a resposta de Ferruccio.
fonte
cmake -DCMAKE_COMPILER_DEFINITIONS=MyLlvmDefinitions.cmake
.Mudança C em todo o sistema no Ubuntu:
sudo update-alternatives --config cc
Alteração de C ++ em todo o sistema no Ubuntu:
sudo update-alternatives --config c++
Para cada uma das opções acima, pressione Número da seleção (1) e Enter para selecionar Clang:
fonte
/opt/clang-llvm-3.5/
instalado, primeiro instale uma nova alternativa:sudo update-alternatives --install /usr/bin/c++ c++ /opt/clang-llvm-3.5/bin/clang++ 30
Você pode usar o mecanismo de arquivo da cadeia de ferramentas do cmake para esse fim, veja, por exemplo, aqui . Você escreve um arquivo de cadeia de ferramentas para cada compilador que contém as definições correspondentes. No momento da configuração, você executa, por exemplo
e todas as informações do compilador serão definidas durante a chamada project () do arquivo da cadeia de ferramentas. Embora a documentação seja mencionada apenas no contexto da compilação cruzada, ela também funciona para diferentes compiladores no mesmo sistema.
fonte
Você definitivamente não precisa usar os vários programas diferentes do llvm-ar etc:
Eles foram criados para funcionar no formato interno llvm e, como tal, não são úteis para a construção do seu aplicativo.
Como nota, -O4 invocará LTO no seu programa que você pode não querer (aumentará bastante o tempo de compilação) e retornará os padrões para o modo c99, de modo que o sinalizador não seja necessariamente necessário.
fonte
Se o compilador padrão escolhido por
cmake
égcc
e você instalouclang
, você pode usar a maneira fácil de compilar seu projeto comclang
:fonte
De acordo com a ajuda de
cmake
:Você pode criar arquivos como
gcc_compiler.txt
eclang_compiler.txt
incluir toda a configuração relativa na sintaxe do CMake.Exemplo de clang (clang_compiler.txt):
Em seguida, execute-o como
GCC:
Clang:
fonte
Você pode usar a sintaxe:
$ENV{environment-variable}
em suasCMakeLists.txt
variáveis de ambiente acesso. Você pode criar scripts que inicializem um conjunto de variáveis de ambiente adequadamente e apenas tenham referências a essas variáveis em seusCMakeLists.txt
arquivos.fonte
-DCMAKE_C_COMPILER ...
etc?CMakeLists.txt
todos os projetos e fazer com que ele consultasse as novas variáveis. Eu esperava que houvesse uma maneira conveniente de fazer isso em todo o sistema, sem precisar modificar nenhum arquivo de projeto. Semelhante a passar aCMAKE_TOOLCHAIN_FILE
.