Ответ 1
Не перезаписывайте CMAKE_C_COMPILER
, а экспортируйте CC (и CXX) перед вызовом cmake:
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
cmake /path/to/your/project
make
Экспорт нужно выполнить только один раз, при первом запуске проекта эти значения будут считаны из кэша cmake.
ОБНОВЛЕНИЕ: более подробное объяснение того, почему не переопределять CMAKE_C(XX)_COMPILER
после комментария Джейка
Я рекомендую не переопределять значение CMAKE_C(XX)_COMPILER
по двум основным причинам: потому что он не будет хорошо работать с кэшем CMake и потому, что он прерывает проверку компилятора и обнаружение инструментов.
При использовании команды set
у вас есть три варианта: без кеша, создать обычную переменную с кешем для создания кешированной переменной и принудительного кэша, чтобы всегда принудительно вводить значение кеша при настройке.
Посмотрим, что произойдет для трех возможных вызовов set
:
Без кеша
set(CMAKE_C_COMPILER /usr/bin/clang)
set(CMAKE_CXX_COMPILER /usr/bin/clang++)
При этом вы создаете "нормальную" переменную CMAKE_C(XX)_COMPILER
, которая скрывает переменную кеша с тем же именем. Это означает, что ваш компилятор теперь жестко закодирован в вашей сборке script, и вы не можете дать ему пользовательское значение. Это будет проблемой, если у вас несколько условий сборки с разными компиляторами. Вы можете просто обновить свой script каждый раз, когда хотите использовать другой компилятор, но в первую очередь удаляет значение использования CMake.
Хорошо, тогда обновите кеш...
С кешем
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "")
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "")
Эта версия просто "не работает". Переменная CMAKE_C(XX)_COMPILER
уже находится в кеше, поэтому она не будет обновляться, если вы ее не нажмете.
А... давайте использовать силу, затем...
Силовой кэш
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "" FORCE)
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "" FORCE)
Это почти то же самое, что и "нормальная" версия переменной, единственное отличие заключается в том, что ваше значение будет установлено в кеше, чтобы пользователи могли его видеть. Но любое изменение будет перезаписано командой set
.
Нарушение проверок и инструментов компилятора
В начале процесса настройки CMake делает проверки на компиляторе: это работает? он способен создавать исполняемые файлы? и т.д. Он также использует компилятор для обнаружения связанных инструментов, таких как ar
и ranlib
. Когда вы переопределяете значение компилятора в script, оно "слишком поздно", все проверки и обнаружения уже выполнены.
Например, на моей машине с gcc как компилятором по умолчанию, при использовании команды set
до /usr/bin/clang
, ar
устанавливается на /usr/bin/gcc-ar-7
. При использовании экспорта перед запуском CMake устанавливается значение /usr/lib/llvm-3.8/bin/llvm-ar
.