2016-09-07 6 views
0

私は2つのサブディレクトリプロジェクト(add_subdirectoryで追加)を持っており、それぞれ独自のライブラリ、バイナリ、インストール/アンインストールのターゲットを持っています。だから、:CMakeサブディレクトリのインストール/アンインストールのターゲット

main_project 
| 
|--CMakeLists.txt 
|--src/ 
    |--CMakeLists.txt (with binary target, install() 
| 
|--project_a 
    |--CMakeLists.txt 
    |--src/ 
     |--CMakeLists.txt (with library, install()) 
| 
|--project_b 
    |--CMakeLists.txt 
    |--src/ 
     |--CMakeLists.txt (with library, install()) 

私は自動的にライブラリをインストールするには、トップレベルプロジェクト(main_project)のために希望とB(target_link_librariesからmain_projectに含まれて())。

cd main_project/build 
cmake .. 
make 
sudo make install 

を、自動的にインストールmain_projectバイナリとproject_a/Bライブラリを持っている:だから、私は行くことができるようにしたいと思います。予想通り

main_project/src/CMakeLists.txt 
... 
install(FILES main project_a project_b DESTINATION bin 
     LIBRARY DESTINATION lib) 

しかし

install TARGETS given target "project_a" which does not exist in this directory. 

cmake ..結果:私はこれを試してみました。私もパスを指定して試してみた

main_project/src/CMakeLists.txt 
... 
install(FILES main ${CMAKE_SOURCE_DIR}/project_a/ ${CMAKE_SOURCE_DIR}/project_b DESTINATION bin 
     LIBRARY DESTINATION lib) 

もproject_a/bがこのディレクトリにないと文句を言いた(も期待、私は推測?)

私はまた、インストールしようとしましたライブラリはinstall()のFILESオプションを使って "手作業"で動作しますが、それはうまくいきますが、サブプロジェクトに完全に良いinstall()があると考えると非常にクルージングです。

project_aとproject_bもuninstall()カスタムターゲットを持っているので、main_projectにアンインストールターゲットを追加することはできません。

CMake Error at CMakeLists.txt:37 (add_custom_target): 
    add_custom_target cannot create target "uninstall" because another 
    target with the same name already exists. The existing target is a 
    custom target created in source directory "/main_project/project_a". 
    See documentation for policy CMP0002 for more details. 

をだから、どのように私はインストールして、必要に応じてアンインストールしない:私のproject_aはアンインストールディレクティブを持っているので、私が得る、

add_custom_target(uninstall 
    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) 

をしかし、私はトップディレクトリCMakeListsにアンインストールディレクティブを追加しようとすると私のmain_projectと一緒に私のサブプロジェクトのライブラリファイル?

+1

あなたが望むものをあなたが持っているとどのようなクリアされていません。試したコードを私たちに教えてください。 – Tsyvarev

+0

私が試したことを含むように編集されました。助けてくれてありがとう。 – Allan

+0

サブプロジェクトの* CMakeLists.txt *は既に 'install()'コマンドを発行しているので、メインプロジェクトはそれをインストールするために何もする必要はありません。 「アンインストール」に関しては、サブプロジェクトがすでにターゲットを指定しているので、メインプロジェクトで作成することはできません。ところで、サードパーティ製のサブプロジェクトの場合、コードを変更できない(または変更したくない)場合は、[ExternalProject_Add](https://cmake.org/cmake/help/v3.0/)を使用することをお勧めします。 module/ExternalProject.html)を作成してビルドします。メインプロジェクトでのサブプロジェクトのインストールでは、 'install(SCRIPT)'や 'install(CODE)'を使うことができます。 – Tsyvarev

答えて

0

問題が見つかりました。私はEXCLUDE_FROM_ALLでインストールしたいサブディレクトリを追加しています。サブディレクトリ内のすべてをビルドしないようにします。必要なライブラリだけです。そのフラグは、サブディレクトリinstall()が起きないようにしているようです。おそらくExternalProject_Addが...確かにまた

、REオーバーライドカスタムターゲットここに行くための最善の方法である、これは私の仕事:http://public.kitware.com/pipermail/cmake/2011-July/045269.html

関連する問題