18

我正在尝试在 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.hppODB 应该生成person-odb.hxx, person-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})
4

2 回答 2

18

对我来说,有类似的东西,我只是使用:

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
)

我们不使用DEPENDSor VERBATIM

DEPENDS选项指定该命令必须在您提供给此选项的项目构建后才执行。

编辑 :

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

也许这就是为什么它对你不起作用。

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

  • 创建一个假项目
  • 将您的自定义命令添加为 POST_BUILD
  • 使您当前的项目依赖于虚假项目
于 2013-08-25T10:14:17.967 回答
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 块中。

于 2014-12-23T16:20:15.773 回答