看到几个帖子的问题,有一些基本概念讲一下吧
以下说明都基于你下载的源码目录,比如your_openwrt_source=~\lede_source; ls $your_openwrt_source;
./scripts/feeds update,install 会根据feeds.conf里定义的openwrt源码URL下载,下载的文件主要位于
feeds 下。编译过程执行这些源码来编译即make你在menuconfig选的包,这些第三方包很多是其他人开发的,比如 wget curl
ppp 等,不在openwrt的feeds里,所以需要在编译过程中下载到 your_openwrt_source/dl/ 目录下,最好先用
-j8 (这个大家怎么念?)之类的多线程编译,节省时间将所有第三方包下过来,然后不带 -j 编译。
当遇到包下载不了报错时,如果显示了下载的URL最好,没显示赶紧趁着报错的curl没终止前在终端 ps|grep curl 一下就能看到下载链接,手动下载这个包放到 dl 下即可。
因为带 -j 2 以上多个CPU编译基本上会失败,其中很多无用的编译报错,但能节省时间。不带 -j 或 -j1的成功率高,但编译时间长。
所以一般用 -j8 下包,下完最好备份一下dl目录,make clean,dirclean 不会删除dl目录,但很多情况下源文件是 git
clone 的,有时第二天编译,想要更新一下,于是需要重置前次编译时所有文件的改动如,这相当于从头开始,就需将dl目录链接回去。然后再不带 -j
编译,这时候编译才走上正轨,集中精神解决遇到的编译报错吧。
git clone src_url make -j108 V=s cd $your_openwrt_sourcecp -Rf ./dl $lede_bak# 得先备份 dl git clean -df git stash -u# 区别是,git可能会根据gitignore配置(尤其全局配置)忽略部分文件/目录无法移除,make clean,dirclean 无法重置部分被patch过的文件 git pull --all git reset --hard lede-17.01 git status; make clean make dirclean ln -s $lede_bak/dl ./ make V=s | tee make.log | grep -i "error:\|warning\|fail"新手建议先不对默认的 .config 做太大改动,也即 make menuconfig 不改太多,仅选择型号,选择编译 sdk和imagebuilder就可以,保证第一次成功。
尝试 make menuconfig 选择要安装的包,第一次保存会生成 ./.config 文件,或熟了可直接手动修改 .config
,注意手动改必须运行一次 make menuconfig 退出,它会自己检验一些关联的包自动移除出或增加到 .config
的包编译列表,如果检查到什么,退出会要求保存然后它会同步某些文件,如果 .config 没有任何问题,则会直接退出。
备份好最终的 .config 改名为 my.config,每次重编译前使用 diff 工具与实时修改的 .config 对比,更有效率
如果想增加第三方包编译,你至少需要知道如何生成修改 .patch文件,修改 Makefile 的版本和源码地址等。
比如你想自己编译luci-app-syncdial,至少得知道如何替换openwrt源码的ppp包,新增shellsync 包和 luci-app-syncdial ,再进行编译。
编译成功后的源码目录,与SDK一样,可以单独编译新的包,但分2种情况
1 新增的包在openwrt源码里没有同样的包,如 syncdial,直接复制新增包的目录(即它的编译模板)到 package 下,执行 ./scripts/feeds update -i 更新包索引即可。
2 新增的包需替换openwrt源码里的包,比如修改并发多拨的ppp,你可以用其他源里(也可以是手动改好的)编译模板手动替换
./package/network/services/ppp 从默认feeds下载的编译模板,也可以自己写一堆 .patch
补丁文件加到编译模板的 patches 目录下 编译模板理解看 https://wiki.openwrt.org/doc/devel/packages
还想继续加系统定制,且如果开发不了编译模板的话,就得自己写patch文件,并且最好放在上面修改新增编译模板步骤的后面,然后自己用patch命令测试补丁、打补丁,修改系统要打包的文件,比如 base-files
另一种方式是定制固件刷入路由器后的文件,可定制的大部分是配置文件,具体在openwrt路由页面上备份一次解压备份文件就明白了,与imagebuilder一样,放在 files 目录下,打包时会自动调用。
包编译模板执行过程中的主要目的是,修改ppp的源码进行编译并将一些自定义文件增加到编译结果中 ,ppp的编译源码,由
./dl/ppp-2.4.7.tar.gz 处理到
./build_dir/target-mips_24kc_musl-1.1.16/ppp-default/ppp-2.4.7
之类的目录,注意这个源码需要由编译模板在自动处理过程中生成编译,手动改没用,只要源码没编译成功,每次重编译会自动删除生成。
最好在编译新增包前,执行 ./scripts/feeds {update,install} -a ,再增加修改各种编译模板,完后 ./scripts/feeds update -i 即可,这样会从编译模板里读取要编译包的版本更新到索引。
之后无需再执行 {update,install} -a ,如果执行了会重新从openwrt源码URL下载索引,然后比如ppp的编译模板,会下载安装到官方源码版本。
剩下编译完成有sdk和imagebuilder,再编译第三方包和重打包镜像是很简单的。