从CMake调用XSD

时间:2013-07-24 22:15:20

标签: xsd cmake

我正在开发一个使用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由其他需要它的源文件找到。

1 个答案:

答案 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.hppModel.cpp的规则。在这种情况下,CMake会为您计算依赖关系:每当您使用Model.{c,h}pp作为add_{library, executable}参数时,CMake会将您的自定义命令设置为目标的依赖关系。

实际上,这是执行诸如生成文件之类的东西的首选方式,因为它允许CMake跳过已经生成的文件。相反,每次运行add_custom_target时都会构建make