LoginSignup
15
7

More than 5 years have passed since last update.

cmakeとgit submoduleで他のプロジェクトを簡単にimportする

Posted at

複数のプロジェクトで共通して必要なプロジェクトや、
外部のライブラリを使用したいが、システムにインストールしたく無い場合にどうするか。
cmake + gitを用いれば簡単に解決できます。

Requirements

C++プロジェクトprojに外部のC++プロジェクトsubを使用する場合を例に取って考えます。
上述のように以下の方法を実行するには

  • projがcmakeで管理されている事
  • proj, subがgitで管理されている事
  • subがcmakeで管理されているか、ヘッダのみで構成されているテンプレートライブラリである事

が必要です。

Procedure

まずgitのリポジトリは

  • yourhost:repos/proj.git
  • anotherhost:repos/sub.git

のようになっているとします。各自の環境に合わせて読み替えてください。

アイデアは以下の通りです。

  • git submoduleを使用すれば外部のプロジェクトを取得できる
  • cmakeのinclude_directoriesマクロを使用すればgit submoduleで取得したライブラリを簡単にincludeできる
  • 外部プロジェクトがヘッダだけなら、それらをコンパイルする必要がないからincludeできれば十分
  • 外部プロジェクトがcmakeで管理されていればそのツリーを親プロジェクトのツリーに取り込める

よって手順としては、

  1. projにおいてgit submoduleによりsubを取得する
  2. projのCMakeLists.txtinclude_directoriesを記述する
  3. subがcmake管理の場合はadd_subdirectoryマクロで取り込む

のみです。

proj/CMakeLists.txt
     mod1/CMakeLists.txt
          func1.cpp
          func2.cpp
     main.cpp
     sub/
sub/mod1/func1.hpp
         func2.hpp
    mod2/func1.hpp

のような場合

proj/CMakeLists
...
include_directories(.)
...

としておけば例えばmod1/func1.cppにおいてincludeパスを指定する事なく:

proj/mod1/CMakeLists.txt
add_library(mod1 STATIC
  func1.cpp
  func2.cpp
)
# -Iは特に指定しなくていい
proj/mod1/func1.cpp
#include "sub/mod2/func1.hpp"
...

のようにincludeする事が可能となります。

15
7
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
7