Nie nadpisuj CMAKE_C_COMPILER
, ale eksportuj 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
Eksport należy wykonać tylko raz, przy pierwszej konfiguracji projektu, a następnie te wartości zostaną odczytane z pamięci podręcznej CMake.
AKTUALIZACJA : dłuższe wyjaśnienie, dlaczego nie zastąpić CMAKE_C(XX)_COMPILER
po komentarzu Jake'a
Odradzam zastępowanie tej CMAKE_C(XX)_COMPILER
wartości z dwóch głównych powodów: ponieważ nie działa dobrze z pamięcią podręczną CMake i ponieważ przerywa sprawdzanie kompilatora i wykrywanie narzędzi.
Korzystając z set
polecenia, masz trzy opcje:
- bez pamięci podręcznej, aby utworzyć normalną zmienną
- z pamięcią podręczną, aby utworzyć zmienną w pamięci podręcznej
- wymuś pamięć podręczną, aby zawsze wymusić wartość pamięci podręcznej podczas konfigurowania
Zobaczmy, co się stanie w przypadku trzech możliwych wywołań set
:
Bez pamięci podręcznej
set(CMAKE_C_COMPILER /usr/bin/clang)
set(CMAKE_CXX_COMPILER /usr/bin/clang++)
Robiąc to, tworzysz „normalną” zmienną, CMAKE_C(XX)_COMPILER
która ukrywa zmienną pamięci podręcznej o tej samej nazwie. Oznacza to, że Twój kompilator jest teraz zakodowany na stałe w skrypcie kompilacji i nie możesz nadać mu niestandardowej wartości. Będzie to problem, jeśli masz wiele środowisk kompilacji z różnymi kompilatorami. Możesz po prostu zaktualizować skrypt za każdym razem, gdy chcesz użyć innego kompilatora, ale to przede wszystkim usuwa wartość używania CMake.
Ok, więc zaktualizujmy pamięć podręczną ...
Z cache
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "")
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "")
Ta wersja po prostu „nie będzie działać”. CMAKE_C(XX)_COMPILER
Zmienna jest już w pamięci podręcznej, dzięki czemu nie będą aktualizowane, chyba że zmusi go.
Ach ... użyjmy siły, więc ...
Wymuś pamięć podręczną
set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "" FORCE)
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "" FORCE)
Jest to prawie to samo, co „normalna” wersja zmiennej, jedyną różnicą jest to, że wartość zostanie ustawiona w pamięci podręcznej, aby użytkownicy mogli ją zobaczyć. Ale każda zmiana zostanie nadpisana przez set
polecenie.
Łamanie kontroli i narzędzi kompilatora
Na początku procesu konfiguracji CMake sprawdza kompilator: czy to działa? Czy jest w stanie produkować pliki wykonywalne? itd. Używa również kompilatora do wykrywania powiązanych narzędzi, takich jak ar
i ranlib
. Kiedy przesłonisz wartość kompilatora w skrypcie, jest „za późno”, wszystkie sprawdzenia i wykrycia są już wykonane.
Na przykład, na moim komputerze z domyślnym kompilatorem gcc, gdy używasz set
polecenia to /usr/bin/clang
, ar
jest ustawiony na /usr/bin/gcc-ar-7
. W przypadku używania eksportu przed uruchomieniem CMake jest ustawiony na /usr/lib/llvm-3.8/bin/llvm-ar
.
/opt
zamiast/usr/local
. Najlepiej/opt/gcc-x.y.z
. W ten sposób, jeśli potrzebujesz jeszcze nowszej wersji, nie będziesz mieć problemów z odinstalowaniem poprzedniej.