2011-10-16 399 views
26

我有相对于CMake的CMake:如何获取目录中所有子目录的名称?

1)两个问题。假设我们有一个变量${MY_CURRENT_DIR}包含包含多个子目录的目录的路径:mydir1,mydir2和mydir3。我想检测这些子目录并将其名称放入${SUBDIRS}(不是这些目录的完整路径,只有它们的名称)。如何自动做到这一点? 2)假设${SUBDIRS}包含“mydir1 mydir2 mydir3”。如何通过遍历${SUBDIRS}更换

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

非常感谢。

回答

70

1)使用该宏:

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() 

实施例:

SUBDIRLIST(SUBDIRS ${MY_CURRENT_DIR}) 

2)使用foreach

​​
+13

对于性能的提高,特别是如果'dirlist'长,使用'LIST(APPEND dirlist $ {child})''而不是'SET(dirlist $ {dirlist} $ {child})'[see here](http://www.cmake.org/Wiki/C Make_Performance_Tips#Use_LIST.28APPEND _.... 29) – ParokshaX

+2

重要注意事项:这不适用于GLOB_RECURSE,只适用于GLOB。 – Synxis

+1

GLOB_RECURSE的默认LIST_DIRECTORIES为false,而GLOB的默认LIST_DIRECTORIES为true。如果使用递归,则必须将其设置为true – Jaco

相关问题