找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 20164|回复: 26

openwrt编译经验谈

  [复制链接]
发表于 2017-5-30 18:27 | 显示全部楼层 |阅读模式
本帖最后由 uof 于 2017-6-1 02:11 编辑

看到几个帖子的问题,有一些基本概念讲一下吧
以下说明都基于你下载的源码目录,比如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 编译,这时候编译才走上正轨,集中精神解决遇到的编译报错吧。
  1. git clone src_url
  2. make -j108 V=s
  3. cd $your_openwrt_sourcecp -Rf ./dl $lede_bak    # 得先备份 dl
  4. git clean -df
  5. git stash -u    # 区别是,git可能会根据gitignore配置(尤其全局配置)忽略部分文件/目录无法移除,make clean,dirclean 无法重置部分被patch过的文件
  6. git pull --all
  7. git reset --hard lede-17.01
  8. git status;
  9. make clean
  10. make dirclean
  11. ln -s $lede_bak/dl ./
  12. 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,再编译第三方包和重打包镜像是很简单的。

Update1:改了下文章格式,@zhouruixi 建议dl目录做软连接,这个比复制更好。
Update2:根据 @greenice 提示 make dirclean 不会删除 dl 目录修改。






评分

参与人数 2恩山币 +3 收起 理由
papa*** + 2 感谢你的分享,无论怎样,你都是最无私的人!来,说说,你E盘上还有啥一起给我吧!
zu*** + 1 强大的恩山!(以下重复1万次)

查看全部评分

我的恩山、我的无线 The best wifi forum is right here.
发表于 2017-5-30 20:49 | 显示全部楼层
.config 文件在哪??

点评

uof
your_openwrt_source/.config ,你得先 make menuconfig 保存一下才会生成  详情 回复 发表于 2017-5-30 20:57
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2017-5-30 20:57 | 显示全部楼层
丰花 发表于 2017-5-30 20:49
.config 文件在哪??

your_openwrt_source/.config ,你得先 make menuconfig 保存一下才会生成

点评

原来是隐藏文件,难怪一直找不到,多谢  详情 回复 发表于 2017-5-30 21:07
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-5-30 21:07 | 显示全部楼层
uof 发表于 2017-5-30 20:57
your_openwrt_source/.config ,你得先 make menuconfig 保存一下才会生成

原来是隐藏文件,难怪一直找不到,多谢
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-5-30 21:11 | 显示全部楼层
dl文件夹建议放到buildroot外边,然后做个软连接过去,防止各种误删

关于configure,从官方wiki摘抄一段
https://lede-project.org/docs/guide-developer/use-buildsystem

Configure using config diff file
Beside make menuconfig another way to configure is using a configuration diff file. This file includes only the changes compared to the default configuration. A benefit is that this file can be version-controlled in your downstream project. It's also less affected by upstream updates, because it only contains the changes.
Creating diff file
This file is created using the ./scripts/diffconfig.sh script.
./scripts/diffconfig.sh > diffconfig # write the changes to diffconfig
Note: Since r2752 LEDE firmware make process automatically creates the configuration diff file config.seed file to the target image directory.
Using diff file
These changes can form the basis of a config file (<buildroot dir>/.config). By running make defconfig these changes will be expanded into a full config.
cp diffconfig .config   # write changes to .config
make defconfig   # expand to full config
These changes can also be added to the bottom of the config file (<buildroot dir>/.config), by running make defconfig these changes will override the existing configuration.
cat diffconfig >> .config   # append changes to bottom of .config
make defconfig   # apply changes

点评

对头 软连接  详情 回复 发表于 2017-10-29 09:27
uof
ln更有效率,改了下原文 diffconfig.sh 好像是输出 .config 配置与原始配置diff用的,现在我索性直接改好一个完整的,编译新的先复制过去,否则按原先好像得 make defconfig; mv .config .config.old; make defconf  详情 回复 发表于 2017-5-30 21:24
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-5-30 21:16 | 显示全部楼层
其实很简单 以前一直不成功 其实是不能fan greatwall而已  一直不得要领  后来才知道 很多包下不下来导致编译失败  编译的机器能fan greatwall 速度快  很简单的事情编译通用版  

点评

uof
要省事直接 imagebuilder 就可以了,全源码编译首次至少1个小时,两者区别就是,snapshot 终究比 17.01.1 要多更新解决bug,并且 snapshot 内核更高,等升级到 4.9 ,就可以BBR了,稳定版就得等着。。。 然后加上需  详情 回复 发表于 2017-5-30 21:28
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2017-5-30 21:24 | 显示全部楼层
zhouruixi 发表于 2017-5-30 21:11
dl文件夹建议放到buildroot外边,然后做个软连接过去,防止各种误删

