Оболочка CMake для новых инструментов командной строки - PullRequest
2 голосов
/ 31 декабря 2011

Я пытаюсь предоставить простую функцию CMake для отображения PlantUML диаграмм в PNG как часть моего процесса сборки. Идея состоит в том, что у меня есть куча .uml файлов, содержащих диаграммы PlantUML, которые я хочу рендерить в 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 foo, nmake foo, jom foo и т. Д.).

Как добавить эту цель к цели по умолчанию (все?), Чтобы она автоматически создавалась вместе с остальными библиотеками и исполняемыми файлами?

1 Ответ

3 голосов
/ 01 января 2012

Из документации CMake :

add_custom_target : Добавить цель без вывода, чтобы она всегда была построена.

Если указана опция ALL , это означает, что эта цель должна быть добавлена ​​к цели сборки по умолчанию, чтобы она запускалась каждый раз.

Зависимости, перечисленные с DEPENDS аргумент может ссылаться на файлы и выходные данные пользовательских команд, созданных с помощью add_custom_command () в том же каталоге (файл CMakeLists.txt).

Если вы используете Visual Studio, единственным недостатком является то, что он создастновый проект для каждой цели.

...