У меня есть несколько проектов, созданных с использованием CMake, и я хотел бы иметь возможность легко переключаться между использованием GCC или Clang / LLVM для их компиляции. Я считаю (пожалуйста, поправьте меня, если я ошибаюсь!), Что для использования Clang мне нужно установить следующее:
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")
Существует ли простой способ переключения между этими переменными и переменными GCC по умолчанию, предпочтительно в виде общесистемного изменения, а не конкретного проекта (т. Е. Не просто добавления их в CMakeLists.txt проекта)?
Кроме того, необходимо ли использовать llvm-*
программы, а не системные значения по умолчанию при компиляции с использованием clang вместо gcc? Какая разница?
CMAKE_USER_MAKE_RULES_OVERRIDE
работ. Кажется, что файл игнорируется (то есть, несмотря на то,CMAKE_C_FLAGS_RELEASE
что установлен-O4
в файле переопределений, он показывает значение по умолчанию-O3 -DNDEBUG
в cmake).src/build-clang
каталоге, переопределения игнорируются.CC
иCXX
переменными, это может быть потому , что вам нужно удалить все файлы из каталога сборки первыми.rm CMakeCache.txt
не может быть существенным.Общесистемные изменения C ++ в Ubuntu:
Напечатает что-то вроде этого:
Затем просто выберите Clang ++.
источник
There is only one alternative in link group cc (providing /usr/bin/cc): /usr/bin/gcc
Вы можете использовать команду option:
а затем оберните настройки компилятора clang в if () s:
Таким образом, он отображается как опция cmake в инструментах настройки GUI.
Чтобы сделать его общесистемным, вы, конечно, можете использовать переменную окружения в качестве значения по умолчанию или остаться с ответом Ферруччо.
источник
cmake -DCMAKE_COMPILER_DEFINITIONS=MyLlvmDefinitions.cmake
.Изменение всей системы C в Ubuntu:
sudo update-alternatives --config cc
Общесистемные изменения C ++ в Ubuntu:
sudo update-alternatives --config c++
Для каждого из вышеперечисленных нажмите Номер выбора (1) и Enter, чтобы выбрать Clang:
источник
/opt/clang-llvm-3.5/
sudo update-alternatives --install /usr/bin/c++ c++ /opt/clang-llvm-3.5/bin/clang++ 30
Для этого вы можете использовать механизм файлов цепочки инструментов cmake, см., Например, здесь . Вы пишете файл цепочки инструментов для каждого компилятора, содержащий соответствующие определения. Во время настройки вы запускаете, например,
и вся информация компилятора будет установлена во время вызова project () из файла toolchain. Хотя в документации упоминается только в контексте кросс-компиляции, он работает также для разных компиляторов в одной системе.
источник
Вам определенно не нужно использовать различные программы llvm-ar и т.д:
Они предназначены для работы во внутреннем формате llvm и, как таковые, бесполезны для сборки вашего приложения.
В качестве примечания -O4 вызовет LTO в вашей программе, который вам может не понадобиться (это значительно увеличит время компиляции), и по умолчанию clang перейдет в режим c99, так что флаг также не обязательно нужен.
источник
Если по умолчанию выбран компилятор
cmake
isgcc
и вы установили егоclang
, вы можете использовать простой способ компиляции проекта с помощьюclang
:источник
Согласно помощи
cmake
:Вы сможете создавать файлы, как
gcc_compiler.txt
иclang_compiler.txt
включать все относительные конфигурации в синтаксис CMake.Пример Clang (clang_compiler.txt):
Затем запустите его как
GCC:
Clang:
источник
Вы можете использовать следующий синтаксис:
$ENV{environment-variable}
в вашихCMakeLists.txt
к переменным окружения доступа. Вы можете создавать сценарии, которые соответствующим образом инициализируют набор переменных среды и просто содержат ссылки на эти переменные в вашихCMakeLists.txt
файлах.источник
-DCMAKE_C_COMPILER ...
etc?CMakeLists.txt
каждого проекта и запроса новых переменных. Я надеялся, что будет удобный способ сделать это в масштабе всей системы, без необходимости изменять какие-либо файлы проекта. Похоже на прохождениеCMAKE_TOOLCHAIN_FILE
.