前言

最近研究 OpenWrt 上瘾,出于好玩的心态,想尝试在 WSL ( Windows Subsystem for Linux ) 中编译 OpenWrt。因为已经有了很多次成功编译的经验,以为一切会很顺利,然而新的挑战等待着我。

错误日志

在执行./scripts/feeds update -a过程中遇到了错误。

Build dependency: OpenWrt can only be built on a case-sensitive filesystem

/mnt/e/Downloads/OpenWrt/lede/include/prereq.mk:12: recipe for target 'prereq' failed
Prerequisite check failed. Use FORCE=1 to override.
/mnt/e/Downloads/OpenWrt/lede/include/toplevel.mk:167: recipe for target 'staging_dir/host/.prereq-build' faile
d
make: *** [staging_dir/host/.prereq-build] Error 1
Collecting package info: doneing...ing/visrouterd2criptsy-openwrt
Collecting target info: doneing...

分析日志

其中第一行是关键。

Build dependency: OpenWrt can only be built on a case-sensitive filesystem
# OpenWrt只能构建在区分大小写的文件系统上

导致的原因是 Windows 文件系统对大小写不敏感。

解决方案

据说微软很早就在解决这个问题,所以 NTFS 本身是支持区分大小写特性的,只不过默认不开启。而开启需要修改注册表,这个操作是对整个系统的全局修改,其危险性可想而知。

值得庆幸的是从 Windows 10 insider build 17093 版本开始,新增了一种区分文件大小写的新方法:单个目录区分大小写。它可以良好的在 WSL 中和其他 Windows 应用程序中使用。这个功能仅修改指定目录本身的属性,故不会对系统有任何的影响。

以管理员权限运行 cmd 输入下面这个命令就可以开启某个目录区分大小写。

fsutil.exe file setCaseSensitiveInfo <path> enable

执行成功后会反馈一条信息

需要注意的是,这个操作不会对此目录中已有的文件生效,只有新写入的文件才会继承这个属性。所以对于目录中已有的文件,需要把文件剪切到其它目录,然后再复制回来。(同盘符下的剪切不是写入,所以后面的操作是复制。)

如果不理解上面这段话的含义,直接删除此目录中所有文件,重新克隆源码,再继续操作。

尾巴

解决了文件系统大小写不敏感的问题,成功的进入到编译的过程,但在编译过程中遇到了之前从没有遇到的问题。本想一篇文章水完这些内容,但这个问题似乎不是很好解决(流下了没有技术的泪水.jpg),所以就暂且咕到这个问题解决吧。

问题一个接着一个的来,我也不知道还要水几篇关于 OpenWrt 的文章,不过这个过程倒是痛并快乐着的,也学习到了不少东西。

参考文章

Per-directory case sensitivity and WSL