https://blog.gmem.cc/bazel-study-note
package(default_visibility = ["//visibility:public"])
cc_library(
name = "func",
srcs = ["func_base.cc"],
hdrs = ["func_base.h"],
deps = [
"//utils:flags-util",
"@com_github_gflags_gflags//:gflags",
],
)
name:名字可以自己起 自己起 下一个依赖的srcs写此名字
deps :depends的意思 相当于include 即文件中包含的其他文件 xxx.h文件又称依赖文件
deps = [
":hello-time", //在同一个目录下的格式
"//lib:hello-greet", //在其他目录下的格式
"@com_github_jbeder_yaml_cpp//:yaml-cpp",//网络上
"@dtu_sdk//lib/idc:idc_config",//其他目录下
],
srcs: 源文件 可放多个 [“flags.cc”, “options.cc”]或glob([“idc_op/*.cc”])
hdrs:头文件 可放多个 [“flags.h”, “options.h”]
编译:进入WORKSPACE的上级目录
执行命令
bazel build //main:name
//main:是BUILD文件相对于WORKSPACE文件的位置
执行:
Bazel将编译的输出放在项目根目录下的bazel-bin目录下
执行命令
bazel-bin/main/name
注意
编译如果出现报错
this rule is missing dependency declarations for the following fles.
缺少相关依赖
①原因是bulid中没有写上main中include的相关依赖 注意此时不一定是在跟main同级的目录下的bulid中 可能是其他级的build中 注意不同级的build的命名和依赖关系
②cc_library中src hdrs deps中赋值的文件路径写的不对 要遵循原则为:BUILD跟文件在同一级写成srcs = glob([".cc"]) ;BUILD在文件的上一级写成 srcs = glob(["qa/:.cc"])
;BUILD在要dep文件的下一级 要在要dep的文件前加上路径
deps = [
“//utils:flags-util”,
“//lib:func”,
],
stage1
├── main
│ ├── BUILD
│ └── hello-world.cc
└── WORKSPACE
仓库 (Repositories)
WORKSPACE所在目录下的所有文件整体就是一个仓库
若WORKSPACE中无定义仓库名为@
若WORKSPACE中有定义workspace(name = “ttt”)则仓库名为@ttt
包(Packages)
BUILD所在目录下的所有文件就是一个包
目标 (Targets)
源文件 或从源文件生成的生成文件
标签(Labels)
用于写BUILD的 写在deps里或include里 用于准确索引到一个目标
仓库名(@ttt//)+包名(x/y/z)+目标名(ppp)=标签
如:@ttt//x/y/z:ppp
需要用的标签在当前仓库 仓库名可以简写为// ----则为//x/y/z:ppp
需要用的标签在当前包中 仓库名和包名可以省略----则为ppp或:ppp
需要用的标签的目标名和其上一级目录名称一样,目标名可不写 —则为@ttt//x/y/z
visibility = ["//main:pkg"],
通过 visibility 参数声明了谁可以使用这个库,
默认情况下 (即未添加 visibility 参数时) 仅在同一个 BUILD 文件中可以使用;
这里 //main:pkg 表明 main 包可以使用这个库。
源文件中include的写法:包名/文件名 同一包中的头文件则可以省略包名
通常会将外部依赖放到 third_party 目录下
依赖本地其他仓库
假设 Eigen3 源代码解压到了 /home/username/eigen3
①
stage1
├── main
│ ├── BUILD
│ └── main.cc
├── eigen3
│ └── BUILD
└── WORKSPACE
②
在 eigen3/BUILD 文件中建立以下构建规则:
EIGEN3_HEADERS = glob([
"Eigen/*",
])
EIGEN3_SOURCES = glob([
"Eigen/**/src/**/*.h",
])
cc_library(
name = "eigen3",
hdrs = EIGEN3_HEADERS,
srcs = EIGEN3_SOURCES,
visibility = ["//visibility:public"],
)
③
在 WORKSPACE 文件建立规则中引入外部仓库:
new_local_repository(
name = "eigen3",
path = "/home/username/eigen3",
build_file = "eigen3/BUILD",
)
④
在 main/BUILD 文件中建立以下构建规则:
cc_binary(
name = "main",
srcs = ["main.cc"],
deps = ["@eigen3//:eigen3"],
)
注意标签 @eigen3//:eigen3 中 // 后直接加 : 是 build_file 参数指定文件中的规则。
依赖远程其他仓库
①
stage1
├── main
│ ├── BUILD
│ └── main.cc
├── eigen3
│ └── BUILD
└── WORKSPACE
②
在 eigen3/BUILD 文件中建立以下构建规则:
EIGEN3_HEADERS = glob([
"Eigen/*",
])
EIGEN3_SOURCES = glob([
"Eigen/**/src/**/*.h",
])
cc_library(
name = "eigen3",
hdrs = EIGEN3_HEADERS,
srcs = EIGEN3_SOURCES,
visibility = ["//visibility:public"],
)
③
在 WORKSPACE 文件建立规则中引入外部仓库:
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
EIGEN_COMMIT = "12e8d57108c50d8a63605c6eb0144c838c128337"
EIGEN_SHA256 = "f689246e342c3955af48d26ce74ac34d21b579a00675c341721a735937919b02"
http_archive(
name = "eigen3",
build_file = "//eigen3:BUILD",
sha256 = EIGEN_SHA256,
strip_prefix = "eigen-{commit}".format(commit = EIGEN_COMMIT),
urls = [
"https://storage.googleapis.com/mirror.tensorflow.org/gitlab.com/libeigen/eigen/-/archive/{commit}/eigen-{commit}.tar.gz".format(commit = EIGEN_COMMIT),
"https://gitlab.com/libeigen/eigen/-/archive/{commit}/eigen-{commit}.tar.gz".format(commit = EIGEN_COMMIT),
],
)