我有以下(简化的)目录结构:
|-- doc/
|-- subdir1/
|-- subdir2/
|-- CMakeLists.txt
|-- src
|-- subdir3/
|-- subdir4/
|-- CMakeLists.txt
|-- test
|-- subdir5/
|-- subdir6/
|-- CMakeLists.txt
|-- CMakeLists.txt
顶级CMakeLists.txt
包含以下内容:
add_subdirectory(doc)
add_subdirectory(src)
add_subdirectory(test)
仅在src/CMakeLists.txt
内我想使用我自己的CMake命令版本
add_subdirectory(),所以我使用CMake macro()来“覆盖”这样的命令:
##src/CMakeLists.txt
macro(add_subdirectory)
message(STATUS "My own 'add_subdirectory()'")
_add_subdirectory(${ARGV})
endmacro(add_subdirectory)
# Call specialized version of 'add_subdirectory()'
add_subdirectory(subdir3)
add_subdirectory(subdir4)
顶级CMakeLists.txt
包含以下内容:
add_subdirectory(doc) #Uses CMake standard command 'add_subdirectory()'
add_subdirectory(src) #Uses overwritten 'add_subdirectory()'
add_subdirectory(test) #Should use CMake standard command 'add_subdirectory()'
对于目录'doc'和'src',行为符合预期。但是在'test'目录里面
被覆盖的add_subdirectory()
仍然适用,这不是我的预期。我是在
由于范围规则的原因,将使用add_subdirectory()
的默认行为。
尝试通过添加
来恢复默认行为macro(add_subdirectory)
_add_subdirectory(${ARGV})
endmacro(add_subdirectory)
在'src / CMakeLists.txt'结尾处的在运行CMake时导致分段错误,我在
假设是无限递归调用的结果。这里有类似的东西:
https://cmake.org/pipermail/cmake/2012-April/050023.html
使用CMake function()代替macro()
似乎会导致相同的行为。
所以我的问题是:是否可以恢复CMake命令后的默认行为 被覆盖了?
我正在使用CMake版本3.5.2。
答案 0 :(得分:1)
您可以通过宏范围之外定义的附加变量激活它:
set(MY_ADD_SUBDIRECTORY TRUE)
macro(add_subdirectory)
if (MY_ADD_SUBDIRECTORY)
message(STATUS "My own 'add_subdirectory()'")
endif()
_add_subdirectory(${ARGV})
endmacro(add_subdirectory)
<强>参考强>
答案 1 :(得分:0)
一个简单的解决方案是将您的maceo命名为其他内容,例如my_add_subdirectory
并在需要特殊行为的位置使用它。
这样你就不必费心去试图“恢复”被覆盖的add_command
(如果可能的话),事情应该有效。