Buck2 的 select 和操作系统
Select
在 BUCK 文件中使用 select 来根据不同的条件处理不同的逻辑,比如下面的例子:
load("@prelude//toolchains:rust.bzl", "system_rust_toolchain")
CRATE_ROOTS = {
"ovr_config//os:linux": "src/main-linux.rs",
"ovr_config//os:windows": "src/main-windows.rs",
"ovr_config//os:macos": "src/main-mac.rs",
"DEFAULT": "src/main.rs",
}
rust_binary(
name = "select-os",
srcs = select({
"ovr_config//os:linux": ["src/main-linux.rs"],
"ovr_config//os:windows": ["src/main-windows.rs"],
"ovr_config//os:macos": ["src/main-mac.rs"],
"DEFAULT": ["src/main.rs"],
}),
crate_root = select(CRATE_ROOTS),
features = [],
)
在上面的例子中,我们使用 select 来选择不同的源文件,根据不同的操作系统来选择不同的源文件,这样就可以在不同的操作系统上编译不同的代码。 在 Mac 上执行的时候,输出结果如下:
buck2 run //:select-os
File changed: root//.git/index.lock
File changed: root//.git/index
File changed: root//.git/objects/44/f609e7b954f1d6db51c2f902811e36c07cbbdc
31 additional file change events
Build ID: 3cd811e0-9de6-4ea0-b64e-4f6efcd221bb
Loading targets. Remaining 0/1 1 dirs read, 1 targets declared
Command: run.
Time elapsed: 0.0s
BUILD SUCCEEDED
Starting RUN of `//:select-os`
Running defined output located at: `/Users/eli/GitMono/buck2/buck2-build-rust-select-os/buck-out/v2/gen/root/200212f73efcd57d/__select-os__/select_os`
Hello, world form mac!
- Buck2 根据所在的操作系统自动选择了不同的源文件,然后编译了不同的代码;
select
会根据是从一个dict
选择一个值用于srcs
的结果;crate_root
是显示指定程序的入口文件,默认可能是src/main.rs
或src/lib.rs
。DEFAULT
是select
的一个默认写法,用于没有选择到到任何值的时候使用,但是DEFAULT
并不是关键字;
ovr_config
ovr_conifg
是在 .buckconfig
定义的别名:
[cell_aliases]
config = prelude
ovr_config = prelude
所以把 BUCK
进行修改同样正常运行:
CRATE_ROOTS = {
"prelude//os:linux": "src/main-linux.rs",
"prelude//os:windows": "src/main-windows.rs",
"prelude//os:macos": "src/main-mac.rs",
"DEFAULT": "src/main.rs",
}
rust_binary(
name = "select-os",
srcs = select({
"ovr_config//os:linux": ["src/main-linux.rs"],
"ovr_config//os:windows": ["src/main-windows.rs"],
"ovr_config//os:macos": ["src/main-mac.rs"],
"DEFAULT": ["src/main.rs"],
}),
crate_root = select(CRATE_ROOTS),
features = [],
)
还有很多要研究的问题,先记录一下:
- 如何配置 Rust 交叉编译环境?
ovr_config
是什么样的写法,约定俗成么?
代码托管在 GitHub 上,请访问 buck2-build-select-os 。