C / C++ ルール

ルール

cc_binary

ルールソースを表示
cc_binary(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, env, exec_compatible_with, exec_properties, features, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local_defines, malloc, nocopts, output_licenses, restricted_to, stamp, tags, target_compatible_with, testonly, toolchains, visibility, win_def_file)

暗黙的な出力ターゲット

  • name.stripped(明示的にリクエストされた場合にのみビルド): バイナリのストリップ バージョン。strip -g はバイナリで実行され、デバッグ シンボルを削除します。--stripopt=-foo を使用して、コマンドラインで追加のストリップ オプションを指定できます。この出力は、明示的にリクエストされた場合にのみビルドされます。
  • name.dwp(明示的にリクエストされた場合にのみビルド): Fission が有効な場合、リモートでデプロイされたバイナリのデバッグに適したデバッグ情報パッケージ ファイル。それ以外の場合は空のファイル。

引数

属性
name

名前(必須)

このターゲットの一意の名前。

deps

ラベルのリスト。デフォルトは []

バイナリ ターゲットにリンクされる他のライブラリのリスト。

cc_library または objc_library のターゲットを指定できます。

srcs

ラベルのリスト。デフォルトは []

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

.cc.c.cpp の各ファイルがすべてコンパイルされます。生成されたファイルの場合: 名前付きファイルが他のルールの outs にある場合、このルールは自動的にその他のルールに依存します。

.h ファイルはコンパイルされませんが、このルールのソースでインクルードできます。.cc ファイルと .h ファイルの両方で、これらの srcs にリストされているヘッダー、または deps 引数にリストされているルールの hdrs にリストされているヘッダーを直接含めることができます。

すべての #included ファイルは、このルールの srcs 属性、または参照される cc_library()hdrs 属性で言及されている必要があります。推奨されるスタイルは、ライブラリに関連付けられたヘッダーをそのライブラリの hdrs 属性にリストし、このルールのソースに関連付けられた残りのヘッダーを srcs にリストすることです。詳しくは、「ヘッダーの包含チェック」をご覧ください。

ルールの名前が srcs にある場合、このルールはそのルールに自動的に依存します。名前付きルールの outs が C または C++ のソースファイルの場合、このルールにコンパイルされます。ライブラリ ファイルの場合、リンクされます。

許可されている srcs ファイル形式:

  • C および C++ のソースファイル: .c.cc.cpp.cxx.c++.C
  • C および C++ ヘッダー ファイル: .h.hh.hpp.hxx.inc.inl.H
  • C プリプロセッサ付きアセンブラ: .S
  • アーカイブ: .a.pic.a
  • 「常にリンク」ライブラリ: .lo.pic.lo
  • 共有ライブラリ(バージョン付きまたはバージョンなし): .so.so.version
  • オブジェクト ファイル: .o.pic.o

...およびそれらのファイルを生成するルール。拡張子が異なると、gcc の規則に従って異なるプログラミング言語が示されます。

additional_linker_inputs

ラベルのリスト。デフォルトは []

これらのファイルを C++ リンカー コマンドに渡します。

たとえば、コンパイル済みの Windows .res ファイルをここに指定して、バイナリ ターゲットに埋め込むことができます。

copts

文字列のリスト。デフォルトは []

これらのオプションを C++ コンパイル コマンドに追加します。「変数を作成」の置換と Bourne シェルのトークン化の対象となります。

この属性の各文字列は、バイナリ ターゲットをコンパイルする前に、指定された順序で COPTS に追加されます。フラグは、このターゲットのコンパイルにのみ有効で、依存関係には有効ではありません。そのため、他の場所でインクルードされているヘッダー ファイルには注意してください。すべてのパスは、現在のパッケージではなく、ワークスペースを基準とした相対パスにする必要があります。

パッケージが機能 no_copts_tokenization を宣言している場合、Bourne シェルのトークン化は、単一の「Make」変数で構成される文字列にのみ適用されます。

defines

文字列のリスト。デフォルトは []

コンパイル行に追加する定義のリスト。「Make」変数の置換と Bourne シェルのトークン化の対象となります。各文字列(単一の Bourne シェル トークンで構成されている必要があります)の先頭に -D が付加され、このターゲットのコンパイル コマンドラインと、このターゲットに依存するすべてのルールに追加されます。広範囲に影響する可能性があるため、十分に注意してください。不明な場合は、代わりに local_defines に定義値を追加します。
includes

文字列のリスト。デフォルトは []

コンパイル行に追加するインクルード ディレクトリのリスト。

「変数を作成」の置換の対象となります。各文字列の先頭に -isystem が追加され、COPTS に追加されます。COPTS とは異なり、これらのフラグは、このルールと、このルールに依存するすべてのルールに追加されます。(注: 依存するルールではありません)。この設定は広範囲に影響する可能性があるため、十分に注意してください。不明な場合は、代わりに COPTS に「-I」フラグを追加します。

ヘッダーは srcs または hdrs に追加する必要があります。追加しないと、コンパイルがサンドボックス化されている場合(デフォルト)、依存ルールで使用できません。

ラベル。デフォルトは "@bazel_tools//tools/cpp:link_extra_lib"

追加ライブラリのリンクを制御します。

デフォルトでは、C++ バイナリは //tools/cpp:link_extra_lib に対してリンクされます。これはデフォルトでラベルフラグ //tools/cpp:link_extra_libs に依存します。フラグを設定しない場合、このライブラリはデフォルトで空になります。ラベルフラグを設定すると、弱いシンボルのオーバーライド、共有ライブラリ関数のインターセプタ、特別なランタイム ライブラリ(malloc の置き換えの場合は malloc または --custom_malloc を優先)などのオプションの依存関係をリンクできます。この属性を None に設定すると、この動作が無効になります。

linkopts

文字列のリスト。デフォルトは []

これらのフラグを C++ リンカー コマンドに追加します。「Make」変数の置換 Bourne シェルのトークン化ラベルの展開の対象となります。この属性の各文字列は、バイナリ ターゲットをリンクする前に LINKOPTS に追加されます。

$ または - で始まらないこのリストの各要素は、deps のターゲットのラベルと見なされます。そのターゲットによって生成されたファイルのリストが、リンカー オプションに追加されます。ラベルが無効であるか、deps で宣言されていない場合は、エラーが報告されます。

linkshared

ブール値。構成不可。デフォルトは False

共有ライブラリを作成します。この属性を有効にするには、ルールに linkshared=True を含めます。デフォルトでは、このオプションはオフになっています。

このフラグが存在する場合、-shared フラグを使用して gcc にリンクが行われ、結果として得られる共有ライブラリは、たとえば Java プログラムに読み込むのに適しています。ただし、cc_binary ルールでビルドされた共有ライブラリは他のプログラムによって手動で読み込まれると想定されているため、ビルド目的で依存バイナリにリンクされることはありません。したがって、cc_library ルールの代わりと見なすべきではありません。スケーラビリティを考慮して、このアプローチは完全に回避し、代わりに java_librarycc_library ルールに依存させることをおすすめします。

linkopts=['-static']linkshared=True の両方を指定すると、完全に自己完結型の単一ユニットが取得されます。linkstatic=Truelinkshared=True の両方を指定すると、ほとんど自己完結型の単一ユニットが取得されます。

linkstatic

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

cc_binarycc_test の場合: バイナリを静的モードでリンクします。cc_library.linkstatic: 以下をご覧ください。

