使用宏'覆盖'cmake命令并恢复其默认行为

时间:2017-06-19 06:04:25

标签: c++ build cmake

我有以下(简化的)目录结构:

|-- 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。

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(如果可能的话),事情应该有效。