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文件中可以指定工具链各个工具的目录。