首页 > 解决方案 > 如何在 CMake 中恢复函数定义?

问题描述

CMake 允许屏蔽这样的任何函数

function(add_executable)
   #...custom code, that may use _add_executable(${ARGN}) to call the original function
endfunction()

但似乎一旦 CMake 解析了该函数定义,它就会在全局 CMake 范围内设置,并且不支持函数定义的嵌套:

function(echo)
    message(STATUS "Original function")
endfunction()

echo() #Original function
function(nesting)
    function(echo)
        message(STATUS "Overwritten function")
#       _echo() # Original function
    endfunction()
    echo() #Overwritten function
endfunction()
echo() #Still Overwritten function, expected Original function

如果您include使用新定义,或者即使您在 CMakeLists 添加的add_subdirectory. 使用宏也无济于事:

macro(echo) 
    _echo(${ARGN})
endmacro(echo)
echo() #Still Overwritten function, but now even _echo() is overwritten

有没有办法恢复函数的旧含义?

标签: cmake

解决方案


这是我发现的一个解决方法。这不是一个真正的答案,但它有效。

function(echo)
    message(STATUS "Original function")
endfunction()

echo() #Original function

function(echo)
    if(__ECHO_BEHAVIORAL_SWITCH)
        message(STATUS "Overwritten function")
    else()
        _echo()
    endif()
endfunction()

function(nesting)
    set(__ECHO_BEHAVIORAL_SWITCH 1)
    echo() #Overwritten function
endfunction()

nesting() #Overwritten function

echo() #Original function

它不会恢复函数的定义,而是将覆盖函数的行为绑定到外部变量,该变量可能缓存在函数内部或add_subdirectory就像我预期的那样。


推荐阅读