ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

uutils coreutils 构建与安装完全指南:用 Rust 跨平台重写 GNU coreutils

uutils coreutils 构建与安装完全指南:用 Rust 跨平台重写 GNU coreutils uutils coreutils 构建与安装完全指南用 Rust 跨平台重写 GNU coreutils【免费下载链接】coreutilsCross-platform Rust rewrite of the GNU coreutils项目地址: https://gitcode.com/GitHub_Trending/co/coreutils本篇技术指南以 uutils coreutils仓库 README.md为核心系统讲解这个用 Rust 重写 GNU coreutils 的跨平台项目的设计目标、构建方式、安装与卸载流程、multicall 二进制用法以及 GNU 兼容性验证方法。读完本文你将掌握从源码编译出可用的 uutils 工具集包括按需定制工具子集、启用 SELinux/OpenSSL 等可选特性、生成 shell 补全与 manpage的完整实战方案。项目定位与设计目标uutils coreutils 是 GNU coreutils 在 Rust 下的跨平台重实现所有 GNU 工具均已有对应实现但部分选项可能缺失或行为存在差异。项目名字中的 uutils 取 universal utils 之意目标是让同一套工具集在 Linux、macOS、*BSD、Windows、WASI 等平台上都能使用从而让脚本可以轻松地在不同平台间迁移。根据 README.md 的官方声明项目主要目标包括与 GNU 输出严格一致匹配 GNU 的 stdout 输出和错误码差异视为 bug更好的错误消息在终端下参数解析错误会以编译器风格报告呈现在出错参数下方用 caret 指示位置而 GNU 只打印单行错误详见 docs/src/extensions-errors.md脚本与管道场景仍保持 GNU 的纯文本消息全面的国际化支持UTF-8仓库中每个工具包都带有locales/*.ftl本地化文件例如 src/uu/ls/locales、src/uu/sort/locales通过 Fluent 实现多语言消息持续改进性能相对其他 coreutils 实现的显著性能回退被视为 bug提供合理扩展在不破坏 GNU 兼容性的前提下提供额外功能如cp/mv/rm的--progress进度条完整清单见 docs/src/extensions.md。此外README 声明 uutils coreutils 自 Ubuntu 25.10 起成为系统默认内置工具集。当前仓库工作区版本为 0.11.0工作区配置要求 Rust 版本不低于 1.88.0见 Cargo.toml并采用 2024 edition。项目遵循 Rust 的发布渠道在 stable、beta、nightly 三个渠道上均有测试覆盖。构建前的环境准备构建 uutils 只需两样东西Rust 工具链cargo、rustc——必备GNU Make——可选用于make方式构建与安装以及生成补全/manpage 所需的额外步骤。注意若想构建包含全部文档在内的完整包需要在 Unix 平台上同时具备 Cargo 和 GNU Make。获取仓库代码git clone https://gitcode.com/GitHub_Trending/co/coreutils cd coreutils使用 Cargo 构建与构建任何 Rust 程序一样Cargo 是主流的构建方式。构建默认 multicall 二进制cargo build --release这条命令会在大多数 Rust 支持的平台上把最通用的 common core 工具集编译进一个multicallBusyBox 式二进制名为coreutils。将--release替换为--profilerelease-small可以针对二进制体积进行优化。从 Cargo.toml 可以看到三个内置 profile 的差异release启用lto fat、panic abort、codegen-units 1追求运行性能release-small继承 release额外设置opt-level z与strip true追求最小体积profiling继承 release 但使用panic unwind并保留调试信息用于性能剖析。按平台启用扩展工具集不同平台还有额外的工具可用通过 feature 开关即可构建对应平台的扩展工具集同样在目标平台上构建cargo build --release --features windows # 或 cargo build --release --features unix # 或WASI 目标 cargo build --release --target wasm32-wasip1 --no-default-features --features feat_wasm这些 feature 集在 Cargo.toml 中有明确定义构成了分层体系Feature 集定位包含内容feat_common_core可在绝大多数目标上构建/运行的基线核心集约 90 个常用工具base32、cat、ls、sort、wc、cksum 家族等feat_Tier1Rust Tier 1 目标平台的扩展集在 common_core 基础上追加 arch、kill、hostname、nproc、sync、timeout、uname、uptime、whoami 等feat_os_unix现代 Unix 平台Tier1 需要 Unix 特性的 chgrp/chmod/chown/chroot/groups/id/install/mkfifo/mknod/nohup/stat/stty 等以及依赖 utmpx 的 pinky/uptime/users/whofeat_os_windowsWindows 平台Tier1 stdbuffeat_wasmWASI 目标common_core 的大部分工具 cksum 家族这些 feature 采用cfg条件与 feature 依赖组合的方式组织如feat_require_unix_utmpx注明了 musl 下 utmp/wtmp 仅有桩实现的事实尽可能把受平台限制的工具集压缩到最小以鼓励工具的最大化跨平台可用性。构建 SELinux 相关工具若要构建 SELinux 专属工具chcon、runcon需要系统预先安装libselinux与libclang然后执行cargo build --release --features unix,feat_selinux从 Cargo.toml 可见feat_selinux会把 selinux 支持传导到cp、id、install、ls、mkdir、mkfifo、mknod、stat等工具并强制启用chcon/runconfeat_require_selinux。运行时则需要 SELinux 已启用的内核。用 OpenSSL 加速校验和工具对于md5sum、sha1sum、sha224sum、sha256sum、sha384sum、sha512sum、cksum这些校验和工具可以启用 OpenSSL 的libcrypto替代纯 Rust digest crate 来加速cargo build --release --features openssl关键细节来自 Cargo.toml 与 README默认情况下 OpenSSL 从源码构建并静态链接进二进制不会引入对系统 libcrypto/libssl 的运行时依赖如需动态链接系统 libcrypto在构建时设置环境变量OPENSSL_NO_VENDOR1加速效果在没有 SHA-NI 硬件加速的 CPU上最为明显该 feature 在 Windows 上是空操作始终使用纯 Rust 实现运行时若 libcrypto 拒绝某算法例如严格 FIPS 模式下禁用 MD5会自动回退到纯 Rust 实现。只构建你需要的工具子集如果不想把平台上的所有工具都编进最终二进制可以手动指定cargo build --features base32 cat echo rm --no-default-features这会精确构建指定工具。注意--no-default-features会同时关掉默认的feat_common_core与feat_diagnostics终端错误诊断渲染及其 ariadne 依赖关掉后工具退化为 GNU 式的单行错误消息。构建为独立二进制也可以把每个工具构建成独立可执行文件cargo build --release --bins --workspace --exclude coreutils --exclude uu_runcon --exclude uu_chcon仓库采用 一工具一 crate 的组织方式每个工具位于 src/uu/ 下独立的uu_UTILNAME包中例如 src/uu/ls、src/uu/wc。因此也可以用--package-p选择性地构建cargo build -p uu_base32 -p uu_cat -p uu_echo -p uu_rm对应关系可在根 Cargo.toml 的依赖声明中查到如base32 { optional true, package uu_base32, path src/uu/base32 }。使用 GNU Make 构建make方式是对 Cargo 命令的封装同样简单直接。仓库根目录的 GNUmakefile 通过cargo tree自动枚举目标平台可用工具并提供一组可配置变量GNUmakefilePROFILE默认 debuginstall 时默认 release、MULTICALL默认 n、COMPLETIONS/MANPAGES/LOCALES默认 y、PREFIX默认 /usr/local、DESTDIR、PROG_PREFIX等。# 构建全部可用工具debug profile make # release 模式 make PROFILErelease # 跳过部分工具 make SKIP_UTILSUTILITY_1 UTILITY_2 # 只构建部分工具 make UTILSUTILITY_1 UTILITY_2Make 与 Cargo 两条路径的差异在于Make 目标更贴近安装一个完整工具集的发行场景会自动处理 shell 补全、manpage、本地化等安装步骤Cargo 则适合开发者日常迭代。另外注意顶层 Makefile 只是薄封装实际规则全部在 GNUmakefile 中在 macOS/BSD 上会调用gmake。安装使用 Cargo 安装cargo install --path . --locked该命令将 uutils 安装到 Cargo 的 bin 目录例如$HOME/.cargo/bin。注意此方式不会安装 shell 补全和 manpage 所需的文件如需补全/manpage请使用 GNU Make 方式或参考下面的手动安装方法。使用 GNU Make 安装# 安装全部可用工具默认 PROFILErelease make install # 需要 sudo 时务必加 -E保留环境变量 sudo -E make install # 跳过部分工具 make SKIP_UTILSUTILITY_1 UTILITY_2 install # 只装部分工具 make UTILSUTILITY_1 UTILITY_2 install常用安装定制选项# 给所有程序加前缀生成 uu-echo、uu-cat 等 make PROG_PREFIXuu- install # 安装 multicall 二进制 make MULTICALLy install # 自定义安装父目录默认 /usr/localDESTDIR 同样受支持 make PREFIX/my/path install # 跳过补全和 manpage 的安装 make COMPLETIONSn MANPAGESn installmake install会为所有已安装工具生成bash、fish、zsh的 shell 补全elvish和powershell的补全也可生成见下节。手动安装 shell 补全补全由uudoc二进制生成它支持bash、elvish、fish、powershell、zsh五种 shell输出到 stdout。先安装uudoccargo install --bin uudoc --features uudoc --path .然后使用uudoc completion utility shell例如为ls在 bash 下安装补全到/usr/local/share/bash-completion/completions/lsuudoc completion ls bash /usr/local/share/bash-completion/completions/ls.bash带前缀的工具同样支持为带uu-前缀的cp生成 zsh 补全env PROG_PREFIXuu- uudoc completion cp zsh手动安装 manpagesuudoc同样负责生成 manpageuudoc manpage utility例如将ls的 manpage 安装到/usr/local/share/man/man1/ls.1uudoc manpage ls /usr/local/share/man/man1/ls.1卸载卸载方式取决于当初的安装方式Cargo 安装的用 Cargo 卸载Make 安装的用 Make 卸载。使用 Cargo 卸载cargo uninstall coreutils使用 GNU Make 卸载# 卸载全部工具 make uninstall # 卸载带前缀的程序 make PROG_PREFIXuu- uninstall # 卸载 multicall 二进制 make MULTICALLy uninstall # 自定义父目录DESTDIR 同样受支持 make PREFIX/my/path uninstallmulticall 二进制的使用构建出的coreutils是一个 multicallBusyBox 式二进制第一个参数是要执行的工具名其后跟随该工具的常规参数详见 docs/src/multicall.mdcoreutils [util] [util options]例如coreutils ls -l--help标志会打印可用工具列表。此外当二进制自身的名字以某个工具名结尾时例如coreutils被命名为cksum它会直接以该工具身份运行以支持带前缀的调用方式名字较长者优先如带ck前缀的sum会被识别为cksum。验证 GNU 兼容性项目的核心承诺是与 GNU 输出严格一致。仓库在 tests/by-util 下为每个工具提供独立测试文件如 tests/by-util/test_ls.rs、tests/by-util/test_sort.rs并在 util/gnu-patches 中维护针对 GNU 测试套件的补丁集。GNU 测试套件的通过情况会持续追踪README 说明了主分支 GNU 测试结果的详细拆解可参考用户手册中的测试覆盖率章节仓库内对应文档为 docs/src/test_coverage.mddocs/wasi-test-gaps.md 则记录了 WASI 目标上的已知测试缺口。参与贡献与许可证如需参与贡献请参阅 CONTRIBUTING.md开发环境搭建与调试细节可参见 DEVELOPMENT.md。uutils coreutils采用MIT License见 LICENSEGNU Coreutils采用 GPL 3.0 或更高版本许可。两者许可证不同使用时请注意区分uutils 是 GNU coreutils 的独立重实现而非对 GPL 代码的派生。【免费下载链接】coreutilsCross-platform Rust rewrite of the GNU coreutils项目地址: https://gitcode.com/GitHub_Trending/co/coreutils创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表