Я пытаюсь предоставить простую функцию CMake для рендеринга диаграмм PlantUML в PNG как часть моего процесса сборки. Идея состоит в том, что у меня есть куча файлов .uml
, содержащих диаграммы PlantUML, которые я хочу отобразить в PNG как часть моего процесса сборки. Я хотел бы иметь функцию, похожую на add_library()
et. и др., который отображает любую диаграмму, для которой файл изображения старше исходного файла.CMake wrapper для новых инструментов командной строки
Используя 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
и т. Д.).
Как добавить эту цель к целевой цели по умолчанию (все?), Чтобы она автоматически строилась с остальными библиотеками и исполняемыми файлами?
Nice find! Я попробую и дам вам знать, как это происходит. –
Спасибо, все, что мне нужно было сделать, это добавить 'ALL' в вызов' add_custom_target() 'и все работает как шарм! –
Что вы делаете, если ОС, на которой запущена сборка, не установила plantuml? – AlexTheo