1 前言 2 自定义规则实现 2.1 规则功能 2.2 实现规则的理论基础 2.3 规则代码实现 3 总结 4 参考资料 1 前言 为了实现如标题所述的将多个静态库合并为一个动态库,内置的 Bazel...:生成动/静态库 cc_proto_library :从 .proto 文件生成 C++ 代码 fdo_prefetch_hints :表示位于工作区中或位于指定绝对路径的 FDO 预取提示配置文件...fdo_profile :表示工作区中或位于指定绝对路径的 FDO 配置文件 cc_test :测试 C/C++ 样例 cc_toolchain :表示一个 C++ 工具链 cc_toolchain_suite...笨方法就是,将每个待合并的静态库都拷贝到目标目录里去,然后一一 ar -x 操作,然后再到目标目录里操作 ar rc。...那如何能够把这两种方式的库都最后合并到 libcombined.so 呢? depset 是一种专门的数据结构,支持有效的合并操作,并定义了遍历顺序。
Bazel 官方定义了一些规则 (rule),用于构建某些特定产物,例如 c++ 的 library 或者 go 语言的 package,用户配置和调用这些规则。...他仅仅需要告诉 Bazel 要构建什么 Artifact,而由 Bazel 来决定如何构建它。 规则由官方和可信赖第三方维护,规则产生的任务,满足封闭性需求,这使得用户可以信赖系统的增量构建能力。...当用户第二次发起构建时,Bazel 会检测工作空间的哪些文件发生了改变,并更新 ActionGraph。如果没有文件改变,就会直接复用上一次的 ActionGraph 进行分析。...这样 Client 只上传这些 Blob,可以减少网络传输的浪费。 Remote Execution API 是一套通用的远程执行协议,客户端部分由 Bazel 实现,服务端部分可自行定制。...除此之外,针对工作空间的完整 ActionGraph 的内存缓存机制 (skyframe),使得 Bazel 对大型项目拥有秒级的构建速度,这也是其他主流构建系统远远达不到的。
通过 $(bazel info output_base)/external/{工作区名称} 可以看到新建的工作区。...创建通用规则时,我们得到的 ctx 对象作为实现函数的参数。同样,创建 reposiroty 规则时,将得到一个 repository_ctx 对象作为实现函数的参数。...BUILD 文件 # Tip: 如果需要引用新工作空间内 bzl 文件,需要创建 BUILD 文件,即创建包 repository_ctx.file("BUILD.bazel", "")...新工作区名称即规则实例名称。...repository_ctx.download_and_extract(),下载一个文件,并校验其文件,解压到其工作空间的指定文件夹中。
workspace需要包含的必要文件: WORKSPACE文件,用于指定当前文件夹就是一个Bazel的工作区。所以WORKSPACE文件总是存在于项目的根目录下。...(如果工作区中的一个目录包含BUILD文件,那么它就是一个package) 要指定一个目录为Bazel的工作区,就只要在该目录下创建一个空的WORKSPACE文件即可。...: 一个工作区是在文件系统包含的源文件要构建的软件,以及符号链接到包含生成输出目录的目录。...每个工作空间目录都有一个名为的文本文件WORKSPACE,该文件可以为空,或者可以包含 对构建输出所需的外部依赖项的引用。 包含名为的文件 WORKSPACE的目录被视为工作空间的根。...因此,Bazel会忽略工作空间中的任何目录树,这些工作树植根于包含WORKSPACE文件的子目录(因为它们形成另一个工作空间)。
Bazel定义构建的依赖关系和规则,并管理构建生成的临时文件及二进制文件,具体的编译工作是调用各个语言的编译工具如GCC, JAVAC等完成的。...为了理解Envoy的编译过程,我们需要先了解Bazel的几个基础概念 workspace: 文件系统中的一个目录,该目录中包含了用于编译软件所需的所有源文件。...每个工作空间中有一个WORKSPACE文件,该文件用于描述该工作空间的外部依赖,例如依赖的Github上的第三方代码。...如果一切顺利,bazel会在proxy目录下创建一个目录链接bazel-bin,指向生成的二进制文件。 编译过程分析 源码目录结构如下,主要的构建逻辑在引号包含的文件中。...这是bazel的语法,表明调用src/envoy这个目录下BUILD文件中Envoy这个target。
加速计算,内存空间和速度优化。精简模型,节省内存空间,加快计算速度。加快框架执行速度,优化模型复杂度和每步计算速度。...依赖库下载到tensorflow/contrib/makefile/downloads目录。eigen #C++开源矩阵计算工具。gemmlowp #小型独立低精度通用矩阵乘法(GEMM)库。...解压模型,复制到benchmark、simple、camera的data目录。运行目录下xcodeproj文件。选择iPhone 7 Plus模拟器,点击运行标志,编译完成点击Run Model按钮。...物理内存映射到进程地址空间内,应用程序直接用输入/输出地址空间,提高读写效率。模型全部一次性加载到内存缓冲区,会对iOS RAM施加过大压力,操作系统会杀死内存占用过多程序。...参考资料: 《TensorFlow技术解析与实战》 欢迎推荐上海机器学习工作机会,我的微信:qingxingfengzi
,这样相当于在定义local_config_cuda这个rule 问题2: 磁盘满 分析与解决: 嵌入式设备存储往往并不大,而Tensorflow安装过程需要的存储空间非常大,很容易遇到磁盘空间不够。...目前能想到的办法就是用NFS来扩展存储空间,至于NFS具体操作不难搜到。...进一步分析,libaws.a对应的目标文件在目录_bazel_root/46688ad2577b25fcaed4521437622fa6/execroot/tf_serving/bazel-out/arm-opt...分析BUILD.bazel源码发现,有对平台的判断,针对不同平台会拷贝不同目录的代码进行编译,而平台里不包含aarch64相关的,从而不会拷相应的代码。...(4) 然后再次修改third_party/libevent.BUILD中的libevent目标,将cmd全删掉,再加一条cp -r命令将暂存的libevent内容拷回原输出目录(注意用绝对路径),再重新编译就成功了
//:swiftlint 用法 报告 我们鼓励你观看本次报告,来获得将 SwiftLint 整合到你的项目中的推荐方式的一个高层次概括: Xcode 整合 SwiftLint 到 Xcode 体系中去从而可以使警告和错误显示到...Swift 源码文件的目录下执行 swiftlint 命令,会对目录进行递归查找。...使用多个 Swift 版本 SwiftLint 工作于 SourceKit 这一层,所以 Swift 版本发生变化时它也能继续工作!...什么时候需要将一个规则设为 opt-in 的指南: 一个可能会有许多负面作用的规则(例如 empty_count) 一个过慢的规则 一个不通用或者仅在某些特定场景下可用的规则(例如 force_unwrapping...在你需要的目录引入 .swiftlint.yml。 在目录结构必要的地方引入额外的 .swiftlint.yml 文件。 每个文件被检查时会使用在文件所在目录下的或者父目录的更深层目录下的配置文件。
,对于同一概念的抽象,整合了 Bazel、Gradle、Cargo、NPM 等之后有了一个基础的抽象层次: 工作空间(workspace)。...工作空间是一个或者多个软件包的集成,它们可以共享依赖、输出目录配置等等。...为了减少二义性,我们使用工作空间 + 仓库来解决这个问题。工作空间可以视为一个完整的业务项目。而仓库呢,则是单一个的代码库,可能是一个库,也可能是包含库的完整工程。 现有的最佳方案是 Bazel。...工作区 工作空间是一个或者多个软件包的集成,它们可以共享依赖、输出目录配置等等。...先看 CMakeLists.txt 的目录,我们在工作区的根节点,定义了这个工程,并添加了 projectA 和 projectB。
Bazel 和 Buck 有一些相似之处,包括相似的目录结构和命令行调用,最重要的是使用相同的配置语言 Starlark,这在某种程度上简化了构建配置的迁移。...尽管 Buck 和 Bazel 有相似之处,但它们在所提供的规则方面有所不同。...为了在过渡阶段同时处理两个薄片,Airbnb 的工程师创建了一个包含两个不同目录rules_shim/buck和rules_shim/bazel的存储库,然后为每个构建系统定义了一个规则,将rules_shim...标识符与正确的目录关联起来。...第一步,将新的生成器与他们现有的基于 Buck 的解决方案集成,确保一切都按预期工作。在第二阶段,他们添加了新的 Bazel 命令,这些命令与 Buck 中使用的命令相同,并可以在两者之间切换。
Bazel 还必须淘汰旧的 APIs。这不是很容易就完成的任务,因为项目的所有语言、工具链、依赖项和 select() 都必须支持新的 APIs。这需要一个有序的迁移顺序来保持项目正常工作。...3.1.2 定义约束和平台 平台的可能选择空间是通过使用构建文件中的 constraint_setting 和 constraint_value 规则定义的。...3.1.3 通用的约束和平台 为了保持生态系统的一致性,Bazel 团队维护了一个存储库,其中包含最流行的 CPU 架构和操作系统的约束定义。...任何定义工具链的人都需要声明一个 toolchain_type 目标,这是一个字符串标识,用来标志工具链类别,以避免在加载了多个语言规则的工作区中出现潜在的冲突。...如果想了解 Bazel 如何选择或拒绝注册的工具链,可以使用 --toolchain_resolution_debug 标志来调试。
本篇介绍何使用宏和规则扩展 Bazel 的构建语言。 在学习更高级的概念之前,先了解以下几个知识点: 了解 BUILD 和 .bzl 文件中使用的 Starlark 语言。...宏和规则(Macros and rules)。 BUILD 的三个阶段 了解如何在两个 BUILD 文件之间共享变量。...规则比宏更强大。它可以访问 Bazel 内部信息,并完全掌控将要处理的内容。例如,它可以将信息传递给其他规则。 如果您想重复使用简单的逻辑,请从宏开始。如果宏变得复杂,通常最好使其成为规则。...执行规则的代码(其 implementation 函数),并将操作实例化。一个操作描述了如何从一组输入生成一组输出,如“在 hello.c 上运行 gcc 和获取 hello.o”。...INFO: Build completed successfully, 1 total action 上面在一个空目录,空文件上跑。下面的是一个简单的打印。
所以为了确保 Bash 脚本的安全可靠,在生产环境中部署之前一定需要做好足够的测试以确保其行为符合我们的预期。 如何能够安全可靠的去测试 Bash 脚本呢?有人可能会说我们可以用 Docker 容器。...例如,我们在脚本中使用了 Bazel 这个构建工具。我们必须提前安装并配置好 Bazel,而且不要忘记为了能够正常使用 Bazel 还得需要一个支持使用 Bazel 构建的工程。...我们是否还能在几秒内获得测试报告呢? 即使使用了容器来执行 Bash 脚本测试,也一样无法避免上面的几个问题。...由于操作系统和 Bash 的一些限制,Bach Testing Framework 无法做到: 拦截使用绝对路径调用的命令 事实上我们应该避免在 Bash 脚本中使用绝对路径,如果不可避免的要使用,我们可以把这个绝对路径抽取为一个变量...删除你的主目录下的所有 `.git` 目录!
目录加载到容器的/mnt/home路径中,并允许在其中的一个终端下工作。...Bazel工作区 由于TensorFlow服务程序是用C++编写的,因此在构建时应使用Google的Bazel构建工具。我们将从最近创建的容器内部运行Bazel。...为此,需要将代码保存到之前启动的bazel工作区内的exporter.py中。...它从sessionBundle获得TF会话对象,并运行一次,同时传入输入和输出张量的推断。...本文小结 在本文中,我们学习了如何将训练好的模型用于服务、如何将它们导出,以及如何构建可运行这些模型的快速、轻量级服务器;还学习了当给定了从其他App使用TensorFlow模型的完整工具集后,如何创建使用这些模型的简单
该目录包含了几种广泛使用的卷积神经网络(CNN)图像分类模型的训练和测试代码。它包含脚本,允许您从头开始训练模型或从预训练(pre-train)的模型进行fine-tune。...您可以轻松地使用这些数据集进行任意模型的训练,如下所示。 我们还包括一个 jupyter notebook,它提供了如何使用TF-Slim进行图像分类的工作示例。...(它还将创建一个名为models / inception的目录,其中包含一个较旧版本的slim,您完全可以忽略此目录。)...在您拥有USERNAME和PASSWORD之后,您就可以运行我们的脚本了。 确保您的硬盘至少有500 GB的可用空间用于下载和存储数据。...我们需要声明使用哪个checkpoint进行Fine-tuning,我们通常使用--checkpoint_path来标志检查的路径,并将其分配给检查点文件的绝对路径。
一、设置工作区: 例子:https://github.com/bazelbuild/examples/tree/main/cpp-tutorial/stage3 编译之前的文件内容: $ ls //...:新建一个空文件名字叫做WORKSPACE,如此以来该目录及其内容标识为 Bazel 工作区,并位于项目目录结构的根目录中。...二、构建文件BUILD介绍: BUILD:一个或多个BUILD文件,告诉 Bazel 如何构建项目的不同部分,内容如下所示: $ cat lib/BUILD load("@rules_cc//cc:defs.bzl...", // 表明在当前目录下 "//lib:hello-time", // 表明在lib文件夹下面 ], ) 三、构建操作: $ bazel build //main:hello-world...INFO: Build completed successfully, 12 total actions 构建生成的文件: $ ls README.md WORKSPACE bazel-bin bazel-out
gRPC 是 Google 开源的高性能、通用 RPC 框架,面向移动和 HTTP/2 设计,是由谷歌发布的首款基于 Protocol Buffers 的 RPC 框架。...gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特性。这些特性使得其在移动设备上表现更好,更省电且节省空间占用。...(#19439) 修复 DNS 解析器冷却时间 (#19489) 在 Windows 上简化并修复 c-ares TCP 路径 (#19397) 修改 codegen 以使用 grpc_impl 命名空间和其他清理...Grpc.Core.targets (#19449) Objective-C ObjC 实验支持 Bazel 构建 (#19621) 实现全局拦截器 (#19322) PHP PHP:修复 channel...(#19635) 对信号接收和信号处理程序执行之间的时间间隔实施有限限制 (#19481) Python 压缩示例 (#19421) Ruby 对于绝对路径,不要 require_relative (
她在 Insight 工作的时候,在安卓系统上用 TensorFlow 部署了一个 WaveNet 模型。本文详细介绍了部署和实现过程。...在 Insight 任职期间,我用 TensorFlow 在安卓上部署了一个预训练的 WaveNet 模型。我的目标是探索将深度学习模型部署到设备上并使之工作的工程挑战!...这篇文章简要介绍了如何用 TensorFlow 在安卓上构建一个通用的语音到文本识别应用程序。 ? 图 1. 流程概述。将 WaveNet 安装到安卓的三个步骤。...在 TensorFlow 目录下运行下列命令行: bazel build tensorflow/tools/graph_transforms:transform_graph bazel-bin/tensorflow...ok-google-how-do-you-run-deep-learning-inference-on-android-using-tensorflow-c39fd00c427b 本文为机器之心编译,转载请联系本公众号获得授权
Go 和 Java 是通用服务器端语言,Python 和 Node 应用于特定的情况(如 Node 用于前端,Python 用于数据分析 /ML)。C++ 被用于一些底层的库。...在 Bazel 中创建一个封闭式的 C++ 工具链是一项很大的工作(对于我们的 Go Monorepo 来说,需要花费数月时间),没有迫切的需求,也没有足够的痛苦,我们还无法接受做这样一件事。...2021 年 6 月:bazel-zig-cc 和 Uber 的 Go Monorepo 2021 年 6 月,Adam Bouhenguel 创建了一个可以工作的 bazel-zig-cc 原型。...2021 年底:回顾 Uber 有很多地方可以从一个封闭式的 C++ 交叉编译器中受益,但由于需要大量的投资,再加上没有足够的理由,所以没有获得资助。...而且,要让 zig-cc 和 bazel-zig-cc 在任何情况下都可以使用,还有很多工作要做。 在一个大公司里引进这样的技术时,最重要的是风险管理。
Actions 包含进来,就会有: 执行 Git 检出 存储工作流 / 作业使用的工件 缓存工作流 / 作业使用的工件 安装通用编程语言和环境 (如 Java、Node.js、Python 和 Ruby...那些基础元素都有了,GitHub Actions 工作流由作业组成,作业由步骤组成,就像 Makefile 由规则组成,规则由命令组成。...DAG 的概念被融入到执行模型当中,你可以将执行单元定义成图来获得依赖关系。你可以定义独立的、特别的工作单元,也可以定义一组单元,但不像构建系统那样,需要在整个执行过程中运行代理来协调任务的执行。...版本的发布也一样。 至于如何配置前端和定义执行单元,平台只需要提供一个东西:一个可以用来调度 / 执行作业的 API。...这可能很专业,因为如何跟踪结果与特定的领域有关。