デフォルトでは、このオプションは cc_binary ではオン、それ以外ではオフになっています。

有効で、これがバイナリまたはテストの場合、このオプションは、可能な限りユーザー ライブラリの .so ではなく .a をリンクするようにビルドツールに指示します。静的ライブラリがないライブラリと同様に、一部のシステム ライブラリは動的にリンクされる可能性があります。したがって、結果の実行可能ファイルは引き続き動的にリンクされるため、静的であるのはほとんどの場合のみです。

実行可能ファイルをリンクする方法は、実際には 3 つあります。

  • STATIC(fully_static_link 機能付き)。すべてが静的にリンクされます。例: 「gcc -static foo.o libbar.a libbaz.a -lm」。
    このモードは、features 属性で fully_static_link を指定することで有効になります。
  • STATIC: すべてのユーザー ライブラリが静的にリンクされます(静的バージョンが利用可能な場合)。ただし、システム ライブラリ(C/C++ ランタイム ライブラリを除く)は動的にリンクされます(例: "gcc foo.o libfoo.a libbaz.a -lm")。
    このモードは、linkstatic=True を指定することで有効になります。
  • DYNAMIC: すべてのライブラリが動的にリンクされます(動的バージョンが利用可能な場合)。例: 「gcc foo.o libfoo.so libbaz.so -lm」。
    このモードは、linkstatic=False を指定することで有効になります。

linkstatic 属性は、cc_library() ルールで使用される場合、意味が異なります。C++ ライブラリの場合、linkstatic=True は静的リンクのみが許可されていることを示します。そのため、.so は生成されません。linkstatic=False は、静的ライブラリの作成を妨げません。この属性は、動的ライブラリの作成を制御するためのものです。

linkstatic=False の場合、ビルドツールは *.runfiles 領域に依存する共有ライブラリへのシンボリック リンクを作成します。

local_defines

文字列のリスト。デフォルトは []

コンパイル行に追加する定義のリスト。「Make」変数の置換と Bourne シェルのトークン化の対象となります。各文字列は単一の Bourne シェル トークンで構成されている必要があり、-D が先頭に付加され、このターゲットのコンパイル コマンドラインに追加されますが、依存関係には追加されません。
malloc

ラベル。デフォルトは "@bazel_tools//tools/cpp:malloc"

malloc のデフォルトの依存関係をオーバーライドします。

デフォルトでは、C++ バイナリは //tools/cpp:malloc に対してリンクされます。これは空のライブラリであるため、バイナリは libc malloc を使用することになります。このラベルは cc_library を参照する必要があります。コンパイルが C++ 以外のルールの場合、このオプションは効果がありません。linkshared=True が指定されている場合、この属性の値は無視されます。

nocopts

文字列。デフォルトは "" です。

C++ コンパイル コマンドから一致するオプションを削除します。「Make」変数の置換の対象となります。この属性の値は正規表現として解釈されます。この正規表現に一致する既存の COPTS(ルールの copts 属性で明示的に指定された値を含む)は、このルールをコンパイルする目的で COPTS から削除されます。この属性はほとんど必要ありません。
stamp

整数。デフォルトは -1 です。

ビルド情報をバイナリにエンコードするかどうか。有効な値:
  • stamp = 1: --nostamp ビルドの場合でも、常にビルド情報をバイナリにスタンプします。この設定は避けるべきです。バイナリとそれに依存するダウンストリーム アクションのリモート キャッシュを無効にする可能性があります。
  • stamp = 0: ビルド情報を常に定数値に置き換えます。これにより、ビルド結果のキャッシュ保存が適切に行われます。
  • stamp = -1: ビルド情報のエンベディングは --[no]stamp フラグで制御されます。

依存関係が変更されない限り、スタンプ付きバイナリは再構築されません。

win_def_file

ラベル。デフォルトは None

リンカーに渡される Windows DEF ファイル。

この属性は、Windows がターゲット プラットフォームの場合にのみ使用する必要があります。共有ライブラリのリンク時に シンボルをエクスポートするために使用できます。

cc_import

ルールソースを表示
cc_import(name, deps, data, hdrs, alwayslink, compatible_with, deprecation, distribs, features, interface_library, licenses, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, visibility)

cc_import ルールを使用すると、ユーザーは事前コンパイル済みの C/C++ ライブラリをインポートできます。

一般的なユースケースは次のとおりです。
1. 静的ライブラリをリンクする

cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  # If alwayslink is turned on,
  # libmylib.a will be forcely linked into any binary that depends on it.
  # alwayslink = 1,
)
2. 共有ライブラリをリンクする(Unix)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  shared_library = "libmylib.so",
)
3. インターフェース ライブラリと共有ライブラリをリンクする(Windows)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # mylib.lib is an import library for mylib.dll which will be passed to linker
  interface_library = "mylib.lib",
  # mylib.dll will be available for runtime
  shared_library = "mylib.dll",
)
4. system_provided=True を使用した共有ライブラリのリンク(Windows)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # mylib.lib is an import library for mylib.dll which will be passed to linker
  interface_library = "mylib.lib",
  # mylib.dll is provided by system environment, for example it can be found in PATH.
  # This indicates that Bazel is not responsible for making mylib.dll available.
  system_provided = 1,
)
5. 静的ライブラリまたは共有ライブラリ
へのリンク Unix の場合:
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  shared_library = "libmylib.so",
)

# first will link to libmylib.a
cc_binary(
  name = "first",
  srcs = ["first.cc"],
  deps = [":mylib"],
  linkstatic = 1, # default value
)

# second will link to libmylib.so
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = 0,
)
Windows の場合:
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.lib", # A normal static library
  interface_library = "mylib.lib", # An import library for mylib.dll
  shared_library = "mylib.dll",
)

# first will link to libmylib.lib
cc_binary(
  name = "first",
  srcs = ["first.cc"],
  deps = [":mylib"],
  linkstatic = 1, # default value
)

# second will link to mylib.dll through mylib.lib
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = 0,
)
cc_import は include 属性をサポートしています。次に例を示します。
  cc_import(
  name = "curl_lib",
  hdrs = glob(["vendor/curl/include/curl/*.h"]),
  includes = [ "vendor/curl/include" ],
  shared_library = "vendor/curl/lib/.libs/libcurl.dylib",
)

引数

属性
name

名前(必須)

このターゲットの一意の名前。

deps

ラベルのリスト。デフォルトは []

ターゲットが依存する他のライブラリのリスト。deps に関する一般的なコメントについては、ほとんどのビルドルールで定義される一般的な属性をご覧ください。
hdrs

ラベルのリスト。デフォルトは []

この事前コンパイル済みライブラリによって公開され、依存ルールのソースによって直接インクルードされるヘッダー ファイルのリスト。

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

1 の場合、この C++ プリコンパイル済みライブラリに(直接的または間接的に)依存するバイナリは、一部にバイナリで参照されるシンボルが含まれていない場合でも、静的ライブラリにアーカイブされたすべてのオブジェクト ファイルにリンクします。これは、コードがバイナリ内のコードによって明示的に呼び出されない場合に便利です。たとえば、コードがサービスによって提供されるコールバックを受け取るように登録されている場合などです。

Windows で VS 2017 で alwayslink が機能しない場合は、既知の問題が原因です。VS 2017 を最新バージョンにアップグレードしてください。

interface_library

ラベル。デフォルトは None

共有ライブラリをリンクするための単一のインターフェース ライブラリ。

