2017年11月28日星期二

bazel 初入门学习

 笔者根据bazel官网的c++例程进行学习

1. 安装bazel
安装链接:https://docs.bazel.build/versions/master/install.html

2. 下载仓库:
 git clone https://github.com/bazelbuild/examples/
 例子代码在examples/cpp-tutorial目录下,目录结构为:

examples
└── cpp-tutorial
    ├──stage1
    │  └── main
    │      ├── BUILD
    │      ├── hello-world.cc
    │  └── WORKSPACE
    ├──stage2
    │  ├── main
    │  │   ├── BUILD
    │  │   ├── hello-world.cc
    │  │   ├── hello-greet.cc
    │  │   ├── hello-greet.h
    │  └── WORKSPACE
    └──stage3
       ├── main
       │   ├── BUILD
       │   ├── hello-world.cc
       │   ├── hello-greet.cc
       │   └── hello-greet.h
       ├── lib
       │   ├── BUILD
       │   ├── hello-time.cc
       │   └── hello-time.h
       └── WORKSPACE
如您所见,有三组文件,每组代表本教程中的一个阶段。 在第一阶段,你将建立一个单一的目标驻留在一个包中。 在第二阶段,你将把你的项目分成多个目标,但是把它保存在一个包里。 在第三个也是最后一个阶段,你将把你的项目分成多个包,并用多个目标构建它。

3. Build
3.1 set up the workspace
在构建项目之前,您需要设置其工作区(workspace)。 工作区是保存项目源文件和Bazel构建输出的目录。 它还包含了Bazel认为特殊的文件:
  (1)WORKSPACE文件,它将目录及其内容标识为Bazel工作区,并位于项目目录结构的根目录下
   (2) 一个或多个BUILD文件,告诉Bazel如何构建项目的不同部分。 (包含BUILD文件的工作空间中的一个目录就是一个包,在本教程的后面,您将学习有关包的信息。)
要将目录指定为Bazel工作区,请在工程目录中创建一个名为WORKSPACE的空文件。当Bazel构建项目时,所有输入和依赖项必须位于同一个WORKSPACE中。

3.2 ubderstand the BUILD file
 BUILD文件包含几种不同类型的Bazel指令。 最重要的类型是构建规则,它告诉Bazel如何构建所需的输出,如可执行的二进制文件或库。 BUILD文件中每个构建规则的实例称为目标,并指向一组特定的源文件和依赖关系。 目标也可以指向其他目标。
 看下根据上述git命令clone下来的 examples/cpp-tutorial/stage1/main 目录

cc_binary(
    name = "hello-world",
    srcs = ["hello-world.cc"],
)
 在我们的例子中,hello-world目标实例化了Bazel的内置cc_binary规则。 该规则告诉Bazel从hello-world.cc源文件中构建一个自包含的可执行二进制文件hello-world,并且不包含任何依赖.

3.3 Build the project
让我们来构建示例项目,转到cpp-tutorial/stage1目录下并且运行下面的命令:
bazel build //main:hello-world
注意目标标签 - // 表示WORKSPACE所在的根目录,hello-world是我们在BUILD文件中命名的目标。

INFO: Found 1 target...
Target //main:hello-world up-to-date:
  bazel-bin/main/hello-world
INFO: Elapsed time: 2.267s, Critical Path: 0.25s
 恭喜你,你刚刚建立了你的第一个Bazel目标! Bazel将构建输出放置在工作空间根部的bazel-bin目录中。 通过浏览其内容来了解Bazel的输出结构。
 现在可以测试你刚刚编译的代码了
   bazel-bin/main/hello-world

3.4 Review the dependency graph
一个成功的构建具有在BUILD文件中明确声明的所有依赖关系。 Bazel使用这些BUILD文件来创建项目的依赖关系图,从而实现准确的增量构建.
 让我们来看看我们的示例项目的依赖关系。 首先,生成依赖关系图的文本表示(在工作空间根目录下运行该命令):
bazel query --nohost_deps --noimplicit_deps 'deps(//main:hello-world)' \
  --output graph
将运行结果输入 webgraphviz
结果如下:























现在你已经建立了你的工作空间,建立了你的项目,并且检查了它的依赖关系,让我们增加做一些更复杂的事情。

Refine your bazel build
虽然单个目标对于小型项目已经足够了,但是对于较大的项目,您可能需要拆分为多个目标和包,以允许快速增量构建(即只重建已更改的内容),并通过构建项目的多个部分来加速构建
在cpp-tutorial/stage2/main文件中
 BUILD文件内容为:

cc_library(
    name = "hello-greet",
    srcs = ["hello-greet.cc"],
    hdrs = ["hello-greet.h"],
)

cc_binary(
    name = "hello-world",
    srcs = ["hello-world.cc"],
    deps = [
        ":hello-greet",
    ],
)
deps表示依赖于,hdrs表示头文件?
运行bazel build //main:hello-world,结果如下:
INFO: Found 1 target...
Target //main:hello-world up-to-date:
  bazel-bin/main/hello-world
INFO: Elapsed time: 2.399s, Critical Path: 0.30s
现在可以运行bazel-bin/main/hello-world进行测试
依赖图如下:

 











Use multiple packages
如下目录cpp-tutorial/stage3
└──stage3
   ├── main
   │   ├── BUILD
   │   ├── hello-world.cc
   │   ├── hello-greet.cc
   │   └── hello-greet.h
   ├── lib
   │   ├── BUILD
   │   ├── hello-time.cc
   │   └── hello-time.h
   └── WORKSPACE

BUILD文件如下:
lib/BUILD:
cc_library(
    name = "hello-time",
    srcs = ["hello-time.cc"],
    hdrs = ["hello-time.h"],
    visibility = ["//main:__pkg__"],
)
main/BUILD :
cc_library(
    name = "hello-greet",
    srcs = ["hello-greet.cc"],
    hdrs = ["hello-greet.h"],
)

cc_binary(
    name = "hello-world",
    srcs = ["hello-world.cc"],
    deps = [
        ":hello-greet",
        "//lib:hello-time",
    ],
) 
 
依赖图如下:
 
 
 
 
 
 
 
 
 
 
 
 
看完这个,你可以开始系统的学习

没有评论:

发表评论

leetcode 17

17.   Letter Combinations of a Phone Number Medium Given a string containing digits from   2-9   inclusive, return all possible l...