本篇文章通过https://github.com/bazelbuild/examples/tree/main/cpp-tutorial里面的例子,来简单介绍下bazel构建的基础知识,方便后续查找和学习...) $ cat main/BUILD load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library") cc_library( // 编译成lib库...// 编译成可执行文件 name = "hello-world", // 对应的可执行文件名 srcs = ["hello-world.cc"], // 编译可执行文件所使用的源文件...deps = [ // 编译可执行文件依赖的lib库 ":hello-greet", // 表明在当前目录下 "//lib:hello-time", // 表明在...INFO: Build completed successfully, 12 total actions 构建生成的文件: $ ls README.md WORKSPACE bazel-bin bazel-out
规则是没有这个功能的,Bazel C/C++ 相关的内置规则有: cc_binary :生成可执行文件 cc_import :允许用户导入预编译的 C/C++ 库,包括动态库、静态库 cc_library...:表示 C++ 工具链的集合 而我们知道规则(Rule)定义了 Bazel 对输入执行的一系列操作,以生成一组输出。...例如 cc_binary 规则可能: 输入(Inputs):获取一组 .cpp 文件 动作(Action):基于输入运行 g++ 输出(Output):返回一个可执行文件 从 Bazel 的角度来看,g...这就涉及到了中间文件的产生,有一个很重要的点就是中间文件的产生只能在当前 Bazel 包中创建。...另外创建的中间文件因为是拷贝过程,实际生成的中间文件,Bazel 已经做了处理,居然是软链接到沙箱(sandbox)源文件,这中间的原理我暂未弄清楚,或许就是沙箱优化 对于交叉编译器,我们必须使用 find_cpp_toolchain
Bazel基于规则引擎和分布式执行模型,可实现快速、可靠的大规模代码构建和测试。Bazel具有以下特点: 1....语言支持丰富:Bazel支持多种编程语言,包括Java、C++、Python等,方便开发者使用。 2. 规则清晰明确:Bazel使用称为BUILD文件的规则文件来描述如何构建目标项目。...容器化部署:结合容器技术,Bazel可以自动化生成Docker镜像,简化容器化应用的构建和部署过程。 7....首先,我们需要创建一个BUILD文件来描述如何构建我们的项目。在这个文件中,我们可以定义目标及其依赖项。...如果一切顺利,Bazel将生成一个可执行文件或其他目标文件。
常用的构建工具包括: Make:GNU 的构建工具,使用 Makefile 文件描述构建规则。 CMake:跨平台构建工具,使用 CMakeLists.txt 文件描述构建规则。...gcc可以将C语言源程序编译、链接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为a.out的文件(g++类似,是编译C++程序的)。...如果要自己编译很多源文件的时候就需要cmake工具,可以更加方便地生成makefile文件给make用。cmake还可以跨平台生成对应平台可用的makefile,无需自己根据每个平台的不同特性修改。...这里的目标必须add_executable、 add_library、 add_custom_target 命令创建的目标:add_dependencies(target-name depend-target1...<< std::endl; return 0; } BUILD cc_binary( name = "hello", srcs = ["main.cc"], ) 构建与运行: bazel
1 rules_go 与 gazelle Bazel 支持很多内置的规则,语言相关规则有 Shell、Objective-C、C++ 和 Java,比如 sh_binary、cc_binary、cc_import...`gazelle`[2] 这个项目可以将 Go 项目转为 Bazel 方式构建,包括生成 BUILD.bazel 文件,根据 go.mod 文件自动生成下载依赖模块规则 go_repository。...生成 BUILD.bazel 文件 $ bazel run tools/cli:gazelle # 生成的依赖仓库下载代码自动生成到 go_repositories.bzl 文件中,然后自动生成导入代码到...Bazel 地官方项目 Gazelle,可以用来生成 Go 和 Protocol Buffers 规则。...借助 Gazelle,能够以最少的人工输入为 Go 项目中的大多数 Go 软件包生成 Bazel 规则。
(怪不得看起来很像Android.bp语法 O(∩_∩)O) Google认为直接用Makefile构建软件速度太慢,结果不可靠,所以构建了一个新的工具叫做Bazel,Bazel的规则层级更高。...(如果工作区中的一个目录包含BUILD文件,那么它就是一个package) 要指定一个目录为Bazel的工作区,就只要在该目录下创建一个空的WORKSPACE文件即可。...: 一个工作区是在文件系统包含的源文件要构建的软件,以及符号链接到包含生成输出目录的目录。...BUILD文件 BUILD文件中包含了多个不同类型的bazel指令。 其中最重要的是编译规则(build rule),它告诉bazel怎么编译目标输出,是一个执行文件还是一个库。...例子: cc_binary( name = "hello-world", srcs = ["hello-world.c"], ) 其中的cc_binary,name,srcs都是相关的target
Bazel定义构建的依赖关系和规则,并管理构建生成的临时文件及二进制文件,具体的编译工作是调用各个语言的编译工具如GCC, JAVAC等完成的。...Package: 是一组用于相关文件的集合,该目录中包含一个BUILD文件,此文件中描述了该程序包的构建方式。 target: 生成的目标,一般是一个lib或者二进制文件。...target是一个构建规则(build rule)的实例,一般包含构建所需的源文件,构建目标的名称。rule还可以嵌套,一个rule的输出文件可以作为另一个rule的输入文件。...例如一个二进制文件编译的target可以依赖另一个target生成的lib。...如果一切顺利,bazel会在proxy目录下创建一个目录链接bazel-bin,指向生成的二进制文件。 编译过程分析 源码目录结构如下,主要的构建逻辑在引号包含的文件中。
(regular rules)函数 rule() 来创建自定义规则,但是这些规则都有一个问题:他们依赖于主机系统上安装的各种工具。...因此从构建的阶段来看,repository_rule 可以做的事情很多,比如包括: 创建/删除文件 执行本地可执行文件,并获取执行结果 创建软链接 下载解压文件 读取本地文件内容 实现自动化的 BUILD...创建通用规则时,我们得到的 ctx 对象作为实现函数的参数。同样,创建 reposiroty 规则时,将得到一个 repository_ctx 对象作为实现函数的参数。...其实就相当于我们要实现一套语言相关的规则了,比如 go_binary,怎么去实现下载指定 Go 发行版 SDK,并编译出该 SDK 对应的可执行文件呢?...我们则需要去定义工具链以及定义工具链的动作,比如编译动作(Action)。最后实现 go_binary,将输入(源文件)传入规则,并调用具体的动作实现最后的可执行文件生成。
Android.bp 的语法和语义可能也类似于 Bazel BUILD 文件。...附加 Map 将生成两个 Map 中的键的并集,并且附加两个 Map 中存在的所有键的值。 默认模块 默认模块可以描述在多个模块中被重复的相同属性。...Makefile 规则,复杂条件或额外的 include 必须手动转换。...构建逻辑接收模块定义,并利用反射和构建规则解析为 Go 数据结构。构建规则由 blueprint 收集并写入 ninja 构建文件。 常见问题 如何写一个条件判断?...Soong 故意不支持 Android.bp 文件中的条件。作为替代,复杂的、需要用到条件的构建规则已被 Go 处理,可以使用高级语言特征来跟踪由条件引入的隐式依赖关系。
本篇的所有代码放在:https://github.com/backendcloud/example/tree/master/bazel-genrule 创建一个简单的 c hello 项目 ⚡ root...使用 genrule 执行一条命令 genrule 的 参数 分为:sources,a tool(例如一个内置命令,一个shell脚本),一条命令,outputs genrule :: (name, sources..., tool, command) -> output 下面的例子是cp一个点c文件,再运行一个写有sed功能的脚本。...\n"); return 0;} 加上cc_binary,执行完成的BUILD流程: ⚡ root@backendcloud ~/bazel-genrule more dir2/* :::...' $< $@",)cc_binary( name = "hello_bazel", srcs = [":renamed_main"],):::::::::::::: dir2/main.c :
本文将介绍: Bazel[1] 构建系统的安装 LLVM[2] 编译系统的安装 Clang[3] is an "LLVM native" C/C++/Objective-C compiler Bazel...安装 Bazel,以二进制方式 Bazelisk[4] 是安装 Bazel 的推荐方式,我们安装它的二进制发布[5]即可: cd ~ wget https://github.com/bazelbuild...如何构建 C++ 项目,可见我的 Start Bazel[8] 笔记。...用已配好的工具链:LLVM toolchain for Bazel[14] 配置 Clang 工具链 本文依照 Bazel Tutorial: Configure C++ Toolchains[15]...cc_toolchain_config(name = "linux_x86_64_toolchain_config") toolchain/cc_toolchain_config.bzl 配置 Clang 工具链规则
当然这里可以进一步去做一些工程上的优化: 生成 CcToolchainConfigInfo 的规则,可以优化其输入配置,使得写一个工具链配置规则即可配置所有主流的 C++ 编译器attrs = { "...Bazel 支持以下针对平台的构建场景: 单平台构建(默认):主机、执行和目标平台是相同的。例如,在运行在 Intel x64 CPU 上的 Ubuntu 上构建 Linux 可执行文件。...3.1.3 通用的约束和平台 为了保持生态系统的一致性,Bazel 团队维护了一个存储库,其中包含最流行的 CPU 架构和操作系统的约束定义。...,然后创建自己的工具链实现规则。...总的步骤这里总结下: 创建 ToolchainInfo 创建 xx_toolchain,比如 C++ 已经有了内置的 cc_toolchain,则无需第一步和这一步了,即不用自己手动去实现该规则,只需要配置
Bazel工作区 由于TensorFlow服务程序是用C++编写的,因此在构建时应使用Google的Bazel构建工具。我们将从最近创建的容器内部运行Bazel。...规则将第三方依赖项定义为在本地存储的文件。...此外,还需利用从项目中导入的tf_workspace规则对TensorFlow的依赖项初始化: # Bazel WORKSPACE文件 workspace(name = "serving") local_repository...定义服务器接口 接下来需要为导出的模型创建一个服务器。 TensorFlow服务使用gRPC协议(gRPC是一种基于HTTP/2的二进制协议)。它支持用于创建服务器和自动生成客户端存根的各种语言。.../opt/classification_server bazel clean 现在,在容器外部,我们必须将其状态提交给一个新的Docker镜像,基本含义是创建一个记录其虚拟文件系统变化的快照。
Makefile 文件中包含了一系列的规则来指导如何产生目标文件,这些规则包含目标、依赖和命令: 目标(Target):这通常是要生成的文件名,例如可执行文件或者对象文件。...依赖(Dependencies):这是生成目标所需的文件或目标。 命令(Commands):这些是生成目标时需要执行的命令。 Makefile 使用 GNU make 工具来执行文件中定义的规则。...Yocto Project: 用途:一个用于创建定制的 Linux 分发版的开发工具,特别适用于嵌入式Linux系统。...Bazel: 用途:虽然是通用的构建工具,但在需要处理大型源代码库的嵌入式项目中表现优异。...特点:Bazel 的依赖管理和构建缓存功能使得它在连续集成和测试环境中非常有效,特别是在有复杂依赖和多平台需求的大型嵌入式项目中。
开发流程 为了了解开发流程,我现在就是一个厂商的 BSP 工程师。这里假设要创建一个名为 demo 的硬件驱动,并且以华为的 Nexus 6P 为例进行开发。...这里不赘述编译 AOSP 的具体过程,只专注于 HIDL 相关部分。 创建 HAL 接口 首先是创建 HAL 硬件抽象描述文件。...so,由服务端使用; 编译的规则可以参考生成的 Android.bp 文件。..."liblog", "android.hardware.demo@1.0", "android.hardware.demo@1.0-impl", ], } 生成的可执行文件如下所示...demo_exec, exec_type, file_type; init_daemon_domain(demo) 这是一个初始化的模板,新的 SELinux 规则可以添加到后面,一个方便搜集新规则的方式是先以
然后,CGo 将 Go 和 C 部分链接成最终的可执行文件。 从 Go Monorepo 创建伊始,C++ 工具链就不是封闭式的:Bazel 会使用它在系统上发现的任何东西。...现在,我们看下非封闭式 C++ 工具链的局限性: 不能交叉编译。所以,如果需要 CGo 的话(我们的许多服务都需要),我们就无法在 Mac 上编译生成 Linux 上的可执行文件。...我花了几个晚上基于 musl.cc 创建了一个 Bazel 工具链,但没走多远,因为当时我无法深入理解 Bazel 的工具链文档,而且也没有找到一个好的示例可以参照。...2021 年 6 月:bazel-zig-cc 和 Uber 的 Go Monorepo 2021 年 6 月,Adam Bouhenguel 创建了一个可以工作的 bazel-zig-cc 原型。...我集成了zig ar,完善了文档,并 在 Zig 邮件列表中宣布了我创建的 bazel-zig-cc 分叉。至此,它对我的小项目是有效的。
Android.bp是用来替换Android.mk的配置文件,它使用Blueprint框架来解析。Blueprint是生成、解析Android.bp的工具,是Soong的一部分。...1、模块 定义一个模块从模块的类型开始,模块有不同的类型,如下例子中的“cc_binary”,模块包含一些属性格式为“property-name: property-value”,其中name属性必须指定...cc_binary{ name: "gzip", srcs: ["src/test/minigzip.c"], shared_libs: ["libz"], stl...工具目录为:build/blueprint/bpfmt/ 在当前目录下执行以下命令: 7、Android.mk转为Android.bp androidmk工具可以把mk文件转换为bp文件,但一些复杂的用法和自定义的规则需要手动转换...工具目录为:build/soong/androidmk/ androidmkAndroid.mk>Android.bp 8、支持的模块类型 Android.bp可以支持android_app、cc_binary
make manifests with-bazel or make manifests no-bazel 前者用bazel生成manifest,后者不用bazel。...主要区别就下面的生成{templator}的不同,后者进入仓库的tools/manifest-templator/目录后执行go build生成可执行文件然后复制到{templator}路径。...生成${templator}。...} 下面进入 //:build-manifest-templator – ${templator} 用了内置的genrule,input是tools/manifest-templator/目录下的templator...标签,该标签对应于tools/manifest-templator/ package中的BUILD.bazel文件中的name:templator(用于go build “tools/manifest-templator
加速框架执行,优化矩阵通用乘法(GEMM)运算,影响卷积层(先数据im2col运行,再GEMM运算)和全连接层。im2col,索引图像块重排列为矩阵列。...classify_image_graph_def.pb \ --output_node_names="softmax" --output=/tmp/quantized_graph.pb \ --mode=eightbit 生成量化后模型大小只有原来的...谷歌开源小型独立低精度通用矩阵乘法(General Matrix to Matrix Multiplication,GEMM)库 gemmlowp。...打开CameraExample.app,有可执行文件CameraExample、资源文件模型文件mmapped_graph.pb、标记文件retrained_labels.txt。.../examples/android目录生成TensorFlow演示程序。
添加swap file是为了在硬盘上创建虚拟内存,给编译像TensorFlow这种大型的项目提供足够的内存。例如TX2的真实内存只有8G,编译TF也需要至少8G的内存,所以有必要创建虚拟内存空间。...中的Step 4:Create a Swap File,在磁盘上创建了8G的虚拟空间。 1. 创建8G大小的swapfile fallocate -l 8G swapfile 2....更改swapfile的权限 chmod 600 swapfile 3. 创建swap区 mkswap swapfile 4. 激活swap区 sudo swapon swapfile 5....创建虚拟内存空间成功 如果你没有建立虚拟内存空间,可能在build TF的时候会遇到如下类似的错误,在报错之前INFO的提示'Killed',正是由于内存不够用导致的。 ?...否则,请阅读下面内容,完成类似修改由于TX2的ARM架构不支持NUMA,所以在build TensorFlow之前需要修改一下clone到本地的源码,具体中添加如下两行内容,避免后面使用TF的时候出现错误
领取专属 10元无门槛券
手把手带您无忧上云