2012-02-13 9 views
3

短い質問: インストール中にファイルをコピーするときにCMakeをシンボリックリンクに従うように設定することはできますか?CMakeインストール時にシンボリックリンクをたどる

詳細:私はCMakeを使ってLLVMをビルドしてインストールしています。インクルードディレクトリの私のLLVMソースツリーには、LLVMに対して開発中の別のサブプロジェクトへのシンボリックリンクがあります。私が "cmake install"を実行したときにシンボリックリンクに従わずにインクルードディレクトリをコピーしたことに気が付いた以外は、すべて動作するようです。私が持っている問題は、シンボリックリンクに相対パスがあることです(gitリポジトリ内にあるためです)。したがって、シンボリックリンクがコピーされたとき(その代わりに、内容をコピーするのではなく)、それらは正しいファイルを指していません。たとえば、私はdsa -> ../../llvm-poolalloc/include/dsa/を持っています。単にリンクをコピーするのではなく、インストールを行うときにこのリンクの内容をコピーしたいと思います。しかし、私はまだこれを行うためのcmakeの旗が見つかりませんでした。

これはおそらく私のプロジェクトを構成する考え方ではないことを認識していますが、すでに準備されているものを使って作業しています。それがこのようになることを期待して働く。だから私は、シンボリックリンクに従うことができることは、ビルドシステム全体を再構成することなく、私の問題を解決するかもしれないと思う。しかし私は、私がやろうとしていることを達成するためのより良い方法について、他の提案にもオープンしています。

私はLinux(Ubuntu 10.04)で作業しており、LLVM 2.6(llvm-gccとともにソースからコンパイルしています)を使用しています。また、私はCMakeバージョン2.8を使用しています。

編集:

ここでは、インストールの指示に関連付けられているCMakeLists.txtファイルからソースコードです:

install(DIRECTORY include 
    DESTINATION . 
    PATTERN ".svn" EXCLUDE 
    PATTERN "*.cmake" EXCLUDE 
    PATTERN "*.in" EXCLUDE 
    PATTERN "*.tmp" EXCLUDE 
) 

install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include 
    DESTINATION . 
) 

含めるディレクトリのディレクトリ一覧は次のとおりです。

dsa -> ../../llvm-poolalloc/include/dsa/ 
llvm 
llvm-c 
poolalloc -> ../../llvm-poolalloc/include/poolalloc 

私が欲しいのは、dsapoolallocディレクトリをコピーすることですシンボリックリンクをコピーするだけではなく、私がシンボリックリンクで絶対パスを使用しない理由は、それらをgit repoにチェックインさせることです。だから私の絶対的な道は、彼らがレポからチェックアウトをするときにプロジェクトに取り組んでいる他の人とは違うでしょう。

+0

これらを含むコードを表示できますか?また、symlinkを絶対にすることもできます。 – arrowd

+0

@arrowdodger、私の質問を見てくれてありがとう。私は詳細を提供するように編集しましたが、それがまだ不明な場合は教えてください。私は 'install'のためのCMakeのドキュメントを見てきました。私がやりたいことができないと思い始めているので、おそらく別の解決策を考えなければならないでしょう。しかし私は間違っている可能性があります。なぜなら私はCMakeについて知らないことがたくさんあるからです。 –

答えて

4

うーん、のは、これを試してみましょう:

get_filename_component(ABS_DIR include REALPATH) 

install(DIRECTORY ${ABS_DIR} 
    DESTINATION . 
    PATTERN ".svn" EXCLUDE 
    PATTERN "*.cmake" EXCLUDE 
    PATTERN "*.in" EXCLUDE 
    PATTERN "*.tmp" EXCLUDE 
) 

それが役に立たない場合は、インクルードが(シンボリックリンクです)ディレクトリ自体が含まれていますが、それは中身だないインストールしようとすることができます。しかし、あなたの場合、スマートな正規表現を考え出す必要があります:

file(GLOB INCLUDES include/*) # filter there .svn and others 

install(FILES ${INCLUDES} 
    DESTINATION include 
) 

最後に、シンボリックリンクを絶対にしてください。

+1

installコマンドでシンボリックリンクをたどることができないようです。しかし、この回答は私のCMakeLists.txtを再構築し、コピーしたい他のディレクトリを指し示すinstall文を追加する方法を理解するのに役立ちました。 –

関連する問題