4

我有一个 c++ 项目,其目录结构如下:

server/
   code/
      BASE/
         Thread/
         Log/
         Memory/
      Net/
   cmake/
      CMakeList.txt
      BASE/
         CMakeList.txt
      Net/
         CMakeList.txt

这是/cmake/CMakeList.txt 的一部分:

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

add_subdirectory(Base)

然后在 /cmake/Base/CMakeList.txt 中使用宏:

SET(SUBDIR, "")
SUBDIRLIST(SUBDIRS, ${BASE_SRC_DIR})
message("SUBDIRS : " ${SUBDIRS})

输出:子目录:

我通过在宏中输出它的值来检查 ${dirlist},我得到预期的目录列表,但是当 SET(${result} ${dirlist})之后的消息(“result” ${result})时,我无法获得预期的输出,我的 CMakeLists.txt 有什么问题?

4

1 回答 1

2

这里有几个小问题:

  1. 在您的宏中,SET(dirlist "")可能只是SET(dirlist). 同样,SET(SUBDIR, "")可能只是SET(SUBDIRS)(我猜“SUBDIR”是一个错字,应该是“SUBDIRS”。你也不希望set命令中的逗号 - 可能是另一个错字?)
  2. ${result}要在宏中输出 的内容,请使用message("result: ${${result}}"), 因为您不是每次都追加,而是追加${child}到. 在你的例子中是,所以是。result${result}${result}SUBDIRS${${result}}${SUBDIRS}
  3. 调用 时SUBDIRLIST,不要在参数之间使用逗号。
  4. 当您输出 的值时SUBDIRS,请包含${SUBDIRS}在引号中,即,message("SUBDIRS: ${SUBDIRS}")否则您将丢失分号分隔符。

除此之外,您的宏似乎还不错。

于 2012-07-16T18:23:23.987 回答