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!
  1. Buck2 根据所在的操作系统自动选择了不同的源文件,然后编译了不同的代码;
  2. select 会根据是从一个 dict 选择一个值用于 srcs 的结果;
  3. crate_root 是显示指定程序的入口文件,默认可能是 src/main.rssrc/lib.rs
  4. DEFAULTselect 的一个默认写法,用于没有选择到到任何值的时候使用,但是 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 = [],
)

还有很多要研究的问题,先记录一下:

  1. 如何配置 Rust 交叉编译环境?
  2. ovr_config 是什么样的写法,约定俗成么?

代码托管在 GitHub 上,请访问 buck2-build-select-os