macros - 跨 CMakeLists 的 CMake 宏

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

输出:
子目录:

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

最佳答案

这里有几个小问题:

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

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

    关于macros - 跨 CMakeLists 的 CMake 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11508959/

    相关文章:

    cuda - 使用 FindCUDA.cmake 和 Thrust 以及 THRUST_DEVICE_SYSTEM_OMP 时出现编译错误

    mysql - Cmake 编译器 "not found"警告,值得关注吗? (MySQL)

    cmake - 为什么 `cmake --verbose=1` 给出详细的 cmake 输出而 `cmake -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON` 没有?

    c - 为什么一些库例程同时实现为宏?为什么 "va_arg"宏被声明为函数(没有 "#define")?

    c++ - 企业架构师错误 : Unexpected symbol fix?

    c++ - C/C++ 宏扩展与代码生成

    c++ - 如何获取 OCaml 链接器标志以与 C++ cmake 构建链接

    macros - 从 &body 中获取 DECLARE 的更简洁的方法

    objective-c - 如何设置 Xcodes "debug/release target settings"?

    c++ - Qt4 应用程序图标未出现在 Windows 任务栏上