許可されているファイル形式: .ifso.tbd.lib.so.dylib

shared_library

ラベル。デフォルトは None

単一の事前コンパイル済み共有ライブラリ。Bazel は、実行時に依存するバイナリで利用できるようにします。

使用可能なファイル形式: .so.dll.dylib

static_library

ラベル。デフォルトは None

単一のプリコンパイル済み静的ライブラリ。

使用可能なファイル形式: .a.pic.a.lib

system_provided

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

1 の場合、ランタイムに必要な共有ライブラリがシステムによって提供されることを示します。この場合、interface_library を指定し、shared_library を空にする必要があります。

cc_library

ルールソースを表示
cc_library(name, deps, srcs, data, hdrs, additional_compiler_inputs, additional_linker_inputs, alwayslink, compatible_with, copts, defines, deprecation, distribs, exec_compatible_with, exec_properties, features, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, nocopts, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)

ヘッダーの包含チェック

ビルドで使用されるすべてのヘッダー ファイルは、cc_* ルールの hdrs または srcs で宣言する必要があります。これは適用されます。

cc_library ルールの場合、hdrs のヘッダーはライブラリの公開インターフェースを構成し、hdrssrcs のファイルから直接インクルードできます。また、deps でライブラリをリストする cc_* ルールの hdrssrcs のファイルからも直接インクルードできます。srcs のヘッダーは、ライブラリ自体の hdrssrcs のファイルからのみ直接インクルードする必要があります。ヘッダーを hdrs または srcs に入れるかどうかを決定する際は、このライブラリのコンシューマーが直接含めることができるようにするかどうかを検討する必要があります。これは、プログラミング言語の publicprivate の可視性の選択とほぼ同じです。

cc_binary ルールと cc_test ルールにはエクスポートされたインターフェースがないため、hdrs 属性もありません。バイナリまたはテストに直接属するすべてのヘッダーは、srcs にリストされるべきです。

これらのルールを説明するために、次の例をご覧ください。

cc_binary(
    name = "foo",
    srcs = [
        "foo.cc",
        "foo.h",
    ],
    deps = [":bar"],
)

cc_library(
    name = "bar",
    srcs = [
        "bar.cc",
        "bar-impl.h",
    ],
    hdrs = ["bar.h"],
    deps = [":baz"],
)

cc_library(
    name = "baz",
    srcs = [
        "baz.cc",
        "baz-impl.h",
    ],
    hdrs = ["baz.h"],
)

この例で許可されている直接インクルードを次の表に示します。たとえば、foo.ccfoo.hbar.h を直接含めることができますが、baz.h は含めることができません。

インクルード ファイル許可されるインクルージョン
foo.hbar.h
foo.ccfoo.h bar.h
bar.hbar-impl.h baz.h
bar-impl.hbar.h baz.h
bar.ccbar.h bar-impl.h baz.h
baz.hbaz-impl.h
baz-impl.hbaz.h
baz.ccbaz.h baz-impl.h

包含チェックルールは、直接包含にのみ適用されます。上記の例では、foo.ccbar.h を含めることができ、bar.hbaz.h を含めることができ、baz.hbaz-impl.h を含めることができます。技術的には、.cc ファイルのコンパイルでは、推移的な deps クロージャ内の任意の cc_libraryhdrs または srcs の任意のヘッダー ファイルを推移的に含めることができます。この場合、コンパイラは foo.cc のコンパイル時に baz.hbaz-impl.h を読み取る可能性がありますが、foo.cc#include "baz.h" を含めることはできません。これを許可するには、bazfoodeps に追加する必要があります。

Bazel は、ツールチェーンのサポートに依存して、インクルード チェックルールの適用を行います。layering_check 機能はツールチェーンでサポートされ、明示的にリクエストされる必要があります。たとえば、--features=layering_check コマンドライン フラグや package 関数の features パラメータなどです。Bazel が提供するツールチェーンは、Unix と macOS の clang でのみこの機能をサポートしています。

引数

属性
name

名前(必須)

このターゲットの一意の名前。

deps

ラベルのリスト。デフォルトは []

バイナリ ターゲットにリンクされる他のライブラリのリスト。

cc_library または objc_library のターゲットを指定できます。

srcs

ラベルのリスト。デフォルトは []

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

.cc.c.cpp の各ファイルがすべてコンパイルされます。生成されたファイルの場合: 名前付きファイルが他のルールの outs にある場合、このルールは自動的にその他のルールに依存します。

.h ファイルはコンパイルされませんが、このルールのソースでインクルードできます。.cc ファイルと .h ファイルの両方で、これらの srcs にリストされているヘッダー、または deps 引数にリストされているルールの hdrs にリストされているヘッダーを直接含めることができます。

すべての #included ファイルは、このルールの srcs 属性、または参照される cc_library()hdrs 属性で言及されている必要があります。推奨されるスタイルは、ライブラリに関連付けられたヘッダーをそのライブラリの hdrs 属性にリストし、このルールのソースに関連付けられた残りのヘッダーを srcs にリストすることです。詳しくは、「ヘッダーの包含チェック」をご覧ください。

ルールの名前が srcs にある場合、このルールはそのルールに自動的に依存します。名前付きルールの outs が C または C++ のソースファイルの場合、このルールにコンパイルされます。ライブラリ ファイルの場合、リンクされます。

許可されている srcs ファイル形式:

  • C および C++ のソースファイル: .c.cc.cpp.cxx.c++.C
  • C および C++ ヘッダー ファイル: .h.hh.hpp.hxx.inc.inl.H
  • C プリプロセッサ付きアセンブラ: .S
  • アーカイブ: .a.pic.a
  • 「常にリンク」ライブラリ: .lo.pic.lo
  • 共有ライブラリ(バージョン付きまたはバージョンなし): .so.so.version
  • オブジェクト ファイル: .o.pic.o

...およびそれらのファイルを生成するルール。拡張子が異なると、gcc の規則に従って異なるプログラミング言語が示されます。

hdrs

ラベルのリスト。デフォルトは []

このライブラリによって公開され、依存ルールのソースによって直接インクルードされるヘッダー ファイルのリスト。

ライブラリのインターフェースを記述するヘッダー ファイルを宣言する場所として、この場所が強く推奨されます。これらのヘッダーは、このルールまたは依存ルール内のソースによって含めることができます。このライブラリのクライアントが含めることを意図していないヘッダーは、公開されたヘッダーに含まれている場合でも、代わりに srcs 属性にリストする必要があります。詳しくは、「ヘッダーの包含チェック」をご覧ください。

additional_compiler_inputs

ラベルのリスト。デフォルトは []

サニタイザーの無視リストなど、コンパイラ コマンドラインに渡す追加のファイル。ここで指定されたファイルは、$(location) 関数を使用して copts で使用できます。
additional_linker_inputs

ラベルのリスト。デフォルトは []

これらのファイルを C++ リンカー コマンドに渡します。

たとえば、コンパイル済みの Windows .res ファイルをここに指定して、バイナリ ターゲットに埋め込むことができます。

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

1 の場合、この C++ ライブラリに(直接的または間接的に)依存するバイナリは、srcs にリストされているファイルのすべてのオブジェクト ファイルをリンクします。バイナリで参照されるシンボルが含まれていないファイルもリンクされます。これは、コードがバイナリ内のコードによって明示的に呼び出されない場合に便利です。たとえば、コードがサービスによって提供されるコールバックを受け取るように登録されている場合などです。

