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)                                                                         

有时候我只是看不见树木,看不见森林。工作就像一个符咒:)