代码之家  ›  专栏  ›  技术社区  ›  topher217

跟踪CMakeLists.txt文件之间的变量、库或其他依赖项的来源

  •  0
  • topher217  · 技术社区  · 2 年前

    我正在尝试理解一种很好的方法来理解扩展的CMake项目(几层子目录),而不必非常熟悉项目的每一部分。简而言之,我希望拥有cmake文件的某种代码导航功能。这可能类似于 ctags 或者VS Code的Intellisense的“转到定义”,它可以取一些库名称(或者通常是一些变量),然后转到库或变量的定义。我将在下面的例子中澄清我所说的“库的定义”是什么意思。

    这里有一个简单的例子,我不需要这样的工具,但我希望这个问题能更清楚。假设我有一个图书馆 module_a 由cmake在文件中创建 src/module_a/CMakeLists.txt :

    add_library(module_a STATIC
        module_a.c
    )
    
    target_include_directories(module_a PUBLIC
        ${CMAKE_CURRENT_LIST_DIR}
    )
    

    以及依赖于此库的可执行文件,该可执行文件通过 src/main/CMakeLists.txt :

    add_executable(main
        main.c
    )
    
    target_link_libraries(main
        module_a
    )
    

    有什么办法让我知道吗 模块a 正在中引用 src/main/CMakeLists.txt 而不知道该文件 src/module_a/CMakeLists.txt ?换句话说,我希望能够在一个更大的项目中查看一个CMakeLists.txt文件,并有一些工具能够告诉我变量、库和其他依赖项的定义位置。

    对于上面的示例,我想打开 src/main/CMakeLists.txt 然后点击某个内容并跳转到 src/module_a/CMakeLists.txt add_library 请来 src/module_a/CMakeLists.txt 通过这种方式,我可以看到我所说的“图书馆的定义”。

    如果不存在这样的工具/插件,有什么好方法可以grep cmake的输出目录来查找这些信息?我猜信息就在那里,但我只是不确定该找什么,只是一条毯子 grep -R module_a src/build 即使是这个简单的例子,也有大量的信息。

    0 回复  |  直到 2 年前
        1
  •  0
  •   Masatake YAMATO    2 年前

    Universal Ctags将库CMakeLists.txt识别为目标:

    $ find
    .
    ./src
    ./src/main
    ./src/main/CMakeLists.txt
    ./src/module_a
    ./src/module_a/CMakeLists.txt
    $ ctags --quiet --options=NONE -o - -R --fields=+nK
    main    src/main/CMakeLists.txt /^add_executable(main$/;"   target  line:1
    module_a    src/module_a/CMakeLists.txt /^add_library(module_a STATIC$/;"   target  line:1
    

    像Vim这样的编辑器可以提供带有标签文件的代码导航功能。 如果 readtags 作为通用Ctags一部分的命令可用,您可以基于该命令创建一个导航工具:

    $ ctags --quiet --options=NONE -o - -R --fields=+nK | readtags -t -  -F '(list "<" $name "> is defined at " $line " in " $input #t)' module_a
    <module_a> is defined at 1 in src/module_a/CMakeLists.txt
    

    (只有当代码库足够小时,管道才能工作;ctag和readtag都构成temorary文件。)