2013-01-23 4 views
9

各コンパイル後に、configファイルをビルドディレクトリにコピーします。CMake:ファイルをコピーするターゲットを持つ方法

# Gather list of all .xml and .conf files in "/config" 
file(GLOB ConfigFiles ${CMAKE_SOURCE_DIR}/config/*.xml 
         ${CMAKE_SOURCE_DIR}/config/*.conf) 

foreach(ConfigFile ${ConfigFiles}) 
    add_custom_command(TARGET MyTarget PRE_BUILD 
        COMMAND ${CMAKE_COMMAND} -E 
         copy ${ConfigFile} $<TARGET_FILE_DIR:MyTarget>) 
endforeach() 

このアクションは、プロジェクトをコンパイルするたびにトリガーされます。何かをコンパイルせずにファイルをコピーするCMakeLists.txtのターゲットを作成することは可能ですか? "コピーを作る"のようなもの。

答えて

24

あなたはcopyと呼ばれる新しいカスタムターゲットを追加し、カスタムコマンドのターゲットことを確認することができるはずです。

file(GLOB ConfigFiles ${CMAKE_SOURCE_DIR}/config/*.xml 
         ${CMAKE_SOURCE_DIR}/config/*.conf) 

add_custom_target(copy) 
foreach(ConfigFile ${ConfigFiles}) 
    add_custom_command(TARGET copy PRE_BUILD 
        COMMAND ${CMAKE_COMMAND} -E 
         copy ${ConfigFile} $<TARGET_FILE_DIR:MyTarget>) 
endforeach() 

あなたがcopyを構築する場合は今すぐ、カスタムコマンドのみが実行されます。

あなたはあなただけのファイルをコピーしたり、MyTargetを構築する場合は、それらをコピーすることができますいずれかのように、MyTargetの依存性として、このcopy目標を維持したい場合は、循環依存を解除する必要があります。 (MyTargetcopyに依存しますが、copyMyTargetに依存してcopy-toディレクトリの場所を取得します)。これを行うには

、あなたはターゲットの出力ディレクトリを取得する昔ながらの方法に頼ることができます。

add_custom_target(copy) 
get_target_property(MyTargetLocation MyTarget LOCATION) 
get_filename_component(MyTargetDir ${MyTargetLocation} PATH) 
foreach(ConfigFile ${ConfigFiles}) 
    add_custom_command(TARGET copy PRE_BUILD 
        COMMAND ${CMAKE_COMMAND} -E 
         copy ${ConfigFile} ${MyTargetDir}) 
endforeach() 
add_dependencies(MyTarget copy) 
+0

ありがとうございました。 2つの別々の 'add_custom_command'コマンドが必要ですか? 1つは実行可能なメインターゲット用、もう1つはコピー先用です。 'add_custom_command(TARGET $ {PRODUCT} PRE_BUILD')。私は主なターゲットを作るとき、または"コピーを作る "ときにファイルをコピーしたい。 – Meysam

+0

@Meysamこの場合、 – Angew

+0

@Meysam - 更新された回答 – Fraser

関連する問題