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)_COMPILERpo komentarzu Jake'a
Odradzam zastępowanie tej CMAKE_C(XX)_COMPILERwartoś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 setpolecenia, 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)_COMPILERktó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)_COMPILERZmienna 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 setpolecenie.
Ł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 ari 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 setpolecenia to /usr/bin/clang, arjest 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.
/optzamiast/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.