C++ ';覆盖';使用宏生成命令并恢复其默认行为
我有以下(简化的)目录结构:C++ ';覆盖';使用宏生成命令并恢复其默认行为,c++,build,cmake,C++,Build,Cmake,我有以下(简化的)目录结构: |-- doc/ |-- subdir1/ |-- subdir2/
|-- doc/
|-- subdir1/
|-- subdir2/
|-- CMakeLists.txt
|-- src
|-- subdir3/
|-- subdir4/
|-- CMakeLists.txt
|-- test
|-- subdir5/
|-- subdir6/
|-- CMakeLists.txt
|-- CMakeLists.txt
##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)
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()'
macro(add_subdirectory)
_add_subdirectory(${ARGV})
endmacro(add_subdirectory)
顶级CMakeLists.txt
包含如下内容:
add_subdirectory(doc)
add_subdirectory(src)
add_subdirectory(test)
##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)
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()'
macro(add_subdirectory)
_add_subdirectory(${ARGV})
endmacro(add_subdirectory)
仅在src/CMakeLists.txt中,我想使用自己版本的CMake命令
,因此我使用CMake“覆盖”命令,如下所示:
##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)
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()'
macro(add_subdirectory)
_add_subdirectory(${ARGV})
endmacro(add_subdirectory)
顶级CMakeLists.txt
包含如下内容:
##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)
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()'
macro(add_subdirectory)
_add_subdirectory(${ARGV})
endmacro(add_subdirectory)
对于目录“doc”和“src”,行为与预期一致。但是在“test”目录中,
覆盖的add_subdirectory()
仍然适用,这不是我所期望的。我在
根据作用域规则,将使用add\u subdirectory()
的默认行为
##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)
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()'
macro(add_subdirectory)
_add_subdirectory(${ARGV})
endmacro(add_subdirectory)
试图通过添加来恢复默认行为
##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)
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()'
macro(add_subdirectory)
_add_subdirectory(${ARGV})
endmacro(add_subdirectory)
在“src/CMakeLists.txt”的末尾,运行CMake时会导致分段错误,我
假设是无限递归调用的结果。这里也提出了类似的建议:
##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)
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()'
macro(add_subdirectory)
_add_subdirectory(${ARGV})
endmacro(add_subdirectory)
使用CMake而不是宏()
似乎会导致相同的行为
##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)
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()'
macro(add_subdirectory)
_add_subdirectory(${ARGV})
endmacro(add_subdirectory)
因此,我的问题是:在CMake命令执行后,是否可以恢复其默认行为
被覆盖了吗
##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)
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()'
macro(add_subdirectory)
_add_subdirectory(${ARGV})
endmacro(add_subdirectory)
我使用的是CMake版本3.5.2。一个简单的解决方案是将您的maceo命名为其他名称,如我的添加子目录
,并在需要特殊行为的地方使用它
##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)
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()'
macro(add_subdirectory)
_add_subdirectory(${ARGV})
endmacro(add_subdirectory)
这样,您就不必费心“恢复”被覆盖的add_命令(如果可能的话),一切都应该正常。您可以通过在宏范围外定义的附加变量激活它:
##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)
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()'
macro(add_subdirectory)
_add_subdirectory(${ARGV})
endmacro(add_subdirectory)
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)
参考
##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)
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()'
macro(add_subdirectory)
_add_subdirectory(${ARGV})
endmacro(add_subdirectory)
有时候我只是看不见树木,看不见森林。工作就像一个符咒:)