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