2017-12-27 33 views
0

複数の.xsdファイルを連結した.xsdファイルを同梱する必要があるアプリケーションがあります。連結のソースリストは、すべてのライブラリの依存関係を歩き、そのライブラリのプロパティを調べることによって導き出すことができます。add_custom_commandで複数のファイルを連結する

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() 

このが表示されます動作するように:私がなってしまった何

は「正しいことを行う」になるアプリケーションのCMakeLists.txtだけで呼び出すことができる機能でした。しかし、実際にこの問題を解決する "正しい方法"であるかどうかはわかりません。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を使用することをお勧めします。残念ながら、猫のconcatはありません 3. FILE(READ ...)FILE(WRITE)cfを使用できます。 [cmakeメーリングリストのこの投稿](https://cmake.org/pipermail/cmake/2010-July/038028.html) –

答えて

0

Tsyvarevは、ターゲットのソースリストにgenerate configファイルを追加するだけです。

置き換え、次のとおりです。

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

をただで:

target_sources(${PROJECT_NAME} ${xsd_config}) 
関連する問題