本文记录uutils/coreutils在Windows上编译失败的经历。

前言

习惯了Linux上的那些命令行工具,会变得非常不适应Windows上cmd.exe或者powershell中所带的命令行工具。不仅仅名字不同影响记忆,输出内容的格式不同也让人觉得不爽。例如,列举当前目录的Linux命令是ls,而在Windows的cmd.exe中却是dirls默认输出非常简洁,而dir打印出太多信息,有时需要翻页才能找到所需要的信息。

如果能在Windows上使用Linux中的那些命令就好了。对此,一种解决方案是使用Cygwin或者MSYS。但这两种提供类Linux的环境,有自己的shell。而我希望的是在cmd.exe中直接使用这些命令。

Linux上这些常用命令是coreutils软件包中提供的,于是我想,如果有类似coreutils的跨平台的实现就好了。果然我不是第一个吃这个螃蟹的人。上Github一搜,倒是有几个项目:

看了一下更新日期,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"

参考链接

(原文底部)

2022-10-10更新

cargo可以一切切换使用nightly建构,比如cargo +nightly build,还是挺方便的。

(更新完)