Не перезаписывать 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
которая скрывает одноименную переменную кэша. Это означает, что ваш компилятор теперь жестко запрограммирован в вашем сценарии сборки, и вы не можете указать ему собственное значение. Это будет проблемой, если у вас несколько сред сборки с разными компиляторами. Вы можете просто обновлять свой скрипт каждый раз, когда хотите использовать другой компилятор, но это в первую очередь лишает смысла использование 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
. Когда вы переопределяете значение компилятора в скрипте, становится «слишком поздно», все проверки и обнаружения уже выполнены.
Например, на моей машине с GCC как компилятор по умолчанию, при использовании set
команды /usr/bin/clang
, ar
устанавливается в /usr/bin/gcc-ar-7
. При использовании экспорта перед запуском CMake для него установлено значение /usr/lib/llvm-3.8/bin/llvm-ar
.
/opt
а не в/usr/local
. Желательно/opt/gcc-x.y.z
. Таким образом, если вам понадобится еще более новая версия, у вас не возникнет проблем с удалением предыдущей.