将多个列表传递给CMake而不使用拆分关键字

时间:2015-01-01 19:15:49

标签: list macros cmake

我需要将几个列表传递给自己的add_executable宏。这些列表用于此宏。代码如下所示:

set(LIST_FILES
  foo.cpp
  bar.cpp
)

set(LIST_LIBRARIES
 libpng
 libfancy
)

add_own_executable(fancyfoobar ${LIST_FILES} ${LIST_LIBRARIES})

# The CMake macro
macro(add_own_executable target files libraries)
  # Do stuff
endmacro()

问题是,target的值为“fancyfoobar”(OK),但参数列表是单个列表项而不是整个列表,意味着files的值为foo.cpp (不好)。 ?libraries的值为bar.cpp(不行)。

有没有办法将“列表”作为列表传递而不是某种方式,即附加项目。我想我必须介绍关键字,所以我可以遍历所有项目并知道文件/库何时开始 - 是否有办法避免这样一个“讨厌的解决方案”:

add_own_executable(fancyfoobar FILES ${LIST_FILES} LIBRARIES ${LIST_LIBRARIES})

3 个答案:

答案 0 :(得分:3)

尝试使用双引号传递列表:

add_own_executable(fancyfoobar "${LIST_FILES}" "${LIST_LIBRARIES}")

答案 1 :(得分:0)

您可以预先知道宏中给出的参数以形成另一个列表,这不是直观的,但它将作为解决方法:

cmake_minimum_required (VERSION 3.0)
project ("dummy" VERSION "1.0" LANGUAGES C)

set (
    _FILES
        hello.c
        world.c
)

macro(show_them)
    set (TMP)
    foreach (ITEM ${ARGV})
        set (TMP "${TMP} ${ITEM}")
    endforeach ()
    message ("- Your list: [${TMP}]")
endmacro ()


show_them (${_FILES})

答案 2 :(得分:0)

由于CMake macros执行单级文本替换,将列表传递给宏的一种方法是实际传递列表名称,然后在宏内部双引用列表。

例如:

你的宏:

macro(add_own_executable target files libs)
  add_executable(${target} ${${files}})
  target_link_libraries(${target} ${${libs}})
endmacro()

用法:

set(LIST_FILES
  foo.cpp
  bar.cpp
)

set(LIST_LIBRARIES
  libpng
  libfancy
)

add_own_executable(fancyfoobar LIST_FILES LIST_LIBRARIES)

在此示例中,调用add_own_executable(fancyfoobar LIST_FILES LIST_LIBRARIES)将等同于

add_executable(fancyfoobar ${LIST_FILES})
target_link_libraries(fancyfoobar ${LIST_LIBRARIES})

因为CMake会针对${target}${files}${libs}的每次出现执行单个文本替换。