如何在CMake中还原功能定义?

时间:2018-12-28 12:08:46

标签: 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添加的CMakeLists中定义它,它也将不起作用。使用宏也无济于事:

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

有什么办法可以还原功能的旧含义?

1 个答案:

答案 0 :(得分:0)

这是我发现的一种解决方法。这不是一个正确的答案,但是可以。

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