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()
のように見えません。このように生成されたファイルに依存するより直接的な方法はありますか?
他のカスタムコマンドやカスタムターゲットは、追加のカスタムターゲットを作成する必要がある、あなたの設定ファイルに依存していない場合。ライブラリや実行可能ファイルの場合、ソースファイルのリストにファイルを追加することで、ファイルへの依存関係を指定することができます。 – Tsyvarev
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) –