2010-12-03 8 views
32

¿Cómo puedo anteponer todos los nombres de archivos en la lista con un prefijo de ruta común automáticamente? Por ejemplo tener una lista de archivos en CMakeLists.txt:¿Cómo anteponer todos los nombres de archivo en la lista con una ruta común?

SET(SRC_FILES foo1.cpp foo2.cpp) 

me gustaría obtener una lista que es equivalente a esto:

${CMAKE_CURRENT_SOURCE_DIR}/foo1.cpp ${CMAKE_CURRENT_SOURCE_DIR}/foo2.cpp 

necesito esto para usar los nombres de archivo en un contexto PARENT_SCOPE , p.ej

SET(FILES_TO_TRANSLATE ${FILES_TO_TRANSLATE} ${SRC_FILES} PARENT_SCOPE) 

para que un CMakeFiles.txt en otro directorio aún pueda encontrar estos archivos.

En esencia, yo esperaría algo como esto (pseudo-código):

SET(FILES_TO_TRANSLATE PREPEND_ALL_NAMES(${CMAKE_CURRENT_SOURCE_DIR} ${SRC_FILES}) PARENT_SCOPE) 

es que esto es fácilmente factible, o tengo a usuarios de bucle "foreach" para crear nueva lista de archivos?

Respuesta

1

Necesita utilizar un bucle foreach. Pero si usa eso en varias partes de su proyecto, es posible que desee crear una función o una macro.

-1

Supongo que desea un nombre de archivo absoluto ya que está anteponiendo $ {CMAKE_CURRENT_SOURCE_DIR}. Si está utilizando FILE(GLOB <VAR> <PATTER>), todos los archivos tendrán una ruta absoluta ya:

file(GLOB_RECURSE SOURCE_FILES src/*.cpp) 

Véase el comments CMake in documentation sobre por qué no usar MUNDIALIZA añadir archivos de origen.

19

La siguiente función puede ser lo que usted desea.

FUNCTION(PREPEND var prefix) 
    SET(listVar "") 
    FOREACH(f ${ARGN}) 
     LIST(APPEND listVar "${prefix}/${f}") 
    ENDFOREACH(f) 
    SET(${var} "${listVar}" PARENT_SCOPE) 
ENDFUNCTION(PREPEND) 

Para usarlo,

PREPEND(FILES_TO_TRANSLATE ${CMAKE_CURRENT_SOURCE_DIR} ${SRC_FILES}) 
+0

A pesar de que esto funciona, la declaración de función es engañosa, ya que sólo las listas de argumentos de la función 2 var, prefijo. Sin embargo, en la práctica, el usuario debe pasar $ {CMAKE_CURRENT_SOURCE_DIR} $ {SRC_FILES} como argumento de prefijo. – bergercookie

+0

Es cierto que requiere el tercer parámetro. Sin embargo, debe agregar el tercer argumento al frente de la lista FOREACH. –

+0

¿Qué es "FILES_TO_TRANSLATE"? – user1754322

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

Esta es una gran respuesta en realidad. Es posible que desee preprocesar su lista para eliminar la extensión original (si eso es lo que está haciendo): cadena (SUSTITUIR ".json" "" lista de entrada "$ {lista de entrada}") – Havok

+0

qué significa ';' en su expresión regular. –

+1

en la lista de tareas es solo una cadena con cadenas separadas por punto y coma, por lo que puede aplicarle expresiones regulares o cualquier otra operación de cadena como una cadena y terminar con ella. ([^;] +) significa "tomar todos los caracteres hasta el próximo"; '" – gena2x

Cuestiones relacionadas