Подтвердить что ты не робот

Как добавить все имена файлов в список с общим путем?

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

4b9b3361

Ответ 1

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

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})

Ответ 2

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

list(TRANSFORM FILES_TO_TRANSLATE PREPEND ${CMAKE_CURRENT_SOURCE_DIR})

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

file(GLOB_RECURSE SOURCE_FILES src/*.cpp)

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