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