用于新命令行工具的CMake包装器

时间:2011-12-31 18:21:33

标签: cmake plantuml

我正在尝试提供一个简单的CMake函数,以便在构建过程中将PlantUML图表呈现给PNG。我的想法是,我有一堆包含PlantUML图表的.uml文件,我想将其作为构建过程的一部分呈现给PNG。我希望有一个类似于add_library() et的函数。 al。,它呈现图像文件比源文件旧的任何图表。

使用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等。

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

1 个答案:

答案 0 :(得分:3)

来自CMake documentation

  

add_custom_target :添加一个没有输出的目标,以便始终构建它。

     

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

     

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

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