Bazel公共的函数规则
common-definitions
不管是写WORKSPACE,BUILD或者其他文件,都要遵循一些Bazel的规则,有些规则是bazel内置的函数使用说明,有的规则是一些语法分析用到的。
不管是写WORKSPACE,BUILD或者其他文件,都要遵循一些Bazel的规则,有些规则是bazel内置的函数使用说明,有的规则是一些语法分析用到的。
所有build rule的公共属性
只列举了部分
- features
rule中规定的package级别可使用的features列表,默认是空。目前还没搞懂具体是指什么。
- data
- visibility
定义了这个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/BUILD
and 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下面的包括子目录都可以使用
- deps
表示这个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=x86
sets 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
因为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
评论
发表评论