我有一个自定义命令
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开始编译源代码之前创建自定义命令。
答案 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
,并且能够将生成命令插入到正确的构建步骤中。