如何使用cmake包含编译生成的文件?

如何使用cmake包含编译生成的文件?,cmake,Cmake,我在“xsd”子目录中有一组.xsd文件。我使用外部命令生成一组用于XML绑定的.hxx和cxx文件 add_custom_command( PRE_BUILD OUTPUT ${PROJECT_SOURCE_DIR}/xsd/file1.hxx ${PROJECT_SOURCE_DIR}/xsd/file1.cxx COMMAND ${XSD_EXECUTABLE} cxx-tree --file-list-prologue 'set(XSD_GENERATED_FILES '

我在“xsd”子目录中有一组.xsd文件。我使用外部命令生成一组用于XML绑定的.hxx和cxx文件

add_custom_command(
PRE_BUILD
OUTPUT ${PROJECT_SOURCE_DIR}/xsd/file1.hxx ${PROJECT_SOURCE_DIR}/xsd/file1.cxx
COMMAND ${XSD_EXECUTABLE} cxx-tree
    --file-list-prologue 'set(XSD_GENERATED_FILES '
    --file-list ${PROJECT_SOURCE_DIR}/cmake_xsd_filelist.txt
    --file-list-epilogue ')'
    --output-dir ${PROJECT_SOURCE_DIR}/xsd
    ${XSD_SOURCE_FILES}
DEPENDS ${XSD_SOURCE_FILES}
)
该工具将创建生成文件的列表。我有以下表格:

set(XSD_GENERATED_FILES
file1.cpp
file1.hpp
file2.cpp
file2.hpp
)
到目前为止还不错

现在是我不知道如何继续的部分。我想包括生成的文件列表,并将它们添加到可执行文件中

include(${PROJECT_SOURCE_DIR}/cmake_xsd_filelist.txt)
add_executable(Prog ${SOURCE_FILES} ${XSD_GENERATED_FILES})
但这并不是我想要的。实际上,它什么也不做,因为最初
cmake_xsd_filelist.txt
是空的

我的目标如下:

  • 当“xsd”文件夹中的文件发生更改时,执行xsd_可执行文件以生成.cpp和hpp文件
  • 仅在生成的.cpp文件发生更改时编译一次
  • 将生成的源文件添加到可执行文件
这在cmake中是可能的吗?如果是,如何添加?

包括来源 这意味着您需要在configure步骤中有一个
cmake_xsd_filelist.txt
文件,即xsd必须由调用。此外,我认为最好将文件生成到二进制目录(遵循以下概念):

不要忘记检查成功退出状态:

if(NOT result EQUAL 0)
  message(FATAL_ERROR "XSD failed")
endif()
现在,您可以包括以下来源:

include(${CMAKE_BINARY_DIR}/generated/cmake_xsd_filelist.txt)
add_executable(Prog ${SOURCE_FILES} ${XSD_GENERATED_FILES})
XSD源代码更新 也就是说,如果某个
xsd
文件发生更改,CMake必须运行reconfigure。以下是有帮助的技巧:

foreach(x ${XSD_SOURCE_FILES})
  configure_file(${x} ${x} COPYONLY)
endforeach()

现在,如果任何
XSD_源文件
更改,CMake将有效地重新配置项目,重新运行
XSD_可执行文件
,并重新包含
CMake_XSD_文件列表.txt

使用add_custom_命令或add_custom_目标的解决方案将不需要重新运行CMake或configure_文件技巧。@steveire在这种情况下,您可以无法包含生成的列表:
include(${CMAKE_BINARY_DIR}/generated/CMAKE_xsd_filelist.txt)
噢,这是输出吗?好的。你知道吗,或者你能在cmake时确定输出文件吗?不,文件是在构建过程中生成的。我不是这么问的:)。我会假装你告诉我不可能确定生成的文件将被调用。
include(${CMAKE_BINARY_DIR}/generated/cmake_xsd_filelist.txt)
add_executable(Prog ${SOURCE_FILES} ${XSD_GENERATED_FILES})
when a file in the 'xsd' folder changes, execute XSD_EXECUTABLE
for generating the .cpp and hpp files.
foreach(x ${XSD_SOURCE_FILES})
  configure_file(${x} ${x} COPYONLY)
endforeach()