【问题标题】:How do I list the defined make targets from the command line?如何从命令行列出定义的 make 目标?
【发布时间】:2015-08-27 22:00:08
【问题描述】:

我觉得问这个几乎是愚蠢的,但我在这个上找不到任何东西......

假设我有一个 cmake 项目,其中包含许多目标(库、可执行文件、外部目标等)。如何使用cmake 命令行界面列出它们?

我想要在以下命令行中有效替换 $target 的内容列表:

cmake . && cmake --build . --target $target
对于既不使用grep 也不使用find 也不使用python 也不使用perl 也不...的解决方案

很多奖励积分......你明白了。

【问题讨论】:

    标签: cmake


    【解决方案1】:

    对于您可以使用的 Makefile 生成器构建环境

    cmake --build . --target help
    

    还有图形输出解决方案(示例找到here):

    cmake --graphviz=test.graph 
    dotty test.graph
    

    另请参阅 Generating Dependency Graphs with CMakeCMake Graphviz Output Cleaner

    如果您没有安装dotty,您仍然可以通过在CMakeLists.txt 中启用GLOBAL_DEPENDS_DEBUG_MODE 来使目标依赖项可见:

    set_property(GLOBAL PROPERTY GLOBAL_DEPENDS_DEBUG_MODE 1)
    

    这里的缺点是你不能从命令行触发它。在生成 make 环境时,它将始终显示在 stderr 上。

    参考文献

    【讨论】:

    • 好吧,如果有一些与底层生成器无关但对我有用的东西会很好。我不太喜欢图形输出解决方案,因为它需要 dotty,我认为这比 perl、grep 和 bash 更糟糕,因为它没有出现在我使用的任何系统的默认安装中。我仍然会奖励基于制造的解决方案的积分。
    • 谢谢。我添加了使用 GLOBAL_DEPENDS_DEBUG_MODE 全局属性的信息。这将在没有dotty 甚至没有--graphviz 命令行选项的情况下工作。而且 - 因为我之前在 CMake 中也错过了这个 - 我计划在 CMake 的错误跟踪器上发布一个 --list-all-targets 命令行选项的功能请求。如果我得到积极的反馈,我会在这里及时通知您。
    • 注意cmake --build . --target helpmake help基本相同
    • @Ignitor 是的,它是一个抽象,所以你不需要知道make 调用语法或make program's path。我在这里使用它是因为它也适用于其他“makefile 生成器”,例如 nmakegmakeninja、...
    • @Florian:您的第二个链接似乎已关闭:-(
    【解决方案2】:

    我想你可能正在寻找命令make help

    当我运行 make help(运行 cmake .. 之后)时,我得到以下输出:

    The following are some of the valid targets for this Makefile:
    ... all (the default if no target is provided)
    ... clean
    ... depend
    etc
    

    您还可以阅读 cmake 为您自动生成的 Makefile

    【讨论】:

    • 这也(就像接受的答案一样)仅在 cmake 生成器设置为 makefiles 时才有效,这是 linux 上的默认设置,但对于 osx 或 windows,cmake 分别使用 xcode 或 Visual Studio 作为默认生成器。而在 linux 上我们更喜欢 ninja,它默认进行多线程构建,并且可以用来生成 compile_commands.json。
    【解决方案3】:

    正如@Florian 和@Olivia Stork 回答的那样,我们可能会得到生成的Makefile 的所有目标。

    但是,人们可能只是在 CMakeLists.txt 中寻找明确声明的目标。像“all”和“clean”这样的目标可能不是人们感兴趣的。

    因此,他们可以在 make 的输出中简单地查询“Built target”。

    cd ~/work/my_project
    mkdir build && cd build && cmake ..
    make -j4 > log.txt 2>&1
    grep 'Built target' log.txt | awk '{print $4}'
    

    【讨论】:

      【解决方案4】:

      @Florian 的回答是正确的。只是为了给它一些上下文,命令

      cmake --build . --target help 假设您的构建目录位于当前目录,如“点”所示。

      如果您将构建目录设置为当前目录以外的另一个目录,比如/build,那么您应该将其指定为 cmake --build build --target help.

      或者,你也可以

      cd build
      make help
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-05
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 2013-10-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多