Как вернуть определение функции в CMake? - PullRequest
0 голосов
/ 28 декабря 2018

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

Есть ли способ вернуть старое значение функции?

1 Ответ

0 голосов
/ 28 декабря 2018

Вот один обход, который я нашел.Это не верный ответ, но он работает.

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 как я и ожидал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...