如何确定 CMake 函数的范围,使其无法从文件外部访问?

How can I scope a CMake function so it can't be accessed from outside a file?

我正在尝试在一个相对复杂的项目中编写一些 CMake 代码,并且我有一个内部包含另一个模块的模块。问题是,每当我包含我的模块时,它内部包含的模块中定义的所有功能都在全局级别可用!这实际上是用一堆我没有明确要求的函数污染了我的全局命名空间。

例如:

# CMakeLists.txt

# Include my module
include(MyModule)

# Call a function from my module
my_module_function()

# HERE IS THE PROBLEM -- functions from "AnotherModule" are visible here!
# This call works
another_module_function()

在我的模块中:

# MyModule.cmake

# Include another module
#  - This other module is written and supported by someone else so I can't modify it
#  - No functions from "AnotherModule" will be used outside of "MyModule"
include(AnotherModule)

# Define my function
function(my_module_function)

    # Call a function from the other module
    another_module_function()
endfunction()

MyModule.cmake 中有什么方法可以让我从 AnotherModule.cmake 导入函数而不让它们在我自己的模块之外可见?这个另一个模块是由其他人编写的,所以我无法控制它,它包含其他具有非常通用名称的函数,例如名为 parse_arguments 的函数,以后可能会导致命名冲突。

AnotherModule.cmake 中的函数在 MyModule.cmake 之外完全不可见将是理想的,但即使有一种简单的方法来为导入的函数模拟一个命名空间,那也是聊胜于无

在 CMake 中,宏和函数具有 全局可见性,没有什么可以改变这一点。

通常一个函数,"internal" 到一些模块,是用下划线 (_) 前缀定义的。这样的前缀起到了向外码发出信号的作用"not to use me"。但这只是一个约定,CMake 不强制任何关于下划线前缀的名称。

如果包含一个模块只有即时效果,即定义自定义 commands/targets 但不导出 functions/macros/variables 外部代码,您可以考虑用 external project (ExternalProject_Add) 包装它。外部项目是一个单独的 CMake 项目,none 它的 CMake 变量或函数之类的东西在它外部是可见的。