Nie nadpisać CMAKE_C_COMPILER
, ale eksport CC
(i CXX
) przed wywołaniem cmake:
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
cmake /path/to/your/project
make
Wywóz musi tylko zrobić raz, po raz pierwszy skonfigurować projektu, wówczas wartości te będą odczytywane z pamięci podręcznej CMake.
UPDATE: dłuższe wyjaśnienie, dlaczego nie nadrzędnymi CMAKE_C(XX)_COMPILER
po komentarzu Jake'a
ja odradzam nadrzędne wartości CMAKE_C(XX)_COMPILER
z dwóch głównych powodów: ponieważ nie będzie grać dobrze z pamięci podręcznej CUpewnij i dlatego, że powoduje przerwanie sprawdzania kompilatora i wykrywanie oprzyrządowania.
Przy użyciu komendy set
, masz trzy opcje:
- bez pamięci podręcznej w celu stworzenia normalnej zmiennej
- z pamięci podręcznej, aby utworzyć w pamięci podręcznej zmienną
- siły cache, aby zawsze wymusić wartość cache podczas konfigurowania
Zobaczmy, co dzieje się na trzech możliwych połączeń do set
:
Bez pamięci podręcznej
set(CMAKE_C_COMPILER /usr/bin/clang)
set(CMAKE_CXX_COMPILER /usr/bin/clang++)
Kiedy ten sposób można utworzyć „normalną” zmienną CMAKE_C(XX)_COMPILER
że ukrywa zmienną cache o tej samej nazwie. Oznacza to, że twój kompilator jest teraz zakodowany na stałe w twoim skrypcie budowania i nie możesz nadać mu niestandardowej wartości. Będzie to problemem, jeśli masz wiele środowisk kompilacji z różnymi kompilatorami. Możesz po prostu zaktualizować swój skrypt za każdym razem, gdy chcesz użyć innego kompilatora, ale to w pierwszej kolejności usuwa wartość używania CMake.
Ok, to, powiedzmy zaktualizować cache ...
Z cache
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "")
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "")
Ta wersja będzie po prostu "nie działa".Zmienna CMAKE_C(XX)_COMPILER
znajduje się już w pamięci podręcznej, więc nie będzie aktualizowana, dopóki jej nie wymusisz.
Ach ... użyjmy siłę, potem ...
Siła cache
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "" FORCE)
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "" FORCE)
To jest prawie taki sam jak w „normalnej” wersji zmiennej, jedyną różnicą jest twój wartość zostanie ustawiona w pamięci podręcznej, aby użytkownicy mogli ją zobaczyć. Ale każda zmiana zostanie nadpisana przez polecenie set
.
Łamanie kontrole kompilatora i oprzyrządowanie
wcześnie w procesie konfiguracji, CUpewnij przeprowadza kontrole na kompilatora: Czy to działa? Czy jest w stanie tworzyć pliki wykonywalne? itp. Używa także kompilatora do wykrywania powiązanych narzędzi, takich jak ar
i ranlib
. Kiedy nadpisujesz wartość kompilatora w skrypcie, jest "za późno", wszystkie kontrole i detekcje są już wykonane.
Na przykład, na moim komputerze z gcc jako podstawowy kompilator, przy użyciu komendy set
do /usr/bin/clang
, ar
jest ustawiony na /usr/bin/gcc-ar-7
. Jeśli używasz eksportu przed uruchomieniem CMake, jest on ustawiony na /usr/lib/llvm-3.8/bin/llvm-ar
.
Tak, to działa! Dzięki @Guillaume! – tidy
Odpowiednik dla leniwego, jeśli odpowiednie kompilatory są ustawione w $ PATH: > eksport CC = 'który gcc' > eksport CXX =' który g ++ ' – gerardw
Odpowiednik dla leniwych, jeśli odpowiednie kompilatory są ustawione w twoim $ ŚCIEŻKA: 'export CC = \' który gcc \ ' eksport CXX = \' który g ++ \ '' – gerardw