本文记录uutils/coreutils在Windows上编译失败的经历。
前言
习惯了Linux上的那些命令行工具,会变得非常不适应Windows上cmd.exe或者powershell中所带的命令行工具。不仅仅名字不同影响记忆,输出内容的格式不同也让人觉得不爽。例如,列举当前目录的Linux命令是ls
,而在Windows的cmd.exe中却是dir
。ls
默认输出非常简洁,而dir
打印出太多信息,有时需要翻页才能找到所需要的信息。
如果能在Windows上使用Linux中的那些命令就好了。对此,一种解决方案是使用Cygwin或者MSYS。但这两种提供类Linux的环境,有自己的shell。而我希望的是在cmd.exe中直接使用这些命令。
Linux上这些常用命令是coreutils软件包中提供的,于是我想,如果有类似coreutils的跨平台的实现就好了。果然我不是第一个吃这个螃蟹的人。上Github一搜,倒是有几个项目:
- ericlagergren/go-coreutils,基于Go语言编写的
- uutils/coreutils,给予Rust语言编写的
- dcantrell/pycoreutils,给予Python语言编写的
看了一下更新日期,uutils/coreutils是最近更新的,所以就决定尝试以下它。
编译uutils/coreutils
准备工作
安装Rust
第一步需要做的是安装Rust。到https://www.rust-lang.org/tools/install下载Windows版本的安装器rustup-init.exe。
Rust的后端是基于LLVM的,和Clang一样,它需要第三方库的支持。可以是Visual Studio的库,也可以是MinGW。官方支持的是Visual Studio。但是这里我选择的是MinGW。
执行rustup-init.exe,过程中会出现以下提示:
default host triple: x86_64-pc-windows-msvc
default toolchain: stable
modify PATH variable: yes
要使用MinGW的话需要修改default host triple
这一项,改成下面这样子:
default host triple: x86_64-pc-windows-gnu
default toolchain: stable
modify PATH variable: yes
这样rustup-init.exe在安装过程中会自动去下载所需的MinGW。
安装CMake
安装uutils/coreutils还需要用到CMake,可以自行去CMake官网下载,或者使用chocolatey或者scoop安装。
编译过程
:: 克隆仓库
git clone --depth=1 https://github.com/uutils/coreutils
:: 进入目录
cd coreutils
:: 使用cargo进行编译(选项是README文档要求的)
cargo build --release --no-default-features --features generic
编译的时候出现了一个问题,说是CMake不知道怎么生成MYSY Makefile
。这个问题在Rust的CMake包的仓库中已经提了Issue:Should be “MinGW Makefile”? #3。看样子是cargo.lock
中的CMake包版本过低。使用下面命令升级CMake包:
cargo update -p cmake
解决完上面的问题,继续使用cargo build --release --no-default-features --features generic
命令进行编译,结果还是除了一大堆错误。
到此就不想再尝试了,可能uutils/coreutils压根儿就没有在Windows上好好测试过,果断弃坑吧。
其他
使用非Rustup的MinGW编译器
如果要使用本地的MinGW编译器版本,可以修改.cargo\config
文件,添加以下内容:
[target.x86_64-pc-windows-gnu]
linker = "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/bin/gcc.exe"
ar = "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/bin/ar.exe"
参考链接
- step-by-step-instruction-to-install-rust-and-cargo-for-mingw-with-msys2
- Rust Windows-GNU 版本与MSYS2-MINGW-W64 整合集成- 知乎
- Can I force the use of my dependencies' Cargo.lock when resolving package versions?
(原文底部)
2022-10-10更新
cargo可以一切切换使用nightly建构,比如cargo +nightly build
,还是挺方便的。
(更新完)