Objective-C Rules
Rules
apple_binary
apple_binary(name, deps, data, binary_type, compatible_with, deprecation, distribs, dylibs, extension_safe, features, licenses, linkopts, minimum_os_version, platform_type, restricted_to, sdk_dylibs, sdk_frameworks, tags, testonly, visibility, weak_sdk_frameworks)
This rule produces single- or multi-architecture ("fat") Objective-C libraries and/or binaries, typically used in creating apple bundles, such as frameworks, extensions, or applications.
The lipo
tool is used to combine files of multiple architectures. One of several
flags may control which architectures are included in the output, depending on the value of
the "platform_type" attribute.
Implicit output targets
name_lipobin
: the 'lipo'ed potentially multi-architecture binary. All transitive dependencies andsrcs
are linked.
Arguments
Attributes | |
---|---|
name |
A unique name for this rule. |
deps
|
|
binary_type
|
|
dylibs
|
A list of dynamic library targets to be linked against in this rule and included
in the final binary. Libraries which are transitive dependencies of any such dylibs will
not be statically linked in this target (even if they are otherwise
transitively depended on via the |
extension_safe
|
linkopts attribute.
|
linkopts
|
|
minimum_os_version
|
|
platform_type
|
ios
is selected, then the output binaries/libraries will be created combining all
architectures specified in --ios_multi_cpus .
Options are:
|
sdk_dylibs
|
|
sdk_frameworks
|
When linking a top level binary (e.g. apple_binary), all SDK frameworks listed in that binary's transitive dependency graph are linked. |
weak_sdk_frameworks
|
|
apple_static_library
apple_static_library(name, deps, data, avoid_deps, compatible_with, deprecation, distribs, features, licenses, linkopts, minimum_os_version, platform_type, restricted_to, sdk_dylibs, sdk_frameworks, tags, testonly, visibility, weak_sdk_frameworks)
This rule produces single- or multi-architecture ("fat") Objective-C statically-linked libraries, typically used in creating static Apple Frameworks for distribution and re-use in multiple extensions or applications.
The lipo
tool is used to combine files of multiple architectures; a build flag
controls which architectures are targeted. The build flag examined depends on the
platform_type
attribute for this rule (and is described in its documentation).
Implicit output targets
name_lipo.a
: a 'lipo'ed archive file. All transitive dependencies andsrcs
are linked, minus all transitive dependencies specified inavoid_deps
.
Arguments
Attributes | |
---|---|
name |
A unique name for this rule. |
deps
|
|
avoid_deps
|
A list of targets which should not be included (nor their transitive dependencies
included) in the outputs of this rule -- even if they are otherwise transitively depended
on via the This attribute effectively serves to remove portions of the dependency tree from a static library, and is useful most commonly in scenarios where static libraries depend on each other. That is, suppose static libraries X and C are typically distributed to consumers
separately. C is a very-common base library, and X contains less-common functionality; X
depends on C, such that applications seeking to import library X must also import library
C. The target describing X would set C's target in |
linkopts
|
|
minimum_os_version
|
|
platform_type
|
ios
is selected, then the output binaries/libraries will be created combining all
architectures specified in --ios_multi_cpus .
Options are:
|
sdk_dylibs
|
|
sdk_frameworks
|
When linking a top level binary (e.g. apple_binary), all SDK frameworks listed in that binary's transitive dependency graph are linked. |
weak_sdk_frameworks
|
|
apple_stub_binary
apple_stub_binary(name, deps, compatible_with, deprecation, distribs, features, licenses, minimum_os_version, platform_type, restricted_to, tags, testonly, visibility, xcenv_based_path)
This rule copies a stub executable (such as that used by a watchOS application or an iMessage sticker pack) from a location in an Xcode platform or SDK bundle to the output.
This rule is meant to be used internally by the Apple bundling rules and does has limited use outside of that. Its purpose is to provide target uniformity across all Apple bundles whether they contain a user binary or a stub binary and to ensure that the platform transition is still present for those stubs so that platform selection works as expected in downstream resource dependencies.
Implicit output targets
name
: the stub executable copied from the Xcode platform/SDK location.
Arguments
Attributes | |
---|---|
name |
A unique name for this rule. |
deps
|
|
minimum_os_version
|
|
platform_type
|
ios
is selected, then the output binaries/libraries will be created combining all
architectures specified in --ios_multi_cpus .
Options are:
|
xcenv_based_path
|
$(SDKROOT) or $(PLATFORM_DIR) (written with
parentheses, as they are "Make" variables, not shell variables).
|
j2objc_library
j2objc_library(name, deps, compatible_with, deprecation, distribs, entry_classes, features, jre_deps, licenses, restricted_to, tags, testonly, visibility)
This rule uses J2ObjC to translate Java source files to Objective-C, which then can be used used as dependencies of objc_library and objc_binary rules. Detailed information about J2ObjC itself can be found at the J2ObjC site
Custom J2ObjC transpilation flags can be specified using the build flag
--j2objc_translation_flags
in the command line.
Please note that the translated files included in a j2objc_library target will be compiled using the default compilation configuration, the same configuration as for the sources of an objc_library rule with no compilation options specified in attributes.
Plus, generated code is de-duplicated at target level, not source level. If you have two different Java targets that include the same Java source files, you may see a duplicate symbol error at link time. The correct way to resolve this issue is to move the shared Java source files into a separate common target that can be depended upon.
Arguments
Attributes | |
---|---|
name |
A unique name for this rule. |
deps
|
j2objc_library , java_library
and java_import targets that contain
Java files to be transpiled to Objective-C.
All The J2ObjC translation works differently depending on the type of source Java source
files included in the transitive closure. For each .java source files included in
Users can import the J2ObjC-generated header files in their code. The import paths for
these files are the root-relative path of the original Java artifacts. For example,
If proto_library rules are in the transitive closure of this rule, J2ObjC protos will also
be generated, compiled and linked-in at the binary level. For proto
|
entry_classes
|
--j2objc_dead_code_removal
is on. The Java classes should be specified in their canonical names as defined by
the Java
Language Specification.
When flag --j2objc_dead_code_removal is specified, the list of entry classes
will be collected transitively and used as entry points to perform dead code analysis.
Unused classes will then be removed from the final ObjC app bundle.
|
jre_deps
|
j2objc_library rule. Only core JRE functionality is linked by default.
|
objc_bundle
objc_bundle(name, bundle_imports, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, testonly, visibility)
This rule encapsulates an already-built bundle. It is defined by a list of
files in one or more .bundle
directories.
Arguments
Attributes | |
---|---|
name |
A unique name for this rule. |
bundle_imports
|
.bundle directory which are
provided to Objective-C targets that depend on this target.
|
objc_bundle_library
objc_bundle_library(name, resources, asset_catalogs, bundles, compatible_with, datamodels, deprecation, distribs, families, features, infoplist, infoplists, licenses, restricted_to, storyboards, strings, structured_resources, tags, testonly, visibility, xibs)
This rule encapsulates a library which is provided to dependers as a bundle.
A objc_bundle_library
's resources are put in a nested bundle in
the final iOS application.
Arguments
Attributes | |
---|---|
name |
A unique name for this rule. |
resources
|
|
asset_catalogs
|
|
bundles
|
|
datamodels
|
|
families
|
TARGETED_DEVICE_FAMILY build setting
in Xcode project files. It is a list of one or more of the strings
"iphone" and "ipad" .
By default this is set to |
infoplist
|
Bazel will perform variable substitution on the plist file for the following values
(if they are strings in the top-level
The key in |
infoplists
|
infoplist and
infoplists are specified, the files defined in both attributes will be used.
Bazel will perform variable substitution on the plist file for the following values
(if they are strings in the top-level
The key in |
storyboards
|
|
strings
|
|
structured_resources
|
resources these files are placed in the bundle root in
the same structure passed to this argument, so
["res/foo.png"] will end up in
Payload/foo.app/res/foo.png .
Note that in the generated Xcode project file, all files in the top directory of
the specified files will be included in the Xcode-generated app bundle. So
specifying |
xibs
|
|
objc_framework
objc_framework(name, compatible_with, deprecation, distribs, features, framework_imports, is_dynamic, licenses, restricted_to, sdk_dylibs, sdk_frameworks, tags, testonly, visibility, weak_sdk_frameworks)
This rule encapsulates an already-built framework. It is defined by a list
of files in one or more .framework
directories.
Arguments
Attributes | |
---|---|
name |
A unique name for this rule. |
framework_imports
|
.framework directory which are
provided to Objective-C targets that depend on this target.
|
is_dynamic
|
|
sdk_dylibs
|
|
sdk_frameworks
|
When linking a top level binary (e.g. apple_binary), all SDK frameworks listed in that binary's transitive dependency graph are linked. |
weak_sdk_frameworks
|
|
objc_import
objc_import(name, resources, hdrs, alwayslink, archives, asset_catalogs, bundles, compatible_with, datamodels, deprecation, distribs, features, includes, licenses, restricted_to, sdk_dylibs, sdk_frameworks, sdk_includes, storyboards, strings, structured_resources, tags, testonly, textual_hdrs, visibility, weak_sdk_frameworks, xibs)
This rule encapsulates an already-compiled static library in the form of an
.a
file. It also allows exporting headers and resources using the same
attributes supported by objc_library
.
Arguments
Attributes | |
---|---|
name |
A unique name for this rule. |
resources
|
|
hdrs
|
These headers describe the public interface for the library and 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 srcs attribute instead. These will be compiled separately from the source if modules are enabled. |
alwayslink
|
srcs and non_arc_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.
|
archives
|
.a files provided to Objective-C targets that
depend on this target.
|
asset_catalogs
|
|
bundles
|
|
datamodels
|
|
includes
|
#include/#import search paths to add to this target
and all depending targets.
This is to support third party and open-sourced libraries that do not
specify the entire workspace path in their
#import/#include statements.
The paths are interpreted relative to the package directory, and the
genfiles and bin roots (e.g. Unlike COPTS, these flags are added for this rule and every rule that depends on it. (Note: not the rules it depends upon!) Be very careful, since this may have far-reaching effects. When in doubt, add "-iquote" flags to COPTS instead. |
sdk_dylibs
|
|
sdk_frameworks
|
When linking a top level binary (e.g. apple_binary), all SDK frameworks listed in that binary's transitive dependency graph are linked. |
sdk_includes
|
#include/#import search paths to add to this target
and all depending targets, where each path is relative to
$(SDKROOT)/usr/include .
|
storyboards
|
|
strings
|
|
structured_resources
|
resources these files are placed in the bundle root in
the same structure passed to this argument, so
["res/foo.png"] will end up in
Payload/foo.app/res/foo.png .
Note that in the generated Xcode project file, all files in the top directory of
the specified files will be included in the Xcode-generated app bundle. So
specifying |
textual_hdrs
|
|
weak_sdk_frameworks
|
|
xibs
|
|
objc_library
objc_library(name, deps, srcs, data, resources, hdrs, alwayslink, asset_catalogs, bundles, compatible_with, copts, datamodels, defines, deprecation, distribs, enable_modules, features, includes, licenses, module_map, non_arc_srcs, pch, restricted_to, runtime_deps, sdk_dylibs, sdk_frameworks, sdk_includes, storyboards, strings, structured_resources, tags, testonly, textual_hdrs, toolchains, visibility, weak_sdk_frameworks, xibs)
This rule produces a static library from the given Objective-C source files.
Implicit output targets
name_fully_linked.a
: A fully linked static library that contains the full transitive closure of library dependencies.
Arguments
Attributes | |
---|---|
name |
A unique name for this rule. |
deps
|
|
srcs
|
|
resources
|
|
hdrs
|
These headers describe the public interface for the library and 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 srcs attribute instead. These will be compiled separately from the source if modules are enabled. |
alwayslink
|
srcs and non_arc_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.
|
asset_catalogs
|
|
bundles
|
|
copts
|
Note that for the generated Xcode project, directory paths specified using "-I" flags in copts are parsed out, prepended with "$(WORKSPACE_ROOT)/" if they are relative paths, and added to the header search paths for the associated Xcode target. |
datamodels
|
|
defines
|
-D flags to pass to the compiler. They should be in
the form KEY=VALUE or simply KEY and are
passed not only to the compiler for this target (as copts
are) but also to all objc_ dependers of this target.
Subject to "Make variable" substitution and
Bourne shell tokenization.
|
enable_modules
|
|
includes
|
#include/#import search paths to add to this target
and all depending targets.
This is to support third party and open-sourced libraries that do not
specify the entire workspace path in their
#import/#include statements.
The paths are interpreted relative to the package directory, and the
genfiles and bin roots (e.g. Unlike COPTS, these flags are added for this rule and every rule that depends on it. (Note: not the rules it depends upon!) Be very careful, since this may have far-reaching effects. When in doubt, add "-iquote" flags to COPTS instead. |
module_map
|
|
non_arc_srcs
|
|
pch
|
|
runtime_deps
|
|
sdk_dylibs
|
|
sdk_frameworks
|
When linking a top level binary (e.g. apple_binary), all SDK frameworks listed in that binary's transitive dependency graph are linked. |
sdk_includes
|
#include/#import search paths to add to this target
and all depending targets, where each path is relative to
$(SDKROOT)/usr/include .
|
storyboards
|
|
strings
|
|
structured_resources
|
resources these files are placed in the bundle root in
the same structure passed to this argument, so
["res/foo.png"] will end up in
Payload/foo.app/res/foo.png .
Note that in the generated Xcode project file, all files in the top directory of
the specified files will be included in the Xcode-generated app bundle. So
specifying |
textual_hdrs
|
|
toolchains
|
|
weak_sdk_frameworks
|
|
xibs
|
|
objc_proto_library
objc_proto_library(name, deps, data, compatible_with, deprecation, distribs, features, licenses, portable_proto_filters, restricted_to, tags, testonly, visibility)
This rule generates ObjC headers for the proto files given through the proto_library and objc_proto_library dependencies.
Arguments
Attributes | |
---|---|
name |
A unique name for this rule. |
deps
|
|
portable_proto_filters
|
|