bazel的使用方法

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),
    ],
)

你可能感兴趣的:(c++,java,python,list,django)