如何使用公共路径在列表中添加所有文件名?

Paw*_*ski 39 cmake

如何自动在列表中添加公共路径前缀的所有文件名?例如,在CMakeLists.txt中有一个文件列表:

SET(SRC_FILES foo1.cpp foo2.cpp)
Run Code Online (Sandbox Code Playgroud)

我想得到一个与此相当的列表:

${CMAKE_CURRENT_SOURCE_DIR}/foo1.cpp ${CMAKE_CURRENT_SOURCE_DIR}/foo2.cpp
Run Code Online (Sandbox Code Playgroud)

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

SET(FILES_TO_TRANSLATE ${FILES_TO_TRANSLATE} ${SRC_FILES} PARENT_SCOPE)
Run Code Online (Sandbox Code Playgroud)

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

从本质上讲,我期待这样的事情(伪代码):

SET(FILES_TO_TRANSLATE PREPEND_ALL_NAMES(${CMAKE_CURRENT_SOURCE_DIR} ${SRC_FILES}) PARENT_SCOPE)
Run Code Online (Sandbox Code Playgroud)

这是否容易实现,或者我是否必须使用"foreach"循环来创建新的文件列表?

cod*_*-gs 28

CMake 3.12添加了列表变换器 - 其中一个变换器是PREPEND.因此,可以使用以下内联来预先添加列表中的所有条目:

list(TRANSFORM FILES_TO_TRANSLATE PREPEND ${CMAKE_CURRENT_SOURCE_DIR})

... FILES_TO_TRANSLATE列表的变量名称在哪里.

更多信息可以在CMake文档中找到.

  • 如果您使用它,请确保在 CMakeLists.txt 文件中添加 `cmake_minimum_required( VERSION 3.12 )`。 (2认同)
  • 现在版本3.15甚至[直接添加了list(PREPEND ...)命令](https://cmake.org/cmake/help/latest/command/list.html#prepend)。 (2认同)
  • @ComicSansMS`list(PREPEND ...)`,根据您链接的文档,*将元素插入列表中的第0个位置*。这不能在每个项目前添加内容。 (2认同)

Din*_*hen 27

以下功能可能是您想要的.

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

要使用它,

PREPEND(FILES_TO_TRANSLATE ${CMAKE_CURRENT_SOURCE_DIR} ${SRC_FILES})
Run Code Online (Sandbox Code Playgroud)

  • 新版本的cmake是否具有类似(但官方)的功能? (2认同)

gen*_*a2x 12

string(REGEX REPLACE "([^;]+)" "ANYPREFIX/\\1.cpp" outputlist "${inputlist}")
Run Code Online (Sandbox Code Playgroud)

将ANYPREFIX替换为任何前缀,将".cpp"替换为您需要的任何后缀.

  • 我敢打赌大多数正则表达式的仇恨者都不知道如何正确使用它们.在cmake中使用分号创建文件名会使自己陷入困境.并且cmake不支持此类文件名.运行`cmake --help-policy CMP0037`以获取更多信息. (3认同)
  • "呃,一个正则表达式.打赌它错了." 是的.包含`;`的文件将无法正常工作.最好让CMake查看列表 - 它正确处理事情. (2认同)

tib*_*bur 3

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