首页 > 其他分享 >bazel学习

bazel学习

时间:2022-11-22 17:35:45浏览次数:73  
标签:Bazel cc 学习 bazel 构建 world main hello

bazel学习

a fast, scalable, multi-language and extensible build system

bazel就是一个编译打包工具,类似于make、cmake等

安装

⚠️:Centos7系统安装bazel4

参考:https://docs.bazel.build/versions/5.0.0/install.html

image-20221121155314062

学习

如何使用bazel这个工具呢?

1、建立工作空间
在构建项目之前,您需要设置其工作空间,工作空间是一个包含项目源文件和 Bazel 构建后文件输出的目录, 它还包含 Bazel 认为特殊的文件:WORKSPACE 文件,它将目录及其中的内容标记为 Bazel 工作区,并位于项目目录结构的根目录中,可以使用一个或多个 BUILD 文件,它们告诉 Bazel 如何构建项目的不同部分。(工作空间中包含 BUILD 文件的目录称为一个包(package))

2、理解Build文件
一个 BUILD 文件包含几种不同类型的 Bazel 指令。 最重要的类型是构建规则,它告诉 Bazel 如何构建所需的输出,例如可执行的二进制文件或库。 BUILD 文件中构建规则的每个实例称为目标,一个目标可以指向一组特定的源文件和依赖项, 也可以指向其他目标。

看一下cpp-tutorial/stage1/main目录下的BUILD文件:

cc_binary(
    name = "hello-world",
    srcs = ["hello-world.cc"],
)

hello-world 目标实例化了 Bazel 的内置 cc_binary 规则,该规则告诉 Bazel 从 hello-world.cc 源文件构建一个独立的,没有依赖关系的可执行二进制文件。

目标中的属性明确声明其依赖项和选项,虽然 name 属性是强制性的,但许多是可选的。 例如,在 hello-world 目标中,name 是必需的且不言自明,而 srcs 是可选的,意味着指定 Bazel 从中构建目标的源文件。

3、构建工程

为了构建您的示例项目,请跳转到 cpp-tutorial/stage1 目录并运行:

cd examples/cpp-tutorial/stage1/
bazel build //main:hello-world

在目标标签中,//main: 是 BUILD 文件在工作空间根目录的位置,hello-world 是BUILD 文件中的目标名称(name)。

Bazel 产生类似于以下内容的输出:

Starting local Bazel server and connecting to it...
INFO: Analyzed target //main:hello-world (37 packages loaded, 161 targets configured).
INFO: Found 1 target...
Target //main:hello-world up-to-date:
  bazel-bin/main/hello-world
INFO: Elapsed time: 7.820s, Critical Path: 0.59s
INFO: 6 processes: 4 internal, 2 linux-sandbox.
INFO: Build completed successfully, 6 total actions

Bazel 将构建的输出文件放在工作空间根目录的 bazel-bin 目录中。

现在测试新构建的二进制文件:

bazel-bin/main/hello-world

学习bazel_test/examples/cpp-tutorial下的三个项目:参考

共有三组文件,每组代表本教程中的一个阶段.:

  • 在第一阶段,将构建单个包中的单个目标。
  • 在第二阶段,将项目拆分为多个目标,但将其保存在一个包中。
  • 在第三个阶段,将项目拆分为多个包并使用多个目标构建它。

stage1

image-20221121161753275

load("@rules_cc//cc:defs.bzl", "cc_binary")

cc_binary(
    name = "hello-world",
    srcs = ["hello-world.cc"],
)

第一阶段,只有一个单一的目标,它构建一个没有额外依赖项的单一源文件:

图片

stage2

image-20221121164005430

如果希望将较大的项目拆分为多个目标和包,以允许快速增量构建(即仅重建已更改的内容)并通过构建项目的多个部分来加速构建。

load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")

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

使用这个 BUILD 文件,Bazel 首先构建 hello-greet 库(使用 Bazel 的内置 cc_library 规则),然后是 hello-world 二进制文件。 hello-world 目标中的 deps 属性告诉 Bazel,构建 hello-world 二进制文件需要 hello-greet 库。

图片

