Решил изменить сборку с идущего по умолчанию GCC на Clang для CMake проекта. Сходу наткнулся на граблю. Стандартная команда CMake:
set(CMAKE_CXX_COMPILER clang++)
set(CMAKE_C_COMPILER clang)
set(CMAKE_C_COMPILER clang)
Вводит его в вечный цикл, который выглядит как-то так:
You have changed variables that require your cache to be deleted.
Configure will be re-run and you may have to reset some variables.
The following variables have changed:
CMAKE_C_COMPILER= /usr/bin/gcc
CMAKE_CXX_COMPILER= /usr/bin/c++
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Checking whether C compiler has -isysroot
-- Checking whether C compiler has -isysroot - yes
-- Checking whether C compiler supports OSX deployment target flag
-- Checking whether C compiler supports OSX deployment target flag - yes
…и так до бесконечности…
Configure will be re-run and you may have to reset some variables.
The following variables have changed:
CMAKE_C_COMPILER= /usr/bin/gcc
CMAKE_CXX_COMPILER= /usr/bin/c++
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Checking whether C compiler has -isysroot
-- Checking whether C compiler has -isysroot - yes
-- Checking whether C compiler supports OSX deployment target flag
-- Checking whether C compiler supports OSX deployment target flag - yes
…и так до бесконечности…
Лечится не удобно, но юзабельно:
export CXX=/usr/bin/clang++
export CC=/usr/bin/clang
cmake CMakeLists.txt
make
export CC=/usr/bin/clang
cmake CMakeLists.txt
make
А если попробовать:
set(CMAKE_C_COMPILER clang CACHE STRING “c compiler” FORCE)?
По идее должно помочь т.к. cmake после изменения переменной CMAKE_C_COMPILER запускает скрипты заново чтобы провести валидацию нового установленного компилера, а занесение в кэш этого нового значения должно позволить выйти из рекурсии т.к. при повторном перезапуске скрипта set() вЫчитает значение из кэша, а не спровоцирует новую рекурсию по проверке компилятора.
Если не ошибаюсь, где-то в документации сказано, что изменение переменных CMAKE_C_COMPILER и CMAKE_CXX_COMPILER должно быть до любой команды project() (в реальности, делать это лучше как можно раньше, т.к. и другие команды влияют на это поведение).