在add_custom_command中连接多个文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在add_custom_command中连接多个文件相关的知识,希望对你有一定的参考价值。

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

以上是关于在add_custom_command中连接多个文件的主要内容,如果未能解决你的问题,请参考以下文章

CMake中add_custom_command的使用

在 cmake 中,我怎样才能始终执行一个进程? (或从 add_custom_command 捕获标准输出)

CMake基础教程(29)add_custom_command添加定制化命令

如何将多个文件列表与 CMake 合并在一起?

80个CMake命令

Socket.io 没有流式传输到多个连接