Rules
- cc_binary
- cc_import
- cc_library
- cc_proto_library
- fdo_prefetch_hints
- fdo_profile
- propeller_optimize
- cc_test
- cc_toolchain
- cc_toolchain_suite
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, linkopts, linkshared, linkstatic, local_defines, malloc, nocopts, output_licenses, restricted_to, stamp, tags, target_compatible_with, testonly, toolchains, visibility, win_def_file)
Implicit output targets
name.stripped
(only built if explicitly requested): A stripped version of the binary.strip -g
is run on the binary to remove debug symbols. Additional strip options can be provided on the command line using--stripopt=-foo
. This output is only built if explicitly requested.name.dwp
(only built if explicitly requested): If Fission is enabled: a debug information package file suitable for debugging remotely deployed binaries. Else: an empty file.
Arguments
Attributes | |
---|---|
name |
A unique name for this target. |
deps |
These can be |
srcs |
All A All If a rule's name is in the Permitted
...and any rules that produce those files. Different extensions denote different programming languages in accordance with gcc convention. |
additional_linker_inputs |
For example, compiled Windows .res files can be provided here to be embedded in the binary target. |
copts |
Each string in this attribute is added in the given order to If the package declares the feature |
defines |
-D and added to the compile command line to this target, as well as to every rule that depends on it. Be very careful, since this may have far-reaching effects. When in doubt, add define values to local_defines instead. |
includes |
Subject to "Make variable" substitution. Each string is prepended with Headers must be added to srcs or hdrs, otherwise they will not be available to dependent rules when compilation is sandboxed (the default). |
linkopts |
LINKOPTS before linking the binary target. Each element of this list that does not start with |
linkshared |
linkshared=True in your rule. By default this option is off. The presence of this flag means that linking occurs with the If you specify both |
linkstatic |
cc_binary and cc_test : link the binary in static mode. For cc_library.linkstatic : see below. By default this option is on for If enabled and this is a binary or test, this option tells the build tool to link in There are really three different ways to link an executable:
The If |
local_defines |
-D and added to the compile command line for this target, but not to its dependents. |
malloc |
By default, C++ binaries are linked against |
nocopts |
COPTS that match this regular expression (including values explicitly specified in the rule's copts attribute) will be removed from COPTS for purposes of compiling this rule. This attribute should rarely be needed. |
stamp |
Stamped binaries are not rebuilt unless their dependencies change. |
win_def_file |
This attribute should only be used when Windows is the target platform. It can be used to export symbols during linking a shared library. |
cc_import
cc_import(name, 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
rules allows users to import precompiled C/C++ libraries.
The following are the typical use cases:
1. Linking a static library
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. Linking a shared library (Unix)
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
shared_library = "libmylib.so",
)
3. Linking a shared library with interface library (Windows)
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
# mylib.lib is a 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. Linking a shared library with 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. Linking to static or shared library On 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,
)
On 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,
)
Arguments
Attributes | |
---|---|
name |
A unique name for this target. |
hdrs |
|
alwayslink |
If alwayslink doesn't work with VS 2017 on Windows, that is due to a known issue, please upgrade your VS 2017 to the latest version. |
interface_library |
Permitted file types: |
shared_library |
Permitted file types: |
static_library |
Permitted file types: |
system_provided |
interface_library should be specified and shared_library should be empty. |
cc_library
cc_library(name, deps, srcs, data, hdrs, 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)
Header inclusion checking
All header files that are used in the build must be declared in the hdrs
or srcs
of cc_*
rules. This is enforced.
For cc_library
rules, headers in hdrs
comprise the public interface of the library and can be directly included both from the files in hdrs
and srcs
of the library itself as well as from files in hdrs
and srcs
of cc_*
rules that list the library in their deps
. Headers in srcs
must only be directly included from the files in hdrs
and srcs
of the library itself. When deciding whether to put a header into hdrs
or srcs
, you should ask whether you want consumers of this library to be able to directly include it. This is roughly the same decision as between public
and private
visibility in programming languages.
cc_binary
and cc_test
rules do not have an exported interface, so they also do not have a hdrs
attribute. All headers that belong to the binary or test directly should be listed in the srcs
.
To illustrate these rules, look at the following example.
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"],
)
The allowed direct inclusions in this example are listed in the table below. For example foo.cc
is allowed to directly include foo.h
and bar.h
, but not baz.h
.
Including file | Allowed inclusions |
---|---|
foo.h | bar.h |
foo.cc | foo.h bar.h |
bar.h | bar-impl.h baz.h |
bar-impl.h | bar.h baz.h |
bar.cc | bar.h bar-impl.h baz.h |
baz.h | baz-impl.h |
baz-impl.h | baz.h |
baz.cc | baz.h baz-impl.h |
The inclusion checking rules only apply to direct inclusions. In the example above foo.cc
is allowed to include bar.h
, which may include baz.h
, which in turn is allowed to include baz-impl.h
. Technically, the compilation of a .cc
file may transitively include any header file in the hdrs
or srcs
in any cc_library
in the transitive deps
closure. In this case the compiler may read baz.h
and baz-impl.h
when compiling foo.cc
, but foo.cc
must not contain #include "baz.h"
. For that to be allowed, baz
must be added to the deps
of foo
.
Unfortunately Bazel currently cannot distinguish between direct and transitive inclusions, so it cannot detect error cases where a file illegally includes a header directly that is only allowed to be included transitively. For example, Bazel would not complain if in the example above foo.cc
directly includes baz.h
. This would be illegal, because foo
does not directly depend on baz
. Currently, no error is produced in that case, but such error checking may be added in the future.
Arguments
Attributes | |
---|---|
name |
A unique name for this target. |
deps |
These can be |
srcs |
All A All If a rule's name is in the Permitted
...and any rules that produce those files. Different extensions denote different programming languages in accordance with gcc convention. |
hdrs |
This is the strongly preferred location for declaring header files that describe the interface for the library. These headers will be made available for inclusion by sources in this rule or in dependent rules. Headers not meant to be included by a client of this library should be listed in the |
alwayslink |
srcs , even if some contain no symbols referenced by the binary. This is useful if your code isn't explicitly called by code in the binary, e.g., if your code registers to receive some callback provided by some service. If alwayslink doesn't work with VS 2017 on Windows, that is due to a known issue, please upgrade your VS 2017 to the latest version. |
copts |
Each string in this attribute is added in the given order to If the package declares the feature |
defines |
-D and added to the compile command line to this target, as well as to every rule that depends on it. Be very careful, since this may have far-reaching effects. When in doubt, add define values to local_defines instead. |
implementation_deps |
deps , the headers and include paths of these libraries (and all their transitive deps) are only used for compilation of this library, and not libraries that depend on it. Libraries specified with implementation_deps are still linked in binary targets that depend on this library. For now usage is limited to cc_libraries and guarded by the flag |
include_prefix |
When set, the headers in the The prefix in the |
includes |
Subject to "Make variable" substitution. Each string is prepended with Headers must be added to srcs or hdrs, otherwise they will not be available to dependent rules when compilation is sandboxed (the default). |
linkopts |
LINKOPTS before linking the binary target. Each element of this list that does not start with |
linkstamp |
base package. |
linkstatic |
cc_binary and cc_test : link the binary in static mode. For cc_library.linkstatic : see below. By default this option is on for If enabled and this is a binary or test, this option tells the build tool to link in There are really three different ways to link an executable:
The If |
local_defines |
-D and added to the compile command line for this target, but not to its dependents. |
nocopts |
COPTS that match this regular expression (including values explicitly specified in the rule's copts attribute) will be removed from COPTS for purposes of compiling this rule. This attribute should rarely be needed. |
strip_include_prefix |
When set, the headers in the If it's a relative path, it's taken as a package-relative one. If it's an absolute one, it's understood as a repository-relative path. The prefix in the |
textual_hdrs |
This is the location for declaring header files that cannot be compiled on their own; that is, they always need to be textually included by other source files to build valid code. |
win_def_file |
This attribute should only be used when Windows is the target platform. It can be used to export symbols during linking a shared library. |
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
generates C++ code from .proto
files.
deps
must point to proto_library
rules.
Example:
cc_library(
name = "lib",
deps = [":foo_cc_proto"],
)
cc_proto_library(
name = "foo_cc_proto",
deps = [":foo_proto"],
)
proto_library(
name = "foo_proto",
)
Arguments
Attributes | |
---|---|
name |
A unique name for this target. |
deps |
proto_library rules to generate C++ code for. |
fdo_prefetch_hints
fdo_prefetch_hints(name, compatible_with, deprecation, distribs, features, licenses, profile, restricted_to, tags, target_compatible_with, testonly, visibility)
Represents an FDO prefetch hints profile that is either in the workspace or at a specified absolute path. Examples:
fdo_prefetch_hints(
name = "hints",
profile = "//path/to/hints:profile.afdo",
)
fdo_profile(
name = "hints_abs",
absolute_path_profile = "/absolute/path/profile.afdo",
)
Arguments
Attributes | |
---|---|
name |
A unique name for this target. |
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)
Represents an FDO profile that is either in the workspace or at a specified absolute path. Examples:
fdo_profile(
name = "fdo",
profile = "//path/to/fdo:profile.zip",
)
fdo_profile(
name = "fdo_abs",
absolute_path_profile = "/absolute/path/profile.zip",
)
Arguments
Attributes | |
---|---|
name |
A unique name for this target. |
absolute_path_profile |
|
profile |
|
proto_profile |
|
propeller_optimize
propeller_optimize(name, compatible_with, deprecation, distribs, features, ld_profile, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)
Represents a Propeller optimization profile in the workspace. Example:
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"
)
Arguments
Attributes | |
---|---|
name |
A unique name for this target. |
ld_profile |
|
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, linkopts, linkstatic, local, local_defines, malloc, nocopts, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)
Arguments
Attributes | |
---|---|
name |
A unique name for this target. |
deps |
These can be |
srcs |
All A All If a rule's name is in the Permitted
...and any rules that produce those files. Different extensions denote different programming languages in accordance with gcc convention. |
additional_linker_inputs |
For example, compiled Windows .res files can be provided here to be embedded in the binary target. |
copts |
Each string in this attribute is added in the given order to If the package declares the feature |
defines |
-D and added to the compile command line to this target, as well as to every rule that depends on it. Be very careful, since this may have far-reaching effects. When in doubt, add define values to local_defines instead. |
includes |
Subject to "Make variable" substitution. Each string is prepended with Headers must be added to srcs or hdrs, otherwise they will not be available to dependent rules when compilation is sandboxed (the default). |
linkopts |
LINKOPTS before linking the binary target. Each element of this list that does not start with |
linkstatic |
cc_binary and cc_test : link the binary in static mode. For cc_library.linkstatic : see below. By default this option is on for If enabled and this is a binary or test, this option tells the build tool to link in There are really three different ways to link an executable:
The If |
local_defines |
-D and added to the compile command line for this target, but not to its dependents. |
malloc |
By default, C++ binaries are linked against |
nocopts |
COPTS that match this regular expression (including values explicitly specified in the rule's copts attribute) will be removed from COPTS for purposes of compiling this rule. This attribute should rarely be needed. |
stamp |
Stamped binaries are not rebuilt unless their dependencies change. |
win_def_file |
This attribute should only be used when Windows is the target platform. It can be used to export symbols during linking a shared library. |
cc_toolchain
cc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler, compiler_files, compiler_files_without_includes, coverage_files, cpu, 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)
Represents a C++ toolchain.
This rule is responsible for:
- Collecting all artifacts needed for C++ actions to run. This is done by attributes such as
all_files
,compiler_files
,linker_files
, or other attributes ending with_files
). These are most commonly filegroups globbing all required files. - Generating correct command lines for C++ actions. This is done using
CcToolchainConfigInfo
provider (details below).
Use toolchain_config
attribute to configure the C++ toolchain. See also this page for elaborate C++ toolchain configuration and toolchain selection documentation.
Use tags = ["manual"]
in order to prevent toolchains from being built and configured unnecessarily when invoking bazel build //...
Arguments
Attributes | |
---|---|
name |
A unique name for this target. |
all_files |
all_files is a superset of all other artifact-providing attributes (e.g. linkstamp compilation needs both compile and link files, so it takes all_files ). This is what |
ar_files |
Collection of all cc_toolchain artifacts required for archiving actions. |
as_files |
Collection of all cc_toolchain artifacts required for assembly actions. |
compiler |
toolchain_identifier attribute instead. It will be a noop after CROSSTOOL migration to Starlark , and will be removed by #7075. When set, it will be used to perform crosstool_config.toolchain selection. It will take precedence over --cpu Bazel option. |
compiler_files |
|
compiler_files_without_includes |
|
coverage_files |
|
cpu |
When set, it will be used to perform crosstool_config.toolchain selection. It will take precedence over --cpu Bazel option. |
dwp_files |
|
dynamic_runtime_lib |
This will be used when 'static_link_cpp_runtimes' feature is enabled, and we're linking dependencies dynamically. |
exec_transition_for_inputs |
|
libc_top |
|
linker_files |
|
module_map |
|
objcopy_files |
|
static_runtime_lib |
This will be used when 'static_link_cpp_runtimes' feature is enabled, and we're linking dependencies statically. |
strip_files |
|
supports_header_parsing |
|
supports_param_files |
|
toolchain_config |
cc_toolchain_config_info . |
toolchain_identifier |
Until issue #5380 is fixed this is the recommended way of associating |
cc_toolchain_suite
cc_toolchain_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
Represents a collections of C++ toolchains.
This rule is responsible for:
- Collecting all relevant C++ toolchains.
- Selecting one toolchain depending on
--cpu
and--compiler
options passed to Bazel.
See also this page for elaborate C++ toolchain configuration and toolchain selection documentation.
Arguments
Attributes | |
---|---|
name |
A unique name for this target. |
toolchains |
cc_toolchain label. "<cpu>" will be used when only --cpu is passed to Bazel, and "<cpu>|<compiler>" will be used when both --cpu and --compiler are passed to Bazel. Example:
|