OpenWrt编译经验谈

    看到几个帖子的问题,有一些基本概念讲一下吧
以下说明都基于你下载的源码目录,比如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,再编译第三方包和重打包镜像是很简单的。


本文章由作者:佐须之男 整理编辑,原文地址: OpenWrt编译经验谈
本站的文章和资源来自互联网或者站长的原创,按照 CC BY -NC -SA 3.0 CN协议发布和共享,转载或引用本站文章应遵循相同协议。如果有侵犯版权的资 源请尽快联系站长,我们会在24h内删除有争议的资源。欢迎大家多多交流,期待共同学习进步。

相关推荐