cmake:从内部 .cmake 打印消息

Posted

技术标签:

【中文标题】cmake:从内部 .cmake 打印消息【英文标题】:cmake: print messages from internal .cmake 【发布时间】:2016-02-18 08:57:58 【问题描述】:

我正在尝试调试在make package 期间遇到的问题:

CMake Error at /usr/local/Cellar/cmake/3.4.3/share/cmake/Modules/BundleUtilities.cmake:861 (message):
    error: fixup_bundle: not a valid bundle

我看到里面有一些message(STATUS ....),但它们没有被打印出来。

例如,在该文件 (/usr/local/Cellar/cmake/3.4.3/share/cmake/Modules/BundleUtilities.cmake) 中包含的函数 fixup_bundle 的开头有以下几行:

message(STATUS "fixup_bundle")
message(STATUS "  app='$app'")
message(STATUS "  libs='$libs'")
message(STATUS "  dirs='$dirs'")

但是当我运行 cmake 时,即使使用 make package VERBOSE=1 也没有打印出来。

但是如果我删除了那些被打印的STATUS,那么我想知道如何“激活”STATUS 消息

【问题讨论】:

区别可能是STATUS 消息转到stdout。你打电话给make package 例如在 shell 脚本中?或者您可以添加一些有关您的主机环境的详细信息吗? 我从 shell 调用它,我没有重定向。我在 osx 10.9 抱歉回复晚了。我正在尝试重现这一点,如果您可以提供一个包含 CPack 配置的最小 CMake 示例脚本,这将有所帮助。这将有助于查看 CMake 为 package 目标生成的规则。 哦,谢谢!我已经更新了问题 【参考方案1】:

如果不更改 CPack 的源代码,我可以重现您的问题,您将不会收到状态消息。您遇到的行为是 CPack 当前的实施方式。

如果您查看 CMake 生成的 package makefile 规则,您会发现如下内容:

# Special rule for the target package
package: preinstall
    @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Run CPack packaging tool..."
    [your path here]/cpack.exe --config ./CPackConfig.cmake
.PHONY : package

所以你在调用make package 时调用cpack.exe。为了重现您的问题,我刚刚将以下行附加到CPackConfig.cmake

message(STATUS "+++ Test +++")

正如您已经测试过的,只有当我删除 STATUS 关键字时,我才会看到该消息。所以我测试了直接从命令行调用:

> cpack.exe --verbose --debug --config ./CPackConfig.cmake

但仍然没有收到消息。在调试cpack.exe 时,我可以看到STATUS 消息最终会调用cmake::UpdateProgress(),而CPack 中根本没有设置ProgressCallback

我认为修复非常简单,但我不确定您是否愿意更改 CMake 的源代码或例如如果您想在CMake's bug tracker 中提出票证。

编辑:我已经使用STATUS 消息成功地测试了cpack.cxx 的以下代码扩展:

void cpackProgress(const char *msg, float prog, void* ptr)

    (void)prog;
    cmCPackLog* log = static_cast<cmCPackLog*>(ptr);
    cmCPack_Log(log, cmCPackLog::LOG_OUTPUT, msg << std::endl);

然后

int main (int argc, char const* const* argv)

    [...]
    cmake cminst;
    cminst.SetProgressCallback(cpackProgress, &log);
    [...]

【讨论】:

谢谢,我已经在问题中添加了 cpack 标签,也许 cpack 中有一个隐藏/魔术标志......并且 cpack 大师最终会回答。我在标记为已回答问题之前等待 @bibi 不客气。很公平。我为必要的cpack.cxx 扩展添加了一个代码示例。在当前存在的 CPack 代码中,只有 cmCPackGenerator::InstallProjectViaInstallCMakeProjects() 正在调用 SetProgressCallback()

以上是关于cmake:从内部 .cmake 打印消息的主要内容,如果未能解决你的问题,请参考以下文章

防止 cmake 运行 cpack

FindPackageHandleStandardArgs.cmake:137 处的 CMake 错误(消息):找不到 Boost(缺少:正则表达式)(找到合适的版本“1.72.0”,

通过 CMake 在 catkin 工作场所外使用 ROS 自定义消息

在 Mac 上使用 CMake 的 GLFW

CMake 工具链包含多个文件

从源代码安装 qiskit-aer 时出现 CMake 错误