每次cmake重新配置/重新生成Makefile时,如何重置由cmake创建的文件?

时间:2019-05-13 00:10:19

标签: cmake configuration

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

0 个答案:

没有答案