本国的/原生的/土著

一个内置模块,用于支持原生规则和其他软件包帮助程序函数。所有原生规则都以函数的形式出现在此模块中,例如 native.cc_library。请注意,原生模块仅在加载阶段可用(即用于宏,不用于规则实现)。属性将忽略 None 值,并将其视为属性未设置。
以下函数也可用:

成员

existing_rule

unknown native.existing_rule(name)

返回一个不可变的类字典对象,用于描述在此线程的软件包中实例化的规则的属性;如果不存在该名称的规则实例,则返回 None

在此,“不可变的类字典对象”是指支持类字典迭代、len(x)name in xx[name]x.get(name)x.items()x.keys()x.values() 的深度不可变对象 x

结果包含每个属性的条目,但私有属性(名称不以字母开头)和一些无法表示的旧版属性类型除外。此外,字典还包含规则实例的 namekind(例如 'cc_binary')的条目。

结果的值按如下方式表示属性值:

  • 类型为 str、int 和 bool 的属性按原样表示。
  • 对于同一软件包中的目标,标签会转换为 ':foo' 形式的字符串;对于不同软件包中的目标,标签会转换为 '//pkg:name' 形式的字符串。
  • 列表表示为元组,字典转换为新的可变字典。其元素以相同的方式递归转换。
  • select 值会返回,其内容会按上述方式转换。
  • 在规则实例化期间未指定值且默认值是计算得出的属性将从结果中排除。(计算出的默认值在分析阶段之前无法计算。)

如果可能,请仅在规则终结器符号宏的实现函数中使用此函数。不建议在其他上下文中使用此函数,并且在未来的 Bazel 版本中会停用此函数;它会使 BUILD 文件变得脆弱且依赖于顺序。另请注意,它与将规则属性值从内部形式转换为 Starlark 的其他两种转换略有不同:一种由计算出的默认值使用,另一种由 ctx.attr.foo 使用。

参数

参数 说明
name 字符串; 必需
目标的名称。

existing_rules

unknown native.existing_rules()

返回一个不可变的类字典对象,用于描述在此线程的软件包中目前实例化的规则。类字典对象的每个条目都会将规则实例的名称映射到 existing_rule(name) 将返回的结果。

在此,“不可变的类字典对象”是指支持类字典迭代、len(x)name in xx[name]x.get(name)x.items()x.keys()x.values() 的深度不可变对象 x

如果可能,请仅在规则终结器符号宏的实现函数中使用此函数。不建议在其他上下文中使用此函数,并且在未来的 Bazel 版本中会停用此函数;它会使 BUILD 文件变得脆弱且依赖于顺序。

exports_files

None native.exports_files(srcs, visibility=None, licenses=None)

指定属于此软件包且导出到其他软件包的文件列表。

参数

参数 说明
srcs 字符串序列; 必需
要导出的文件列表。
visibility 序列;或 None; 默认值为 None
可以指定可见性声明。这些文件将对指定的目标可见。如果未指定可见性,这些文件将对每个软件包可见。
licenses 字符串序列;或 None; 默认值为 None
要指定的许可。

glob

sequence native.glob(include=[], exclude=[], exclude_directories=1, allow_empty=unbound)

Glob 会返回当前软件包中每个文件的新可变排序列表,这些文件:
  • include 中的至少一个模式匹配。
  • exclude(默认值为 [])中的任何模式都不匹配。
如果启用了 exclude_directories 实参(设置为 1),则目录类型的文件将从结果中省略(默认值为 1)。

参数

参数 说明
include 字符串序列; 默认值为 []
要包含的 glob 模式列表。
exclude 字符串序列; 默认值为 []
要排除的 glob 模式列表。
exclude_directories 整数; 默认值为 1
一个标志,用于指示是否排除目录。
allow_empty 默认值为 unbound
是否允许 glob 模式不匹配任何内容。如果 `allow_empty` 为 False,则每个单独的 include 模式都必须匹配某些内容,并且最终结果也必须为非空(在排除 `exclude` 模式的匹配项之后)。

module_name

string native.module_name()

与此软件包所在的代码库关联的 Bazel 模块的名称。如果此软件包来自在 WORKSPACE 而不是 MODULE.bazel 中定义的代码库,则此值为空。对于由模块扩展生成的代码库,这是托管该扩展的模块的名称。它与 module_ctx.modules 中看到的 module.name 字段相同。 可能会返回 None

