Bazel cc_binaryルール

2020/03/04

BAZEL C/C++ Googleサービス Linux RandomGrid Ubuntu 技術

t f B! P L

Bazelを使うことになった

紆余曲折あって、(主にサーバのHDD故障とかHDD故障とかHDD故障とかHDD故障とか)検討時間が十分に取れる見通しがなくなったので、社で使用するビルドツールは一旦makeとbazelの併用という形になりました。

まあ個人的にも後発のツール使うようにしたかったので、怪我の功名?
いや、大怪我だから巧妙を遥かに痛みが上回りますがね?

というわけでチクチクと調査してはここにノウハウを貯めていきたいと思います。

大部分は社内のwikiにもコピペするけどなっ!

bazelはBUILDファイル内にビルドルールを記述することで、ビルドを自動化してくれる仕組みですが、そのルールは基本的に関数のような記載の仕方をするルールと、引数、引数の設定値で構成されています。

かなり細かい指定が出来る割にプログラムの記述と似たような文法であるため、Makefileよりも書きやすいですが、そもそも細かいビルドが出来るからそれでも調査しないといけないことは山ほど有るんだけどさ

そんなわけで日替わりでルールを一つ一つ記載していきたいと思います。

今日は一番基本的なcc_binaryルールについてです。
基本的には公式ページの内容をダダっと呼んで思い込みで翻訳しているので、必ずしも正しいかどうかは別の話です。

ご利用は計画的に

なお、共有引数は除きます。

特段の記載がない限り、各引数の設定値は文字列です。

cc_binaryルール

name
必須:ビルドターゲットの名称

deps
任意:ビルドターゲットにリンクするライブラリ、cc_libraryルールやobjc_libraryのターゲットを使用できる

srcs
任意:長いので後述

additional_linker_inputs
任意:windowsのリソースファイルのような追加でリンク記述が必要なターゲットへのパスを記述する

args
任意:実行時にビルドターゲットに渡されるコマンドライン引数 

copts
任意:C++コンパイル時の追加のオプション指定、追加はこの引数に記載された順に追加される。-l オプションによるライブラリの指定などはここに記載する

defines
任意:-Dオプションに当たる定義を指定、コンパイル時に定義される定数

includes
任意:-isystemに当たる検索ディレクトリを記載する。システムディレクトリの後に検索され、ユーザーディレクトリの前に検索される、優先度の高いリンク先を記載するが、-L、-lでやるほうが無難

linkopts
任意:リンカオプション、copt引数と同じくリンカに渡すオプションを列挙する

linkshared,
任意 真偽値で指定:-sharedオプションを追加したのと同様の状態となる、シェアードオブジェクト(動的リンクライブラリ)を作成する際に指定するオプション。ただしこのオプションを指定して出来上がったライブラリは他のビルドルールに利用できない。

linkstatic,
任意 真偽値で指定:静的リンクの指定、.soの代わりに.aをリンクしてビルドを行う。あまり使わない。。。

local_defines
任意:依存ターゲットに波及させずに、ターゲットにだけ有効な-Dにあたる定義を追加する

malloc
任意:mallocの実装をCのデフォルトのものから他のものに切り替えることが出来る。

nocopts
任意:記載されたものと一致するコンパイラオプションを除外する。COPT引数の内容と一致した場合はこちらの動作が優先される。

stamp
任意 -1 or 0 or 1:
1→ビルド情報をバイナリに含んでビルドします、リンクテストするときとか使うかな
0→ビルド情報を毎回入れ替えます。最新のビルド環境だけが残る。
-1→ビルド情報をバイナリに含まない、デフォルトではこれ。

win_def_file
任意:ウィンドウズなんて知るかっ!

srcsに関して

srcs引数がC/C++で記載されたソースファイルの指定です。
.hファイルはsrcs引数かhdrs引数に列挙しなければビルドされません。
depsオプションで指定したライブラリのヘッダなどのような、#includeによって直接インクルードされるヘッダはsrcs引数かhdrs引数に列挙されていなければなりません。
(システムヘッダ以外のヘッダのこと言いたいのかな???)
記載できるファイルは以下です。
  • C/C++ ソースファイル: .c, .cc, .cpp, .cxx, .c++, .C
  • C/C++ ヘッダファイル: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • アセンブラおよびCのプリプロセッサファイルr: .S
  • アーカイブファイル: .a, .pic.a
  • libtool用のオブジェクトファイル: .lo, .pic.lo
  • 共有オブジェクト(Linuxにおける動的ライブラリ): .so, .so.version
  • オブジェクトファイル: .o, .pic.o

Translate

ページビューの合計

注意書き

基本的にごった煮ブログですので、カテゴリから記事を参照していただけると読みやすいかと存じます。

ADBlocker等を使用していると、Twitterやアクセスカウンタが表示されません。

記事を読むには差し支えませんが、情報を参照したい場合には一時例外にしていただけると全てご参照いただけます。

Featured Post

ボイドラDICEの攻略法

QooQ