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