2012-07-21 24 views
25

CMake的名單基本上只是分號分隔的字符串,但如果你通過這樣一個變量的命令時,它得到擴展到多個參數 - 例如,如何正確地將標誌的CMake列表(分號-sep)傳遞給set_target_properties?

set(FLAGS f1 f2 f3) 
# now FLAGS == 'f1;f2;f3' 
add_custom_command(
    ... 
    COMMAND my_cmd ${FLAGS} 
    ... 
) 

將正確調用my_cmd f1 f2 f3

現在,如果我這樣做與

set_target_properties(
    myTarget PROPERTIES 
    LINK_FLAGS "${LD_FLAGS}" 
) 

擴張不會發生,我結束了與包含分號單LD_FLAG - 無用的,而不是擴大它變成一個空格分隔的字符串。

有什麼辦法可以讓我把一個列表傳遞給LINK_FLAGS屬性(或任何屬性)時,它會被擴展爲多個參數而不僅僅是一個?

感謝, 丹

回答

13

我不認爲set_target_properties可以自動完成擴張,但您可以使用string (REPLACE ...)擴大列表爲空格分隔字符串:

string (REPLACE ";" " " LD_FLAGS_STR "${LD_FLAGS}") 
set_target_properties(
    myTarget PROPERTIES 
    LINK_FLAGS "${LD_FLAGS_STR}" 
) 
+8

這真的是最好的方法是什麼?爲什麼CMake設計爲使用與其自己的'set_target_properties'命令不兼容的列表格式? – 2015-12-01 00:06:29

+0

這種技術的主要問題一般在於,如果任何標誌包含空格,它們將導致問題。如果可能的話(例如,如果包含外部提供的文件名,其中可能包含空格),將需要進行一些轉義以保留參數中的空格。 – 2016-06-01 16:35:59

+1

B +++ T。它不起作用。 'string(REPLACE「;」「」DEST $ {SRC})'用一個空字符串替換分號。只有這樣才能工作:'foreach(OPT $ {LD_FLAGS})set(LINK_FLAGS「$ {LINK_FLAGS} $ {OPT}」) endforeach()'。這將是非常有趣的,除非這個C++ + p不是當今最流行的構建工具。 – Ethouris 2016-10-19 16:51:37

2

我使用它像串

set(FLAGS " f1 f2 f3")

注意,在前面的空間,它讓你連接其他標誌集。

對於更復雜的項目,而不是如果 - 別人的,你也可以做一個雙擴張招:

set(GCC_FLAGS " -Wl,--relax") 
set(DIAB_FLAGS " -tPPCE500ES:cross") 
set(MSVC_FLAGS " /RAINBOW_CRAP) 
# ... 
# ...LINUX_FLAGS, WINDOWS_FLAGS, etc... 


set_target_properties(
    myTarget PROPERTIES 
    LINK_FLAGS "${${COMPILER}_FLAGS} ${${SYSTEM}_FLAGS}" 
) 

# COMPILER and SYSTEM is set somewhere else, in toolchain files for example 
5

對於使用cmake的列表,列表中,使用

${LD_FLAG} 

對於使用一個cmake列表作爲字符串,(即列表項用';'分隔),使用

"${LD_FLAG}" 

所以在你的情況下,只要刪除「」應該是足夠的。

+0

這是正確的解決方案,謝謝 – 2017-09-15 13:50:59

+0

奇怪,但這一個並沒有爲我工作,版本3.9 :('set_target_properties調用參數數量不正確.' – Andry 2017-10-21 19:26:34

+0

@Andry什麼是它顯示如果你插入「MESSAGE(」$ {LD_FLAG}「)」?「 – 2017-11-07 01:05:03

5

set_property命令是專爲這個

http://www.cmake.org/cmake/help/v3.0/command/set_property.html

set_property(TARGET tgt PROPERTY LINK_FLAGS foo bar) 
+0

誰說這不是? – steveire 2015-03-16 18:56:26

+0

Steveire - 我錯誤地認爲它不在2.8.11中,因爲我試圖將'set_target_properties(foo ...)'改爲'set_properties(TARGET foo ......)'但是現在我看到p有區別命令名稱的虛擬化(複數與單數)。正確的名稱是'set_property'(以'y'結尾)。 – 2015-03-16 20:47:59

+0

是的,你可以用這個答案顯示的方式使用set_property(),但CMake將LINK_FLAGS視爲一個純字符串,而不是一個列表 - 這意味着在這個答案中,鏈接傳遞一個參數,'foo; bar'。這很不幸。同樣有趣的是,現在有一個'COMPILE_OPTIONS'屬性是一個列表,但舊的'COMPILE_FLAGS'是一個純字符串。 – 2016-06-01 16:23:26

相關問題