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 打印消息的主要内容,如果未能解决你的问题,请参考以下文章
FindPackageHandleStandardArgs.cmake:137 处的 CMake 错误(消息):找不到 Boost(缺少:正则表达式)(找到合适的版本“1.72.0”,