Windows で VS 2017 で alwayslink が機能しない場合は、既知の問題が原因です。VS 2017 を最新バージョンにアップグレードしてください。

copts

文字列のリスト。デフォルトは []

これらのオプションを C++ コンパイル コマンドに追加します。「変数を作成」の置換と Bourne シェルのトークン化の対象となります。

この属性の各文字列は、バイナリ ターゲットをコンパイルする前に、指定された順序で COPTS に追加されます。フラグは、このターゲットのコンパイルにのみ有効で、依存関係には有効ではありません。そのため、他の場所でインクルードされているヘッダー ファイルには注意してください。すべてのパスは、現在のパッケージではなく、ワークスペースを基準とした相対パスにする必要があります。

パッケージが機能 no_copts_tokenization を宣言している場合、Bourne シェルのトークン化は、単一の「Make」変数で構成される文字列にのみ適用されます。

defines

文字列のリスト。デフォルトは []

コンパイル行に追加する定義のリスト。「Make」変数の置換と Bourne シェルのトークン化の対象となります。各文字列(単一の Bourne シェル トークンで構成されている必要があります)の先頭に -D が付加され、このターゲットのコンパイル コマンドラインと、このターゲットに依存するすべてのルールに追加されます。広範囲に影響する可能性があるため、十分に注意してください。不明な場合は、代わりに local_defines に定義値を追加します。
implementation_deps

ラベルのリスト。デフォルトは []

ライブラリ ターゲットが依存する他のライブラリのリスト。deps とは異なり、これらのライブラリのヘッダーとインクルード パス(およびすべての推移的依存関係)は、このライブラリのコンパイルにのみ使用され、それに依存するライブラリには使用されません。implementation_deps で指定されたライブラリは、このライブラリに依存するバイナリ ターゲットで引き続きリンクされます。

現在のところ、使用は cc_libraries に限定され、フラグ --experimental_cc_implementation_deps によって保護されています。

include_prefix

文字列。デフォルトは "" です。

このルールのヘッダーのパスに追加する接頭辞。

設定すると、このルールの hdrs 属性のヘッダーは、この属性の値がリポジトリ相対パスの先頭に追加されたパスでアクセスできます。

strip_include_prefix 属性の接頭辞は、この接頭辞が追加される前に削除されます。

includes

文字列のリスト。デフォルトは []

コンパイル行に追加するインクルード ディレクトリのリスト。

「変数を作成」の置換の対象となります。各文字列の先頭に -isystem が追加され、COPTS に追加されます。COPTS とは異なり、これらのフラグは、このルールと、このルールに依存するすべてのルールに追加されます。(注: 依存するルールではありません)。この設定は広範囲に影響する可能性があるため、十分に注意してください。不明な場合は、代わりに COPTS に「-I」フラグを追加します。

ヘッダーは srcs または hdrs に追加する必要があります。追加しないと、コンパイルがサンドボックス化されている場合(デフォルト)、依存ルールで使用できません。

linkopts

文字列のリスト。デフォルトは []

これらのフラグを C++ リンカー コマンドに追加します。「Make」変数の置換 Bourne シェルのトークン化ラベルの展開の対象となります。この属性の各文字列は、バイナリ ターゲットをリンクする前に LINKOPTS に追加されます。

$ または - で始まらないこのリストの各要素は、deps のターゲットのラベルと見なされます。そのターゲットによって生成されたファイルのリストが、リンカー オプションに追加されます。ラベルが無効であるか、deps で宣言されていない場合は、エラーが報告されます。

linkstamp

ラベル。デフォルトは None

指定された C++ ソースファイルを同時にコンパイルして、最終バイナリにリンクします。このトリックは、バイナリにタイムスタンプ情報を導入するために必要です。通常の方法でソースファイルをオブジェクト ファイルにコンパイルすると、タイムスタンプが正しくなくなります。リンクスタンプ コンパイルには特定のコンパイラ フラグのセットを含めることができないため、特定のヘッダー、コンパイラ オプション、その他のビルド変数に依存してはなりません。このオプションは base パッケージでのみ必要です。
linkstatic

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

cc_binarycc_test の場合: バイナリを静的モードでリンクします。cc_library.linkstatic: 以下をご覧ください。

デフォルトでは、このオプションは cc_binary ではオン、それ以外ではオフになっています。

有効で、これがバイナリまたはテストの場合、このオプションは、可能な限りユーザー ライブラリの .so ではなく .a をリンクするようにビルドツールに指示します。静的ライブラリがないライブラリと同様に、一部のシステム ライブラリは動的にリンクされる可能性があります。したがって、結果の実行可能ファイルは引き続き動的にリンクされるため、静的であるのはほとんどの場合のみです。

実行可能ファイルをリンクする方法は、実際には 3 つあります。

  • STATIC(fully_static_link 機能付き)。すべてが静的にリンクされます。例: 「gcc -static foo.o libbar.a libbaz.a -lm」。
    このモードは、features 属性で fully_static_link を指定することで有効になります。
  • STATIC: すべてのユーザー ライブラリが静的にリンクされます(静的バージョンが利用可能な場合)。ただし、システム ライブラリ(C/C++ ランタイム ライブラリを除く)は動的にリンクされます(例: "gcc foo.o libfoo.a libbaz.a -lm")。
    このモードは、linkstatic=True を指定することで有効になります。
  • DYNAMIC: すべてのライブラリが動的にリンクされます(動的バージョンが利用可能な場合)。例: 「gcc foo.o libfoo.so libbaz.so -lm」。
    このモードは、linkstatic=False を指定することで有効になります。

linkstatic 属性は、cc_library() ルールで使用される場合、意味が異なります。C++ ライブラリの場合、linkstatic=True は静的リンクのみが許可されていることを示します。そのため、.so は生成されません。linkstatic=False は、静的ライブラリの作成を妨げません。この属性は、動的ライブラリの作成を制御するためのものです。

linkstatic=False の場合、ビルドツールは *.runfiles 領域に依存する共有ライブラリへのシンボリック リンクを作成します。

local_defines

文字列のリスト。デフォルトは []

コンパイル行に追加する定義のリスト。「Make」変数の置換と Bourne シェルのトークン化の対象となります。各文字列は単一の Bourne シェル トークンで構成されている必要があり、-D が先頭に付加され、このターゲットのコンパイル コマンドラインに追加されますが、依存関係には追加されません。
nocopts

文字列。デフォルトは "" です。

C++ コンパイル コマンドから一致するオプションを削除します。「Make」変数の置換の対象となります。この属性の値は正規表現として解釈されます。この正規表現に一致する既存の COPTS(ルールの copts 属性で明示的に指定された値を含む)は、このルールをコンパイルする目的で COPTS から削除されます。この属性はほとんど必要ありません。
strip_include_prefix

文字列。デフォルトは "" です。

このルールのヘッダーのパスから削除する接頭辞。

設定すると、このルールの hdrs 属性のヘッダーは、この接頭辞が切り捨てられたパスでアクセス可能になります。

相対パスの場合、パッケージ相対パスとして扱われます。絶対パスの場合は、リポジトリ相対パスとして解釈されます。

include_prefix 属性の接頭辞は、この接頭辞が削除された後に追加されます。

textual_hdrs

ラベルのリスト。デフォルトは []

このライブラリによって公開され、依存ルールのソースによってテキストでインクルードされるヘッダー ファイルのリスト。

