2017-12-27 486 views
0

我们的应用程序需要提供一个.xsd文件,该文件由多个其他.xsd文件连接在一起组成。连接的源列表可以通过遍历所有库依赖关系并检查其上的属性来派生。在add_custom_command中连接多个文件

我最终什么样的主意是,应用程序的可的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()似乎也不错。有没有一种更直接的方式来执行这种生成文件的依赖关系?

+0

如果其他自定义命令或自定义的目标取决于您的配置文件,无需要创建额外的定制目标。在库或可执行文件的情况下,可以通过将文件添加到源文件列表来指定对文件的依赖性。 – Tsyvarev

+0

1.关于add_custom_command(TARGET $ {PROJECT_NAME} POST_BUILD ....)怎么办? 2.比较喜欢使用COMMAND $ {CMAKE_COMMAND} -E,不幸的是没有任何cat concat 3.您可以使用FILE(READ ...)FILE(WRITE)cf. [在cmake邮件列表上的这篇文章](https://cmake.org/pipermail/cmake/2010-July/038028.html) –

回答

0

由于Tsyvarev指出,只需将生成配置文件添加到目标的源列表。

也就是说,替换:

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

只:

target_sources(${PROJECT_NAME} ${xsd_config})