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

时间:2016-02-12 14:39:26

标签: c++ cmake clang llvm

我想通过"复合"使用cmake' s 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传递这些选项的惯用方法是什么?

1 个答案:

答案 0 :(得分:2)

您在此处观察到的不是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"。问题是clang也将这些论点视为两个。也就是说,clang的argv[i]中的main()指向"-mllvm -XYZ"字符串并且clang将其视为单个标记。

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