【问题标题】:How to include generated files for compilation with cmake?如何包含生成的文件以使用 cmake 进行编译?
【发布时间】:2014-09-27 12:01:08
【问题描述】:

我在子目录“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_EXECUTABLE 以生成 .cpp 和 hpp 文件。
  • 生成的 .cpp 文件发生变化时只编译一次
  • 将生成的源文件添加到可执行文件中。

这甚至可以用 cmake 实现吗?如果是,怎么做?

【问题讨论】:

  • 你知道,或者你能确定cmake时的输出文件吗?
  • 否,文件是在构建过程中生成的。
  • 这不是我问的:)。我会假装你告诉我不可能确定生成的文件将被调用。

标签: cmake


【解决方案1】:

包括来源

include(${PROJECT_SOURCE_DIR}/cmake_xsd_filelist.txt)
add_executable(Prog ${SOURCE_FILES} ${XSD_GENERATED_FILES})

这意味着您需要在 configure 步骤中有一个cmake_xsd_filelist.txt 文件,即 xsd 必须由execute_process 调用。另外我认为最好将文件生成到二进制目录(遵循out-of-source 概念):

# Create directory if needed
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/generated")

execute_process(
    COMMAND
        ${XSD_EXECUTABLE} cxx-tree
        --file-list-prologue 'set(XSD_GENERATED_FILES '
        --file-list "${CMAKE_BINARY_DIR}/generated/cmake_xsd_filelist.txt"
        --file-list-epilogue ')'
        --output-dir "${CMAKE_BINARY_DIR}/generated/xsd"
        ${XSD_SOURCE_FILES}
    RESULT_VARIABLE result
)

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

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 源更新

when a file in the 'xsd' folder changes, execute XSD_EXECUTABLE
for generating the .cpp and hpp files.

即如果xsd 文件之一发生更改,CMake 必须运行重新配置。这是有用的技巧:

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

现在,如果 XSD_SOURCE_FILES 发生任何更改,CMake 将重新配置项目,有效地重新运行 XSD_EXECUTABLE 并重新包含 cmake_xsd_filelist.txt

【讨论】:

  • 使用 add_custom_command 或 add_custom_target 的解决方案不需要重新运行 cmake 或 configure_file 技巧。
  • @steveire 在这种情况下,您不能包含生成的列表:include(${CMAKE_BINARY_DIR}/generated/cmake_xsd_filelist.txt)
  • 哦,那是输出?好的。
猜你喜欢
  • 2015-09-21
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多