【问题标题】:'Overwrite' cmake command using a macro and restore its default behavior使用宏“覆盖”cmake 命令并恢复其默认行为
【发布时间】:2017-06-19 06:04:24
【问题描述】:

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

|-- 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”,行为符合预期。但在“测试”目录中
覆盖的add_subdirectory() 仍然适用,这不是我所期望的。我在下
印象是由于范围规则,将使用add_subdirectory() 的默认行为。

尝试通过添加来恢复默认行为

macro(add_subdirectory)                                                                            
    _add_subdirectory(${ARGV})                                                                     
endmacro(add_subdirectory)                                                                         

在运行 CMake 时,在“src/CMakeLists.txt”的末尾会导致分段错误,我
假设是无限递归调用的结果。这里提出了类似的建议:
https://cmake.org/pipermail/cmake/2012-April/050023.html

使用 CMake function() 而不是 macro() 似乎会导致相同的行为。

所以我的问题是:是否可以在 CMake 命令完成后恢复其默认行为
被覆盖了吗?

我使用的是 CMake 版本 3.5.2。

【问题讨论】:

    标签: c++ build cmake


    【解决方案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)
    

    参考

    【讨论】:

    • 有时我只是只见树木不见森林。像魅力一样工作:)
    【解决方案2】:

    一个简单的解决方案是将您的 maceo 命名为其他名称,例如 my_add_subdirectory,并在您需要特殊行为的地方使用它。

    这样您就不必费心尝试“恢复”被覆盖的add_command(如果这可能的话),一切都会正常进行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      • 2021-05-05
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      相关资源
      最近更新 更多