文档章节

编译OpenWRT过程问题解决

临峰不畏
 临峰不畏
发布于 2015/04/02 19:39
字数 2356
阅读 18444
收藏 39

本人是只菜鸟,没有接触过OpenWrt,只是平时都是在Linux下做开发。习惯了Linux的开发环境。

本人的操作系统是CentOS 6.4(好久都没有换过了)。本人按照网上牛人们的指点也开始下载编译OpenWRT。

如下为网上的资料:


sudo apt-get update      (更新)
安装编译需要的组件:
sudo apt-get install gcc 
sudo apt-get install g++ 
sudo apt-get install binutils 
sudo apt-get install patch 
sudo apt-get install bzip2 
sudo apt-get install flex 
sudo apt-get install bison 
sudo apt-get install make 
sudo apt-get install autoconf 
sudo apt-get install gettext 
sudo apt-get install texinfo 
sudo apt-get install unzip 
sudo apt-get install sharutils 
sudo apt-get install subversion 
sudo apt-get install libncurses5-dev 
sudo apt-get install ncurses-term 
sudo apt-get install zlib1g-dev 
sudo apt-get install gawk
sudo apt-get install asciidoc
sudo apt-get install libz-dev

编译环境搭建完成
mkdir openwrt 创建一个openwrt文件夹
cd openwrt    进入openwrt文件夹
svn co svn://svn.openwrt.org/openwrt/branches/backfire  下载官网的源码
./scripts/feeds update -a     更新软件包
./scripts/feeds install -a    安装软件包
make menuconfig 进入定制界面(里面可以选择芯片的型号,集成的组件等等,根据实际情况选择)
defconfig
make V=99   (开始编译)
剩下的就是等待了,第一次编译需要的时间相对比较长,这个跟你的电脑配置和网速有关。



由于原作者是用的Ubuntu作为开发环境,所以在安装上面的那些依赖工具包时都是用 apt-get 来安排的,在CentOS里采用 yum。其实都一样,只要知道依赖哪些包就行了。

本人checkout 的OpenWRT源码库路径为 : svn://svn.openwrt.org/openwrt/trunk

其它的都按上面的步骤做。


如下是我遇到的几个问题:


./scripts/feeds update -a失败

报:

$ ./scripts/feeds update -a
Updating feed 'packages' from 'https://github.com/openwrt/packages.git' ...
Cloning into './feeds/packages'...
fatal: Unable to find remote helper for 'https'
failed.

可能是git仓库路径不对,将https替换成git就可以了。

用 grep 命令搜

