根据条件在CMake中执行多个post构建命令

And*_* AG 3 cmake

所以我有一些cmake定义ADD_EXTRA_STEP可以是true或false,并根据用户的需要设置.然后,在构建后我必须执行一些命令.我目前有这样的事情:

    add_custom_command(TARGET ${some_target}
        POST_BUILD
        COMMAND <command to generate FOO.out>
        COMMAND <command that uses FOO.out and generates FOO2.out>
        COMMENT <some comment>
        VERBATIM
    )
    add_custom_command(TARGET ${some_target}
        POST_BUILD
        COMMAND <some other command>
        COMMENT <some other comment>
        VERBATIM
    )
Run Code Online (Sandbox Code Playgroud)

现在在两者之间add_custom_command我需要执行另一个命令,当且仅当if ADD_EXTRA_STEP设置为true.问题是,为了实现这一点,我需要保证FOO2.out存在.到目前为止我的想法是做这样的事情:

    add_custom_command(TARGET ${some_target}
        POST_BUILD
        COMMAND <command to generate FOO.out>
        COMMAND <command that uses FOO.out and generates FOO2.out>
        COMMENT <some comment>
        VERBATIM
    )
    if(${ADD_EXTRA_STEP})
        add_custom_command(TARGET ${some_target}
            POST_BUILD
            COMMAND <extra step command that uses FOO2.out>
            COMMENT <some extra comment>
            VERBATIM
        )
    endif()
    add_custom_command(TARGET ${some_target}
        POST_BUILD
        COMMAND <some other command>
        COMMENT <some other comment>
        VERBATIM
    )
Run Code Online (Sandbox Code Playgroud)

但是,我怀疑这是否有效以及以这种方式实施它是否是一种"好"做法.换句话说,是否保证当add_custom_command执行命令时,前add_custom_command一个命令(即产生FOO2.out的命令)已经执行了?

提前致谢!

use*_*253 7

您需要将add_custom_commandadd_custom_target结合使用

其主要思想是使用OUTPUT的形式add_custom_command在所述第一步骤与OUTPUT等于FOO2.out然后指定FOO2.outDEPENDS在条件目标/命令.是使用add_custom_command还是add_custom_target取决于命令中的实际操作以及如何在后续步骤中使用命令的结果.考虑这个简单的例子:

add_executable(some_executable some_executable_source.c)
add_custom_command(OUTPUT FOO2.out
   DEPENDS some_executable
   COMMAND ${CMAKE_COMMAND} -E touch FOO2.out
   COMMAND ${CMAKE_COMMAND} -E echo "creating FOO2.out"
)

if (${ADD_EXTRA_STEP})
  add_custom_target(run ALL
    ${CMAKE_COMMAND} -E echo "executing extra step"
    DEPENDS FOO2.out
  )
endif()
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果需要,将在创建FOO2.out之后始终执行额外步骤