如何在 cmake 缓存文件中设置 CLANGS?

How to set CLANGS in a cmake cache file?

我想用 cmake 和 clang 编译 TDengine,管理不同编译器路径和 gcc 或 clang 的 cflags/cxxflags 选项的最佳做法是什么?

我的缓存文件:

set(CMAKE_C_COMPILER CACHE FILEPATH /usr/bin/clang)
set(CMAKE_CXX_COMPILER CACHE FILEPATH /usr/bin/clang++)
set(CFLAGS "-Wno-error=incompatible-pointer-types-discards-qualifiers -Wno-error=implicit-int-float-conversion -Wno-error=implicit-const-int-float-conversion")

CFLAGS 似乎没有传递给编译器。

您可能从某处使用的 makefile 中获得了这个 CFLAG 部分。在 cmake 中 CFLAG 没有特定的相关性,请参阅 the list of cmake variables(未列出)。

恕我直言,组织此类设置的最佳方法是使用包含编译器特定信息的 toolchain files

toolchains/clang.cmake

# clang toolchain

#modified example for cross compiling for raspbery from the cmake documentation

#set(CMAKE_SYSTEM_NAME ...)
#set(CMAKE_SYSTEM_PROCESSOR ...)

#set(CMAKE_SYSROOT ...)
#set(CMAKE_STAGING_PREFIX ...)

set(CMAKE_C_COMPILER /usr/bin/clang)
set(CMAKE_CXX_COMPILER /usr/bin/clang++)

#set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ...)
#set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ...)
#set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ...)
#set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ...)

# set initial compile flags
set(CMAKE_C_FLAGS_INIT -Wno-error=incompatible-pointer-types-discards-qualifiers -Wno-error=implicit-int-float-conversion -Wno-error=implicit-const-int-float-conversion)
set(CMAKE_CXX_FLAGS_INIT ${CMAKE_C_FLAGS_INIT}) # use the same flags for C++?

请注意,几个 set() 命令被注释掉了,因为它们只是必需的,如果您需要交叉编译并指定它们会限制一些 cmake 功能。

toolchains/gnu.cmake

# gnu toolchain

set(CMAKE_C_COMPILER /usr/bin/gcc)
set(CMAKE_CXX_COMPILER /usr/bin/g++)

# different compiler flags here?
set(CMAKE_C_FLAGS_INIT -Wno-error=incompatible-pointer-types-discards-qualifiers -Wno-error=implicit-int-float-conversion -Wno-error=implicit-const-int-float-conversion)
set(CMAKE_CXX_FLAGS_INIT ${CMAKE_C_FLAGS_INIT}) # use the same flags for C++?

这允许您使用 -D CMAKE_TOOLCHAIN_FILE=toolchains/clang.cmake 选项指定 clang 应该与您正在配置的项目一起使用。

您也可以通过 CMakePresets.json file 指定它,它允许您为多个设置定义默认值,包括工具链文件,您只需要 --preset=my-preset-name 选项,如果您想共享,这可能很方便该项目...