$ grep 'https://github.com' feeds/* -R
feeds/packages.tmp/location:https://github.com/openwrt/packages.git

那就把这个地方改一下啰。

再试一下。结果还是老样子,我想了一下,这个 feeds/packages.tmp/location 很可能是临时文。改它不会有效果的。

好像 feeds.conf.default 文件里也找到了。

$ grep 'https://github.com' feeds.conf.default -R
src-git packages https://github.com/openwrt/packages.git
src-git luci https://github.com/openwrt/luci.git
src-git routing https://github.com/openwrt-routing/packages.git
src-git telephony https://github.com/openwrt/telephony.git
src-git management https://github.com/openwrt-management/packages.git
src-git targets https://github.com/openwrt/targets.git

将里面所有https替换成git。

再试一下,OK了。


后记:其实还有更根本的解决方法,详见后期的博文《git 错误:Unable to find remote helper for 'https'


gconvert.c libiconv

我在第一次编译OpenWRT时,出现如下错误提示:

gconvert.c:66:2: error: #error GNU libiconv not in use but included iconv.h is from libiconv

我在网上找解决方案,结果一致地都是说,重新 ./configure 一下:

./configure --enable-iconv=no --with-libiconv=gnu
make

可问题的关键是:OpenWRT的trunk路径下没见有个 configure 呀!

后来,经过仔细推敲,发现是在编glib时没通过。

$ find -name "gconvert.c"
./build_dir/host/pkg-config-0.28/glib/glib/gconvert.c

那我就直接进到 ./build_dir/host/pkg-config-0.28/glib/ 路径下,发现该路径下有 configure 文件。

那我说直接在该路径下编译 glib

$ cd build_dir/host/pkg-config-0.28/glib/
./configure --enable-iconv=no --with-libiconv=gnu
make

这样,glib 就顺利通过了编译。

再回到 OpenWRT的trunk路径下,继续 make.


libubox安装错误

报错:

mkdir -p /home/hevake_lcj/Workspace/OpenWRT/trunk/dl
echo "Checking out files from the git repository..."; 
mkdir -p /home/hevake_lcj/Workspace/OpenWRT/trunk/tmp/dl && cd /home/hevake_lcj/Workspace/OpenWRT/trunk/tmp/dl && rm -rf libubox-2015-03-22 && [ \! -d libubox-2015-03-22 ] && git clone http://git.openwrt.org/project/libubox.git libubox-2015-03-22 --recursive && (cd libubox-2015-03-22 && git checkout b8d9b382e39823850331edc2a92379173daf1be3 && git submodule update) && echo "Packing checkout..." && rm -rf libubox-2015-03-22/.git &&     tar czf /home/hevake_lcj/Workspace/OpenWRT/trunk/tmp/dl/libubox-2015-03-22-b8d9b382e39823850331edc2a92379173daf1be3.tar.gz libubox-2015-03-22 && mv /home/hevake_lcj/Workspace/OpenWRT/trunk/tmp/dl/libubox-2015-03-22-b8d9b382e39823850331edc2a92379173daf1be3.tar.gz /home/hevake_lcj/Workspace/OpenWRT/trunk/dl/ && rm -rf libubox-2015-03-22; 
Checking out files from the git repository...
Cloning into 'libubox-2015-03-22'...
fatal: Unable to find remote helper for 'http'
make[3]: *** [/home/hevake_lcj/Workspace/OpenWRT/trunk/dl/libubox-2015-03-22-b8d9b382e39823850331edc2a92379173daf1be3.tar.gz] Error 128

从第二行看出,是用git clone工程:

git clone http://git.openwrt.org/project/libubox.git

整个第三行是将clone下来的源码打包tar.gz包。

于是,我访问了一下:http://git.openwrt.org/project/libubox 果然出现 404页面。看来还真没有?

我再访问了一下:http://git.openwrt.org/ 结果,发现列表里有这个工程:


进入链接 project/libubox.git:

我自己亲自 git clone 一下。

$ cd dl
$ mkdir tmp
$ cd tmp
$ git clone http://git.openwrt.org/project/libubox.git libubox
Cloning into 'libubox'...
fatal: Unable to find remote helper for 'http'

我在网上找了“fatal: Unable to find remote helper for 'http'”的解决方法。得知将 "http:" 换成 “git:” 即可。

于是,我再次 git clone

$ git clone git://git.openwrt.org/project/libubox.git

结果成功clone了。

然后,手动完成编译命令过程:

mkdir -p /home/hevake_lcj/Workspace/OpenWRT/trunk/tmp/dl
cd /home/hevake_lcj/Workspace/OpenWRT/trunk/tmp/dl
rm -rf libubox-2015-03-22
git clone git://git.openwrt.org/project/libubox.git libubox-2015-03-22 
echo "Packing checkout..." 
rm -rf libubox-2015-03-22/.git
tar czf libubox-2015-03-22-b8d9b382e39823850331edc2a92379173daf1be3.tar.gz libubox-2015-03-22
mv libubox-2015-03-22-b8d9b382e39823850331edc2a92379173daf1be3.tar.gz ../../dl/
rm -rf libubox-2015-03-22;

然后,回到OpenWRT的trunk路径下继续 make.


fatal: Unable to find remote helper for 'http'

编译报错:

make[3]: Entering directory `/home/hevake_lcj/Workspace/OpenWRT/trunk/package/network/config/netifd'
mkdir -p /home/hevake_lcj/Workspace/OpenWRT/trunk/dl
echo "Checking out files from the git repository..."; 
mkdir -p /home/hevake_lcj/Workspace/OpenWRT/trunk/tmp/dl \
 && cd /home/hevake_lcj/Workspace/OpenWRT/trunk/tmp/dl \
 && rm -rf netifd-2015-03-31 \
 && [ \! -d netifd-2015-03-31 ] \
 && git clone http://git.openwrt.org/project/netifd.git netifd-2015-03-31 --recursive \
 && (cd netifd-2015-03-31 \
 && git checkout 3a0f953722698eab6f3f623a1d6ec5a1b7102b77 \
 && git submodule update) && echo "Packing checkout..." \
 && rm -rf netifd-2015-03-31/.git \
 && tar czf /home/hevake_lcj/Workspace/OpenWRT/trunk/tmp/dl/netifd-2015-03-31-3a0f953722698eab6f3f623a1d6ec5a1b7102b77.tar.gz netifd-2015-03-31 \
 && mv /home/hevake_lcj/Workspace/OpenWRT/trunk/tmp/dl/netifd-2015-03-31-3a0f953722698eab6f3f623a1d6ec5a1b7102b77.tar.gz /home/hevake_lcj/Workspace/OpenWRT/trunk/dl/ \
 && rm -rf netifd-2015-03-31;

找到 package/network/config/netifd/Makefile,打开


将第8行的“http:”替换成"git:",然后再回到OpenWRT目录再make.



注:后来我还会反复遇到这个问题。火了!一条命令全部换掉!

$ grep -E "http:.*\.git" `find -name Makefile | xargs` | \
  awk -F: '!/.svn/{print $1}' | uniq | xargs \
  sed -i 's/http\(:.*\.git\)/git\1/g'

在trunk目录下,找出Makefile中有"http:xxxxx.git"的文件,并将所有的"http:xxxxx.git"替换成"git:xxxxx.git"

$ grep -E "https:.*\.git" `find -name Makefile | xargs` | \
  awk -F: '!/.svn/{print $1}' | uniq | xargs \
  sed -i 's/https\(:.*\)\.git/git\1\.git/g'

把 https 也替换成 git


opkg下载失败

Checking out files from the git repository...
Cloning into 'opkg-9c97d5ecd795709c8584e972bfdf3aee3a5b846d'...
fatal: Could not read from remote repository.

这时往上看一下,看make到哪儿了

make[3]: Entering directory `/home/hevake_lcj/Workspace/OpenWRT/trunk/package/system/opkg'

原来是 opkg 在 git clone 时可能是路径的问题,失败了。

我尝试打开 opkg 路径下的 Makefile,将

PKG_SOURCE_URL:=http://git.yoctoproject.org/git/opkg

改成:

PKG_SOURCE_URL:=git://git.yoctoproject.org/git/opkg

结果还是没有生效。

我手动搜opkg,找到官网: http://git.yoctoproject.org/cgit/cgit.cgi/opkg/ 打开,看到网页最下面有:

于是,我改 trunk/package/system/opkg/Makefile 文件,把 PKG_SOURCE_URL改成:

PKG_SOURCE_URL:=git://git.yoctoproject.org/opkg

继续 make,通过了!


linux-firmware clone失败

fatal: Unable to look up git.kernel.org (port 9418) (Temporary failure in name resolution)

我到 git.kernel.org 网站找到了 linux-firmware 的仓库 https://git.kernel.org/cgit/linux/kernel/git/balbi/linux-firmware.git/

看到最下面的 git 路径说明:


这与 Makefile 里指定的不统一。于是将Makefile里的git路径改过来


再 make

我现在都总结出经验来了。

凡是git clone失败的,如果是http头的问题,将http替换成git再试。

如果还是不行,就要检查一下git的路径是不是对的。简单的方法就是到 git 路径的根节点上去找出源码仓库,并得到其真实有效的git路径。

并将Makefile中的改过来就OK了。


linux-firmware fatal: reference is not a tree 问题

make[3]: Entering directory `/home/hevake_lcj/Workspace/OpenWRT/trunk/package/kernel/mac80211'
mkdir -p /home/hevake_lcj/Workspace/OpenWRT/trunk/dl
echo "Checking out files from the git repository..."; 
mkdir -p /home/hevake_lcj/Workspace/OpenWRT/trunk/tmp/dl \
  && cd /home/hevake_lcj/Workspace/OpenWRT/trunk/tmp/dl \
  && rm -rf linux-firmware-f404336ba808cbd57547196e13367079a23b822c \
  && [ \! -d linux-firmware-f404336ba808cbd57547196e13367079a23b822c ] \
  && git clone git://git.kernel.org/pub/scm/linux/kernel/git/balbi/linux-firmware.git linux-firmware-f404336ba808cbd57547196e13367079a23b822c --recursive \
  && (cd linux-firmware-f404336ba808cbd57547196e13367079a23b822c \
    && git checkout f404336ba808cbd57547196e13367079a23b822c \
    && git submodule update) \
  && echo "Packing checkout..." \
  && rm -rf linux-firmware-f404336ba808cbd57547196e13367079a23b822c/.git \
  && tar cjf /home/hevake_lcj/Workspace/OpenWRT/trunk/tmp/dl/linux-firmware-2015-03-20-f404336ba808cbd57547196e13367079a23b822c.tar.bz2 linux-firmware-f404336ba808cbd57547196e13367079a23b822c \
  && mv /home/hevake_lcj/Workspace/OpenWRT/trunk/tmp/dl/linux-firmware-2015-03-20-f404336ba808cbd57547196e13367079a23b822c.tar.bz2 /home/hevake_lcj/Workspace/OpenWRT/trunk/dl/ \
  && rm -rf linux-firmware-f404336ba808cbd57547196e13367079a23b822c; 
Checking out files from the git repository...
Cloning into 'linux-firmware-f404336ba808cbd57547196e13367079a23b822c'...
remote: Counting objects: 2344, done.
remote: Compressing objects: 100% (1164/1164), done.
remote: Total 2344 (delta 1182), reused 2272 (delta 1145)
Receiving objects: 100% (2344/2344), 42.07 MiB | 26 KiB/s, done.
Resolving deltas: 100% (1182/1182), done.
fatal: reference is not a tree: f404336ba808cbd57547196e13367079a23b822c
make[3]: *** [/home/hevake_lcj/Workspace/OpenWRT/trunk/dl/linux-firmware-2015-03-20-f404336ba808cbd57547196e13367079a23b822c.tar.bz2] Error 128
make[3]: Leaving directory `/home/hevake_lcj/Workspace/OpenWRT/trunk/package/kernel/mac80211'

fatal: reference is not a tree: f404....22c,意思好像是说git工程里没有 f404...22c 这么版本。那么我得检查一下这个版本号对不对。

在trunk/tmp/dl路径下下载的linux-firmware还没有删掉,我们进入该目录。并用git log查看一下提交日志,得到:

commit b8ac7c7e27dcd13fa3c843aaf62457e9c57ea4db
Author: Rasesh Mody <rmody@brocade.com>
Date:   Tue Sep 10 16:10:54 2013 -0700

    linux-firmware: Add Brocade FC/FCOE Adapter firmware files
    
    This patch adds firmware files for Brocade HBA and CNA drivers(BFA and BNA).
    
    Signed-off-by: Rasesh Mody <rmody@brocade.com>
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>

commit 8ff6cc3a5e1d9452ae8fb993532afc1f3ab3a71f
Merge: 1461bed e7c85b2
Author: Ben Hutchings <ben@decadent.org.uk>
Date:   Mon Sep 30 04:50:51 2013 +0100

    Merge branch 'moxa' of https://github.com/lunn/linux-firmware

commit 1461bed1300097efeba59c82ffa30c90cc7e3ae5
Author: Alex Deucher <alexander.deucher@amd.com>
Date:   Mon Aug 26 10:45:33 2013 -0400

    radeon: add ucode for KAVERI GPUs
    
    Add new ucode files and update the WHENCE entry.
    
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>

commit 66f87a226160b545ac02f3844ea601cbe10a5da2
Author: Alex Deucher <alexander.deucher@amd.com>
Date:   Mon Aug 26 10:42:44 2013 -0400

    radeon: add smc ucode for BONAIRE

在这里面,没有搜到 f404336ba808cbd57547196e13367079a23b822c 这个版本号

那,我就将其改成最新的版本号吧 b8ac7c7e27dcd13fa3c843aaf62457e9c57ea4db,但愿没有问题。


同时,将 trunk/tmp/dl/下的原下载目录改名(避免反复下载)、

$ cd tmp/dl
$ mv linux-firmware-f404336ba808cbd57547196e13367079a23b822c/ linux-firmware-b8ac7c7e27dcd13fa3c843aaf62457e9c57ea4db

好!我们再 make 一下。

© 著作权归作者所有

下一篇: Linux启动过程
临峰不畏
粉丝 221
博文 187
码字总数 98583
作品 0
深圳
架构师
私信 提问
加载中

评论(4)

临峰不畏
临峰不畏 博主

引用来自“求春磊”的评论

https://yq.aliyun.com/articles/33263 这人也是你吗

是的
求春磊
求春磊
https://yq.aliyun.com/articles/33263 这人也是你吗
bobcafe
bobcafe
fix first build pkg-config/glib fail

tools/pkg-config/Makefile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff –git a/tools/pkg-config/Makefile b/tools/pkg-config/Makefile
index 0edc807..11a325b 100755
— a/tools/pkg-config/Makefile
+++ b/tools/pkg-config/Makefile
@@ -20,7 +20,7 @@ include $(INCLUDE_DIR)/host-build.mk
HOST_LDFLAGS += $(HOST_STATIC_LINKING)
unexport PKG_CONFIG

-HOST_CONFIGURE_ARGS += –with-internal-glib
+HOST_CONFIGURE_ARGS += –with-internal-glib –enable-iconv=no –with-libiconv=gnu

define Host/Install
$(MAKE) -C $(HOST_BUILD_DIR) install \
林中首
林中首
过程好曲折~
OpenWRT开发之——创建软件包(有更新)

试验步骤 为了达到自己编写一个程序打包成ipk,并能在OpenWRT上运行的目的。我在网上找了些学习的资料。 本人参考的是:如何在OpenWRT上做开发 感谢该网友的耐心解答。虽然有现成的步骤,博主...

临峰不畏
2015/05/04
17.2K
2
OpenWrt学习目标(更新)

最近在研究OpenWrt,总感觉这一看一点那也了解一点,没有目的,也没有重心。 这里,给自己拟定一个目标,就朝着这个目标去学。 目标:在OpenWrt上开发服务器软件,该软件可以通过LuCI进行控制...

临峰不畏
2015/05/01
3.6K
8
OpenWrt系列教程汇总 & OpenWrt简体中文Wiki

OpenWrt系列教程汇总 OpenWrt简体中文Wiki 快速导航

AlphaJay
2011/07/26
42.7K
1
OpenWrt 和 LEDE 宣布正式合并,名字沿用 OpenWrt

2017 年 5 月,我们曾报道过 OpenWrt 和 LEDE 项目正在讨论合并,现在,二者已在官网正式宣布合并,合并后的项目仍用 OpenWRT 命名。合并后的 OpenWrt 项目将按照 LEDE 制定的规范进行管理。...

王练
2018/01/05
6K
13
Ubuntu 12.04下编译Openwrt教程 推荐

搭建编译环境 Ubuntu x64 12.04下的命令: sudo apt-get install subversion sudo apt-get install git sudo apt-get install flex sudo apt-get install g++ sudo apt-get install gawk su......

枫影Xda
2012/10/30
9.1K
1

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 如果是个帅小伙你愿意和他出去吗

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 小小编辑推荐:《Ghost 》游戏《死亡搁浅》原声 《Ghost 》游戏(《死亡搁浅》原声) - Au/Ra / Alan Walker 手机党少年们想听歌,请使劲儿戳...

小小编辑
19分钟前
17
3
java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
16
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部