如何从命令行列出定义的 make 目标?

How do I list the defined make targets from the command line?

我觉得问这个问题有点傻,但我找不到任何关于这个的东西...

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

我想要一个有效的列表来替代以下命令行中的 $target

cmake . && cmake --build . --target $target

对于既不使用 grep 也不使用 find 也不使用 python 也不使用 perl 的解决方案有很多 的奖励积分。 .. 你明白了。

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

cmake --build . --target help

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

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

另见 Generating Dependency Graphs with CMake and CMake Graphviz Output Cleaner

如果您没有安装 dotty,您仍然可以通过在 CMakeLists.txt:

中启用 GLOBAL_DEPENDS_DEBUG_MODE 来使目标依赖项可见
set_property(GLOBAL PROPERTY GLOBAL_DEPENDS_DEBUG_MODE 1)

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

参考资料

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

当我 运行 make help (在 运行ning 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

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

然而,人们可能只是在 CMakeLists.txt 中寻找明确声明的目标。像“全部”和“干净”这样的目标可能不是人们感兴趣的。

因此,他们可以简单地在 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 }'

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

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

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

或者,您也可以

cd build
make help