CMAKE_uu如何评估调用CMAKE函数的当前行?
出于调试目的,如果我可以访问CMAKE_uu如何评估调用CMAKE函数的当前行?,cmake,Cmake,出于调试目的,如果我可以访问 脚本的文件名 脚本中的当前行号 在配置时间调用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)?这可能是一个更好的方式来实现你的目标