多语言构建系统简介
偶然从byvoid的个人简历中知道了buck。简单看了一下知道了这是一个facebook开源的编译工具,但是该github仓库已不再更新,而是转移到了buck2。buck2的介绍是fast multi-language build system,然后下面解释了buck2/buck构建系统的特点和由来。其中提到了多语言的支持,而这也是大型复杂系统的特点,编程语言多,依赖关系复杂,包含测试用例代码静态扫描等保证系统,传统的集成方式实现复杂且容易出错。buck2对编译过程进行了抽象,可以支持各种编程语言的构建,而且相对于buck构建速度更快更好用。
buck2官网有个Why Buck2的页面,里面回答了三个问题:why does Buck2 exist,what’s different about Buck2和why use Buck2,需要注意的是,虽然这里的很多比较基准都是buck,但页面内同时也标注了,这些区别同样适用于其他构建系统如bazel。
下面我们再来看看google开源的构建工具bazel,github仓库在这里,但是官网主页https://bazel.build在手机浏览器上却一直无法访问(2024年9月27日验证),目前可以移步参考这里https://bazel.google.cn/。在介绍页面bazel也提到了多语言多平台的支持:
One tool, multiple languages: Build and test Java, C++, Android, iOS, Go, and a wide variety of other language platforms. Bazel runs on Windows, macOS, and Linux.
具体其他使用方法,可以参考官网手册,也可以在具体实践中学习摸索这里就不做过多介绍了。
除了上面提到的多语言构建系统外,还有很多针对特定语言的构建系统,比如CMake就针对的是C++/C,最近在Windows平台下构建Wireshark就用到了CMake。CMake在这里可以根据环境配置生成Visual Studio构建用的sln文件,也可以生成Ninja构建使用的ninja文件,当然还可以生成传统Make使用的Makefile文件。CMake还支持代码外编译(Out-of-source builds),即构建输出文件和源代码文件完全分开,便于代码管理和部署。国内的腾讯也开源了构建系统blade,功能和上面的bazel类似,这里有篇使用指南,其中还提到构建系统和编译系统的区别:
构建(build)和编译(compile)不同——编译器负责将源代码转换为库文件或可执行文件;构建工具负责分析构建目标之间的依赖关系,并调用编译器来生成构建目标。
其实构建系统,编译系统和版本控制工具可以集成起来,实现更加灵活和强大的功能,但是这需要很强的研发能力。谷歌对微软:代码管理工具哪家强?其中提到谷歌的一些内部做法,值得其他有需求的公司或者项目借鉴,另外其中还提到bazel 项目的由来,内部名字是blaze。