前言
最近研究 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
本文作者:P3TERX
本文链接:https://p3terx.com/archives/reasons-and-solutions-for-openwrt-compilation-failure-3.html
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。非商业转载及引用请注明出处(作者、原文链接),商业转载请联系作者获得授权。
成功了,果然用 WSL 就要面临各种奇怪的问题
感谢,dalao。