33

我有一个自定义命令

add_custom_command(
    OUTPUT config.h
    PRE_BUILD
    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/mk_config_h.py ${CMAKE_CURRENT_BINARY_DIR}/config.h
)

我试图在其他一切之前运行它并生成 unix Makefile。

但是 PRE_BUILD 仅支持 VS2010,这意味着它config.h是在链接之前构建的。

如何在 cmake 开始编译源代码之前制作自定义命令。

4

2 回答 2

51

您应该add_custom_target改为使用add_dependencies并使您的正常目标依赖于它:

add_custom_target(
    myCustomTarget
    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/mk_config_h.py ${CMAKE_CURRENT_BINARY_DIR}/config.h
)
add_dependencies(myTarget myCustomTarget)

这应该确保在编译源代码之前运行该命令myTarget

于 2013-04-12T14:15:36.790 回答
2

通常基于 makefile 的构建系统不需要将标头作为目标的一部分。此外,将标头添加到目标被认为是一种反模式。但生成标头是此规则的一个例外。

http://voices.canonical.com/jussi.pakkanen/2013/03/26/a-list-of-common-cmake-antipatterns/

您应该将您的设置${CMAKE_CURRENT_BINARY_DIR}/config.h为其他一些编译目标的一部分。例如:

set(PROGRAM1_SOURCES main_program1.cpp)
set(PROGRAM1_HEADERS main_program1.h ${CMAKE_CURRENT_BINARY_DIR}/config.h)
add_executable(program1 ${PROGRAM1_SOURCES} ${PROGRAM1_HEADERS})

这样,CMake 将知道哪个目标实际需要生成config.h,并且能够将生成命令插入到正确的构建步骤中。

另外,请参阅https://cmake.org/cmake-tutorial/#s5中的示例

于 2016-02-04T09:45:37.590 回答