2011-10-16 12 views
26

Tengo dos preguntas relativas a CMakeCMake: ¿Cómo obtener el nombre de todos los subdirectorios de un directorio?

1) Supongamos que tenemos una variable ${MY_CURRENT_DIR} que contiene la ruta de un directorio que contiene varios subdirectorios: mydir1, mydir2 y mydir3. Quiero detectar estos subdirectorios y poner sus nombres en ${SUBDIRS} (no la ruta completa de estos directorios, solo su nombre). ¿Cómo hacer eso automáticamente?

2) Suponga que ${SUBDIRS} contiene "mydir1 mydir2 mydir3". Cómo reemplazar

ADD_SUBDIRECTORY(mydir1) 
ADD_SUBDIRECTORY(mydir2) 
ADD_SUBDIRECTORY(mydir3) 

por un bucle sobre ${SUBDIRS}?

Muchas gracias.

Respuesta

70

1) Utilice esta macro:

MACRO(SUBDIRLIST result curdir) 
    FILE(GLOB children RELATIVE ${curdir} ${curdir}/*) 
    SET(dirlist "") 
    FOREACH(child ${children}) 
    IF(IS_DIRECTORY ${curdir}/${child}) 
     LIST(APPEND dirlist ${child}) 
    ENDIF() 
    ENDFOREACH() 
    SET(${result} ${dirlist}) 
ENDMACRO() 

Ejemplo:

SUBDIRLIST(SUBDIRS ${MY_CURRENT_DIR}) 

2) Usar foreach:

FOREACH(subdir ${SUBDIRS}) 
    ADD_SUBDIRECTORY(${subdir}) 
ENDFOREACH() 
+13

para la mejora del rendimiento, especialmente si 'dirlist' es largo, el uso 'LIST (APPEND dirlist $ {child})' en lugar de 'SET (dirlist $ {dirlist} $ {child})' [ver aquí] (http://www.cmake.org/Wiki/C Make_Performance_Tips # Use_LIST.28APPEND _.... 29) – ParokshaX

+2

Nota importante: esto no funcionará con 'GLOB_RECURSE', solamente con' GLOB' – Synxis

+1

GLOB_RECURSE tiene LIST_DIRECTORIES defecto falsas mientras MUNDIALIZA tiene LIST_DIRECTORIES defecto cierto. Si usa recurse, deberá configurarlo en true – Jaco

Cuestiones relacionadas