CMake:如何在其他所有事情之前运行add_custom_command

时间:2013-04-12 13:40:14

标签: cmake

我有一个自定义命令

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。

然而,只有VS2010支持PRE_BUILD,这意味着在链接之前构建config.h

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

2 个答案:

答案 0 :(得分:35)

您应该使用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的来源之前运行命令。

答案 1 :(得分:1)

Usualy构建基于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

上的示例