1、bazel介绍
bazel是一个构建系统,使用以目录树形式整理的源代码构建软件,其中每一个包(package)都是一个目录,其中包含一组相关的源文件和一个BUILD文件(BUILD,BUILD.bazel)
2、目录结构
项目
├── main //源代码所在在文件夹
├── BUILD //编译文件
├── class_loader.cc //类加载器
├── class_loader.h //类加载器头文件
├── class_loader_manager.cc //类加载器管理
├── class_loader_manager.h
├── class_loader_register_macro.h //类加载器注册宏定义
└──utility
├── class_factory.cc //类工厂
├── class_factory.h //类工厂
├── class_loader_utility.cc // 类加载器工具
└── class_loader_utility.h
├── lib
├── BUILD
├── count.cc
└── count.h
└── WORKSPACE //WORKSPACE用不上的话,内容可以为空,只象征着工作空间的主目录所在
3、BUILD文件
BUILD文件中一些常用的概念:
- 标签(label):类似于语言中的标识符,一些标识符范例如下所示:
//lib:count | lib目录下定义的count |
:class_loader_manager class_loader_manager | 当前目录下定义的 |
@@myrepo//my/app/main:app_binary | @@表示规范代码库语法 |
@myrepo//my/app/main:app_binary | 明显代码库标签 |
- 规则(rule):指定了输入和输出之间的关系,以及如何构建输出,一些常用的规则如下所示
- cc_binary: 生成一个可执行的二进制文件
- cc_library: 结果是生成 .so、.lo、 或 .a
- cc_proto_library: 从 .proto 文件生成 C++ 代码,deps必须指向proto_library规则不得 包含函数定义、for 语句或 if 语句
- proto_library: 定义协议缓冲区
- 扩展程序:bazel鼓励奖代码和数据分开,可以在.bzl文件中申明函数,在BUILD中使用load语句导入扩展
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
- 依赖:大多数构建规则都有三个属性,srcs、deps和data,用于指定不同的依赖
- srcs:输出源文件的规则所直接使用的文件
- deps:指向提供头文件的单独编译的模块的规则; 符号、库、数据等
- data:构建中一些需要的数据文件
- 可见性:bazel具有两种可见性系统:目标可见性和加载可见性
- 目标可见性:控制可能依赖目标的文件,授予一个包可见性权限不意味着这个包的子包也被授予可见性,常见的可见性设置如下所示
"//visibility:public" | 授予所有包访问权限 |
"//visibility:private" | 不授予任何额外的访问权限,只有这个包中的目标可以访问这个目标 |
"//foo/bar:__pkg__" | 授予//foo/bar权限(不包括其子包) |
"//some_pkg:my_package_group" | 授予给定package_group的所有包 |
"//foo/bar:__subpackages__" | 授予//foo/bar权限(包括其子包) |
-
- 加载可见性:控制是否一个.bzl文件可以被当前包外的其他其他BUILD或者.bzl文件加载,使用visibility()函数来定义加载可见性
4、BUILD案例
// load语句在于加载bazel的相关扩展包,第一个参数表示扩展包的位置,扩展程序是以.bzl结尾的文件,第二个参数表示扩展包
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
// 加载@rules_cc//cc:defs.bzl并添加其中定义的符号cc_binary和cc_library到当前环境
//*_library 用于构建目标语言的库
// *_binary 用于构建目标语言的可执行文件,
cc_library(
name = "class_loader",
srcs = ["class_loader.cpp"],
hdrs = ["class_loader.h"],
visibility = ["//visibility:public"]
/*visibility 参数声明了谁可以使用这个库,默认情况下 (即未添加 visibility 参数时) 仅在同一个 BUILD 文件中可以使用; //main:pkg 表明 main 包可以使用这个库 */
)
cc_library(
name = "class_loader_manager",
srcs = ["class_loaderr_manager.cpp"],
hdrs = ["class_loaderr_manager.h"], //头文件
)
cc_binary(
name = "class_loader",
srcs = ["class_loader.cpp"], //源文件,可以放多个如[“flags.cc”, “options.cc”]
deps = [
":class_loader_manager", //同一个目录下的格式
"//lib:count", //其他目录下的格式
"@com_github_jbeder_yaml_cpp//:yaml-cpp", //网络上
"@dtu_sdk//lib/idc:idc_config",//其他目录下
],
//name:自定义,与下一个依赖的srcs对齐
/*deps: depends,依赖文件。在cc_binary中加入了deps,构建的可执行文件以来与deps中的内容,即cc_library中的name*/
)
cc_binary(
name = "main",
srcs = ["main.cc"],
deps = [
"//lib:count",
/*因为要依赖于lib文件夹中的count,所以要加入deps来表示可执行文件需要依赖于lib文件夹中的count*/
],
)