ビルドルールガイド

はじめに

サンドボックス API(SAPI)は、Google の Bazel ビルドシステム、または一般的な CMake メタビルドシステムで使用できます。このページでは Bazel に焦点を当てていますが、同じ機能が CMake でも利用できます。Bazel は推奨されるビルドシステムであり、最も簡単に統合できます。

BUILD.bazel ファイルには、ホストコードをビルドするビルドルールがあります。ホストコードでライブラリのサンドボックス バージョンを使用するには、ホストコードで使用するビルド ターゲットを準備する必要があります。

SAPI ビルドルール

  • sapi_library

sapi_library

sapi_library(name, deps, srcs, hdrs, embed, functions, lib, lib_name, input_files, namespace, header, add_default_deps, limit_scan_depth, visibility)

出力ターゲット

sapi_library() ビルドルールは、次のターゲットを生成します。

  • name-sapi: サンドボックス化されたライブラリ。ホストコード ターゲットとして通常の cc_library を置き換えます。zlib_sapi.bin とサンドボックスの依存関係で構成されます。
  • name.interface: 生成されたライブラリ インターフェース。
  • name.embed: バイナリに Sandboxee を埋め込むために使用される cc_embed_data() ターゲット。bazel/embed_data.bzl をご覧ください。
    • name.bin: Sandboxee バイナリ。小さな通信スタブとサンドボックス化されるライブラリで構成されます。

引数

属性
name

名前(必須)

このターゲットの一意の名前。これにより、サンドボックス化された C/C++ ライブラリが特定されます。name-sapi 出力ターゲットをご覧ください。

deps

ラベルのリスト。省略可

サンドボックス化された C/C++ ライブラリにリンクされる他のライブラリのリスト。

srcs

ラベルのリスト。省略可

サンドボックス化された C/C++ ライブラリを作成するために処理される C ファイルと C++ ファイルのリスト。これらは、生成されていない(通常のソースコード)か生成された C/C++ ソースファイルとヘッダー ファイルです。

詳細については、 cc_library ドキュメントの srcs 属性の説明をご覧ください。

hdrs

ラベルのリスト。省略可

サンドボックス化された C/C++ ライブラリを作成するために処理されるヘッダー ファイルのリスト。

サンドボックス定義(sandbox.h)はここに配置します。埋め込み SAPI ライブラリが使用され、デフォルトのサンドボックス ポリシーで十分な場合は、空のままにします。

埋め込む

ブール値。省略可。デフォルトは True です。

True の場合、サンドボックス化されたライブラリはホストコード内に埋め込まれます。これにより、SAPI サンドボックスを ::sapi::Sandbox::Sandbox(FileToc*) コンストラクタで初期化できます。

関数

関数名のリスト(省略可)

サンドボックス バージョンが生成され、ホストコードで使用できる C/C++ ライブラリの関数のリスト。

リストが空の場合、ライブラリで見つかったすべての関数をエクスポートしてラップしようとします。

lib

文字列。必須

サンドボックス化されたライブラリになる C/C++ ライブラリ ターゲットの名前。

これは、プロジェクトに C/C++ ライブラリの cc_library ビルドルールがあることを前提としています。

lib_name

文字列。必須

functions 属性からライブラリ関数をプロキシするために使用される SAPI オブジェクトの名前。サンドボックス ライブラリ内の関数への呼び出しは、SAPI オブジェクトを介して行われます。

input_files

ラベルのリスト。省略可

sapi_interface ルールの内部実行中に処理される C ファイルと C++ ファイルのリスト。ジェネレータは、これらのファイルで C/C++ ライブラリの関数宣言をスキャンします。

C/C++ ライブラリのエクスポートされたヘッダーは常にスキャンされるため、ほとんどの場合、これは必要ありません。

namespace

文字列。省略可。デフォルトは sapigen

lib_name で定義された SAPI オブジェクトを配置する C++ 名前空間識別子。

デフォルトの Namespace は sapigen です。

header

文字列。省略可

生成されたヘッダー ファイルの代わりに使用するヘッダー ファイルの名前。

コードを自動生成する場合は、この属性を使用しないでください

add_default_deps

ブール値。省略可。デフォルトは True です。

非推奨

limit_scan_depth

ブール値。省略可。デフォルトは False です。

複雑なライブラリの場合、Bazel のファイル数の上限に達し、ビルドプロセスが成功しないことがあります。この属性は、このような複雑な状況を回避するためのものです。必要な場合を除き、使用しないでください

tags

タグについては、Bazel のドキュメントをご覧ください。

visibility

可視性については、Bazel のドキュメントをご覧ください。

使用例

zlib の例は、sapi_library ビルドルールがどのように使用されるかを示す優れたリファレンス プロジェクトです。

load(
    "//sandboxed_api/tools/generator:sapi_generator.bzl",
    "sapi_library",
)

sapi_library(
    name = "zlib-sapi",
    srcs = [],     # Extra code compiled with the SAPI library
    hdrs = [],     # Leave empty if embedded SAPI libraries are used, and the
                   # default sandbox policy is sufficient.
    embed = True,  # This is the default
    functions = [
        "deflateInit_",
        "deflate",
        "deflateEnd",
    ],
    lib = "@zlib//:zlibonly",
    lib_name = "Zlib",
    namespace = "sapi::zlib",
)