4

我正在尝试调试在 a 期间遇到的问题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 ....),但没有打印出来。

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

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

但是当我运行 cmake 时,即使使用make package VERBOSE=1.

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

4

1 回答 1

4

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

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

# 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

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

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

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

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

但是还是没有收到消息。调试时cpack.exe,我可以看到STATUS消息最终会调用cmake::UpdateProgress(),并且ProgressCallbackCPack.

我认为修复非常简单,但我不确定您是否愿意更改 CMake 的源代码,或者您是否想在CMake 的 bug tracker中提出问题。

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

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);
    [...]
}
于 2016-03-16T09:10:57.183 回答