在add_custom_command中连接多个文件

问题描述 投票:0回答:1

我们的应用程序需要附带.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()似乎也不对。是否有更直接的方法来对这样生成的文件进行依赖?

cmake xsd
1个回答
0
投票

正如Tsyvarev指出的那样,只需将生成配置文件添加到目标的源列表中。

也就是说,替换:

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

只是:

target_sources(${PROJECT_NAME} ${xsd_config})
© www.soinside.com 2019 - 2024. All rights reserved.