2016-02-12 43 views
2

我想通過cmake的add_compile_options將「複合」選項傳遞給編譯器。使用cmake傳遞複合編譯器選項

也就是說,涉及兩個(或更多)標誌的選項必須以特定的順序傳遞,並且即使它們已經傳遞給編譯器,也不會忽略任何標誌。

一個例子就是所有必須通過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

第一次聽說附加到'CMAKE_CXX_FLAGS'的手冊是* antipattern *。如果它看起來像正確的解決方案。 – Tsyvarev

+0

'add_compile_options(「 - mllvm -XYZ; -mllvm -ABC」)'是否正常工作? – arrowd

+0

@arrowd沒有,因爲它不修剪引號「」,所以它增加了例如'鐺++ ....「-mllvm -XYZ; -mllvm -ABC」'這是無效的。 – gnzlbg

回答

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"的問題是,鐺得到這些參數作爲兩個太也就是說,在鏗鏘的main()argv[i]"-mllvm -XYZ"串並鐺把它當作一個標誌。

唯一的解決辦法,我可以看到的是使用CMAKE_{C,CXX}_FLAGS設置這些標誌。作爲@Tsyvarev說,這是完全可以使用這個變量。