これは、単独でコンパイルできないヘッダー ファイルを宣言する場所です。つまり、有効なコードをビルドするには、常に他のソースファイルによってテキストでインクルードされる必要があります。

win_def_file

ラベル。デフォルトは None

リンカーに渡される Windows DEF ファイル。

この属性は、Windows がターゲット プラットフォームの場合にのみ使用する必要があります。共有ライブラリのリンク時に シンボルをエクスポートするために使用できます。

cc_proto_library

ルールソースを表示
cc_proto_library(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

cc_proto_library.proto ファイルから C++ コードを生成します。

depsproto_library ルールを指している必要があります。

例:

cc_library(
    name = "lib",
    deps = [":foo_cc_proto"],
)

cc_proto_library(
    name = "foo_cc_proto",
    deps = [":foo_proto"],
)

proto_library(
    name = "foo_proto",
)

引数

属性
name

名前(必須)

このターゲットの一意の名前。

deps

ラベルのリスト。デフォルトは []

C++ コードを生成する proto_library ルールのリスト。

cc_shared_library

ルールソースを表示
cc_shared_library(name, deps, additional_linker_inputs, dynamic_deps, exports_filter, shared_lib_name, tags, user_link_flags, win_def_file)

共有ライブラリを生成します。

cc_shared_library(
    name = "foo_shared",
    deps = [
        ":foo",
    ],
    dynamic_deps = [
        ":bar_shared",
    ],
    additional_linker_inputs = [
        ":foo.lds",
    ],
    user_link_flags = [
        "-Wl,--version-script=$(location :foo.lds)",
    ],
)
cc_library(
    name = "foo",
    srcs = ["foo.cc"],
    hdrs = ["foo.h"],
    deps = [
        ":bar",
        ":baz",
    ],
)
cc_shared_library(
    name = "bar_shared",
    shared_lib_name = "bar.so",
    deps = [":bar"],
)
cc_library(
    name = "bar",
    srcs = ["bar.cc"],
    hdrs = ["bar.h"],
)
cc_library(
    name = "baz",
    srcs = ["baz.cc"],
    hdrs = ["baz.h"],
)

この例では、foo_sharedfoobaz を静的にリンクします。後者は推移的依存関係です。bardynamic_dep bar_shared によって動的に提供されるため、リンクされません。

foo_shared は、リンカ スクリプトの *.lds ファイルを使用して、どのシンボルをエクスポートするかを制御します。cc_shared_library ルールロジックは、どのシンボルがエクスポートされるかを制御しません。2 つの共有ライブラリが同じターゲットをエクスポートする場合、エクスポートされると想定されるものを使用して、分析フェーズでエラーを発生させるだけです。

cc_shared_library のすべての直接依存関係はエクスポートされると想定されます。したがって、Bazel は分析中に foofoo_shared によってエクスポートされていると想定します。bazfoo_shared によってエクスポートされるとは想定されていません。exports_filter によって一致したすべてのターゲットもエクスポートされると想定されます。

例のすべての cc_library は、最大で 1 つの cc_shared_library にのみ出現します。bazbar_shared にもリンクする場合は、baztags = ["LINKABLE_MORE_THAN_ONCE"] を追加する必要があります。

shared_lib_name 属性により、bar_shared によって生成されるファイルの名前は、Linux でデフォルトで使用される libbar.so ではなく bar.so になります。

エラー

Two shared libraries in dependencies export the same symbols.

これは、同じターゲットをエクスポートする 2 つの異なる cc_shared_library 依存関係を持つターゲットを作成するたびに発生します。この問題を解決するには、cc_shared_library 依存関係のいずれかでライブラリがエクスポートされないようにする必要があります。

これは、同じターゲットを静的にリンクする 2 つの異なる cc_shared_library 依存関係を持つ新しい cc_shared_library を作成するときに発生します。エクスポートのエラーと同様です。

この問題を解決する 1 つの方法は、ライブラリを cc_shared_library 依存関係の 1 つにリンクしないようにすることです。同時に、まだリンクしている方は、リンクしていない方がシンボルを認識できるようにライブラリをエクスポートする必要があります。もう 1 つの方法は、ターゲットをエクスポートするサードパーティ ライブラリを抽出することです。3 つ目の方法は、cc_libraryLINKABLE_MORE_THAN_ONCE のタグを付けることです。ただし、この修正はまれであるべきで、cc_library が実際に複数回リンクしても安全であることを確認する必要があります。

'//foo:foo' is already linked statically in '//bar:bar' but not exported`

つまり、deps の推移的閉包内のライブラリは、cc_shared_library 依存関係の 1 つを経由しなくても到達可能ですが、dynamic_deps 内の別の cc_shared_library にすでにリンクされており、エクスポートされていません。

解決策は、cc_shared_library 依存関係からエクスポートするか、エクスポートする 3 つ目の cc_shared_library を取り出すことです。

Do not place libraries which only contain a precompiled dynamic library in deps.

プリコンパイル済みの動的ライブラリがある場合、現在作成中の cc_shared_library ターゲットに静的にリンクする必要はなく、リンクすることもできません。したがって、cc_shared_librarydeps には属しません。この事前コンパイル済み動的ライブラリが cc_libraries のいずれかの依存関係である場合、cc_library はそれに直接依存する必要があります。

Trying to export a library already exported by a different shared library

現在のルールで、動的依存関係のいずれかによってすでにエクスポートされているターゲットをエクスポートすると、このエラーが表示されます。

この問題を解決するには、deps からターゲットを削除して動的依存関係にのみ依存するか、exports_filter がこのターゲットをキャッチしないようにします。

引数

属性
name

名前(必須)

このターゲットの一意の名前。

deps

ラベルのリスト。デフォルトは []

全体アーカイブされた後、共有ライブラリに無条件で静的にリンクされるトップレベル ライブラリ。

これらの直接依存関係の推移的ライブラリ依存関係は、dynamic_depscc_shared_library によってまだリンクされていない限り、この共有ライブラリにリンクされます。

分析中、ルール実装は、複数の cc_shared_libraries が同じターゲットをエクスポートするときにエラーを返すために、deps にリストされているターゲットを共有ライブラリによってエクスポートされるものと見なします。ルール実装では、共有オブジェクトによってエクスポートされるシンボルをリンカーに通知する処理は行われません。ユーザーは、リンカー スクリプトまたはソースコードの可視性宣言を使用して、この処理を行う必要があります。

また、同じライブラリが複数の cc_shared_library に静的にリンクされている場合にも、エラーがトリガーされます。これは、"LINKABLE_MORE_THAN_ONCE"cc_library.tags に追加するか、`cc_library` を共有ライブラリの 1 つのエクスポートとしてリストして、一方を他方の dynamic_dep にすることで回避できます。

additional_linker_inputs

ラベルのリスト。デフォルトは []

リンカーに渡す追加のファイル(リンカースクリプトなど)。リンカーがこのファイルを認識するために必要なリンカーフラグは、個別に渡す必要があります。これを行うには、user_link_flags 属性を使用します。
dynamic_deps

ラベルのリスト。デフォルトは []

これらは、現在のターゲットが依存する他の cc_shared_library 依存関係です。

cc_shared_library の実装では、dynamic_deps のリスト(推移的、つまり現在のターゲットの dynamic_depsdynamic_deps も含む)を使用して、推移的な deps のどの cc_libraries をリンクしないかを決定します。これは、別の cc_shared_library によってすでに提供されているためです。

exports_filter

文字列のリスト。デフォルトは []

この属性には、現在の共有ライブラリによってエクスポートされると宣言されているターゲットのリストが含まれます。

ターゲット deps は、共有ライブラリによってエクスポートされることがすでにわかっています。この属性は、共有ライブラリによってエクスポートされるが、deps の推移的な依存関係であるターゲットをリストするために使用する必要があります。

この属性は、実際にはこれらのターゲットに依存関係エッジを追加するものではありません。依存関係エッジは deps によって作成される必要があります。この属性のエントリは単なる文字列です。この属性にターゲットを配置すると、共有ライブラリがそのターゲットからシンボルをエクスポートするというクレームとみなされます。cc_shared_library ロジックは、どのシンボルをエクスポートすべきかをリンカーに伝える処理を実際には行いません。

次の構文を使用できます。

foo/BUILD 内の任意のターゲットを考慮する //foo:__package__

foo/BUILD 内のターゲット、または foo/ bar/BUILD などの foo/の下の他のパッケージ内のターゲットを考慮する //foo:__subpackages__

shared_lib_name

文字列。デフォルトは "" です。

デフォルトでは、cc_shared_library は、ターゲットの名前とプラットフォームに基づいて共有ライブラリ出力ファイルの名前を使用します。これには、拡張子と接頭辞が含まれる場合があります。デフォルトの名前が望ましくない場合があります。たとえば、Python 用の C++ 共有ライブラリを読み込む場合、デフォルトの lib* プレフィックスが望ましくないことがよくあります。このような場合は、この属性を使用してカスタム名を選択できます。

文字列のリスト。デフォルトは []

リンカーに渡す追加のフラグ。たとえば、additional_linker_inputs 経由で渡されたリンカースクリプトをリンカーに認識させるには、次のようにします。
         cc_shared_library(
            name = "foo_shared",
            additional_linker_inputs = select({
              "//src/conditions:linux": [
                ":foo.lds",
                ":additional_script.txt",
              ],
              "//conditions:default": []}),
            user_link_flags = select({
              "//src/conditions:linux": [
                "-Wl,-rpath,kittens",
                "-Wl,--version-script=$(location :foo.lds)",
                "-Wl,--script=$(location :additional_script.txt)",
              ],
              "//conditions:default": []}),
              ...
         )
        
win_def_file

ラベル。デフォルトは None

リンカーに渡される Windows DEF ファイル。

この属性は、Windows がターゲット プラットフォームの場合にのみ使用してください。共有ライブラリのリンク時に シンボルをエクスポートするために使用できます。

fdo_prefetch_hints

ルールソースを表示
fdo_prefetch_hints(name, compatible_with, deprecation, distribs, features, licenses, profile, restricted_to, tags, target_compatible_with, testonly, visibility)

ワークスペース内または指定された絶対パスにある FDO プリフェッチ ヒント プロファイルを表します。例:

fdo_prefetch_hints(
    name = "hints",
    profile = "//path/to/hints:profile.afdo",
)

fdo_profile(
  name = "hints_abs",
  absolute_path_profile = "/absolute/path/profile.afdo",
)

引数

属性
name

名前(必須)

このターゲットの一意の名前。

profile

ラベル。デフォルトは None

ヒント プロファイルのラベル。ヒント ファイルの拡張子は .afdo です。ラベルは fdo_absolute_path_profile ルールを指すこともできます。

fdo_profile

ルールソースを表示
fdo_profile(name, absolute_path_profile, compatible_with, deprecation, distribs, features, licenses, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, visibility)

ワークスペース内または指定された絶対パスにある FDO プロファイルを表します。例:

fdo_profile(
    name = "fdo",
    profile = "//path/to/fdo:profile.zip",
)

fdo_profile(
  name = "fdo_abs",
  absolute_path_profile = "/absolute/path/profile.zip",
)

引数

属性
name

名前(必須)

このターゲットの一意の名前。

absolute_path_profile

文字列。デフォルトは "" です。

FDO プロファイルの絶対パス。FDO ファイルの拡張子は、インデックスなしの LLVM プロファイルの場合は .profraw、インデックス付きの LLVM プロファイルの場合は .profdata、LLVM profraw プロファイルを含む場合は .zip、AutoFDO プロファイルの場合は .afdo のいずれかになります。
profile

ラベル。デフォルトは None

FDO プロファイルのラベル、またはそれを生成するルールのラベル。FDO ファイルの拡張子は、インデックスなしの LLVM プロファイルの場合は .profraw、インデックス付きの LLVM プロファイルの場合は .profdata、LLVM profraw プロファイルを含む場合は .zip、AutoFDO プロファイルの場合は .afdo、XBinary プロファイルの場合は .xfdo のいずれかになります。ラベルは fdo_absolute_path_profile ルールを指すこともできます。
proto_profile

ラベル。デフォルトは None

protobuf プロファイルのラベル。

memprof_profile

ルールソースを表示
memprof_profile(name, absolute_path_profile, compatible_with, deprecation, distribs, features, licenses, profile, restricted_to, tags, target_compatible_with, testonly, visibility)

ワークスペース内または指定された絶対パスにある MEMPROF プロファイルを表します。例:

memprof_profile(
    name = "memprof",
    profile = "//path/to/memprof:profile.afdo",
)

memprof_profile(
  name = "memprof_abs",
  absolute_path_profile = "/absolute/path/profile.afdo",
)

引数

属性
name

名前(必須)

このターゲットの一意の名前。

absolute_path_profile

文字列。デフォルトは "" です。

MEMPROF プロファイルへの絶対パス。ファイルの拡張子は .profdata または .zip のみです(zip ファイルには memprof.profdata ファイルが含まれている必要があります)。
profile

ラベル。デフォルトは None

MEMPROF プロファイルのラベル。プロファイルには、.profdata 拡張子(インデックス付き/シンボル化された memprof プロファイルの場合)または memprof.profdata ファイルを含む zip ファイルの .zip 拡張子のいずれかが含まれている必要があります。ラベルは fdo_absolute_path_profile ルールを指すこともできます。

propeller_optimize

ルールソースを表示
propeller_optimize(name, compatible_with, deprecation, distribs, features, ld_profile, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

ワークスペース内の Propeller 最適化プロファイルを表します。例:

propeller_optimize(
    name = "layout",
    cc_profile = "//path:cc_profile.txt",
    ld_profile = "//path:ld_profile.txt"
)

propeller_optimize(
    name = "layout_absolute",
    absolute_cc_profile = "/absolute/cc_profile.txt",
    absolute_ld_profile = "/absolute/ld_profile.txt"
)

引数

属性
name

名前(必須)

このターゲットの一意の名前。

ld_profile

ラベル。デフォルトは None

リンク アクションに渡されるプロファイルのラベル。このファイルの拡張子は .txt です。

cc_test

ルールソースを表示
cc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, includes, licenses, link_extra_lib, linkopts, linkstatic, local, local_defines, malloc, nocopts, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)

引数

属性
name

名前(必須)

このターゲットの一意の名前。

deps

ラベルのリスト。デフォルトは []

バイナリ ターゲットにリンクされる他のライブラリのリスト。

cc_library または objc_library のターゲットを指定できます。

srcs

ラベルのリスト。デフォルトは []

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

.cc.c.cpp の各ファイルがすべてコンパイルされます。生成されたファイルの場合: 名前付きファイルが他のルールの outs にある場合、このルールは自動的にその他のルールに依存します。

.h ファイルはコンパイルされませんが、このルールのソースでインクルードできます。.cc ファイルと .h ファイルの両方で、これらの srcs にリストされているヘッダー、または deps 引数にリストされているルールの hdrs にリストされているヘッダーを直接含めることができます。

すべての #included ファイルは、このルールの srcs 属性、または参照される cc_library()hdrs 属性で言及されている必要があります。推奨されるスタイルは、ライブラリに関連付けられたヘッダーをそのライブラリの hdrs 属性にリストし、このルールのソースに関連付けられた残りのヘッダーを srcs にリストすることです。詳しくは、「ヘッダーの包含チェック」をご覧ください。

ルールの名前が srcs にある場合、このルールはそのルールに自動的に依存します。名前付きルールの outs が C または C++ のソースファイルの場合、このルールにコンパイルされます。ライブラリ ファイルの場合、リンクされます。

許可されている srcs ファイル形式:

  • C および C++ のソースファイル: .c.cc.cpp.cxx.c++.C
  • C および C++ ヘッダー ファイル: .h.hh.hpp.hxx.inc.inl.H
  • C プリプロセッサ付きアセンブラ: .S
  • アーカイブ: .a.pic.a
  • 「常にリンク」ライブラリ: .lo.pic.lo
  • 共有ライブラリ(バージョン付きまたはバージョンなし): .so.so.version
  • オブジェクト ファイル: .o.pic.o

...およびそれらのファイルを生成するルール。拡張子が異なると、gcc の規則に従って異なるプログラミング言語が示されます。

additional_linker_inputs

ラベルのリスト。デフォルトは []

これらのファイルを C++ リンカー コマンドに渡します。

たとえば、コンパイル済みの Windows .res ファイルをここに指定して、バイナリ ターゲットに埋め込むことができます。

copts

文字列のリスト。デフォルトは []

これらのオプションを C++ コンパイル コマンドに追加します。「変数を作成」の置換と Bourne シェルのトークン化の対象となります。

この属性の各文字列は、バイナリ ターゲットをコンパイルする前に、指定された順序で COPTS に追加されます。フラグは、このターゲットのコンパイルにのみ有効で、依存関係には有効ではありません。そのため、他の場所でインクルードされているヘッダー ファイルには注意してください。すべてのパスは、現在のパッケージではなく、ワークスペースを基準とした相対パスにする必要があります。

パッケージが機能 no_copts_tokenization を宣言している場合、Bourne シェルのトークン化は、単一の「Make」変数で構成される文字列にのみ適用されます。

defines

文字列のリスト。デフォルトは []

コンパイル行に追加する定義のリスト。「Make」変数の置換と Bourne シェルのトークン化の対象となります。各文字列(単一の Bourne シェル トークンで構成されている必要があります)の先頭に -D が付加され、このターゲットのコンパイル コマンドラインと、このターゲットに依存するすべてのルールに追加されます。広範囲に影響する可能性があるため、十分に注意してください。不明な場合は、代わりに local_defines に定義値を追加します。
includes

文字列のリスト。デフォルトは []

コンパイル行に追加するインクルード ディレクトリのリスト。

「変数を作成」の置換の対象となります。各文字列の先頭に -isystem が追加され、COPTS に追加されます。COPTS とは異なり、これらのフラグは、このルールと、このルールに依存するすべてのルールに追加されます。(注: 依存するルールではありません)。この設定は広範囲に影響する可能性があるため、十分に注意してください。不明な場合は、代わりに COPTS に「-I」フラグを追加します。

ヘッダーは srcs または hdrs に追加する必要があります。追加しないと、コンパイルがサンドボックス化されている場合(デフォルト)、依存ルールで使用できません。

ラベル。デフォルトは "@bazel_tools//tools/cpp:link_extra_lib"

追加ライブラリのリンクを制御します。

デフォルトでは、C++ バイナリは //tools/cpp:link_extra_lib に対してリンクされます。これはデフォルトでラベルフラグ //tools/cpp:link_extra_libs に依存します。フラグを設定しない場合、このライブラリはデフォルトで空になります。ラベルフラグを設定すると、弱いシンボルのオーバーライド、共有ライブラリ関数のインターセプタ、特別なランタイム ライブラリ(malloc の置き換えの場合は malloc または --custom_malloc を優先)などのオプションの依存関係をリンクできます。この属性を None に設定すると、この動作が無効になります。

linkopts

文字列のリスト。デフォルトは []

これらのフラグを C++ リンカー コマンドに追加します。「Make」変数の置換 Bourne シェルのトークン化ラベルの展開の対象となります。この属性の各文字列は、バイナリ ターゲットをリンクする前に LINKOPTS に追加されます。

$ または - で始まらないこのリストの各要素は、deps のターゲットのラベルと見なされます。そのターゲットによって生成されたファイルのリストが、リンカー オプションに追加されます。ラベルが無効であるか、deps で宣言されていない場合は、エラーが報告されます。

linkstatic

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

cc_binarycc_test の場合: バイナリを静的モードでリンクします。cc_library.linkstatic: 以下をご覧ください。

デフォルトでは、このオプションは cc_binary ではオン、それ以外ではオフになっています。

有効で、これがバイナリまたはテストの場合、このオプションは、可能な限りユーザー ライブラリの .so ではなく .a をリンクするようにビルドツールに指示します。静的ライブラリがないライブラリと同様に、一部のシステム ライブラリは動的にリンクされる可能性があります。したがって、結果の実行可能ファイルは引き続き動的にリンクされるため、静的であるのはほとんどの場合のみです。

実行可能ファイルをリンクする方法は、実際には 3 つあります。

  • STATIC(fully_static_link 機能付き)。すべてが静的にリンクされます。例: 「gcc -static foo.o libbar.a libbaz.a -lm」。
    このモードは、features 属性で fully_static_link を指定することで有効になります。
  • STATIC: すべてのユーザー ライブラリが静的にリンクされます(静的バージョンが利用可能な場合)。ただし、システム ライブラリ(C/C++ ランタイム ライブラリを除く)は動的にリンクされます(例: "gcc foo.o libfoo.a libbaz.a -lm")。
    このモードは、linkstatic=True を指定することで有効になります。
  • DYNAMIC: すべてのライブラリが動的にリンクされます(動的バージョンが利用可能な場合)。例: 「gcc foo.o libfoo.so libbaz.so -lm」。
    このモードは、linkstatic=False を指定することで有効になります。

linkstatic 属性は、cc_library() ルールで使用される場合、意味が異なります。C++ ライブラリの場合、linkstatic=True は静的リンクのみが許可されていることを示します。そのため、.so は生成されません。linkstatic=False は、静的ライブラリの作成を妨げません。この属性は、動的ライブラリの作成を制御するためのものです。

linkstatic=False の場合、ビルドツールは *.runfiles 領域に依存する共有ライブラリへのシンボリック リンクを作成します。

local_defines

文字列のリスト。デフォルトは []

コンパイル行に追加する定義のリスト。「Make」変数の置換と Bourne シェルのトークン化の対象となります。各文字列は単一の Bourne シェル トークンで構成されている必要があり、-D が先頭に付加され、このターゲットのコンパイル コマンドラインに追加されますが、依存関係には追加されません。
malloc

ラベル。デフォルトは "@bazel_tools//tools/cpp:malloc"

malloc のデフォルトの依存関係をオーバーライドします。

デフォルトでは、C++ バイナリは //tools/cpp:malloc に対してリンクされます。これは空のライブラリであるため、バイナリは libc malloc を使用することになります。このラベルは cc_library を参照する必要があります。コンパイルが C++ 以外のルールの場合、このオプションは効果がありません。linkshared=True が指定されている場合、この属性の値は無視されます。

nocopts

文字列。デフォルトは "" です。

C++ コンパイル コマンドから一致するオプションを削除します。「Make」変数の置換の対象となります。この属性の値は正規表現として解釈されます。この正規表現に一致する既存の COPTS(ルールの copts 属性で明示的に指定された値を含む)は、このルールをコンパイルする目的で COPTS から削除されます。この属性はほとんど必要ありません。
stamp

整数。デフォルトは 0 です。

ビルド情報をバイナリにエンコードするかどうか。有効な値:
  • stamp = 1: --nostamp ビルドの場合でも、常にビルド情報をバイナリにスタンプします。この設定は避けるべきです。バイナリとそれに依存するダウンストリーム アクションのリモート キャッシュを無効にする可能性があります。
  • stamp = 0: ビルド情報を常に定数値に置き換えます。これにより、ビルド結果のキャッシュ保存が適切に行われます。
  • stamp = -1: ビルド情報のエンベディングは --[no]stamp フラグで制御されます。

依存関係が変更されない限り、スタンプ付きバイナリは再構築されません。

win_def_file

ラベル。デフォルトは None

リンカーに渡される Windows DEF ファイル。

この属性は、Windows がターゲット プラットフォームの場合にのみ使用する必要があります。共有ライブラリのリンク時に シンボルをエクスポートするために使用できます。

cc_toolchain

ルールソースを表示
cc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler_files, compiler_files_without_includes, coverage_files, deprecation, distribs, dwp_files, dynamic_runtime_lib, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, visibility)

C++ ツールチェーンを表します。

このルールは次の処理を行います。

  • C++ アクションの実行に必要なすべてのアーティファクトを収集します。これは、all_filescompiler_fileslinker_files などの属性、または _files で終わるその他の属性によって行われます。これらは、必要なすべてのファイルを globbing する filegroup であることがほとんどです。
  • C++ アクションの正しいコマンドラインを生成します。これは、CcToolchainConfigInfo プロバイダ(詳細は後述)を使用して行われます。

toolchain_config 属性を使用して C++ ツールチェーンを構成します。C++ ツールチェーンの構成とツールチェーンの選択に関する詳細なドキュメントについては、こちらの ページ もご覧ください。

bazel build //... を呼び出すときにツールチェーンが不必要にビルドおよび構成されないようにするには、tags = ["manual"] を使用します。

引数

属性
name

名前(必須)

このターゲットの一意の名前。

all_files

ラベル(必須)

すべての cc_toolchain アーティファクトのコレクション。これらのアーティファクトは、すべての rules_cc 関連アクションの入力として追加されます(以下の属性からより正確なアーティファクト セットを使用しているアクションを除く)。Bazel は、all_files が他のすべてのアーティファクト提供属性のスーパーセットであると想定しています(たとえば、リンクスタンプ コンパイルにはコンパイル ファイルとリンク ファイルの両方が必要であるため、all_files が使用されます)。

これは cc_toolchain.files に含まれるもので、C++ ツールチェーンを使用するすべての Starlark ルールで使用されます。

ar_files

ラベル。デフォルトは None

アーカイブ アクションに必要なすべての cc_toolchain アーティファクトのコレクション。

as_files

ラベル。デフォルトは None

アセンブリ アクションに必要なすべての cc_toolchain アーティファクトのコレクション。

compiler_files

ラベル(必須)

コンパイル アクションに必要なすべての cc_toolchain アーティファクトのコレクション。
compiler_files_without_includes

ラベル。デフォルトは None

入力検出がサポートされている場合(現在は Google のみ)、コンパイル アクションに必要なすべての cc_toolchain アーティファクトのコレクション。
coverage_files

ラベル。デフォルトは None

カバレッジ アクションに必要なすべての cc_toolchain アーティファクトのコレクション。指定しない場合は、all_files が使用されます。
dwp_files

ラベル(必須)

dwp アクションに必要なすべての cc_toolchain アーティファクトのコレクション。
dynamic_runtime_lib

ラベル。デフォルトは None

C++ ランタイム ライブラリのダイナミック ライブラリ アーティファクト(libstdc++.so など)。

これは、'static_link_cpp_runtimes' 機能が有効で、依存関係を動的にリンクしている場合に使用されます。

exec_transition_for_inputs

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

遷移なし(デフォルトのターゲット プラットフォーム)ではなく、実行プラットフォームの cc_toolchain にすべてのファイル入力をビルドする場合は True に設定します。
libc_top

ラベル。デフォルトは None

コンパイル/リンク アクションへの入力として渡される libc のアーティファクトのコレクション。
linker_files

ラベル(必須)

リンク アクションに必要なすべての cc_toolchain アーティファクトのコレクション。
module_map

ラベル。デフォルトは None

モジュラー ビルドに使用されるモジュール マップ アーティファクト。
objcopy_files

ラベル(必須)

objcopy アクションに必要なすべての cc_toolchain アーティファクトのコレクション。
static_runtime_lib

ラベル。デフォルトは None

C++ ランタイム ライブラリの静的ライブラリ アーティファクト(libstdc++.a など)。

これは、'static_link_cpp_runtimes' 機能が有効になっていて、依存関係を静的にリンクしている場合に使用されます。

strip_files

ラベル(必須)

ストリップ アクションに必要なすべての cc_toolchain アーティファクトのコレクション。
supports_header_parsing

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

cc_toolchain がヘッダー解析アクションをサポートしている場合は True に設定します。
supports_param_files

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

cc_toolchain がリンク アクションにパラメータ ファイルを使用することをサポートしている場合は True に設定します。
toolchain_config

ラベル(必須)

cc_toolchain_config_info を提供するルールのラベル。
toolchain_identifier

文字列。構成不可。デフォルトは ""

この cc_toolchain を対応する crosstool_config.toolchain と照合するために使用される識別子。

問題 #5380 が修正されるまでは、cc_toolchainCROSSTOOL.toolchain に関連付けるにはこの方法をおすすめします。toolchain_config 属性(#5380)に置き換えられます。

cc_toolchain_suite

ルールソースを表示
cc_toolchain_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

C++ ツールチェーンのコレクションを表します。

このルールは次の処理を行います。

  • 関連するすべての C++ ツールチェーンを収集します。
  • Bazel に渡された --cpu オプションと --compiler オプションに応じて、1 つのツールチェーンを選択します。

C++ ツールチェーンの構成とツールチェーンの選択に関する詳細なドキュメントについては、こちらの ページ もご覧ください。

引数

属性
name

名前(必須)

このターゲットの一意の名前。

toolchains

文字列をラベルにマッピングするディクショナリ。構成不可。必須

「<cpu>」または「<cpu>|<compiler>」文字列から cc_toolchain ラベルへのマップ。--cpu のみが Bazel に渡される場合は「<cpu>」が使用され、--cpu--compiler の両方が Bazel に渡される場合は「<cpu>|<compiler>」が使用されます。例:

          cc_toolchain_suite(
            name = "toolchain",
            toolchains = {
              "piii|gcc": ":my_cc_toolchain_for_piii_using_gcc",
              "piii": ":my_cc_toolchain_for_piii_using_default_compiler",
            },
          )