У нас есть набор межплатформенных сценариев сборки CMake , и мы поддерживаем сборку с помощью Visual C ++ и GCC .
Мы пробуем Clang , но я не могу понять, как проверить, является ли компилятор Clang с нашим сценарием CMake.
Что я должен проверить, чтобы увидеть, является ли компилятор Clang или нет? В настоящее время мы используем MSVC
и CMAKE_COMPILER_IS_GNU<LANG>
для тестирования Visual C ++ и GCC, соответственно.
__GNUC__
и другим_MSC_VER
, но он не может использовать те же программы, что и любой компилятор. Обнаружение LLVM Clang и Apple Clang имеет решающее значение для обеспечения того, чтобы код компилировался и выполнялся как ожидалось. Я так устал от работы с BS Clang, что мы просто ломаем компиляцию на Windows . Мы приняли политику разрешать пользователям жаловаться в LLVM, чтобы разработчики Clang меняли свое поведение. Также смотрите Как сказать Clang перестать притворяться другими компиляторами?Ответы:
Надежной проверкой является использование
CMAKE_<LANG>_COMPILER_ID
переменных. Например, чтобы проверить компилятор C ++:Они также работают правильно, если используется оболочка компилятора, такая как ccache .
Начиная с CMake 3.0.0
CMAKE_<LANG>_COMPILER_ID
значение для Clang, предоставляемого Apple, теперьAppleClang
. Чтобы проверить и Clang, предоставленный Apple, и обычный Clang, используйте следующее условие if:Также см. Описание политики AppleClang .
В CMake 3.15 добавлена поддержка как clang-cl, так и обычного внешнего интерфейса clang. Вы можете определить интерфейсный вариант, проверив переменную
CMAKE_CXX_COMPILER_FRONTEND_VARIANT
:источник
CMAKE_CXX_COMPILER_ID
переменная доступна только после командыproject(Foo CXX)
.if (CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") ... endif()
AppleClang
конкретно, @sakra указывает, чтоcmake 3.0.0
выпущеноAppleClang
. Однако, просто потому, чтоcmake --version
отчеты равны или выше, недостаточно - вы должныcmake_minimum_required(VERSION 3.0.0)
использовать3.0.0
стандарты!Исходный код движка OGRE 3D использует следующую проверку :
источник
export CXX="ccache clang++"
)if ("${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}" MATCHES ".*clang")
обращаться с делом ccache.${CMAKE_CXX_COMPILER} == /Library/Developer/CommandLineTools/usr/bin/c++
. Принятый ответ работает.Просто, чтобы избежать ошибок, я использую сравнение без учета регистра, например:
Для создания регулярного выражения без учета
MATCHES
регистра я попробовал все здесь безуспешно (похоже, не поддерживается в CMake).источник
Это немного более подробный ответ для новичков cmake, модифицированный из ответа Сакры, просто добавьте следующие строки
CMakeLists.txt
:Затем запустите
cmake .
в папке, где лежит CMakeLists.txt. Затем вы увидите кучу результатов вместе с вашим ответом.источник