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
使用新定义,或者即使您在 CMakeLists 添加的add_subdirectory
. 使用宏也无济于事:
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
就像我预期的那样。
推荐阅读
- java - 如何在 Java 中快速对两个列表进行排序
- c# - 将 XML 解析为数据表
- solr - 使用带有 solr 的 nutch 进行索引和爬行
- react-native - 如何在 React Native 0.57 中使用 MobX 和装饰器?
- python - InvalidArgumentError:断言失败:[最大框坐标值大于 1.100000:] [1.15277779]
- xcode10 - Xcode 首选项 -> 帐户未保存
- javascript - 承诺 API 是如何工作的?
- protractor - 我们如何在并行执行的同时对所有浏览器只执行一次查询
- python-3.x - Python 声明 numpy 数组“元组”不可调用(在 jupyter 笔记本中?)
- ios - 如何在应用程序处于非活动状态时获取推送通知 ios swift3