在add_custom_command中连接多个文件

时间:2017-12-27 18:49:34

标签: cmake xsd

我们的应用程序需要附带.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()

似乎正常工作。但我不确定它是否真的是&#34;正确的方式&#34;要解决这个问题,并假设add_custom_target()只取决于add_custom_command()的输出,这样我才能add_dependencies()看起来也不对。是否有更直接的方法来对这样生成的文件进行依赖?

1 个答案:

答案 0 :(得分:0)

Tsyvarev所述,只需将生成配置文件添加到目标的源列表中。

即,替换:

add_custom_target(generate-config DEPENDS ${xsd_config})
add_dependencies(${PROJECT_NAME} generate-config)

只是:

target_sources(${PROJECT_NAME} ${xsd_config})