Cmake:在 cmake 文件中查找变量,而不会用另一个文件的范围污染容器范围



假设我有一个文件info.cmake,它有:

set(a 1)
set(b 2)
set(c 3)

现在一个项目可以通过包含来加载它:

include(../info.cmake)

访问与a关联的值,但这会用bc的值污染环境。有没有办法只读取a潜在get_property()的值?

您可以使用包装器函数添加局部变量范围

function(my_info_wrapper_function)
    include(../info.cmake)
    set(a "${a}" PARENT_SCOPE)
endfunction()
my_info_wrapper_function()

但这只会封装局部变量。您的CMakeLists.txt文件仍将被"污染",如果确实如此info.cmake例如更改缓存变量或添加任何目标。

引用

  • 设置和使用变量的 CMake 语法是什么?

正如Florian所提到的,您将不得不求助于使用具有自己作用域的函数。以下是建议的更通用版本,可以给出源文件的路径和要查找的变量:

function(lookup value)
    set(options
            ""
            )
    set(oneValueArgs
            SOURCE
            VARIABLE
            )
    set(multiValueArgs
            ""
            )
    cmake_parse_arguments(LOOKUP "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
    if(EXISTS "${LOOKUP_SOURCE}")
        include("${LOOKUP_SOURCE}")
        set(key     ${LOOKUP_VARIABLE})
        if(NOT ${key})
            message(SEND_WARNING "No value was set for ${LOOKUP_VARIABLE} in the source file: ${LOOKUP_SOURCE}")
        endif(${key})
        set(${value} ${${key}} PARENT_SCOPE)
    else()
        message(SEND_ERROR "The source file was not found at ${LOOKUP_SOURCE}")
    endif()
endfunction()

这是您可以使用它的方式:

lookup(val
        SOURCE       ../info.cmake
        VARIABLE     a)
message(SEND_ERROR ${val}) #Will Print 1

最新更新