Não substitua CMAKE_C_COMPILER
, mas exporte CC
(e CXX
) antes de chamar o cmake:
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
cmake /path/to/your/project
make
A exportação precisa ser feita apenas uma vez, na primeira vez em que você configurar o projeto, esses valores serão lidos no cache do CMake.
UPDATE : explicação mais longa sobre por que não substituir CMAKE_C(XX)_COMPILER
após o comentário de Jake
Eu recomendo não substituir o CMAKE_C(XX)_COMPILER
valor por dois motivos principais: porque ele não funciona bem com o cache do CMake e porque quebra as verificações do compilador e a detecção de ferramentas.
Ao usar o set
comando, você tem três opções:
- sem cache, para criar uma variável normal
- com cache, para criar uma variável em cache
- forçar cache, para sempre forçar o valor do cache ao configurar
Vamos ver o que acontece nas três chamadas possíveis para set
:
Sem cache
set(CMAKE_C_COMPILER /usr/bin/clang)
set(CMAKE_CXX_COMPILER /usr/bin/clang++)
Ao fazer isso, você cria uma variável "normal" CMAKE_C(XX)_COMPILER
que oculta a variável de cache com o mesmo nome. Isso significa que seu compilador agora está codificado no script de construção e você não pode atribuir um valor personalizado a ele. Isso será um problema se você tiver vários ambientes de compilação com diferentes compiladores. Você pode simplesmente atualizar seu script sempre que quiser usar um compilador diferente, mas isso remove o valor do uso do CMake em primeiro lugar.
Ok, então, vamos atualizar o cache ...
Com cache
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "")
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "")
Esta versão simplesmente "não funciona". A CMAKE_C(XX)_COMPILER
variável já está no cache, portanto, não será atualizada a menos que você a force.
Ah ... vamos usar a força, então ...
Forçar cache
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "" FORCE)
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "" FORCE)
É quase o mesmo que a versão variável "normal", a única diferença é que seu valor será definido no cache, para que os usuários possam vê-lo. Mas qualquer alteração será substituída pelo set
comando.
Quebrando verificações e ferramentas do compilador
No início do processo de configuração, o CMake realiza verificações no compilador: Funciona? É capaz de produzir executáveis? etc. Ele também usa o compilador para detectar ferramentas relacionadas, como ar
e ranlib
. Quando você substitui o valor do compilador em um script, é "tarde demais", todas as verificações e detecções já estão concluídas.
Por exemplo, na minha máquina com gcc como compilador padrão, ao usar o set
comando para /usr/bin/clang
, ar
está definido para /usr/bin/gcc-ar-7
. Ao usar uma exportação antes de executar o CMake, ela está definida como /usr/lib/llvm-3.8/bin/llvm-ar
.
/opt
vez de/usr/local
. De preferência/opt/gcc-x.y.z
. Dessa forma, se você precisar de uma versão ainda mais nova, não terá problemas para desinstalar a anterior.