Bazel公共的函数规则

common-definitions
不管是写WORKSPACE,BUILD或者其他文件,都要遵循一些Bazel的规则,有些规则是bazel内置的函数使用说明,有的规则是一些语法分析用到的。

所有build rule的公共属性

只列举了部分
  • features
rule中规定的package级别可使用的features列表,默认是空。目前还没搞懂具体是指什么。
  • data
List of labels; optional:表示这个rule在运行时所需的文件列表。
  • visibility
List of labels; optional; default default_visibility from package if specified, else private
定义了这个rule是否可以被别的package中的rule所使用。
有5种形式的label可以使用:
1、["//visibility:public"]: Anyone can use this rule
2、["//visibility:private"]: Only rules in this package can use this rule. 
3、["//some/package:__pkg__", "//other/package:__pkg__"]: Only rules in some/package and other/package (defined in some/package/BUILDand other/package/BUILD) have access to this rule.
必须是规定的package下面的BUILD文件中的rule才有权限使用
4、["//project:__subpackages__", "//other:__subpackages__"]: Only rules in packages project or other or in one of their sub-packages have access to this rule.
指定的package下面的包括子目录都可以使用
5、["//some/package:my_package_group"]: A package group is a named set of package names. 

  • deps
List of labels; optional
表示这个rule所需要的依赖列表。这个依赖包括同语言内的依赖以及跨语言的依赖。

*_test的公共属性


*_binary的公共属性

  • args
List of strings; optional; subject to $(location) and "Make variable" substitution, and Bourne shell tokenization
命令行参数,bazel会在执行bazel run或者bazel test这个target时传递。需要注意的是自己手动执行bazel-bin/下的可执行程序不会传入这些参数。

可配置的属性

有些属性是需要配置的,比如根据不同的命令行参数配置不同的值。这个尤其是在多平台维护时用到。比如下面这个srcs属性:
cc_library(
    name = "multiplatform_lib",
    srcs = select({
        ":x86_mode": ["x86_impl.cc"],
        ":arm_mode": ["arm_impl.cc"]
    })
)
config_setting(
    name = "x86_mode",
    values = { "cpu": "x86" }
)
config_setting(
    name = "arm_mode",
    values = { "cpu": "arm" }
)
在属性值的设置中使用select()可以根据输入的config_setting的值来进行匹配。比如bazel build :multiplatform_lib --cpu=arm sets multiplatform_lib's srcs to ["arm_impl.cc"], while bazel build :multiplatform_lib --cpu=x86sets srcs to ["x86_impl.cc"]

隐式的输出目标

在BUILD文件中创建target时会声明一个有name属性的rule。而且很多build rule函数会隐式的产生一个或者多个目标文件,这虽然不是在BUILD文件中显式的写明,但是会根据不同的build rule隐式的产生。

"Make" Variables


公共函数

load

load(label, symbols...)
load() 是声明加载Skylark模块(.bzl文件)中的定义,比如:
load("//path/to/rules:my_rules.bzl", "my_rules")
这会让bazel执行//path/to/rules:my_rules.bzl这个Skylark模块并加载my_rules符号到当前环境中。
还可以一次性加载多个以及重命符号名:
load("//path/to/rules:my_defs.bzl", BUILD_DEF_COMPILER_FLAGS="COMPILER_FLAGS", "LINKER_FLAGS")
加载了COMPILER_FLAGS和LINKER_FLAGS到当前环境中,而且将COMPILER_FLAGS重命名为BUILD_DEF_COMPILER_FLAGS
因为label必须与package相关,所以.bzl文件必须有一个BUILD文件所在的package,而且文件后缀名必须是.bzl

package

package(default_deprecation, default_testonly, default_visibility, features)
这个函数声明了这个package中所有的后续rule的元数据。在BUILD文件中出现一次。而且package()应该在所有的load()语句之后,所有的rule之前。

glob

glob(include, exclude=[], exclude_directories=1)
Glob是一个辅助函数,用于在任何位置获得想要的文件列表。可以使用*通配符以及目录分隔符/,另外**表示递归通配符只能在目录分隔符/之间使用,比如"x/**/*.java" is valid, but "test**/testdata.xml" and "**.java" are both invalid. No other wildcards are supported.

select

select(
    {conditionA: valuesA, conditionB: valuesB, ...},
    no_match_error = "custom message"
)
这也是一个辅助函数,可以使得rule的属性被配置,选取的方式通过读Bazel的命令行flag。
里面的conditionA是在config_setting中定义出来的。比如:
config_setting(
    name = "simple",
    values = {"compilation_mode": "opt"}
)
那么在命令行中如果有 --compilation_mode=opt那么就是使用了这个simple

workspace

workspace(name = "com_example_project")
在WORKSPACE文件中使用,每个仓库的WORKSPACE文件都应该有这个函数,来设置这个仓库的全局名称。这个名称被用来存放输出目录。
For example, if there is a runfile foo/bar in the local repository and the WORKSPACE file contains workspace(name = "baz"), then the runfile will be available under mytarget.runfiles/baz/foo/bar




评论

此博客中的热门博文

Bazel WORKSPACE文件编写

Bazel的概念和技术

Bazel BUILD文件的编写