2011-12-31 6 views
2

Я пытаюсь предоставить простую функцию 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 и т. Д.).

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

ответ

3

От CMake documentation:

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

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

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

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

+0

Nice find! Я попробую и дам вам знать, как это происходит. –

+0

Спасибо, все, что мне нужно было сделать, это добавить 'ALL' в вызов' add_custom_target() 'и все работает как шарм! –

+0

Что вы делаете, если ОС, на которой запущена сборка, не установила plantuml? – AlexTheo