我有两个与CMake相关的问题
1)假设我们有一个变量${MY_CURRENT_DIR}
,它包含一个包含几个子目录的目录路径:mydir1,mydir2和mydir3。我想检测这些子目录并将其名称放入${SUBDIRS}
(不是这些目录的完整路径,只是它们的名称)。如何自动完成?
2)假设${SUBDIRS}
包含“mydir1 mydir2 mydir3”。如何更换
ADD_SUBDIRECTORY(mydir1)
ADD_SUBDIRECTORY(mydir2)
ADD_SUBDIRECTORY(mydir3)
通过${SUBDIRS}
上的循环?
非常感谢。
答案 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。)。)