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

18

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

我有一个项目,需要使用ODB为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个回答

19

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

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选项指定只有在构建了您提供给此选项的项目后,才必须执行该命令。

编辑:

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

这可能就是为什么它对您不起作用的原因。

解决方法可能是(有点丑陋):

  • 创建一个虚假的项目
  • 将您的自定义命令添加到其中,并设置为POST_BUILD
  • 使当前项目依赖于虚假项目

好的。谢谢。我使用gcc/make和其他GNU工具。 除了CMake之外,还有其他方法可以添加自定义预构建步骤吗? - David Bulczak
@DavidBulczak 我不这么认为...我有一个解决方法,但非常丑陋:创建一个虚假项目,在其中添加您的自定义命令作为 POST_BUILD,并使您当前的项目依赖于虚假项目...你明白我的意思吗? - Pierre Fourgeaud
1
@DavidBulczak 使用 add_dependencies(${PROJECT_NAME} FAKE_PROJECT) - Pierre Fourgeaud
还有一个想法:也许可以创建一个自定义目标,在该目标中执行我的自定义命令。然后我只需要在自定义目标和主目标之间创建依赖关系,它应该可以工作...希望如此。首先我会尝试@Pierre的方法,然后再尝试我的想法。 - David Bulczak
1
我已经添加了以下代码到我的项目中,现在它可以正常工作了!`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})` - David Bulczak
显示剩余4条评论

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块中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接