CMake:如何获取目录的所有子目录的名称?

Vin*_*ent 41 cmake

我有两个与CMake相关的问题

1)假设我们有一个变量${MY_CURRENT_DIR},它包含一个包含几个子目录的目录路径:mydir1,mydir2和mydir3.我想检测这些子目录并将其名称放入${SUBDIRS}(不是这些目录的完整路径,只是它们的名称).如何自动完成?

2)假设${SUBDIRS}包含"mydir1 mydir2 mydir3".如何更换

ADD_SUBDIRECTORY(mydir1)
ADD_SUBDIRECTORY(mydir2)
ADD_SUBDIRECTORY(mydir3)
Run Code Online (Sandbox Code Playgroud)

循环结束${SUBDIRS}

非常感谢你.

ref*_*aim 89

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()
Run Code Online (Sandbox Code Playgroud)

例:

SUBDIRLIST(SUBDIRS ${MY_CURRENT_DIR})
Run Code Online (Sandbox Code Playgroud)

2)使用foreach:

FOREACH(subdir ${SUBDIRS})
  ADD_SUBDIRECTORY(${subdir})
ENDFOREACH()
Run Code Online (Sandbox Code Playgroud)

  • 为了提高性能,特别是如果'dirlist`很长,请使用`LIST(APPEND dirlist $ {child})`而不是`SET(dirlist $ {dirlist} $ {child})`[见这里](http:// www .cmake.org /维基/ CMake_Performance_Tips#Use_LIST.28APPEND _.... 29) (14认同)
  • 可能需要修改 if 条件来检查文件夹是否包含一个 `CMakeLists.txt` 文件以仅添加合适的目录而不是 .git 之类的内容,这会导致 cmake 期间出现错误:`IF(IS_DIRECTORY ${curdir} /${child} AND EXISTS ${curdir}/${child}/CMakeLists.txt)` (6认同)
  • 重要说明:这不适用于`GLOB_RECURSE`,仅适用于'GLOB` (2认同)
  • GLOB_RECURSE的默认LIST_DIRECTORIES为false,而GLOB默认的LIST_DIRECTORIES为true。如果您使用递归,则必须将其设置为true (2认同)