我的子目录“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}
)
Run Code Online (Sandbox Code Playgroud)
该工具创建生成文件的列表。我有以下形式:
set(XSD_GENERATED_FILES
file1.cpp
file1.hpp
file2.cpp
file2.hpp
)
Run Code Online (Sandbox Code Playgroud)
到这里就好了。
现在我不知道如何继续。我想包含生成的文件列表并将它们添加到可执行文件中。
include(${PROJECT_SOURCE_DIR}/cmake_xsd_filelist.txt)
add_executable(Prog ${SOURCE_FILES} ${XSD_GENERATED_FILES})
Run Code Online (Sandbox Code Playgroud)
但这并没有达到我想要的效果。实际上,它什么也没做,因为最初cmake_xsd_filelist.txt是空的。
我的目标如下:
这甚至可以用 cmake 实现吗?如果是,怎么办?
小智 5
include(${PROJECT_SOURCE_DIR}/cmake_xsd_filelist.txt)
add_executable(Prog ${SOURCE_FILES} ${XSD_GENERATED_FILES})
Run Code Online (Sandbox Code Playgroud)
这意味着您需要在配置cmake_xsd_filelist.txt步骤中有一个文件,即 xsd 必须由execute_process调用。另外我认为最好将文件生成到二进制目录(遵循源外概念):
# 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
)
Run Code Online (Sandbox Code Playgroud)
不要忘记检查成功退出状态:
if(NOT result EQUAL 0)
message(FATAL_ERROR "XSD failed")
endif()
Run Code Online (Sandbox Code Playgroud)
现在您可以添加来源:
include(${CMAKE_BINARY_DIR}/generated/cmake_xsd_filelist.txt)
add_executable(Prog ${SOURCE_FILES} ${XSD_GENERATED_FILES})
Run Code Online (Sandbox Code Playgroud)
when a file in the 'xsd' folder changes, execute XSD_EXECUTABLE
for generating the .cpp and hpp files.
Run Code Online (Sandbox Code Playgroud)
即,如果其中一个xsd文件发生更改,CMake 必须运行重新配置。这是有帮助的技巧:
foreach(x ${XSD_SOURCE_FILES})
configure_file(${x} ${x} COPYONLY)
endforeach()
Run Code Online (Sandbox Code Playgroud)
现在,如果发生任何更改XSD_SOURCE_FILES,CMake 将有效地重新配置项目,重新运行XSD_EXECUTABLE并重新包含cmake_xsd_filelist.txt.
| 归档时间: |
|
| 查看次数: |
4860 次 |
| 最近记录: |