我需要将几个列表传递给自己的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})
答案 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}
的每次出现执行单个文本替换。