Bazel http_archiveルール

2020/03/10

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

t f B! P L
さて、本日もお仕事です。

サーバが乾燥するまで設営作業が出来ないので、本日はとりあえずやっぱりマニュアルとサンプル作成。。。

前回の記事であげたGoogleTestとの連携のなかで、http_archiveルールというルールが出てきました。

これを利用するに当たって、ある程度内容を把握していたほうがいいだろうと考え、今回はhttp_archiveルールの翻訳です。


あいかわらず速度重視した、Da★Boの独断と偏見と愛と憎しみと希望と絶望の翻訳です。

ご利用は計画的に


http_archiveルールの使用例

http_archveルールは、アーカイブ化されたバジルリポジトリをダウンロードするためのルールです。
このルールを使用することで、アーカイブファイルを解凍、メイクした上でバインド可能な状態にします。

このルールが対応している拡張子は以下のとおりです。
zip
jar
war
tar
tar.gz
tgz
tar.zz
tar.bz2

例として、手元のソースコードを含むチャットプログラムのリポジトリにSSLライブラリを配置する例を紹介します。
URLはhttp://example.com/openssl.zipです。
このzipファイルを解凍すると以下のような構成のフォルダが得られます。
  src/

    openssl.cc

    openssl.h


ローカルリポジトリには、openssl.BUILDという名称のBUILDファイルを用意し、内容を以下のように記載してください。

  cc_library(

      name = "openssl-lib",

      srcs = ["src/openssl.cc"],

      hdrs = ["src/openssl.h"],

  )


  ローカルリポジトリのチャットアプリからこのライブラリを参照するには、チャットアプリのWORKSPACEファイルに以下の内容を記載してください。

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")


  http_archive(

      name = "my_ssl",

      urls = ["http://example.com/openssl.zip"],

      sha256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",

      build_file = "@//:openssl.BUILD",

  )


  これによりチャットアプリのBUILDファイルから、@my_ssl//:openssl-lib を依存関係として参照することが出来るようになります。

対象がDebの場合


対象のアーカイブがDebの場合、http_archiveルールではなく、http_fileルールを使用します。
ロードにPythonを使用しますが、http_fileルールの内容の指定方法は基本的にhttp_archveと同様です。

python load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file")


http_file(

    name = "my_deb",

    urls = ["http://example.com/package.deb"],

    sha256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",

    )



http_archiveルールの属性


name

必須:
このリポジトリを一位に識別する名称を設定します。

auth_patterns

任意:dict型文字列
ホスト名をカスタム認証パターンに紐付けます。
URLのホスト名が設定した辞書の値と一致した場合、設定されたパターンをもとに http リクエストへの認証ヘッダを生成します。
これにより一般的なクラウドストレージの多くの認証手続きに対応することが出来ます。
ここで設定するパターンは、文字列をnetrcファイルに記載された対応するホスト名の設定値に置き換え書式を作成します。
作成された書式はHTTPリクエストのAuthorizationフィールドに設定されます。

以下に例を記載します。
python http_jar(

    name = "custom-artifact",

    url = "https://storage.cloudprovider.com/custom-bucket/custom-artifact.jar",

    sha256 = "...",

    netrc = "/home/testuser/workspace/netrc",

    auth_patterns = { "storage.cloudprovider.com": "Bearer " }

    )


 netrc:
    machine storage.cloudprovider.com password RANDOM-TOKEN


最終的なhttpリクエストヘッダは以下のように生成されます。
  Authorization: Bearer RANDOM-TOKEN


build_file

任意:ラベル名
リポジトリのBUILDルールが記載されたBUILDファイルの名称を指定します。このラベルは絶対参照での指定が必要です。
 @// がメインリポジトリのルートを表します。

 このファイルは必ずしも名称が必要ではありませんが、BUILD.new-repo-name などと名付けで区別しておいたほうが識別しやすいでしょう。
 build_file 属性と build_file_content属性で指定する方法がありますが、両方を同時に指定することは出来ません。


build_file_content

任意:文字列
このリポジトリのビルドファイルの内容を指定できます。
 build_file 属性と build_file_content属性で指定する方法がありますが、両方を同時に指定することは出来ません。

canonical_id

任意:文字列
アーカイブのIDです。この値が指定された場合、bazel はアーカイブをキャッシュに配置し、IDが一致しない限りキャッシュのアーカイブを使用してビルドを行います。

netrc

任意:文字列
認証情報として使用するnetrcファイルへのパスを記載します。

patch_args

任意:文字列リスト
パッチツールの引数を設定します。デフォルトの値は-p0ですが、gitによって生成されたパッチは-p1を必要とします。
-pオプションを複数設定することも可能ですが、リストの最後に指定されたオプションが有効になります。
-pオプションがどれも有効でなかった場合などは、Bazelはフォールバックを行い、Bazelネイティブのコマンドラインパッチツールを使ってパッチを実装します。
フォールバックが行われた場合、パッチコマンドラインツールおよびパッチツールは使用される、patchオプションが使用されます。

patch_cmds

任意:文字列リスト
Bashコマンドによるパッチ適用後に実行されるコマンドを指定します。

patch_cmds_win

任意:文字列リスト
Windowsなんて都市伝説です。

patches

任意:ラベルリスト
アーカイブの解凍後にパッチとして適用されるファイルの名称のリストです。デフォルトではBazelネイティブで実装されたパッチツールを使用しますが、これはファズマッチおよびバイナリーパッチをサポートしていません。
patch_tool 属性が指定されているか patch_args属性に -p 以外の引数がある場合、Bazelはフォールバックしてパッチコマンドラインツールを使用します。

sha256

任意:文字列
ダウンロードされるファイルの SHA-256 を指定します。SHA-256が一致なかった場合ファイルはダウンロードされません。
SHA-256 をしなければリモートファイルが変更することが可能となってしまうため、セキュリティリスクに繋がります。
開発中に除外して開発を容易にすることは出来ますが、製品の出荷時には設定することを推奨します。

strip_prefix

任意:文字列
アーカイブの解凍先のディレクトリから、指定されたプリフィックスを取り除きます。
階層ごとにこれを指定する必要はなく、strip_prefixが指定された位置から下の階層のプリフィックスのついたファイルやディレクトリについて、一括して取り除きます。
実際の使用例はこちら

type

任意:文字列
ダウンロードするアーカイブのファイルタイプを指定します。デフォルトでは、アーカイブの種類はURLから推測されますが、ファイルに拡張子がない場合にこの属性を使用して指定することが出来ます。
このルールが対応している拡張子は以下のとおりです。
zip
jar
war
tar
tar.gz
tgz
tar.zz
tar.bz2

url

任意:文字列リスト
Bazelに使用させたいファイルへのURLのリストです。
全ての指定のプロトコルはhttpまたはhttpsでなくてはならず、また参照先はファイルである必要があります。
URLのリダイレクトは参照されますが、認証が必要なURLには対応していません。

workspace_file

任意:ラベル
ここで指定されたファイルをリポジトリのWORKSPACEファイルとして扱います。
workspace_file属性とworkspace_file_content属性のどちらかで指定できますが、両方を指定することはできません。

workspace_file_content

任意:ラベル
ここで指定されたファイルをリポジトリのWORKSPACEファイルとして扱います。
workspace_file属性とworkspace_file_content属性のどちらかで指定できますが、両方を指定することはできません。

Translate

ページビューの合計

注意書き

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

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

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

Featured Post

ボイドラDICEの攻略法

QooQ