【问题标题】:cmake add_custom_command that is executed on every build在每次构建时执行的 cmake add_custom_command
【发布时间】:2015-10-17 01:42:39
【问题描述】:

我想在 CMake 中有一些东西,只要我输入 make 就会执行

add_custom_command(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/build_date.cc
    PRE_BUILD
    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/mk_build_date.py 
            ${CMAKE_CURRENT_BINARY_DIR}/build_date.cc
)
add_custom_target(build-date-xxx 
                  ALL
                  DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/build_date.cc)

这就是我目前正在做的事情。不幸的是,make build-date-xxx 只会生成一次文件。

即使没有 add_custom_target 声明,该文件也只会构建一次。

GNU Make 中的结果应该是这样的

.PHONY all: 
    echo "hallo welt"
all: foo.c bar.c
%.c:
    touch $@

只要输入 make 就在该 makefile 中。因为 all 是第一个目标,所以它总是会被调用并且自定义命令 echo "hallo welt" 会被实际执行。

【问题讨论】:

标签: cmake cmake-custom-command


【解决方案1】:

尝试使用 ADD_CUSTOM_TARGET 并在其中使用参数 ALL。 然后让你的主要目标依赖于这个自定义目标。

【讨论】:

  • 实际上这正是我在 cmake 中查看第二个命令时所做的。一旦运行 cmake,它就会生成文件。但不是每次都运行 make。
【解决方案2】:

颠倒你的顺序...有一个自定义目标没有依赖项(没有DEPENDS)来生成你的文件,并添加一个依赖于这个目标的自定义命令,提到它@987654322 @s 文件,实际上并没有做任何事情(例如COMMAND ${CMAKE_COMMAND} -E echo)。然后在某处提及输出文件(大概您将其作为库或可执行文件的源)。 (您也可以将ALL 用于自定义目标,但我假设某些代码对象实际上使用了输出文件,因此您希望所述代码对象依赖于输出文件。)

理想情况下,您应该避免修改文件,除非确实发生了变化,否则您将永远无法获得无操作构建。 (如何做到这一点留给读者作为练习。)

【讨论】:

    猜你喜欢
    • 2016-04-22
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多