关于configure,从官方wiki摘抄一段 ...

ln更有效率,改了下原文
diffconfig.sh 好像是输出 .config 配置与原始配置diff用的,现在我索性直接改好一个完整的,编译新的先复制过去,否则按原先好像得 make defconfig; mv .config .config.old; make defconfig 搞2次文件才是对的
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2017-5-30 21:28 | 显示全部楼层
星雨≠ 发表于 2017-5-30 21:16
其实很简单 以前一直不成功 其实是不能fan greatwall而已  一直不得要领  后来才知道 很多包下不下来导致编 ...

要省事直接 imagebuilder 就可以了,全源码编译首次至少1个小时,两者区别就是,snapshot 终究比 17.01.1 要多更新解决bug,并且 snapshot 内核更高,等升级到 4.9 ,就可以BBR了,稳定版就得等着。。。
然后加上需要的正常功能,除非专业做这个开发 过度折腾太浪费时间。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-5-31 14:46 | 显示全部楼层
学习了 谢谢分享
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-5-31 21:02 | 显示全部楼层
make dirclean  不会删 dl 文件夹
放心用

点评

uof
看了下Makefile,的确不会删dl,我再更新下  详情 回复 发表于 2017-6-1 01:27
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-5-31 23:22 | 显示全部楼层
感谢分享经验。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2017-6-1 01:27 | 显示全部楼层
greenice 发表于 2017-5-31 21:02
make dirclean  不会删 dl 文件夹
放心用

看了下Makefile,的确不会删dl,我再更新下
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-6-2 22:00 | 显示全部楼层
感觉是给我说的
问下编译成功但是uboot刷固件提示
页面未找到

请求的页面不存在。
======
(改了几行配置代码)
之前编译的都能刷,后来为了搞明白一些变量
就是无线中的那个随着mac变名字
加了一行echo xxxx于是编译成功后刷提交固件以后出现上面的,是这个原因?

点评

uof
我没用uboot,也没看明白你说的 不过我觉得uboot的错误提示跟你加的代码应该关系不大  详情 回复 发表于 2017-6-3 23:41
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2017-6-3 23:41 | 显示全部楼层
wszgrcy 发表于 2017-6-2 22:00
感觉是给我说的
问下编译成功但是uboot刷固件提示
页面未找到

我没用uboot,也没看明白你说的
不过我觉得uboot的错误提示跟你加的代码应该关系不大

点评

感谢...虽然没看到.之前的解决了,未知问题注释掉后重编译好了.......现在有一下几种固件格式 openwrt-ar71xx-generic-tl-wr841nd-v7-initramfs-uImage.bin -squashfs-factory.bin -squashfs-sysupgrade.bin 其中  详情 回复 发表于 2017-6-4 00:04
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-6-4 00:04 | 显示全部楼层
uof 发表于 2017-6-3 23:41
我没用uboot,也没看明白你说的
不过我觉得uboot的错误提示跟你加的代码应该关系不大

感谢...虽然没看到.之前的解决了,未知问题注释掉后重编译好了.......现在有一下几种固件格式
openwrt-ar71xx-generic-tl-wr841nd-v7-initramfs-uImage.bin
-squashfs-factory.bin
-squashfs-sysupgrade.bin
其中只有第一个能从uboot刷入
第二个和第三个不能
并且2.3也不能从网页中那个升级刷入(以前用别人的包记得好像网页是tar.gz格式).
但是我把编译的所有格式都勾选了,但是生成出来的就这三个(x86版本我倒是出来很多,但是ar71xx..841v7就这三个格式,郁闷)
==========
第二个是编译出来的是4m的.然后我移植了别人源码的一个adbyby(费了n多功夫才知道该怎么搞).结果惊喜的发现.....软件包空间是0.而进uboot一看,确实是8m闪存,然后找到地方改了,编译后更加惊喜的发现.....除了第一个格式是4m其他两个都是8m.当然,现在的问题是.第一个木有解决,第二个编译出来还刷不上..
PS:虽然第一个中我刷上了后发现adbyby移植成功,但是8m和不能刷其他格式的问题还是没解决

点评

uof
没用过你这个路由,换个大闪存也就几百块,在空间上多花点钱减少时间消耗很合算 可以借鉴下别人怎么搞的,8M在软件上无非就是自己做patch在编译前打上就行了 移植应用,最好对方有完整的feeds源,否则只能自己搞清  详情 回复 发表于 2017-6-4 03:31
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-4-26 17:07

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表