OpenWrt在WSL编译报错
OpenWrt在WSL编译报错
根据大神的log:https://ryanchan.top/archives/compile-openwrt-with-wsl
记录编译的指令为:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin make -j1 V=s
1. 大小写不敏感
执行以下指令时:
./scripts/feeds update -a
具体报错如下:
Build dependency: OpenWrt can only be built on a case-sensitive filesystem
Prerequisite check failed. Use FORCE=1 to override.
make: *** [/mnt/d/openwrt/include/toplevel.mk:182: /mnt/d/openwrt/staging_dir/host/.prereq-build] Error 1
Collecting package info: done
Collecting target info: done
原因如图,就是WSL系统对大小写不敏感。
解决方法,就是将对应路径修改为大小写敏感,已知路径为D:\openwrt
,以管理员身份运行powershell,然后运行下面的指令:
$ fsutil.exe file setCaseSensitiveInfo openwrt enable
已启用目录 D:\openwrt 的区分大小写属性。
此时需要再clean下仓库之前产生的临时文件(请确保此时仓库内无任何需要保存的文件!),然后再执行update
的指令:
git clean -dfx
此时update
便不再报错。
2. Permission denied
具体报错:
./bootstrap: 107: cannot create t/testsuite-part.tmp: Permission denied
看了下代码,应该是host端工具automake编译报错,根据报错日志:
cd /mnt/d/openwrt/build_dir/host/automake-1.16.5; AUTOM4TE=/mnt/d/openwrt/staging_dir/host/bin/autom4te AUTOCONF=/mnt/d/openwrt/staging_dir/host/bin/autoconf AUTOMAKE=/mnt/d/openwrt/staging_dir/host/bin/automake ACLOCAL=/mnt/d/openwrt/staging_dir/host/bin/aclocal AUTOHEADER=/mnt/d/openwrt/staging_dir/host/bin/autoheader LIBTOOLIZE=/mnt/d/openwrt/staging_dir/host/bin/libtoolize LIBTOOL=/mnt/d/openwrt/staging_dir/host/bin/libtool M4=/mnt/d/openwrt/staging_dir/host/bin/m4 AUTOPOINT=true GTKDOCIZE=true STAGING_DIR_HOST="" ./bootstrap
查看此文件build_dir/host/automake-1.16.5/bootstrap
有以下字段:
$PERL ./gen-testsuite-part > t/testsuite-part.tmp
chmod a-w t/testsuite-part.tmp
mv -f t/testsuite-part.tmp t/testsuite-part.am
尝试手动创建目录t
,也是报错,但是经过chmod 777 t
这个指令后就可以成功。
可重新编译又报错了。
看了下这段代码的意图,好像是测试用的?而且automake应该是host端使用而已,所以只要能编译通过,应该问题不大。
直接注释掉上面的三行代码,就可以跑通了。
# $PERL ./gen-testsuite-part > t/testsuite-part.tmp
# chmod a-w t/testsuite-part.tmp
# mv -f t/testsuite-part.tmp t/testsuite-part.am
3. perl报错
具体报错:
. /mnt/d/openwrt/include/shell.sh; xzcat /mnt/d/openwrt/dl/perl-5.28.1.tar.xz | tar -C /mnt/d/openwrt/build_dir/hostpkg/perl/perl-5.28.1/.. -xf -
[ ! -d ./src/ ] || cp -fpR ./src/* /mnt/d/openwrt/build_dir/hostpkg/perl/perl-5.28.1
Applying ./patches/001-macos_11_support.patch using plaintext:
File hints/darwin.sh is read-only; trying to patch anyway
patching file hints/darwin.sh
patch: **** Can't rename file hints/darwin.sh.oG8fLA9 to hints/darwin.sh : Permission denied
Patch failed! Please fix ./patches/001-macos_11_support.patch!
make[3]: *** [Makefile:158: /mnt/d/openwrt/build_dir/hostpkg/perl/perl-5.28.1/.prepared9fcb883e266016279d18f552776d0380_6664517399ebbbc92a37c5bb081b5c53] Error 1
make[3]: Leaving directory '/mnt/d/openwrt/feeds/packages/lang/perl'
time: package/feeds/packages/perl/host-compile#1.54#7.62#18.58
ERROR: package/feeds/packages/perl [host] failed to build.
make[2]: *** [package/Makefile:118: package/feeds/packages/perl/host/compile] Error 1
make[2]: Leaving directory '/mnt/d/openwrt'
make[1]: *** [package/Makefile:114: /mnt/d/openwrt/staging_dir/target-arm_cortex-a7+neon-vfpv4_musl_eabi/stamp/.package_compile] Error 2
make[1]: Leaving directory '/mnt/d/openwrt'
make: *** [/mnt/d/openwrt/include/toplevel.mk:232: world] Error 2
感觉和第二点很相似,依旧是权限问题。
最后通过手动打patch解决——即openwrt的打patch方式,因权限问题无法成功执行;只能通过手动打patch到源码,然后编译的形式。算是“曲线救国”吧。
先找到perl的源码压缩包:
$ ls dl |grep perl
perl-5.28.1.tar.xz
看下其哈希值:
$ sha256sum perl-5.28.1.tar.xz
fea7162d4cca940a387f0587b93f6737d884bf74d8a9d7cfd978bc12cd0b202d perl-5.28.1.tar.xz
解压后,进入该目录:
x perl-5.28.1.tar.xz
cd perl-5.28.1.tar.xz
apply所有的patch:
cd perl-5.28.1.tar.xz
git apply ../../feeds/packages/lang/perl/patches/*
然后重新打包,最终格式不变,依旧为tar.xz
:
tar -cvf perl-5.28.1.tar perl-5.28.1
xz -z perl-5.28.1.tar
查看新的perl源码压缩包:
$ ls dl |grep perl
perl-5.28.1.tar.xz
计算新的哈希值:
$ sha256sum perl-5.28.1.tar.xz
8cfd7ce5e30785bbaca00bd4ceb4a4537d4da4758a0be3c2dc35cd7aa25855db perl-5.28.1.tar.xz
将这个新的哈希值更新到对应的package中,需修改openwrt/feeds/packages/lang/perl
中的Makefile:
diff --git a/lang/perl/Makefile b/lang/perl/Makefile
index 40532b5f0..d0f1792fd 100644
--- a/lang/perl/Makefile
+++ b/lang/perl/Makefile
@@ -21,7 +21,8 @@ PKG_SOURCE_URL:=\
https://mirrors.sonic.net/cpan/src/5.0 \
https://www.cpan.org/src/5.0
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
-PKG_HASH:=fea7162d4cca940a387f0587b93f6737d884bf74d8a9d7cfd978bc12cd0b202d
+# PKG_HASH:=fea7162d4cca940a387f0587b93f6737d884bf74d8a9d7cfd978bc12cd0b202d
+PKG_HASH:=8cfd7ce5e30785bbaca00bd4ceb4a4537d4da4758a0be3c2dc35cd7aa25855db
然后删除对应的patch文件:
rm -rf feeds/packages/lang/perl/patches/*.patch
并删除perl的编译产物:
rm -rf build_dir/hostpkg/perl/perl-5.28.1
然后重新编译即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)