我们的应用程序需要附带.xsd文件,该文件由几个连接在一起的其他.xsd文件组成。可以通过遍历所有库依赖项并检查其上的属性来派生串联的源列表。
我最终得到的是一个应用程序的CMakeLists.txt可以调用的函数,它将“做正确的事”:
function(make_config_xsd)
set(xsd_config ${CMAKE_CURRENT_BINARY_DIR}/config.xsd)
# build up a list of config files that are going to be concatenated
set(config_list ${appcommon_SOURCE_DIR}/config/common.xsd)
# iterate over the library dependencies and pull out config_file properties
get_target_property(libraries ${PROJECT_NAME} LINK_LIBRARIES)
foreach(lib ${libraries})
get_target_property(conf ${lib} config_file)
if(conf)
list(APPEND config_list ${conf})
endif()
endforeach()
# finally, add the app specific one last
list(APPEND config_list ${PROJECT_SOURCE_DIR}/config/config.xsd)
add_custom_command(OUTPUT ${xsd_config}
COMMAND echo \"<?xml version=\\"1.0\\"?><xs:schema xmlns:xs=\\"http://www.w3.org/2001/XMLSchema\\">\" > ${xsd_config}
COMMAND cat ${config_list} >> ${xsd_config}
COMMAND echo \"</xs:schema>\" >> ${xsd_config}
DEPENDS "${config_list}")
add_custom_target(generate-config DEPENDS ${xsd_config})
add_dependencies(${PROJECT_NAME} generate-config)
endfunction()
这似乎有效。但是我不确定它是否真的是解决这个问题的“正确的方法”,并且假装add_custom_target()
仅仅取决于add_custom_command()
的输出,这样我才能做add_dependencies()
似乎也不对。是否有更直接的方法来对这样生成的文件进行依赖?
正如Tsyvarev指出的那样,只需将生成配置文件添加到目标的源列表中。
也就是说,替换:
add_custom_target(generate-config DEPENDS ${xsd_config})
add_dependencies(${PROJECT_NAME} generate-config)
只是:
target_sources(${PROJECT_NAME} ${xsd_config})