8 个版本

使用旧的 Rust 2015

0.0.8 2024年1月15日
0.0.7 2024年1月5日
0.0.6 2023年4月3日
0.0.4 2023年3月31日

开发工具 中排名第 920

Download history 18/week @ 2024-03-29 5/week @ 2024-04-05 8/week @ 2024-05-17 16/week @ 2024-05-24 37/week @ 2024-05-31 26/week @ 2024-06-07 16/week @ 2024-06-14 16/week @ 2024-06-21 14/week @ 2024-06-28 12/week @ 2024-07-05 9/week @ 2024-07-12

每月下载量 52

BSD-2-Clause 许可协议

29KB
527 行代码(不含注释)

crit: Rust 跨平台编译器

             .__  __
  ___________|__|/  |_
_/ ___\_  __ \  \   __\
\  \___|  | \/  ||  |
 \___  >__|  |__||__|
     \/

概要

crit 编译适用于许多不同目标平台的 Rust 应用程序。这项工作基于传统的 Rust 工具,包括 crosscargo 和惊人的 rustc 编译器。

示例

$ cd example

$ crit

$ ls .crit/bin
aarch64-apple-darwin
aarch64-unknown-linux-gnu
aarch64-unknown-linux-musl
...

默认情况下,crit 以发布模式编译(-- -r)。

有关更多选项,请参阅 crit -h

CRATE

https://crates.io/crates/crit

API 文档

https://docs.rs/crit/latest/crit/

下载

https://github.com/mcandre/crit/releases

从源代码安装

$ cargo install --force --path .

许可协议

BSD-2-Clause 许可协议

运行时要求

  • 能够运行 musl/Linux 容器的宿主机(例如 GNU/Linux、musl/Linux、macOS 或 Windows 宿主机)
  • Docker First Aid Kit
  • 设置环境变量 DOCKER_DEFAULT_PLATFORM = linux/amd64
  • ASDF 0.10(在安装每个 Rust 应用程序二进制文件后运行 asdf reshim
  • cargo-cache
  • direnv 2
  • POSIX 兼容的 tar
  • tinyrick 0.0.9
  • tree
  • GNU 兼容的 time
  • Amphetamine(macOS),The Caffeine(Windows),Caffeine(Linux)可以在任何长时间构建过程中防止休眠
  • UNIX 环境,例如 macOS、Linux、BSD、WSL 等。

tar 是一种便携式归档工具,适用于创建 *.tgz 归档文件。用户可以下载这些归档文件并提取与其平台相关的可执行文件。归档文件特别适合用于Docker容器中,因为tar命令比unzip更容易安装。

请注意,非UNIX文件系统在端口生成过程中可能无法保留关键的chmod acl位。这可能会损坏下游的工件,例如压缩归档和安装过程。

贡献

有关开发crit的更多详细信息,请参阅DEVELOPMENT.md

常见问题解答

帮助,某些目标损坏了?

请确保您的项目能够使用传统的 crosscargo 命令针对单个目标进行构建。无法针对单个目标编译的项目,在尝试为多个目标进行交叉编译时自然会遇到困难。

请注意,Rust不断引入新的、不受支持的的目标。我们尽力跟上,但有时会错过一些。无论如何,您可以通过编写自定义模式来声明禁用的目标,用于 - / --exclude-targets 标志。

某些目标可能缺乏对Rust std 库的原始支持。这对于裸金属或嵌入式目标很常见。对于这类目标,您有几种解决策略

  • 提供 std 实现。联系有关目标的专业人士。
  • 避免在您的代码以及依赖关系树中使用 std 库。这对于许多Rust项目来说实际上是一种常见的做法,作为对嵌入式开发支持的积极立场。
  • 禁用不需要的目标。

帮助,交叉编译看起来冻结了?

crit隐藏了大量的编译器噪音。当目标正在构建时,您可以使用常见的Docker命令来检查编译过程

  • docker ps-a
  • docker logs[--follow] <container id>

帮助,交叉编译很慢?

是的,确实很慢!几乎和用虚拟机进行交叉编译一样慢。

Rustaceans期待Rust编译器是分析性的,花费更多的时间优化程序,以便最终的可执行文件运行更安全、更快。Rust编译器通常需要很长时间来编译每个目标。

自然地,当交叉编译多个目标时,时间会随着目标数量的增加而增加。

一些交叉编译性能提示

  • 调整您的Docker设置(见上面的Docker急救包)
  • 重置常见的Cargo构建配置文件选项(例如,codegen-unitsltostrip等。)
  • 使用调试模式(例如,--
  • 使用更少的依赖项
  • 按照 UNIX哲学 进行设计,即“每个程序只做一件事”。不要做一百件事都很差。
  • 保持主机唤醒状态(见Amphetamine / The Caffeine / Caffeine以上)
  • 将交叉编译作为发布时的步骤,与更快速的开发任务区分开来
  • 在具有更多CPU、磁盘和RAM资源的CI/CD管道中进行交叉编译
  • 排除更多目标(例如,-<target pattern>

致谢

  • cross 基础交叉编译系统
  • cross-toolchains 提供交叉Docker镜像
  • cubejs/rust-cross 额外交叉目标的Docker镜像
  • factorio 基于标准 Go 工具链生成 Go 应用程序端口
  • tug 自动化多平台 Docker 镜像构建
  • WASM 为 C/C++ 代码提供可移植的接口。
  • xgo 支持具有原生 cgo 依赖的 Go 项目。

依赖项

~2.9–4MB
~68K SLoC