在CMake中添加自定义构建步骤

时间:2013-08-25 10:08:21

标签: c++ c++11 build cmake custom-build-step

我正在尝试在CMake中添加一个生成一些文件的自定义构建步骤。我还没有找到它是如何工作的描述。

我有一个项目,包括来源,标题和实现文件必须由ODB for C ++生成。 ODB将类头作为参数,并生成我想在项目中使用的源文件。

现在我的CMakeLists.txt中有以下命令:

add_custom_command(TARGET ${PROJECT_NAME}
    PRE_BUILD
    COMMAND odb -o /home/david/dev/ --std c++11 -I/home/david/dev/ -d sqlite --generate-    query --generate-schema ${PROMOTER_LIB_PREFIX}/entities/person.hpp
    DEPENDS ${PROJECT_NAME}
    VERBATIM
)

对于文件person.hpp,ODB应生成person-odb.hxxperson-odb.cxxperson-odb.ixx但我使用的CMake命令不会生成任何内容。在终端中,这个命令工作正常。

我做错了什么?

编辑:可以通过添加以下行来解决问题:

set(FAKE_TARGET fakeTarget)
add_custom_target(fakeTarget
    odb -o /home/david/dev/ --std c++11 -I/home/david/dev/ -d sqlite --generate-query --generate-schema ${PROMOTER_LIB_PREFIX}/entities/person.hpp
)
add_dependencies(${PROJECT_NAME} ${FAKE_TARGET})

2 个答案:

答案 0 :(得分:16)

对我而言,我只是使用:

add_custom_command(TARGET ${PROJECT_NAME}
    PRE_BUILD
    COMMAND odb -o /home/david/dev/ --std c++11 -I/home/david/dev/ -d sqlite --generate-    query --generate-schema ${PROMOTER_LIB_PREFIX}/entities/person.hpp
)

我们不使用DEPENDSVERBATIM

DEPENDS选项指定只有在构建了您为此选项指定的项目后才能执行该命令。

编辑:

  

请注意,仅Visual Studio 7或更高版本支持PRE_BUILD选项。对于所有其他生成器,PRE_BUILD将被视为PRE_LINK。

也许这就是为什么它不适合你。

解决方法可能(有点难看):

  • 创建虚假项目
  • 将自定义命令添加为POST_BUILD
  • 让你当前的项目依赖假的

答案 1 :(得分:3)

我使用它的方式是:

add_custom_command(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/gen_icinstrtab.hpp
    COMMAND xsltproc --output ${CMAKE_CURRENT_BINARY_DIR}/gen_icinstrtab.hpp ${CMAKE_SOURCE_DIR}/xml/genictabc.xslt ${CMAKE_SOURCE_DIR}/xml/icminstr.xml
)

add_executable(
    du4

    ${CMAKE_CURRENT_BINARY_DIR}/gen_icinstrtab.hpp
    .
    .
    .
)

关键是将甚至.hpp文件添加到add_executable块中。