2016-07-12 5 views
1

に応じて、サブプロジェクトをビルドする:CMakeの:私は2つのサブディレクトリ(簡体字)を含むプロジェクトを持っているの他のサブプロジェクトヘッダー

project(superproj)  
add_subdirectory(foo-api) 
add_subdirectory(bar-api) 

bar-apifoo-apiヘッダーを使用し、それらが$PREFIX/include/fooにインストールされることを想定して(そのファイルが#include <foo/header.h>が含まれている)

しかし、私はこのスーパープロジェクトをコンパイルするとき、私は実際に私のシステムにfoo-apiをインストールしたくありません。この場合、bar-apiはどうすればビルドできますか?それはbar-apiのCMakeFileと混乱せずにそうすることが可能ですか?私はこれらの2つのプロジェクトを可能な限り独立したものにしておきたいので、別々にクローンしてビルドするだけです。

+1

'foo-api'の[' target_include_directories(... PUBLIC ...) '](https://cmake.org/cmake/help/latest/command/target_include_directories.html)はどうですか?これは、通常、ライブラリを自己インクルードディレクトリにする方法です。 – Florian

答えて

1

使用include_directories

project(superproj) 
include_directories(foo-api/path/to/includes) 
add_subdirectory(foo-api) 
add_subdirectory(bar-api) 

それのアクションは、現在のディレクトリ内のすべてのサブディレクトリに伝播されます。そして、フロリシア語がコメントで述べたように、最新版のCMakeの場合はtarget_include_directoriesと考えてください。

+0

私はプロジェクトフォルダ内のヘッダとそれらがインストールされているパスが異なるため、 'include_directories'は動作しないと思います。つまり、 'foo-api/include/some_header.h'にありますが、'/usr/include/foo/some_header.h'にインストールされています。 'bar-api'ファイルには' #include 'があります。ですから、 'bar-api'ファイルに' #include'ディレクティブを変更せずに 'include_directories'を追加するだけではいけません。 –

+1

@c_spkこれは重要な問題です。あなたがインクルードパスのエイリアスを作成する必要があるように見えますが、コンパイラにはこの機能がないので、ビルドシステムはここでは何もしません。回避策として、 'foo-api/include'を指す' foo-api/foo'シンボリックリンクを作成し、include_directoryに 'foo-api'を追加することができます。また、cmakeにはシンボリックリンクの作成機能がありません(おそらく、すべてのファイルシステムでサポートされているわけではないのでしょうか?)、 'add_custom_target'や' add_custom_command'を使ってサポートされているすべてのプラットフォームのシンボリックリンクを自動化する必要があります。 – Sergey

関連する問題