CMake & Clang

Решил изменить сборку с идущего по умолчанию GCC на Clang для CMake проекта. Сходу наткнулся на граблю. Стандартная команда CMake:

set(CMAKE_CXX_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
…и так до бесконечности…

Лечится не удобно, но юзабельно:

export CXX=/usr/bin/clang++
export CC=/usr/bin/clang
cmake CMakeLists.txt
make

2 Comments CMake & Clang

  1. stunpix

    А если попробовать:
    set(CMAKE_C_COMPILER clang CACHE STRING “c compiler” FORCE)?

    По идее должно помочь т.к. cmake после изменения переменной CMAKE_C_COMPILER запускает скрипты заново чтобы провести валидацию нового установленного компилера, а занесение в кэш этого нового значения должно позволить выйти из рекурсии т.к. при повторном перезапуске скрипта set() вЫчитает значение из кэша, а не спровоцирует новую рекурсию по проверке компилятора.

    Reply
  2. anonymous

    Если не ошибаюсь, где-то в документации сказано, что изменение переменных CMAKE_C_COMPILER и CMAKE_CXX_COMPILER должно быть до любой команды project() (в реальности, делать это лучше как можно раньше, т.к. и другие команды влияют на это поведение).

    Reply

Leave a Reply