跨CMakeLists的CMake宏

时间:2012-07-16 16:57:22

标签: macros cmake

我有一个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})

输出: SUBDIRS:

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

1 个答案:

答案 0 :(得分: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}"),否则您将丢失分号分隔符。
  5. 除此之外,你的宏看起来很好。