Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMAKE_uu如何评估调用CMAKE函数的当前行?_Cmake - Fatal编程技术网

CMAKE_uu如何评估调用CMAKE函数的当前行?

CMAKE_uu如何评估调用CMAKE函数的当前行?,cmake,Cmake,出于调试目的,如果我可以访问 脚本的文件名 脚本中的当前行号 在配置时间调用CMake函数/宏时。(我想通过包装器函数为我自己的组件自动注入这些信息,以跟踪缓存变量被覆盖的时间和位置) 而1。似乎正在评估CMAKE_当前的列表_文件,我不知道如何实现2。总是设置为它实际放置的行,在我的例子中是包装函数内的行 正如建议的那样,我可以在调用方站点上使用[CMAKE_CURRENT_LIST_LINE][3]作为附加参数来实现这一点。但我希望避免这种情况,以隐藏“公共接口”中的调试逻辑 一个简单的工

出于调试目的,如果我可以访问

  • 脚本的文件名
  • 脚本中的当前行号
  • 配置时间调用CMake函数/宏时。(我想通过包装器函数为我自己的组件自动注入这些信息,以跟踪缓存变量被覆盖的时间和位置)

    而1。似乎正在评估CMAKE_当前的列表_文件,我不知道如何实现2。总是设置为它实际放置的行,在我的例子中是包装函数内的行

    正如建议的那样,我可以在调用方站点上使用[CMAKE_CURRENT_LIST_LINE][3]作为附加参数来实现这一点。但我希望避免这种情况,以隐藏“公共接口”中的调试逻辑


    一个简单的工作示例来表达我的需求:

    CMakeLists.txt

    cmake_minimum_required(VERSION 3.0)
    include( myComponent )
    
    # access via public interface
    myComponentFunctionWrapperFunction( "CMakeLists.txt:5" )
    myComponentFunctionWrapperMacro( "CMakeLists.txt:6" )
    myComponentMacroWrapperFunction( "CMakeLists.txt:7" )
    myComponentMacroWrapperMacro( "CMakeLists.txt:8" )
    
    # direct access of the hidden interface
    myComponentFunction( ${CMAKE_CURRENT_LIST_FILE} ${CMAKE_CURRENT_LIST_LINE} "CMakeLists.txt:11" )
    myComponentFunction( ${CMAKE_CURRENT_LIST_FILE} ${CMAKE_CURRENT_LIST_LINE} "CMakeLists.txt:12" )
    myComponentMacro( ${CMAKE_CURRENT_LIST_FILE} ${CMAKE_CURRENT_LIST_LINE} "CMakeLists.txt:13" )
    myComponentMacro( ${CMAKE_CURRENT_LIST_FILE} ${CMAKE_CURRENT_LIST_LINE} "CMakeLists.txt:14" )
    
    # the actual component
    
    function( myComponentFunction CALLER CALLER_LINE DATA )
        message( STATUS "myComponent.function( ${CALLER}, ${CALLER_LINE}, ${DATA} )" )
    endfunction()
    
    macro( myComponentMacro CALLER CALLER_LINE DATA )
        message( STATUS "myComponent.macro( ${CALLER}, ${CALLER_LINE}, ${DATA} )" )
    endmacro()
    
    
    # the public interface for injecting debug info
    
    function( myComponentFunctionWrapperFunction DATA )
        myComponentFunction( ${CMAKE_CURRENT_LIST_FILE} ${CMAKE_CURRENT_LIST_LINE} ${DATA} )
    endfunction()
    
    macro( myComponentFunctionWrapperMacro DATA )
        myComponentFunction( ${CMAKE_CURRENT_LIST_FILE} ${CMAKE_CURRENT_LIST_LINE} ${DATA} )
    endmacro()
    
    function( myComponentMacroWrapperFunction DATA )
        myComponentMacro( ${CMAKE_CURRENT_LIST_FILE} ${CMAKE_CURRENT_LIST_LINE} ${DATA} )
    endfunction()
    
    macro( myComponentMacroWrapperMacro DATA )
        myComponentMacro( ${CMAKE_CURRENT_LIST_FILE} ${CMAKE_CURRENT_LIST_LINE} ${DATA} )
    endmacro()
    
    $ cmake -D CMAKE_MODULE_PATH=`pwd` .
    -- myComponent.function( <myPath>/CMakeLists.txt, 15, CMakeLists.txt:5 )
    -- myComponent.function( <myPath>/CMakeLists.txt, 19, CMakeLists.txt:6 )
    -- myComponent.macro( <myPath>/CMakeLists.txt, 23, CMakeLists.txt:7 )
    -- myComponent.macro( <myPath>/CMakeLists.txt, 27, CMakeLists.txt:8 )
    -- myComponent.function( <myPath>/CMakeLists.txt, 11, CMakeLists.txt:11 )
    -- myComponent.function( <myPath>/CMakeLists.txt, 12, CMakeLists.txt:12 )
    -- myComponent.macro( <myPath>/CMakeLists.txt, 13, CMakeLists.txt:13 )
    -- myComponent.macro( <myPath>/CMakeLists.txt, 14, CMakeLists.txt:14 )
    -- Configuring done
    
    myComponent.cmake

    cmake_minimum_required(VERSION 3.0)
    include( myComponent )
    
    # access via public interface
    myComponentFunctionWrapperFunction( "CMakeLists.txt:5" )
    myComponentFunctionWrapperMacro( "CMakeLists.txt:6" )
    myComponentMacroWrapperFunction( "CMakeLists.txt:7" )
    myComponentMacroWrapperMacro( "CMakeLists.txt:8" )
    
    # direct access of the hidden interface
    myComponentFunction( ${CMAKE_CURRENT_LIST_FILE} ${CMAKE_CURRENT_LIST_LINE} "CMakeLists.txt:11" )
    myComponentFunction( ${CMAKE_CURRENT_LIST_FILE} ${CMAKE_CURRENT_LIST_LINE} "CMakeLists.txt:12" )
    myComponentMacro( ${CMAKE_CURRENT_LIST_FILE} ${CMAKE_CURRENT_LIST_LINE} "CMakeLists.txt:13" )
    myComponentMacro( ${CMAKE_CURRENT_LIST_FILE} ${CMAKE_CURRENT_LIST_LINE} "CMakeLists.txt:14" )
    
    # the actual component
    
    function( myComponentFunction CALLER CALLER_LINE DATA )
        message( STATUS "myComponent.function( ${CALLER}, ${CALLER_LINE}, ${DATA} )" )
    endfunction()
    
    macro( myComponentMacro CALLER CALLER_LINE DATA )
        message( STATUS "myComponent.macro( ${CALLER}, ${CALLER_LINE}, ${DATA} )" )
    endmacro()
    
    
    # the public interface for injecting debug info
    
    function( myComponentFunctionWrapperFunction DATA )
        myComponentFunction( ${CMAKE_CURRENT_LIST_FILE} ${CMAKE_CURRENT_LIST_LINE} ${DATA} )
    endfunction()
    
    macro( myComponentFunctionWrapperMacro DATA )
        myComponentFunction( ${CMAKE_CURRENT_LIST_FILE} ${CMAKE_CURRENT_LIST_LINE} ${DATA} )
    endmacro()
    
    function( myComponentMacroWrapperFunction DATA )
        myComponentMacro( ${CMAKE_CURRENT_LIST_FILE} ${CMAKE_CURRENT_LIST_LINE} ${DATA} )
    endfunction()
    
    macro( myComponentMacroWrapperMacro DATA )
        myComponentMacro( ${CMAKE_CURRENT_LIST_FILE} ${CMAKE_CURRENT_LIST_LINE} ${DATA} )
    endmacro()
    
    $ cmake -D CMAKE_MODULE_PATH=`pwd` .
    -- myComponent.function( <myPath>/CMakeLists.txt, 15, CMakeLists.txt:5 )
    -- myComponent.function( <myPath>/CMakeLists.txt, 19, CMakeLists.txt:6 )
    -- myComponent.macro( <myPath>/CMakeLists.txt, 23, CMakeLists.txt:7 )
    -- myComponent.macro( <myPath>/CMakeLists.txt, 27, CMakeLists.txt:8 )
    -- myComponent.function( <myPath>/CMakeLists.txt, 11, CMakeLists.txt:11 )
    -- myComponent.function( <myPath>/CMakeLists.txt, 12, CMakeLists.txt:12 )
    -- myComponent.macro( <myPath>/CMakeLists.txt, 13, CMakeLists.txt:13 )
    -- myComponent.macro( <myPath>/CMakeLists.txt, 14, CMakeLists.txt:14 )
    -- Configuring done
    
    执行

    cmake_minimum_required(VERSION 3.0)
    include( myComponent )
    
    # access via public interface
    myComponentFunctionWrapperFunction( "CMakeLists.txt:5" )
    myComponentFunctionWrapperMacro( "CMakeLists.txt:6" )
    myComponentMacroWrapperFunction( "CMakeLists.txt:7" )
    myComponentMacroWrapperMacro( "CMakeLists.txt:8" )
    
    # direct access of the hidden interface
    myComponentFunction( ${CMAKE_CURRENT_LIST_FILE} ${CMAKE_CURRENT_LIST_LINE} "CMakeLists.txt:11" )
    myComponentFunction( ${CMAKE_CURRENT_LIST_FILE} ${CMAKE_CURRENT_LIST_LINE} "CMakeLists.txt:12" )
    myComponentMacro( ${CMAKE_CURRENT_LIST_FILE} ${CMAKE_CURRENT_LIST_LINE} "CMakeLists.txt:13" )
    myComponentMacro( ${CMAKE_CURRENT_LIST_FILE} ${CMAKE_CURRENT_LIST_LINE} "CMakeLists.txt:14" )
    
    # the actual component
    
    function( myComponentFunction CALLER CALLER_LINE DATA )
        message( STATUS "myComponent.function( ${CALLER}, ${CALLER_LINE}, ${DATA} )" )
    endfunction()
    
    macro( myComponentMacro CALLER CALLER_LINE DATA )
        message( STATUS "myComponent.macro( ${CALLER}, ${CALLER_LINE}, ${DATA} )" )
    endmacro()
    
    
    # the public interface for injecting debug info
    
    function( myComponentFunctionWrapperFunction DATA )
        myComponentFunction( ${CMAKE_CURRENT_LIST_FILE} ${CMAKE_CURRENT_LIST_LINE} ${DATA} )
    endfunction()
    
    macro( myComponentFunctionWrapperMacro DATA )
        myComponentFunction( ${CMAKE_CURRENT_LIST_FILE} ${CMAKE_CURRENT_LIST_LINE} ${DATA} )
    endmacro()
    
    function( myComponentMacroWrapperFunction DATA )
        myComponentMacro( ${CMAKE_CURRENT_LIST_FILE} ${CMAKE_CURRENT_LIST_LINE} ${DATA} )
    endfunction()
    
    macro( myComponentMacroWrapperMacro DATA )
        myComponentMacro( ${CMAKE_CURRENT_LIST_FILE} ${CMAKE_CURRENT_LIST_LINE} ${DATA} )
    endmacro()
    
    $ cmake -D CMAKE_MODULE_PATH=`pwd` .
    -- myComponent.function( <myPath>/CMakeLists.txt, 15, CMakeLists.txt:5 )
    -- myComponent.function( <myPath>/CMakeLists.txt, 19, CMakeLists.txt:6 )
    -- myComponent.macro( <myPath>/CMakeLists.txt, 23, CMakeLists.txt:7 )
    -- myComponent.macro( <myPath>/CMakeLists.txt, 27, CMakeLists.txt:8 )
    -- myComponent.function( <myPath>/CMakeLists.txt, 11, CMakeLists.txt:11 )
    -- myComponent.function( <myPath>/CMakeLists.txt, 12, CMakeLists.txt:12 )
    -- myComponent.macro( <myPath>/CMakeLists.txt, 13, CMakeLists.txt:13 )
    -- myComponent.macro( <myPath>/CMakeLists.txt, 14, CMakeLists.txt:14 )
    -- Configuring done
    
    $cmake-D cmake\u模块路径=`pwd`。
    --myComponent.function(/CMakeLists.txt,15,CMakeLists.txt:5)
    --myComponent.function(/CMakeLists.txt,19,CMakeLists.txt:6)
    --myComponent.macro(/CMakeLists.txt,23,CMakeLists.txt:7)
    --myComponent.macro(/CMakeLists.txt,27,CMakeLists.txt:8)
    --myComponent.function(/CMakeLists.txt,11,CMakeLists.txt:11)
    --myComponent.function(/CMakeLists.txt,12,CMakeLists.txt:12)
    --myComponent.macro(/CMakeLists.txt,13,CMakeLists.txt:13)
    --myComponent.macro(/CMakeLists.txt,14,CMakeLists.txt:14)
    --配置完成
    

    也许我可以通过某种方式访问堆栈跟踪?如果您发出消息(警告…),则行号可用。但我想存储它们,而不仅仅是在终端上打印。
    有什么想法吗?

    不确定这是否可行

    我想通过包装器函数自动注入这些信息 让我自己的组件跟踪缓存变量在何时何地出现 覆盖)

    您是否尝试过将cmake与--trace一起使用(如果您有足够新的cmake版本,甚至可以使用--trace expand)?这可能是一个更好的方式来实现你的目标