Key Concepts
https://buck.build/about/overview.html
- build rule
- 描述如何从源文件生成输出文件
- eg: cxx_binary, android_binary, …
- build target
- 用来代表一个build rule的字符串,必须是唯一的。
- build file
- 默认为 BUCK 文件
- 定义一系列build rule
- 大型工程可以有多个BUCK文件,每个BUCK文件只负责一个模块的构建
- buck package
- 一个buck build file定义了buck package的root,在root内的所有文件和子目录构成了buck package
- buck package不可以包含其他buck package,也就是说如果一个子目录中存在build file,这个子目录就不属于任何其他buck package,而是自己就是一个buck package
- buck cell
- 一个buck cell包含多个buck package
- ???
- buck project
- .buckconfig文件定义buck project,当buck被调用时,当前目录或者最近的祖先目录中的.buckconfig文件会被使用
- .buckconfig中的 [repositories] 部分定义了组成buck project的buck cell
dependency graph
每个build rule都可以有0个或多个dependency。可以使用build rule对应的参数,比如deps,指定dependency。
所有的dependency共同组成了一个有向图,buck要求这个图必须是没有环的。当buck构建时,会从下向上进行构建。
单个仓库中维护多个buck项目
Facebook buck相信将多个模块的源码放到同一个repo中,也就是monorepo有助于确保团队中的每个人使用正确版本的代码,buck使用cell和project支持monorepo。
buck Marcos
https://buck.build/extending/macros.html
buck build file就是python脚本,buck将python function称作macro。
定义macro
建议将所有macro定义写在单独的 .bzl(Build Zebeline Language) 文件中,并使用 load() 引入要使用的macro。
预览macro展开
使用 buck audit 查看所有macro展开后,产生了哪些build rule。
buck交叉编译C项目
https://buck.build/files-and-dirs/buckconfig.html#cxx
在.buckconfig文件中可以指定工具链各个工具的目录。