2010-12-03 35 views
32

如何预先自动使用通用路径前缀列出列表上的所有文件名?例如有文件中的CMakeLists.txt列表:如何用共同路径预先列出列表上的所有文件名?

SET(SRC_FILES foo1.cpp foo2.cpp) 

我想获得一个列表,是相同的:

${CMAKE_CURRENT_SOURCE_DIR}/foo1.cpp ${CMAKE_CURRENT_SOURCE_DIR}/foo2.cpp 

我需要这在PARENT_SCOPE上下文中使用的文件名,例如

SET(FILES_TO_TRANSLATE ${FILES_TO_TRANSLATE} ${SRC_FILES} PARENT_SCOPE) 

这样,一个CMakeFiles.txt另一个目录中仍然可以找到这些文件。

从本质上说,我希望这样的事情(伪代码):

SET(FILES_TO_TRANSLATE PREPEND_ALL_NAMES(${CMAKE_CURRENT_SOURCE_DIR} ${SRC_FILES}) PARENT_SCOPE) 

这是很容易可行的,或者我有用户“foreach”循环创建文件的新名单?

回答

1

您需要使用foreach循环。但是如果你在你的项目的几个部分使用它,你可能想创建一个函数或宏。

-1

我假设你想要一个绝对文件名,因为你正在预先设置$ {CMAKE_CURRENT_SOURCE_DIR}。如果您正在使用FILE(GLOB <VAR> <PATTER>),所有的文件将已经绝对路径:

file(GLOB_RECURSE SOURCE_FILES src/*.cpp) 

查看为什么不使用GLOB添加源文件的comments CMake in documentation

19

以下功能可能是你想要的。

FUNCTION(PREPEND var prefix) 
    SET(listVar "") 
    FOREACH(f ${ARGN}) 
     LIST(APPEND listVar "${prefix}/${f}") 
    ENDFOREACH(f) 
    SET(${var} "${listVar}" PARENT_SCOPE) 
ENDFUNCTION(PREPEND) 

要使用它,

PREPEND(FILES_TO_TRANSLATE ${CMAKE_CURRENT_SOURCE_DIR} ${SRC_FILES}) 
+0

尽管这个作品中,函数的声明是误导,因为它只是列出了2个函数参数VAR,前缀。然而,在实践中,用户必须通过$ {CMAKE_CURRENT_SOURCE_DIR} $ {SRC_FILES}作为前缀参数。 – bergercookie 2016-11-17 21:30:39

+0

确实需要第三个参数。但是,您需要将第三个参数添加到FOREACH列表的前面。 – 2016-11-21 00:38:47

9
string(REGEX REPLACE "([^;]+)" "ANYPREFIX/\\1.cpp" outputlist "${inputlist}") 
相关问题