読者です 読者をやめる 読者になる 読者になる

FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

Bazelビルドにおけるincludeディレクトリの関係

f:id:msyksphinz:20160529232134p:plain

Bazelで自作ISSをビルドしようとしているが、いろいろと詰まっている。なかなかうまくいかないらしい。

これはC++ソースコードの記述を、Bazelに合わせるべきなので、Bazelの設定をがんばってC++に合わせるべきか。。。

includeファイルの指定方法

includeファイルを指定する方法は、どうやら2つある。

copts = ["-Iapp1"]

あるいは、

includes = ["app1"]

ただし、これらをあえて記述する必要はない。

Bazelでのビルドではいろんなオプションが指定できるが、これをどのように実現するかが問題になる。 例えば、上記のようなプロジェクト構成で、以下のようなビルド階層を取っているとする。

github.com

WORKSPACE
app1
  app1.cpp
  app1.hpp
  BUILD
app2
  app2.cpp
  app2.hpp
  BUILD
app3
  app3.hpp

app1内でapp2のヘッダファイルをどのように指定するか

WORKSPACEファイルが上位階層にあるので、WORKSPACEを起点にして記述する。

cc_binary (
  name = "app1",
  srcs = ["app1.cpp"],
  deps = ["//app2",
          "//app3"],
)

このとき、coptsもincludesも使っていないが、app1.cppには以下のようにインクルードファイルを記述する。

#include <stdio.h>
#include "app2/app2.hpp"
#include "app3/app3.hpp"

int main ()
{
  printf ("App2 calling () ... %d\n", app2(1, 2));
  printf ("HOGE is = %d\n", HOGE);

  return 0;
}

WORKSPACEを起点としたヘッダファイルの場所を記述する。

ヘッダファイルのみのディレクトリを参照するには

app3はヘッダファイルのみを記述したディレクトリになっている。ここでは、cc_inc_libraryを使ってプロジェクトとして記述する。

cc_inc_library (
  name = "app3",
  hdrs = ["app3.hpp"],
  visibility = ["//visibility:public"],
)

これにより、app3のディレクトリが、app1から参照できるようになる。

app1$ make
bazel build app1 --verbose_failures
..
INFO: Found 1 target...
Target //app1:app1 up-to-date:
  bazel-bin/app1/app1
INFO: Elapsed time: 9.171s, Critical Path: 1.24s