我正在开发一个使用codesynthesis从XSD架构部分生成的项目。我使用了以下地址的FindXSD.cmake让CMake正确搜索XSD标头: http://wiki.codesynthesis.com/uploads/8/86/FindXSD.cmake.gz
这个FindXSD.cmake设置XSD_EXECUTABLE变量,我想用它来构建任何目标之前从模式生成代码(项目的主要目标是库),但是不熟悉CMake,I很难理解如何集成这样的自定义命令。
这是我到目前为止所做的:
add_library (mylibrary ${MY_PROJECT_SRC})
add_custom_command(TARGET mylibrary PRE_BUILD
COMMAND "${XSD_EXECUTABLE} cxx-tree --type-naming knr
-- hxx-suffix .hpp --cxx-suffix .cpp
${MY_PROJECT_SOURCE_DIR}/src/model/Model.xsd")
但它似乎没有做任何事情,而且,如果确实如此,我不知道文件的生成位置(命令应该生成Model.hpp和Model.cpp),所以我不知道是什么要添加的命令使Model.cpp在目标库中编译,而Model.hpp由其他需要它的源文件找到。
答案 0 :(得分:2)
您可以使用add_custom_target()
ALL
关键字
add_custom_target(xsdgen
COMMAND ${XSD_EXECUTABLE} cxx-tree --type-naming knr
--hxx-suffix .hpp --cxx-suffix .cpp
${MY_PROJECT_SOURCE_DIR}/src/model/Model.xsd)
这会将此命令添加到所有目标列表中。现在,您需要确保在 mylibrary 之前构建此目标:
add_dependencies(mylibrary xsdgen)
还有另一种方法 - 使用add_custom_command
定义生成Model.hpp
和Model.cpp
的规则。在这种情况下,CMake会为您计算依赖关系:每当您使用Model.{c,h}pp
作为add_{library, executable}
参数时,CMake会将您的自定义命令设置为目标的依赖关系。
实际上,这是执行诸如生成文件之类的东西的首选方式,因为它允许CMake跳过已经生成的文件。相反,每次运行add_custom_target
时都会构建make
。