module_version

string native.module_version()

与此软件包所在的代码库关联的 Bazel 模块的版本。如果此软件包来自在 WORKSPACE 而不是 MODULE.bazel 中定义的代码库,则此值为空。对于由模块扩展生成的代码库,这是托管该扩展的模块的版本。它与 module_ctx.modules 中看到的 module.version 字段相同。 可能会返回 None

package_default_visibility

List native.package_default_visibility()

返回正在评估的软件包的默认可见性。这是 package()default_visibility 参数的值,扩展后包含软件包本身。

package_group

None native.package_group(*, name, packages=[], includes=[])

此函数定义一组软件包,并为该组分配标签。该标签可在 visibility 属性中引用。

参数

参数 说明
name 字符串; 必需
此规则的唯一名称。
packages 字符串序列; 默认值为 []
此组中软件包的完整枚举。
includes 字符串序列; 默认值为 []
此软件包组中包含的其他软件包组。

package_name

string native.package_name()

正在评估的软件包的名称,不包含代码库名称。例如,在 BUILD 文件 some/package/BUILD 中,其值将为 some/package。如果 BUILD 文件调用在 .bzl 文件中定义的函数,package_name() 将与调用方 BUILD 文件软件包匹配。对于根软件包,该值始终为空字符串。

package_relative_label

Label native.package_relative_label(input)

在当前正在初始化的软件包(即当前宏正在执行的 BUILD 文件)的上下文中,将输入字符串转换为 Label 对象。如果输入已是 Label,则会原封不动地返回。

此函数只能在评估 BUILD 文件及其直接或间接调用的宏时调用;它不能在(例如)规则实现函数中调用。

此函数的结果与将给定字符串传递给 BUILD 文件中声明的目标的标签值属性所产生的 Label 值相同。

使用说明: 此函数与 Label() 的区别在于,Label() 使用调用它的 .bzl 文件的软件包的上下文,而不是 BUILD 文件的软件包的上下文。当您需要引用硬编码到宏中的固定目标(例如编译器)时,请使用 Label()。当您需要将 BUILD 文件提供的标签字符串规范化为 Label 对象时,请使用 package_relative_label()。(在 BUILD 文件或调用 .bzl 文件以外的软件包的上下文中,无法将字符串转换为 Label。因此,外部宏应始终优先将 Label 对象传递给内部宏,而不是标签字符串。)ctx.package_relative_label() 在规则或方面实现函数中提供相同的功能。

参数

参数 说明
input 字符串;或 Label; 必需
输入标签字符串或 Label 对象。如果传递了 Label 对象,则会原封不动地返回。

repo_name

string native.repo_name()

包含当前正在评估的软件包的代码库的规范名称,不带前导 at 符号。

repository_name

string native.repository_name()

实验性 。此 API 处于实验阶段,可能会随时更改。请勿依赖此功能。您可以通过设置 --+incompatible_enable_deprecated_label_apis
以实验性方式启用此功能。 已废弃。建议改用 repo_name,它不包含虚假的前导 at 符号,但在其他方面行为相同。

包含当前正在评估的软件包的代码库的规范名称,并以单个 at 符号 (@) 作为前缀。例如,在由 WORKSPACE 节 local_repository(name='local', path=...) 调用而存在的软件包中,它将设置为 @local。在主代码库中的软件包中,它将设置为 @

subpackages

sequence native.subpackages(*, include, exclude=[], allow_empty=False)

返回当前软件包的每个直接子软件包的新可变列表,无论文件系统目录深度如何。返回的列表已排序,并且包含相对于当前软件包的子软件包的名称。建议优先使用 bazel_skylib.subpackages 模块中的方法,而不是直接调用此函数。

参数

参数 说明
include 字符串序列; 必需
要在子软件包扫描中包含的 glob 模式列表。
exclude 字符串序列; 默认值为 []
要从子软件包扫描中排除的 glob 模式列表。
allow_empty 布尔值; 默认值为 False
如果调用返回空列表,是否失败。默认情况下,空列表表示对 subpackages() 的调用是多余的,这可能会导致 BUILD 文件中出现错误。 设置为 true 可让此函数在这种情况下成功运行。