cmake:从内部 .cmake 打印消息
cmake: print messages from internal .cmake
我正在尝试调试 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
那些会被打印出来所以我想知道如何 "actvate" STATUS
消息
我可以重现您的问题,如果未更改 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);
[...]
}
我正在尝试调试 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
那些会被打印出来所以我想知道如何 "actvate" STATUS
消息
我可以重现您的问题,如果未更改 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);
[...]
}