Как я могу определить область действия функции CMake, чтобы к ней нельзя было получить доступ из-за пределов файла? - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь написать некоторый код 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, не видя их вне моего собственного модуля? Этот другой модуль написан кем-то другим, поэтому я не имею над ним контроля, и он включает в себя другие функции с очень общими c именами, такими как parse_arguments, которые потенциально могут вызвать конфликт имен в дальнейшем.

Было бы идеально сделать функции из AnotherModule.cmake полностью невидимыми вне MyModule.cmake, но даже если бы существовал простой способ имитировать пространство имен для импортируемых функций, которое было бы лучше, чем ничего.

1 Ответ

2 голосов
/ 11 марта 2020

В макросах и функциях CMake есть глобальная видимость , и ничто не может изменить это.

Часто функция, "внутренняя" для какого-либо модуля, определяется с префиксом подчеркивания (_) , Такой префикс играет роль сигнала внешнему коду «не использовать меня». Но это всего лишь соглашение, CMake не применяет ничего к именам с префиксом подчеркивания.

Если включение модуля имеет только непосредственные эффекты , то есть определяет пользовательские команды / цели, но не экспортируйте функции / макросы / переменные для внешнего кода, вы можете обернуть его в внешний проект (ExternalProject_Add). Внешний проект - это отдельный проект CMake, и никакие его вещи CMake, такие как переменные или функции, не видны вне его.

...