bazel学习

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*/
           ],
        )
     
                

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值