`CMAKE_C_COMPILER_ID MATCHES "Clang|GNU"` 是如何工作的?

How `CMAKE_C_COMPILER_ID MATCHES "Clang|GNU"` works?

我想使用 Clang 作为首选构建我的项目,如果 Clang 不存在,并通过 GCC 编译它,但在我的实践中,Cmake 总是选择 GCC。

cmake_minimum_required (VERSION 2.8.12)
project (leptjson_test C)

if (CMAKE_C_COMPILER_ID MATCHES "Clang|GNU")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -pedantic -fsanitize=address -fsanitize=undefined -Wall")
endif()

add_library(leptjson leptjson.c)
add_executable(leptjson_test test.c)
target_link_libraries(leptjson_test leptjson)

How CMAKE_C_COMPILER_ID MATCHES "Clang|GNU" works?

它将存储在 CMAKE_C_COMPILER_ID 中的字符串与扩展 regex 表达式 Clang|GNU.

相匹配

I want to build my project using Clang as first choice, if Clang doesn't exist, and compile it by GCC

查看 CMakeDetermineCCompiler.cmakeCMAKE_C_COMPILER_LIST 设置为您的编译器列表。你可以这样做:

cmake_minimum_required(...)
if(LEPTJSON_DEV)  # my recommendation
    set(CMAKE_C_COMPILER_LIST clang gcc)
endif()
project(...)

我建议使用一些变量保护您的自定义设置,这样其他人也可以在没有您的设置的情况下使用您的库。