如何正确地将标记的CMake列表(semicolon-sep)传递给set_target_properties?

时间:2012-07-21 18:39:45

标签: cmake

CMake列表基本上只是以分号分隔的字符串,但是如果将这样的变量传递给命令,它会扩展为多个参数 - 例如,

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属性(或任何属性)时,它会扩展为多个参数而不只是一个?

谢谢, 丹

5 个答案:

答案 0 :(得分:16)

我认为set_target_properties不能自动执行扩展,但您可以使用string (REPLACE ...)将列表扩展为以空格分隔的字符串:

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

答案 1 :(得分:6)

要将cmake List用作列表,请使用

${LD_FLAG}

如果将cmake列表用作字符串,(列表项目用';')分隔,请使用

"${LD_FLAG}"

所以在你的情况下,只需删除""应该足够了。

答案 2 :(得分:5)

set_property命令是为此

设计的

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

set_property(TARGET tgt PROPERTY LINK_FLAGS foo bar)

答案 3 :(得分:1)

我像字符串一样使用它

set(FLAGS " f1 f2 f3")

注意前面的空格,它允许你连接其他标志集。

对于更复杂的项目,而不是if-elses,你也可以做双扩展技巧:

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

答案 4 :(得分:0)

在cmake 3.x中,有几种方法

顶层CMakeLists.txt文件如下所示:

# The name of the included file could be anything,
# it doesn't have to be called CMakeLists.txt
include(foo/CMakeLists.txt)
include(bar/CMakeLists.txt)

add_executable(myApp ${myApp_SOURCES})

子目录文件的结构如下:

list(APPEND myApp_SOURCES
    ${CMAKE_CURRENT_LIST_DIR}/foo.cpp
    ${CMAKE_CURRENT_LIST_DIR}/foo_p.cpp
)

Enhanced source file handling with target_sources()