cmake:从内部.cmake打印消息

时间:2016-02-18 08:57:58

标签: cmake cpack

我正在尝试调试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}'") 开头有这些行:

make package VERBOSE=1

但是当我运行cmake时,即使使用STATUS,也不会打印出来。

但是,如果我删除那些被打印的STATUS,那么我想知道如何“使用MyConstants消息

1 个答案:

答案 0 :(得分:4)

我可以重现您的问题,如果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

因此,您在执行cpack.exe时呼叫make package。要重现您的问题,我只需将以下行添加到CPackConfig.cmake

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

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

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

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

我认为修复非常简单,但我不确定您是否愿意更改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);
    [...]
}