如何在 CMake 中还原函数定义

  • 本文关键字:原函数 定义 CMake 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新定义,或者即使您在 add_subdirectory 添加的 CMakeList 中定义它,它也不起作用。使用宏也无济于事:

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

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

这是我

发现的一个漫游。这不是一个真正的答案,但它有效。

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就像我预期的那样。

最新更新