bazel的编译中使用了Starlark语言,这种语言类似于python语言,详细内容可以参考 :https://docs.bazel.build/versions/4.2.1/skylark/language.html
本篇文章属于小白文章,只是为了把这个语言的具体内容罗列出来,方便后续参考。
一、Starlark语言简介:
语法格式如下所示:
load(":foo.bzl", "var", "fct") # loads `var`, and `fct` from `./foo.bzl`
这里的load 的作用是引用指定bzl文件./foo.bzl里面的var和fct。
二、envoy里面的例子
Envoy里面的WORKSPACE里面就使用了Starlark语言,如下所示:
$ pwd
/Users/XXXX/envoy
$ cat WORKSPACE
workspace(name = "envoy")
// 备注:下面的load 是从/envoy/bazel/api_binding.bzl去执行envoy_api_binding()函数
load("//bazel:api_binding.bzl", "envoy_api_binding")
envoy_api_binding()
load("//bazel:api_repositories.bzl", "envoy_api_dependencies")
envoy_api_dependencies()
load("//bazel:repositories.bzl", "envoy_dependencies")
envoy_dependencies()
load("//bazel:repositories_extra.bzl", "envoy_dependencies_extra")
envoy_dependencies_extra()
load("//bazel:dependency_imports.bzl", "envoy_dependency_imports")
envoy_dependency_imports()
如下所示:
引用的代码如下所示:
def envoy_api_binding():
# Treat the data plane API as an external repo, this simplifies exporting
# the API to https://github.com/envoyproxy/data-plane-api. This is the
# shadow API for Envoy internal use, see #9479.
if "envoy_api" not in native.existing_rules().keys():
_default_envoy_api(name = "envoy_api", reldir = "generated_api_shadow")
# We also provide the non-shadowed API for developer use (see #9479).
if "envoy_api_raw" not in native.existing_rules().keys():
_default_envoy_api(name = "envoy_api_canonical", reldir = "api")
# TODO(https://github.com/envoyproxy/envoy/issues/7719) need to remove both bindings and use canonical rules
native.bind(
name = "api_httpbody_protos",
actual = "@com_google_googleapis//google/api:httpbody_cc_proto",
)
native.bind(
name = "http_api_protos",
actual = "@com_google_googleapis//google/api:annotations_cc_proto",
)
从上面的代码就可以看出来,这个api_binding.bzl文件里面的envoy_api_binding()函数跟python长得很像,代码比较简单,就不做解析。