百度Apollo采用bazel作为代码编译构建工具
每个模块下都有一个build文件,其作用是按照bazel的格式来编译代码的。
关于如何使用bazel编译c++代码,可以见如下网址:
安装教程 - https://docs.bazel.build/versions/master/install.htmlbazel教程 - https://docs.bazel.build/versions/master/tutorial/cpp.html 我的bazel教程 - https://blog.csdn.net/DinnerHowe/article/details/79815087
下面来介绍为什么百度要用bazel以及docker来编译以及做系统环境吧:
Google软件构件工具Bazel答疑
首先原文在这里。参考文献在这里Google软件构建工具Bazel原理及使用方法介绍
Bazel是什么?
Bazel是一个构建工具,即一个可以运行编译和测试来组装软件的工具,跟Make、Ant、Gradle、Buck、Pants和Maven一样。
Bazel有什么特殊之处
Bazel是设计用来配合Google的软件开发模式。有以下几个特点:
- 多语言支持:Bazel支持Java,Objective-C和C++,可以扩展来支持任意的编程语言
- 高级别的构建语言:工程是通过BUILD语言来描述的。BUILD语言以简洁的文本格式,描述了由多个小的互相关联的库、二进制程序和测试程序来组成的一个项目。而与之相比,Make这类的工具需要描述各个单独的文件和编译的命令
- 多平台支持:同一套工具和同样的BUILD文件可以用来构建不同架构和不同平台的软件。在Google,我们使用Bazel来构建在我们数据中心系统中运行的服务器端程序和在手机上运行的客户端应用程序。
- 重现性[Reproducibility]:在BUILD文件中,每个库,测试程序,二进制文件必须明确完整地指定直接依赖。当修改源代码文件后,Bazel使用这个依赖信息就可以知道哪些必须重新构建,哪些任务可以并行执行。这意味者所有的构建都是增量形式的并能够每次都生成相同的结果。
- 伸缩性[Scalability]:Bazel可以处理巨大的构建;在Google,一个服务器端程序超过100k的源码是常有的事情,如果没有文件被改动,构建过程需要大约200ms
为什么Google不使用...?
Make,Ninja: 通过这些工具都能够控制执行哪些命令来构建文件,但是需要用户书写正确的规则。
用户跟Bazel在更高级别上交互。例如,它有内置的"Java test", "C++ binary"的规则[rule],有例如“目标平台”[target platform],“主机平台"[host platform]这种标记。这些规则都经历了充分的测试,是不会出错的。- Ant和Maven:Ant和Maven主要是面向Java,而Bazel可以处理多种语言。Bazel鼓励把代码库的内容划分成小的,可复用的单元,并且只重新构建需要重新构建的文件。这会提高在庞大的代码库上开发的速度。
- Gradle: Bazel 配置文件比Gradle的要更加结构化,让Bazel能够准确理解每个行为的所作所为。使得能够有更多的并发和更好的可重现性