该阶段使用两个目标构建了项目。 hello-world 目标构建一个源文件并依赖于另一个目标 (//main:hello-greet),该库是由两个额外的源文件构建的。

stage3

image-20221121164342218

这里将其中一个功能放在另外一个文件夹//lib下:

//main:
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")

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

//lib:
load("@rules_cc//cc:defs.bzl", "cc_library")

cc_library(
    name = "hello-time",
    srcs = ["hello-time.cc"],
    hdrs = ["hello-time.h"],
    visibility = ["//main:__pkg__"],
)

可以看出主包中的 hello-world 目标依赖于 lib 包中的 hello-time 目标(因此目标标签为 //lib:hello-time) - Bazel 通过 deps 属性知道这一点。

图片

第三阶段师将项目构建为具有三个目标的两个包,并了解它们之间的依赖关系。

使用

bazel_test

cc_library(
    name = "lib",
    srcs = ["lib/lib.cc"],
    hdrs = ["lib/lib.h"],
)

cc_binary(
    name = "main.out",
    srcs = ["main.cc"],
    deps = [
        ":lib",
    ],
)

编译

bazel build //main:main.out

运行

./bazel-bin/main/main.out

更多

1、https://bazel.build/tutorials/cpp-use-cases

2、程序见:

参考

1、https://blog.csdn.net/weixin_36354875/article/details/124822985

2、https://blog.csdn.net/butterfly5211314/article/details/125349431

标签:Bazel,cc,学习,bazel,构建,world,main,hello
From: https://www.cnblogs.com/pam-sh/p/16915818.html

相关文章

  • 初学Java应如何学习
    学习技巧在以前大部分人学习都是先去找本书,先看看,再试,要是不懂了在去网上去查,再在继续啃着书本。但现在向书学习和在网上学习这掌握的效果是不同的,要学会用适合自己的学习方......
  • 一文带你学懂LAMP架构--从概念入门到实战精通,还等什么,快来学习!!
    (服务阶段)1.服务相关概念简析,学习不迷路1.1web服务概述WEB服务器也称为WWW(WORLDWIDEWEB,万维⽹)服务器,主要功能是提供⽹上信息浏览服务。常见的web服务器:httpd(apache),nginx+......
  • HX学习之常用代码块
    查看内建的代码块,点击菜单-工具-代码块设置,选择要查看的语言的代码块。通用js代码块iff:简单ifforr:for循环结构体fori:for循环结构体并包含ifunn:函数funa:匿名函数......
  • 泡妞最需要明白什么,最需要学习什么?
    最需要明白的是,女性思维。其实大多数中国男人泡妞的时候用的都是男性思维,这就相当于一个歪果仁和我们聊天,他用的英语,我们用的汉语,语言不通导致信息不对称。你以为你在对......
  • 可撤销并查集学习笔记
    前言与可持久化并查集一起食用,效果更佳。前置知识:并查集以及并查集的按秩合并优化。例题引入你需要维护一棵\(n\)个点的动态森林,初始时是\(n\)个散点,有\(q\)个......
  • 学习apply()方法的使用,记录一下
    网上大牛,说的很直接,劫持另外一个对象(a)的方法,继承a的属性.,我个人理解,就是把你的变成我的.1.对象的继承,一般的做法是复制:Object.extend下面是prototype.js的实现方式......
  • HBuild X学习之快捷键
    alt+数字选择导航项目 f1【光标所在位置】跳转api官方文档 f4语法校验【文件未保存时鼠标右键-验证本文档校验语法来进行校验】 ctrl+鼠标左键多光标新增,增加一......
  • 【Mybatis学习总结九】Spring中集成Mybatis
    学习了Mybatis的基本内容后,现在最重要的内容莫过于是在Spring中集成Mybatis了。好处之一就是不用再单独配置Mybatis-config.xml文件了(含有数据库连接池和配置类名以及注册......
  • 【Mybatis学习总结八】Mybatis缓存
    这节内容了解下即可。如多数持久层框架一样,Mybatis同样提供了一级缓存和二级缓存。(*)一级缓存:(1)一级缓存也就是Session级的缓存,默认是开启的,查询操作是使用缓存的;(2)必须是......
  • 【Mybatis学习总结七】调用存储过程
    今天这节课本来可以一小时结束的,我却从三点半搞到了九点。我觉得我是世界上最S13的人!!!没有之一!!!!一个小错害我花了一个晚上的时间去寻找,真是够无语的。好了,言归正传,还是先总结......