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
有什么办法可以还原功能的旧含义?
答案 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
中。