如何在使用cmake完成后打印消息?

8
我想在CMake构建过程完成后打印消息。我只想在make命令成功完成后通知用户。我该怎么做?我尝试使用add_custom_target(),但无法选择运行时间。我还尝试了add_custom_command(),但也没有得到正确的结果。有什么想法吗?感谢您提前的想法。

当所有目标都完成时,你希望打印此消息...因此,这个自定义目标取决于所有其他目标...添加依赖关系(add_dependencies())是否是一个好主意呢? - francis
是的!你说得非常正确!但是,这个项目包含了许多目标。有没有办法可以获取所有目标的列表? - Genie
3个回答

10
您确实可以执行以下操作:
add_custom_target( FinalMessage ALL
    ${CMAKE_COMMAND} -E cmake_echo_color --cyan "Compilation is over!"
    COMMENT "Final Message" )
add_dependencies( FinalMessage ${ALL_TARGETS} )

根据您之前定义的所有目标列表,定制目标以确保最后运行。


1
谢谢回复。我刚刚尝试了一下,但失败了。${ALL_TARGETS}为空。我正在使用CMake 2.8.11.2。它是在CMake 3.0以上实现的吗? - Genie
谢谢。我之前尝试过使用 Set(ALL_TARGETS ${ALL_TARGETS} "${LIBRARY_NAME}" PARENT_SCOPE),但是由 add_subdirectory() 方法加载的一些子目录中定义的目标不在该列表中。 - Genie

5

要在构建特定目标(例如make yourtarget)后打印消息,您可以使用以下命令:

add_custom_command(TARGET yourtarget POST_BUILD
                   COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --cyan
                   "Message after yourtarget has been built.")

除了使用POST_BUILD,您还可以使用PRE_BUILDPRE_LINK来实现其他目的,详见文档

(在评论中指定要在所有目标之后打印消息,但原始问题不太明确。因此,对于查看此处的人可能有一些价值。)


请注意,使用此方法时,文档说明:“如果目标已经构建,则该命令将不会执行。” - sdbbs

3

smarquis的帮助下,我刚刚解决了这个问题。谢谢。

这是一步一步的操作流程。由于我的源代码树使用了复杂的add_subdirectory()方法进行连接,因此这个方法适用于每个人。

  1. Initialize ALL_TARGETS variable cached. Add the line in CMakeLists.txt right below the version checking command.

     Set(ALL_TARGETS "" CACHE INTERNAL "")
    
  2. Override Add_library() and Add_executable() methods. If there's any other target, override it as well. Add the lines below at the end of CMakeLists.txt file.

     function(Add_library NAME)
       Set(ALL_TARGETS ${ALL_TARGETS} "${ARGN}" CACHE INTERNAL "ALL_TARGETS")
       _add_library(${NAME} ${ARGN})
     endfunction()
    
     function(Add_executable NAME)
       Set(ALL_TARGETS ${ALL_TARGETS} "${ARGN}" CACHE INTERNAL "ALL_TARGETS")
       _add_executable(${NAME} ${ARGN})
     endfunction()
    
  3. Create custom target that will execute all the things you want to do after building. In this example I just print some information on screen. Add it followed by the above.

     add_custom_target(BUILD_SUCCESSFUL ALL
                       DEPENDS ${ALL_TARGETS}
                       COMMAND ${CMAKE_COMMAND} -E echo ""
                       COMMAND ${CMAKE_COMMAND} -E echo "====================="
                       COMMAND ${CMAKE_COMMAND} -E echo "  Compile complete!"
                       COMMAND ${CMAKE_COMMAND} -E echo "====================="
                       COMMAND ${CMAKE_COMMAND} -E echo ""
                      )
    
  4. Tada!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接