Mam wiele projektów zbudowanych przy użyciu CMake i chciałbym móc łatwo przełączać się między nimi za pomocą GCC lub Clang / LLVM w celu ich skompilowania. Wierzę (popraw mnie, jeśli się mylę!), Że aby użyć Clanga, muszę ustawić następujące ustawienia:
SET (CMAKE_C_COMPILER "/usr/bin/clang")
SET (CMAKE_C_FLAGS "-Wall -std=c99")
SET (CMAKE_C_FLAGS_DEBUG "-g")
SET (CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG")
SET (CMAKE_C_FLAGS_RELEASE "-O4 -DNDEBUG")
SET (CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")
SET (CMAKE_CXX_COMPILER "/usr/bin/clang++")
SET (CMAKE_CXX_FLAGS "-Wall")
SET (CMAKE_CXX_FLAGS_DEBUG "-g")
SET (CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELEASE "-O4 -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
SET (CMAKE_AR "/usr/bin/llvm-ar")
SET (CMAKE_LINKER "/usr/bin/llvm-ld")
SET (CMAKE_NM "/usr/bin/llvm-nm")
SET (CMAKE_OBJDUMP "/usr/bin/llvm-objdump")
SET (CMAKE_RANLIB "/usr/bin/llvm-ranlib")
Czy istnieje prosty sposób przełączania między tymi a domyślnymi zmiennymi GCC, najlepiej jako zmiana ogólnosystemowa, a nie specyficzna dla projektu (tj. Nie tylko dodanie ich do pliku CMakeLists.txt projektu)?
Czy konieczne jest także używanie llvm-*
programów zamiast domyślnych ustawień systemu podczas kompilacji przy użyciu clang zamiast gcc? Co za różnica?
CMAKE_USER_MAKE_RULES_OVERRIDE
prac. Wygląda na to, że plik jest ignorowany (tzn. PomimoCMAKE_C_FLAGS_RELEASE
ustawienia-O4
w pliku przesłonięć, pokazuje domyślną wartość-O3 -DNDEBUG
w cmake).src/build-clang
katalogu przesłonięcia są ignorowane.CC
iCXX
, przyczyną może być to, że musisz najpierw usunąć wszystkie pliki z katalogu kompilacji.rm CMakeCache.txt
może nie być poważny.Systemowa zmiana C ++ w Ubuntu:
Wydrukuje coś takiego:
Następnie wybierz clang ++.
źródło
There is only one alternative in link group cc (providing /usr/bin/cc): /usr/bin/gcc
Możesz użyć polecenia Option:
a następnie zawiń ustawienia kompilatora clang w if () s:
W ten sposób jest wyświetlany jako opcja cmake w narzędziach do konfiguracji GUI.
Aby uczynić go ogólnosystemowym, możesz oczywiście użyć zmiennej środowiskowej jako wartości domyślnej lub pozostać przy odpowiedzi Ferruccio.
źródło
cmake -DCMAKE_COMPILER_DEFINITIONS=MyLlvmDefinitions.cmake
.Systemowa zmiana C w Ubuntu:
sudo update-alternatives --config cc
Systemowa zmiana C ++ w Ubuntu:
sudo update-alternatives --config c++
Dla każdego z powyższych naciśnij Numer wyboru (1) i Enter, aby wybrać Clang:
źródło
/opt/clang-llvm-3.5/
sudo update-alternatives --install /usr/bin/c++ c++ /opt/clang-llvm-3.5/bin/clang++ 30
W tym celu można użyć mechanizmu pliku cmake w pliku toolchain, patrz np . Tutaj . Piszesz plik łańcucha narzędzi dla każdego kompilatora zawierający odpowiednie definicje. W czasie konfiguracji uruchamiasz np
a wszystkie informacje kompilatora zostaną ustawione podczas wywołania projektu () z pliku toolchain. Chociaż w dokumentacji wspomniano tylko w kontekście kompilacji krzyżowej, działa ona również w przypadku różnych kompilatorów w tym samym systemie.
źródło
Na pewno nie musisz używać różnych programów llvm-ar itp .:
Są one przystosowane do pracy w wewnętrznym formacie llvm i jako takie nie są przydatne do budowania aplikacji.
Uwaga: -O4 wywoła LTO w twoim programie, którego możesz nie chcieć (znacznie wydłuży to czas kompilacji) i powróci domyślnie do trybu c99, aby flaga również nie była potrzebna.
źródło
Jeśli domyślnym kompilatorem wybranym przez
cmake
jestgcc
i masz zainstalowanyclang
, możesz użyć łatwego sposobu na kompilację swojego projektu zclang
:źródło
Według pomocy
cmake
:Umożliwisz tworzenie plików podobnych
gcc_compiler.txt
iclang_compiler.txt
obejmujących całą konfigurację względną w składni CMake.Przykład Clang (clang_compiler.txt):
Następnie uruchom go jako
GCC:
Szczęk:
źródło
Możesz użyć składni:
$ENV{environment-variable}
w swoim,CMakeLists.txt
aby uzyskać dostęp do zmiennych środowiskowych. Możesz tworzyć skrypty, które odpowiednio inicjują zestaw zmiennych środowiskowych i po prostu zawierają odniesienia do tych zmiennych w twoichCMakeLists.txt
plikach.źródło
-DCMAKE_C_COMPILER ...
etc?CMakeLists.txt
każdego projektu i wysłania zapytania o nowe zmienne. Miałem nadzieję, że będzie to wygodny sposób, aby zrobić to w całym systemie, bez konieczności modyfikowania plików projektu. Podobne do zaliczania aCMAKE_TOOLCHAIN_FILE
.