OpenWrt 的编译可以分为两种方式:
本地的物理机/虚拟机/WSL(windows sub-linux)来执行编译工作。利用 GitHub 提供的 Action 功能,编写 continuous integration (CI) workflows 来实现在线云编译。本篇先介绍一下本地编译的方法:
第一步:依赖
sudo apt-get install subversion g++ zlib1g-dev build-essential git python rsync man-db sudo apt-get install libncurses5-dev gawk gettext unzip file libssl-dev wget zip time第二步:克隆
源码可以使用官方的或是第三方维护的,当然你也可以用官方的源码加上一些你喜欢的 package 来组成自己的特有包来编译。
OpenWrt 官方:
Git clone或者第三方维护的:
Git clone由 GitHub 拉取代码要是没有代理的话速度会很慢,这里分享一个技巧:
你可以将仓库先由 GitHub 拉到国内的 “码云” 上,然后再由码云拉回本地,这样中转一下,速度就快多了码云:
第三步:更新
在 Openwrt 系统中,“feed”是一系列的软件包,这些软件包需要通过一个统一的接口地址进行访问。“feed”软件包中的软件包可能分布在远程服务器上、在 SVN 上、在本地文件系统中或者其他的地方,用户可以通过一种支持 feed 机制的协议,通过同一个地址进行访问。
在执行更新前,请记得修改 feeds.conf.default 文件里面的源路径。(当然要是你的网络连接国外的速度很快,请忽略)
这是我码云上的 openwrt feed 源列表:
src-git packages [email protected]:yfdoor/openwrt-packages.git src-git luci [email protected]:yfdoor/openwrt-luci.git src-git routing [email protected]:yfdoor/openwrt-routing.git src-git telephony [email protected]:yfdoor/openwrt-telephony.git然后执行:
./scripts/feeds update -a// 更新 ./scripts/feeds install -a // 安装第四步:配置
make defconfig // 检查编译工具是否全,生成 .config 文件 make menuconfig// 打开编译菜单,自定义项目,更新 .config 文件第五步:下载
编译前最好先执行一下下载,当然你也可以跳过这步,直接编译。编译过程会自动执行下载。下载相关的工具包会放到 dl 文件夹。
make download V=s第六步:编译
make V=99 or V=s // V = verbose 全部都显示总结:
OpenWRT 源码是由一堆 makefile 和补丁组成的,源代码中不包括任何的源代码或内核代码,使用脚本与 makefile 来定义需要下载哪些文件与打上补丁。因此一个好的可以科学上网的网络环境是很重要的。90% 编译失败都是网络的原因,请仔细查看失败后的报错信息来逐步 debug。
简言之,编译过程如下:
下载交叉编译工具,内核头文件,C 库等。设置 staging_dir 目录,交叉编译的 toolchain 会安装到这里。创建 dl 目录, 所有的第三方源码包会被下载到这里创建 build_dir 目录, 用户态工具会被编译到这里创建 build_dir/target-arch/root 和 目标平台根文件系统在根文件系统中安装所有包,最后生成的镜象会在 bin/目录中注意事项:
网络,网络,可以翻墙的网络。若是使用 WSL 编译,请注意 openwrt 要求放的磁盘位置区分大小写。fsutil.exe file setCaseSensitiveInfo (path) enable //启用 NTFS 区分大小写功能若是使用 WSL 编译,在 windows 和 Linux 文件系统转移文件的时候请注意文件权限的问题。若是使用 WSL 编译,借用主机的 SSR 的时候,可以使用 proxychains 来实现。若编译过程中卡在某个文件的下载上,可关掉进程,手动将相应的文件下载到 dl 文件夹。附录:
make clean #删除 bin build_dir make dirclean #删除 bin build_dir staging_dir toolchain logs make distclean #删除以上所有文件,dl 和 .config make package/yfdoor/luci-adb-plus/compile V=s #单独编译软件包 ake clean