Не перезаписуйте 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
. Таким чином, якщо вам потрібна ще новіша версія, ви не матимете проблем із видаленням попередньої.