2012-06-19 10 views
25

私が使用してファイルのリストを作成しました:Iが、/ usr/myprojectに、これらのファイルのすべてをインストールしたい/私がインストールしたフォルダにファイルツリーを維持したいcmakeを使用してファイルの階層をインストールするにはどうしたらいいですか?

file(GLOB_RECURSE DEPLOY_FILES "${PROJECT_SOURCE_DIR}/install/*") 

を:

install/junk 
install/other/junk2 
install/other/junk3 

私が使用している場合:

install(FILES ${DEPLOY_FILES} DESTINATION "usr/myproject") 

すべてのファイルのようには/ usr/myprojectにで終わる:

/usr/myproject/junk 
/usr/myproject/junk2 
/usr/myproject/junk3 

インストールコマンドで相対パスを追跡するにはどうすればよいですか?

私は、forループで手動で行うことで問題を回避働いてきた:

set(BASE "${PROJECT_SOURCE_DIR}/install") 
foreach(ITEM ${DEPLOY_FILES}) 
    get_filename_component(ITEM_PATH ${ITEM} PATH) 
    string(REPLACE ${BASE} "" ITEM_PATH ${ITEM_PATH}) 
    install(FILES ${ITEM} DESTINATION "usr/myproject${ITEM_PATH}") 
endforeach() 

...しかし、これを行うのは面倒です。確かに簡単な方法がありますか?

+1

f *&ingがどのようにして難しい** 'cp -r' **操作を簡単に行うことができて面白いです。 – ulidtko

答えて

23

使用(カントは...しかし、インストールドキュメントで何かを参照してください):

INSTALL(DIRECTORY <directory> DESTINATION usr/myproject) 

(詳細はこちらを参照してください。http://www.cmake.org/cmake/help/v2.8.8/cmake.html#command:install

INSTALL(DIRECTORY .... )は、ディレクトリ構造を保持します。しかし、install<directory>として使用すると、最終的にはusr/myproject/install/....になります。これはあなたが望むものではありません。

  1. 使用INSTALL(FILES .... DESTINATION usr/myproject)その後、INSTALL(DIRECTORY .... DESTINATION usr/myprojectを使用)し、手動でインストールするディレクトリを一覧表示、install/に直接横たわるファイルをインストールするには:

    はこれを行うには2つの方法があります。

  2. 元の投稿でglobbingコマンドを使用して、どのエントリがディレクトリであるかを判断し、ディレクトリエントリを別のリストに移動してリストをINSTALL(FILES ...)INSTALL(DIRECTORY ...)にそれぞれ送ります。

    file(GLOB DEPLOY_FILES_AND_DIRS "${PROJECT_SOURCE_DIR}/install/*") 
    foreach(ITEM ${DEPLOY_FILES_AND_DIRS}) 
        IF(IS_DIRECTORY "${ITEM}") 
         LIST(APPEND DIRS_TO_DEPLOY "${ITEM}") 
        ELSE() 
         LIST(APPEND FILES_TO_DEPLOY "${ITEM}") 
        ENDIF() 
    endforeach() 
    INSTALL(FILES ${FILES_TO_DEPLOY} DESTINATION usr/myproject) 
    INSTALL(DIRECTORY ${DIRS_TO_DEPLOY} DESTINATION usr/myproject) 
    

注:インストールファイルの種類に応じて、他のINSTALL(...)のコマンドは、あなたのライブラリ/実行ファイルをインストールするには、例えば(より適切INSTALL(TARGETS ....)かもしれません

+0

@Fraser編集のおかげで、私は間違った書式を完全に逃しました。 –

40

インストールする最も簡単な方法。指定されたディレクトリからすべてがある:

install(DIRECTORY mydir/ DESTINATION dir/newname) 

末尾'/'は重要です。 mydirがなければ、newname/mydirにインストールされます。cmakeのドキュメントから

各ディレクトリ名の最後の構成要素が宛先 ディレクトリに追加されるが、後続のスラッシュは、それ 空の最後のコンポーネントを残すので、これを回避するために使用されてもよいです。

+0

これは非常に簡単な解決策です。 –

+4

ありがとうございます。「後に続く/」は重要です。 – fechidal89

18

ファイルのリストを持っている場合は、あなたがそれらの上に単純にループすることができますし、ディレクトリ部分を抽出するためにget_filename_component()を使用します。

完了
foreach (file ${INCLUDE_FILES}) 
    get_filename_component(dir ${file} DIRECTORY) 
    install(FILES ${file} DESTINATION include/${dir}) 
endforeach() 

を。 ;-)

+0

これは本当に良い簡単な答えです。ファイルリストを解析して一度に1つずつインストールする以外の方法は必要ありません。 +1 – bartgol

+0

美しく簡単です。 – Gallaecio

関連する問題