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

时间:2011-10-16 22:34:03

标签: cmake

我有两个与CMake相关的问题

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

2)假设${SUBDIRS}包含“mydir1 mydir2 mydir3”。如何更换

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

通过${SUBDIRS}上的循环?

非常感谢。

2 个答案:

答案 0 :(得分:83)

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

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

答案 1 :(得分:0)


关于上面的回答: 使用这个宏:

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

我遇到了这个文件(GLOB 命令)的问题。(我使用的是 cmake 3.17.3) 否则宏效果很好。 我收到了 FILE GLOB 错误,类似于“FILE GLOB 需要在目录后使用 glob 表达式”。 (也许它不喜欢 RELATIVE 和/或只是使用 curdir 作为第四个参数。)

我不得不使用:

FILE(GLOB children ${curdir}/*)

(取出 RELATIVE 和第一个 ${curdir} (请注意我上面的 cmake 版本,这可能是我的问题(到目前为止我不熟悉 glob。)。)