Как добавить все имена файлов в списке с общим путем? - PullRequest
38 голосов
/ 03 декабря 2010

Как можно автоматически добавить все имена файлов в списке с общим префиксом пути? Например, наличие списка файлов в 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 для создания нового списка файлов?

Ответы [ 5 ]

26 голосов
/ 24 декабря 2014

Следующая функция может быть тем, что вы хотите.

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})
17 голосов
/ 04 июля 2018

CMake 3.12 добавил список преобразователей - один из этих преобразователей PREPEND.Таким образом, для добавления всех записей в списке можно использовать следующее:

list(TRANSFORM FILES_TO_TRANSLATE PREPEND ${CMAKE_CURRENT_SOURCE_DIR})

..., где FILES_TO_TRANSLATE - имя переменной списка.

Дополнительную информацию можно найти в документации CMake .

От @ComicSansMS: "И теперь версия 3.15 даже напрямую добавила команду list (PREPEND ...)."

12 голосов
/ 30 июля 2015
string(REGEX REPLACE "([^;]+)" "ANYPREFIX/\\1.cpp" outputlist "${inputlist}")

Замените ANYPREFIX любым префиксом, а '.cpp' - любым необходимым суффиксом.

1 голос
/ 05 декабря 2010

Вам нужно использовать цикл foreach. Но если вы используете это в нескольких частях вашего проекта, вы можете захотеть создать функцию или макрос.

0 голосов
/ 21 марта 2012

Я предполагаю, что вам нужно абсолютное имя файла, так как вы добавляете $ {CMAKE_CURRENT_SOURCE_DIR}.Если вы используете FILE(GLOB <VAR> <PATTER>), у всех файлов уже будет абсолютный путь:

file(GLOB_RECURSE SOURCE_FILES src/*.cpp)

См. комментарии CMake в документации о том, почему не использовать GLOB для добавления исходных файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...