2013-06-10 11 views
9

私は、実行するイメージファイルfoo.bmpを必要とする小さなプログラムを作成しています
私はプログラムをコンパイルできますが、実行するにはfoo.bmpをコピーしてビルドする必要があります'サブディレクトリを手動で編集するCMake:ビルドディレクトリにカスタムリソースを追加する

CMakeLists.txtでプログラムをコンパイルするときにfoo.bmpを自動的に追加してサブディレクトリを作成するにはどのコマンドを使用しますか?

答えて

9

これを行うには、add_custom_commandを使用して、ビルドディレクトリに必要なファイルのビルドルールを生成する必要があります。ターゲットからそれらのファイルへの依存関係を追加します:CMakeは、ターゲットによって必要とされるものだけを構築します。

ソースディレクトリからビルドしていない場合は、ファイルのみをコピーするようにしてください。

このような何か:この場合

project(foo) 

cmake_minimum_required(VERSION 2.8) 

# we don't want to copy if we're building in the source dir 
if (NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR) 

    # list of files for which we add a copy rule 
    set(data_SHADOW yourimg.png) 

    foreach(item IN LISTS data_SHADOW) 
     message(STATUS ${item}) 
     add_custom_command(
      OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${item}" 
      COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/${item}" "${CMAKE_CURRENT_BINARY_DIR}/${item}" 
      DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${item}" 
     ) 
    endforeach() 
endif() 

# files are only copied if a target depends on them 
add_custom_target(data-target ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/yourimg.png") 

私がコピーを強制的にyourimg.pngファイルの依存と「ALL」のカスタムターゲットを使用していますが、あなたはまた1からの依存関係を追加することができますあなたの既存のターゲットの

+0

add_custom_target行が何をやってん。 あなたのコードを修正しようとしましたが、add_custom_target行にもforeachループが含まれていましたが、複数のファイルで失敗します。 – Archit

+0

ええ、依存関係に問題があると思います。だからあなたのイメージに依存しているターゲットがない場合、それらは構築されません。だからこそ私の例では "add_custom_target"を追加しています。より良いルールは 'add_custom_target(data-target ALL DEPENDS $ {data_SHADOW})'です。常にすべての画像に依存します。 – Guillaume

1

この場合、ファイルコマンドを使用して別の解決策を試みました。ファイルまたはディレクトリをソースからdestに単にコピーするオプションCOPYがあります。このよう

FILE(COPY yourImg.png DESTINATION "${CMAKE_BINARY_DIR}")

相対パスは、宛先のために働く(あなたが簡単に使用することができます例えば。)

ドキュメントの参照:https://cmake.org/cmake/help/v3.0/command/file.html

関連する問題