如何使用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 '
    --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})

这意味着你需要在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.

转载注明原文:如何使用cmake包含生成的文件进行编译? - 代码日志