在使用 cmake 构建时,如何让 make 变得冗长但只有“有意义”的行?

Posted

技术标签:

【中文标题】在使用 cmake 构建时,如何让 make 变得冗长但只有“有意义”的行?【英文标题】:How can I get make to be verbose but with only "meaningful" lines when building with cmake? 【发布时间】:2021-12-17 23:11:09 【问题描述】:

我在我的一个项目中使用带有 GNU Make 生成器的 CMake,然后想要构建它 - 很详细。

我对实际产生东西的行感兴趣,而不是对以下行感兴趣:

gmake[2]: Entering directory '/some/where'
gmake[2]: Leaving directory '/some/other/place'

也不是说:

cd /some/where && /path/to/cmake/bin/cmake -E cmake_link_script CMakeFiles/some.dir/link.txt --verbose=1

因为它们“包装”了 cmake 运行该脚本时将发生的实际工作(例如,调用 gcc 等链接器可执行文件)。

我不太介意百分比标题,例如:

[ 97%] Building CXX object /path/to/proj/CMakeFiles/something.dir/foo.o

即如果您的解决方案删除了​​它们,那么很好,如果它保留它们 - 也很好。

我已经阅读了这个问题的答案和 cmets:Using CMake with GNU Make: How can I see the exact commands?,到目前为止我想出的最好的是:

MAKEFLAGS="$MAKEFLAGS --no-print-dir" cmake --build build_dir/  --verbose 

--verbose 为您提供最大的 (?) 冗长性,包含您不想要的所有内容。然后,--no-print-dir 被 GNU Make 拾取,从而避免了进入/离开目录消息。

我可以做得更好,实际上避免使用cdcmake -E 命令吗?

注意事项:

我意识到我可以使用最大详细程度,然后使用 grep 进行过滤。这不是我想要的 - 我希望一开始就不要发出这些行。 不得将任何内容硬编码到CMakeLists.txt 文件中;在 CMake 配置之后,一切都必须通过命令行完成。

【问题讨论】:

我确定MAKEFLAGS+="--no-print-dir" 是一个错字,而您的意思是MAKEFLAGS="--no-print-dir" @MadScientist:嗯,这取决于我的 MAKEFLAGS 中是否还有其他东西,但没关系。 这是我使用 Ninja 的原因号 #289465。 POSIX shell 没有定义任何像+= 这样的操作符;使用它是一个语法错误。在保留预先存在的值的同时编写它的可移植方式是MAKEFLAGS="$MAKEFLAGS --no-print-dir"。一些 shell(如 bash)确实支持 += 作为特定的运算符,而另一些则不支持。 没有特别的理由必须打印这些行:这就是 cmake 决定生成其 makefile 的方式。 cmake 可以很容易地生成在这里做得更好的 makefile,而且我确信 cmake 可以(甚至可以)生成不能完全按照某些人想要的方式工作的 ninja 文件。 【参考方案1】:

你会发现自己没有办法做你想做的事。

由于 cmake 只是生成 makefile,实际上是 make 运行配方并打印输出,因此您需要查看 makefile 并了解规则是如何构建的。例如,如果您找到链接线的示例规则,您将看到它看起来像这样:

myexecutable: ...
        @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/mydir/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable myexecutable"
        cd /mydir && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/myexecutable.dir/link.txt --verbose=$(VERBOSE)

请注意,此配方中 cd /mydir ... 文本之前没有特殊变量、标记或任何内容。

因此,绝对没有办法控制这个特定配方的打印方式,与所有其他配方的打印方式分开。你要么全部得到,要么一个都得不到。

【讨论】:

以上是关于在使用 cmake 构建时,如何让 make 变得冗长但只有“有意义”的行?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 nmake 克服错误(make -k 的行为)

如何在CMake中配置可移植并行版本?

如何在不使用 CMake 但仅使用 make 的项目中合并使用 CMake 的仅标头库?

使用 make install 安装 libssh 构建时出错

Cmake:未设置 CMAKE_MAKE_PROGRAM

cmake