gpt4 book ai didi

CMAKE_ 如何评估调用 cmake 函数的当前行?

转载 作者:行者123 更新时间:2023-12-03 15:51:04 25 4
gpt4 key购买 nike

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

  • 脚本文件名
  • 脚本中的当前行号

  • 配置时间其中一个 CMake 函数/宏是 调用 . (我想通过包装函数为我自己的组件自动注入(inject)这些信息,以跟踪缓存变量何时何地被覆盖)。

    虽然 1. 似乎正在评估 CMAKE_CURRENT_LIST_FILE,但我无法弄清楚如何实现 2。 CMAKE_CURRENT_LIST_LINE始终设置为实际放置的行,在我的情况下是包装函数内的行。

    如建议 in the CMake bugtracker ,我可以通过 [CMAKE_CURRENT_LIST_LINE][3] 作为附加参数在调用方站点上执行此操作。但我想避免这种情况从“公共(public)接口(interface)”隐藏调试逻辑。

    表达我想要的最小工作示例:

    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" )

    我的组件.cmake :
    # 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

    也许我可以以某种方式访问​​堆栈跟踪?如果您发出,例如,message(WARNING ...),则行号可用。但我想存储它们,而不仅仅是在终端上打印。
    有任何想法吗?

    最佳答案

    不确定这是否可能。

    I want to inject this information automatically via wrapper functions for my own component to track when and where cache variables were overwritten)



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

    关于CMAKE_ 如何评估调用 cmake 函数的当前行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27002039/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com