我想通过"复合"使用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传递这些选项的惯用方法是什么?
答案 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所说,使用这个变量是完全可以的。