2

我正在尝试提供一个简单的 CMake 函数来将PlantUML图渲染为 PNG,作为我构建过程的一部分。这个想法是我有一堆.uml包含 PlantUML 图的文件,我想在构建过程中将这些文件渲染为 PNG。我想要一个类似于add_library() et 的功能。人。渲染图像文件早于源文件的任何图表。

使用add_custom_command(),我想出了以下代码段:

#
# Create top-level target that renders a PlantUML diagram to a PNG image.
#
function(add_diagram target source)

  # Program used to render the diagram.
  set(plantuml java -jar ${PLANTUML_JARFILE})

  # Diagram source file basename used to create output file name.
  get_filename_component(output ${source} NAME_WE)

  # Render the diagram and write an "${output}.png"
  # file in the current binary folder.
  add_custom_command(
    OUTPUT
      ${CMAKE_CURRENT_BINARY_DIR}/${output}.png
    COMMAND
      ${plantuml} -o ${CMAKE_CURRENT_BINARY_DIR} -tpng ${source}
    MAIN_DEPENDENCY
      ${source}
    COMMENT
      "Rendering diagram '${output}'."
  )

  # Top-level target to build the output file.
  add_custom_target(${target}
    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${output}.png)

endfunction()

我将此函数调用为:

add_diagram(foo ${CMAKE_CURRENT_SOURCE_DIR}/foo.uml)

其中foo.uml是包含 PlantUML 图的文件。在一个非常基本的层面上,这“有效”是因为它创建了一个我可以手动构建的命名顶级目标(例如,使用make foonmake foojom foo等)。

如何将此目标添加到默认目标(全部?),以便自动与其余库和可执行文件一起构建?

4

1 回答 1

3

CMake 文档

add_custom_target:添加一个没有输出的目标,这样它就会一直被构建。

如果指定了ALL选项,则表示应将此目标添加到默认构建目标中,以便每次都运行它。

使用DEPENDS参数列出的依赖项可能会引用在同一目录(CMakeLists.txt 文件)中使用 add_custom_command() 创建的自定义命令的文件和输出。

如果您使用的是 Visual Studio,唯一的缺点是它会为每个目标创建一个新项目。

于 2012-01-01T01:43:59.503 回答