web-dev-qa-db-fra.com

Comment préparer tous les noms de fichiers sur la liste avec un chemin commun?

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?

43
Pawel Stolowski

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})
31
Ding-Yi Chen
string(REGEX REPLACE "([^;]+)" "ANYPREFIX/\\1.cpp" outputlist "${inputlist}")

Remplacez Anyprefix par un préfixe et "CPPP" avec un suffixe dont vous avez besoin.

13
gena2x

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.

2
tibur

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}/")
0
Dominik Wójt

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.

0
sradomski