gpt4 book ai didi

cmake - 如何包含生成的文件以使用 cmake 进行编译?

转载 作者:行者123 更新时间:2023-12-01 02:14:50 25 4
gpt4 key购买 nike

我在子目录“xsd”中有一组 .xsd 文件。我使用外部命令生成一组用于 XML 绑定(bind)的 .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吗?如果是,如何?

    最佳答案

    包括来源

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

    这意味着您需要有一个 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.

    IE。如果 xsd 之一,CMake 必须运行重新配置。文件更改。这是有帮助的技巧:
    foreach(x ${XSD_SOURCE_FILES})
    configure_file(${x} ${x} COPYONLY)
    endforeach()

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

    关于cmake - 如何包含生成的文件以使用 cmake 进行编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26074450/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com