У меня есть функция cmake
, которую я использую для создания целей с надлежащими зависимостями, определенными в моих файлах debian/control
проектов.Это прекрасно работает.
Теперь я хочу создать файл DOT
, чтобы иметь графическое представление моих зависимостей.Для этого я создаю файл «deps.dot» следующим образом:
function(CreateTargets COMPONENT)
[...]
if(NOT EXISTS "${CMAKE_BINARY_DIR}/deps.dot")
file(WRITE
"${CMAKE_BINARY_DIR}/deps.dot"
"digraph dependencies {\n")
endif()
foreach( DEP ${DEPENDS_LIST} )
file(APPEND
"${CMAKE_BINARY_DIR}/deps.dot"
"\"${ARG_PROJECT_NAME}\" [shape=box];\n...
...\"${ARG_PROJECT_NAME}\" -> \"${DEP}\";\n")
endforeach()
[...]
endfunction()
При первой настройке он работает как положено.Он создает файл с digraph dependencies {
, а затем добавляет указанные зависимости в цикл foreach()
.
Второй добавляемый компонент не вызовет file(WRITE ...
, так как файл уже существует.
Теперь, когда я делаю изменения в моих CMakeLists.txt
или файлах модуля, он перезапускает эту функцию и ... к сожалению повторно применяет file(APPEND ...
без предварительного выполнения file(WRITE ...
.В результате получается совершенно неверный файл DOT
.
Как узнать, что мне нужно перезапустить file(WRITE ...
?
Мое текущее решение - переименовать файл в конце, когда ясоздать файл SVG:
file(APPEND "${CMAKE_BINARY_DIR}/deps.dot" "}\n")
# We change the name of the deps.dot file so next time the
# configuration runs it generates a brand new file
#
file(RENAME
"${CMAKE_BINARY_DIR}/deps.dot"
"${CMAKE_BINARY_DIR}/dependencies.dot")
execute_process(
COMMAND dot -Tsvg ${CMAKE_BINARY_DIR}/dependencies.dot
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
OUTPUT_FILE "${CMAKE_BINARY_DIR}/dependencies.svg")
Это работает при условии, что конфигурация работает правильно.Если возникает ошибка, файл deps.dot
задерживается, и я получаю эту ошибку от DOT
, говоря, что файл не является допустимым графиком.