#sysroot #libcore #compilation #cross #cross-compilation #no-std #cargo-toml

no-std bin+lib cargo-sysroot

简单轻松地交叉编译 Rust sysroot 库

13 个版本

0.8.1 2022 年 1 月 24 日
0.8.0 2020 年 11 月 25 日
0.7.3 2020 年 8 月 15 日
0.6.2 2019 年 10 月 15 日
0.4.1 2018 年 11 月 17 日

#594Cargo 插件

Download history 49/week @ 2024-04-03

每月 82 次下载

MIT/Apache

34KB
564

Cargo-sysroot

Crates.io maintenance-experimental

一个简单的工具,用于编译您的 no_std 应用程序的 sysroot 库,同时使用标准 cargo 工具。

这不是像 cargo xbuildxargo 这样的包装器,这是一个独立工具,您只需在之前调用一次。它具有与标准工具(如 Rust Analyzer、clippy 或简单的 cargo check)一起工作的优点。它通过为您生成一个 .cargo/config 来实现这一点。

先决条件

  • 最新的夜间编译器。
  • 必须为活动工具链安装 rust-src 组件。
  • 您的 Cargo.toml 文件 必须 包含 package.metadata.cargo-sysroot.target,其中 target 是一个目标规范 JSON 文件。
    • 内置目标也可以使用!
  • 或者,在命令行上传递 --target,例如 cargo sysroot --target path/to/target.json

示例 Cargo.toml

[package]
name = "My Project"
version = "0.1.0"
authors = ["Me <[email protected]>"]

[package.metadata.cargo-sysroot]
target = "my_custom_target.json" # This is relative to Cargo.toml

入门

  • 运行 cargo install cargo-sysroot
  • 在您的项目的当前工作目录中运行 cargo sysroot

本工具将为您生成一个类似下面的 .cargo/config.toml 文件。您可以通过命令行选项 --no-config 来禁用此功能。

[build]
target = <package.metadata.cargo-sysroot.target>
rustflags = [
    "--sysroot",
    "<project root>/target/sysroot",
]

sysroot 将位于 target/sysroot,而构建它的目标目录为 target/sysroot/target

由于 Rust sysroot 的工作方式,您可以通过简单地传递不同的 --target 到 cargo,在无需重新构建的情况下同时使用多个不同的目标规格。

请注意,此工具目前非常简单,所以如果该文件已存在,它不会尝试做任何事情。在这种情况下,您将需要手动编辑它。

这将允许 Cargo 使用常规命令,如 cargo build,正确地构建您的项目。

您可能希望修改此文件以利用 target.$triple.runner 键。有关详细信息,请参阅 Cargo 文档。请注意,作者遇到了 $triple 变体不起作用的问题,您可能在使用 cfg 变体时获得更好的成功。

如果您更新了 Rust 夜间版本,您将需要再次运行 cargo-sysroot,这将导致 cargo 检测到更新并重新构建 sysroot 和您的项目。

建议

如果您有比 target.$triple.runner 更复杂的需求,后者不支持复杂的命令行修改。

作者建议使用他们自己的 cargo-runner 来解决这个问题,它允许在 Cargo.toml 中指定命令行,并从 Cargo 应用路径后缀。

其他选择包括 cargo-make,您可以将其设置为运行您想要的任何内容,而不是使用 cargo run

使用我的其他 crate,cargo-image 来构建适合在 QEMU 中运行的形象。

详细信息

sysroot crate 使用 --release 开关进行编译。使用 memrustc-dep-of-std 功能构建 compiler_builtins,提供 memcpy 和相关功能。

sysroot crate 将共享您 crate 指定的任何配置文件信息。例如,如果您为 release 启用了调试,sysroot crate 也将具有此功能。这符合 cargo-xbuild 的行为,并且某些 crate,例如 bootloader,需要此功能才能正常工作。

您可以通过 --rust-src-dir 标志传递自定义 rust 源代码。

TODO

  • 允许禁用 mem 功能?

常见问题解答

  • 问:为什么您要写这个而不是直接使用 cargo-xbuild
  • 答:这比让 cargo-xbuild 可靠地工作或与任何其他标准工具工作更容易、更简单。

许可

根据您的要求,许可为以下之一:

任选其一。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交以包含在作品中的任何贡献,应按上述方式双授权,不附加任何额外条款或条件。

依赖项

~3–4MB
~70K SLoC