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

学习

如何使用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

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

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

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

stage2

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

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

这里将其中一个功能放在另外一个文件夹//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、程序见Github

参考

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

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

bazel学习的更多相关文章

  1. 小白学k8s(8)-Bazel部署go应用

    Bazel使用了解 Bazel产生的背景 什么是Bazel 快(Fast) 可伸缩(scalable) 跨语言(multi-language) 可扩展(extensible) Bazel中的主要文件 ...

  2. 转 如何阅读TensorFlow源码

      通过bazel学习之后,大概了解了TensorFlow的项目的源文件和描述文件. 下面是一篇不错的介绍,搬砖here. 在静下心来默默看了大半年机器学习的资料并做了些实践后,打算学习下现在热门的T ...

  3. 学习笔记TF022:产品环境模型部署、Docker镜像、Bazel工作区、导出模型、服务器、客户端

    产品环境模型部署,创建简单Web APP,用户上传图像,运行Inception模型,实现图像自动分类. 搭建TensorFlow服务开发环境.安装Docker,https://docs.docker. ...

  4. 深度学习主机环境配置: Ubuntu16.04 + GeForce GTX 1070 + CUDA8.0 + cuDNN5.1 + TensorFlow

    深度学习主机环境配置: Ubuntu16.04 + GeForce GTX 1070 + CUDA8.0 + cuDNN5.1 + TensorFlow 最近在公司做深度学习相关的学习和实验,原来一直 ...

  5. 学习Tensorflow,反卷积

    在深度学习网络结构中,各个层的类别可以分为这几种:卷积层,全连接层,relu层,pool层和反卷积层等.目前,在像素级估计和端对端学习问题中,全卷积网络展现了他的优势,里面有个很重要的层,将卷积后的f ...

  6. TensorFlow的Bazel构建文件结构

    目录 说明 分析 全局设定文件:$TF_ROOT/WORKSPACE 外部依赖项入口:tensorflow/workspace.bzl 看看有多少package? 本来是想理解一下TF源码编译过程的, ...

  7. 学习笔记TF067:TensorFlow Serving、Flod、计算加速,机器学习评测体系,公开数据集

    TensorFlow Serving https://tensorflow.github.io/serving/ . 生产环境灵活.高性能机器学习模型服务系统.适合基于实际数据大规模运行,产生多个模型 ...

  8. 大数据下基于Tensorflow框架的深度学习示例教程

    近几年,信息时代的快速发展产生了海量数据,诞生了无数前沿的大数据技术与应用.在当今大数据时代的产业界,商业决策日益基于数据的分析作出.当数据膨胀到一定规模时,基于机器学习对海量复杂数据的分析更能产生较 ...

  9. TensorFlow实战Google深度学习框架1-4章学习笔记

    目录 第1章 深度学习简介 第2章 TensorFlow环境搭建 第3章 TensorFlow入门 第4章 深层神经网络   第1章 深度学习简介 对于许多机器学习问题来说,特征提取不是一件简单的事情 ...

  10. 学习笔记TF044:TF.Contrib组件、统计分布、Layer、性能分析器tfprof

    TF.Contrib,开源社区贡献,新功能,内外部测试,根据反馈意见改进性能,改善API友好度,API稳定后,移到TensorFlow核心模块.生产代码,以最新官方教程和API指南参考. 统计分布.T ...

随机推荐

  1. .NET 8.0 通用管理平台,支持模块化、WinForms 和 WPF

    前言 领导要求做一个小项目,要求独立运行,用以最少的依赖,此时不想集成到主项目中,但是又想用HzyAdmin中如此好用的自动注入,还有操作简单的仓储模式,话不多说,直接开干. HzyAdmin 是一个 ...

  2. 19、解析2_1(链、chunk、锁)

    解析 shared pool 图解: library cache里面,暂时可以认为存储着: 1.SQL以及对应的执行计划(所占空间比较小): 2.存储过程.函数.触发器.包,它们编译后的对象(所占空间 ...

  3. mysql与mongodb、redis的性能对比,包含源代码

    最近因为工作需要,所以研究了一下mongodb,但是不知道它的真实性能怎么样,所以对比mysql做了一些测试,现在只是插入操作,更新还没来得及弄,贴出来和大家分享一下(已经补齐redis部分) 1.数 ...

  4. 如何快速构建基于Spring4.0的Rest API(攻略)

    本文由 ImportNew - 邬柏 翻译自 javacodegeeks.如需转载本文,请先参见文章末尾处的转载要求. ImportNew注:如果你也对Java技术翻译分享感兴趣,欢迎加入我们的 Ja ...

  5. golang配置读取值viper

    viper简介 Viper是Go应用程序的完整配置解决方案,包括12-Factor应用程序.它旨在在应用程序中工作,并且可以处理所有类型的配置需求和格式.它支持: 设置默认值 从JSON.TOML.Y ...

  6. Codeforces Round 887 (Div. 2)

    C. Ntarsis' Set ​ (\(1 \leq n,k \leq 2 \cdot 10^5\)) 题解:思维 + 二分 我们不妨反向考虑 由于答案最后一次一定在第一个位置 所以答案上一轮一定在 ...

  7. 使用LOGSTASH 将数据导入到ES

    logstash 执行过程 input -->filter -->output filter 可以对数据进行处理 输出插件 codec plugin 使用脚本将数据导入到ES input ...

  8. DOM元素高度获取踩坑

    前情 最近在开发一个需求,需要做一个滚动列表展示当前中奖用户,但是列表每一项高度又不是固定的,每次滚动前需要先获取当前要滚动的块是多高才知道要滚动多少. 坑位 在开发这个滚动列表的时候发现滚着滚着就会 ...

  9. Esxi缩小硬盘大小的办法

    ​进虚拟机,把要缩减硬盘的那个系统,磁盘管理,收缩卷收缩了.然后关机. 本例:调整800G到350G. Esxi打开ssh,进去. cd /vmfs/volumes// datastorename,完 ...

  10. 2024年1月Java项目开发指南8:统一数据返回格式

    有时候返回一个字符串,有时候返回一串数字代码,有时候返回一个对象-- 不过怎么说,我们返回的内容往往具有三个 1.消息代码 code 2.消息内容 msg 3.数据内容 data 接下来,我们要编写一 ...