使用 cmake 传递复合编译器选项

Pass compound compiler options using cmake

本文关键字:编译器 选项 复合 cmake 使用      更新时间:2023-10-16

我正在尝试使用 cmake 的add_compile_options将"复合"选项传递给编译器。

也就是说,涉及两个(或多个)标志的选项必须按特定顺序传递,并且即使它们已经传递给编译器,也不能省略任何标志。

一个例子是必须通过 clang 传递到 llvm 的所有 llvm 选项,例如 -mllvm -ABC -mllvm -XYZ -mllvm ...

我宁愿不使用CMake的反模式set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mllvm -ABC")而是使用像check_cxx_compiler_flag(flag available) + add_compile_option(flag)这样可移植的东西。

但是,add_compile_options(-mllvm -XYZ -mllvm -ABC)失败,因为-mllvm选项被缓存并且只传递一次,因此传递-mllvm -XYZ -ABC会导致错误。

此外,使用引号 " 无济于事,因为引号也会被传递(即它们没有被剥离),这也会导致错误。

使用 CMake 传递这些选项的惯用方法是什么?

你在这里观察到的不是CMake保留引号。

CMake 有特殊类型的字符串 - 列表。列表是一个字符串,其中元素用 ";" 分隔。当你写somefunction(A B C)时,你实际上是构造一个字符串"A;B;C",这也是一个包含 3 个元素的列表。但是当你写somefunction("A B C")时,你传递的是一个普通的字符串。

现在,当你编写add_compile_options("-mllvm -XYZ;-mllvm -ABC")时,CMake 确实纠正了事情(在某种意义上)——它传递编译器两个命令行参数,"-mllvm -XYZ " 和 "-mllvm -ABC" 。问题是,叮当也把这些论点当作两个。也就是说,叮当main()中的argv[i]指向"-mllvm -XYZ"弦,叮当将其视为单旗。

我能看到的唯一解决方案是使用 CMAKE_{C,CXX}_FLAGS 来设置这些标志。正如@Tsyvarev所说,使用此变量是完全可以的。

从 CMake 3.12 开始,您现在可以使用以下语法:

add_compile_options(
    "SHELL:-mllvm -XYZ"
    "SHELL:-mllvm -ABC"
)

这种可能性记录在这里:https://cmake.org/cmake/help/latest/command/target_compile_options.html#option-de-duplication