我有一个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
得到该错误是因为该文件不是有效图形。