Comment puis-je préparer tous les noms de fichiers sur la liste avec un préfixe de chemin commun automatiquement? Par exemple, avoir une liste de fichiers dans cmakelists.txt:
SET(SRC_FILES foo1.cpp foo2.cpp)
J'aimerais avoir une liste équivalente à celle-ci:
${CMAKE_CURRENT_SOURCE_DIR}/foo1.cpp ${CMAKE_CURRENT_SOURCE_DIR}/foo2.cpp
J'ai besoin de cela pour utiliser des noms de fichiers dans un contexte parent_scope, par exemple.
SET(FILES_TO_TRANSLATE ${FILES_TO_TRANSLATE} ${SRC_FILES} PARENT_SCOPE)
donc, qu'un coukefiles.txt dans un autre répertoire peut toujours trouver ces fichiers.
En substance, j'attendrais quelque chose comme ceci (pseudo-code):
SET(FILES_TO_TRANSLATE PREPEND_ALL_NAMES(${CMAKE_CURRENT_SOURCE_DIR} ${SRC_FILES}) PARENT_SCOPE)
Est-ce que ceci est facilement faisable ou dois-je utiliser la boucle "foreach" pour créer une nouvelle liste de fichiers?
La fonction suivante peut être ce que vous voulez.
FUNCTION(PREPEND var prefix)
SET(listVar "")
FOREACH(f ${ARGN})
LIST(APPEND listVar "${prefix}/${f}")
ENDFOREACH(f)
SET(${var} "${listVar}" PARENT_SCOPE)
ENDFUNCTION(PREPEND)
Pour l'utiliser,
PREPEND(FILES_TO_TRANSLATE ${CMAKE_CURRENT_SOURCE_DIR} ${SRC_FILES})
string(REGEX REPLACE "([^;]+)" "ANYPREFIX/\\1.cpp" outputlist "${inputlist}")
Remplacez Anyprefix par un préfixe et "CPPP" avec un suffixe dont vous avez besoin.
Vous devez utiliser une boucle foreach
. Mais si vous utilisez cela dans plusieurs parties de votre projet, vous pouvez créer une fonction ou une macro.
En améliorant la réponse de Ding-Yi Chen, si vous devez toujours prendre en charge la cmake avant 3.12, vous pouvez utiliser le code suivant:
function(list_transform_prepend var prefix)
set(temp "")
foreach(f ${${var}})
list(APPEND temp "${prefix}${f}")
endforeach()
set(${var} "${temp}" PARENT_SCOPE)
endfunction()
L'avantage de cette solution est que cette interface est plus proche de l'une est CMAKE 3.12 list(TRANSFORM ...)
et le changement est effectué en place.
Utilisé comme ça
list_transform_prepend(FILES_TO_TRANSLATE "${CMAKE_CURRENT_SOURCE_DIR}/")
Je suppose que vous voulez un nom de fichier absolu comme vous êtes préparé $ {CMAKE_CURRENT_SOURCE_DIR}. Si vous utilisez FILE(GLOB <VAR> <PATTER>)
, tous les fichiers auront déjà un chemin absolu:
file(GLOB_RECURSE SOURCE_FILES src/*.cpp)
Voir le commentaires cumake dans la documentation Pourquoi ne pas utiliser GLOB pour ajouter des fichiers source.