打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
openWrt从源码下载到编译(开发环境搭建)

更新:最近openwrt  SVN失效了,不过官方有新的教程

https://wiki.openwrt.org/zh-cn/doc/howto/buildroot.exigence

OpenWrt编译系统 – 安装

OpenWrt build system是OpenWrt这个Linux发行版的编译程序。OpenWrt build system 能够在Linux、BSD或者Mac OS X系统上正常工作。但是请注意你必须使用一个对大小写敏感的文件系统。

我们建议您使用一个Linux发行版(例如:Debian)。您可以选择在您的电脑上单独安装一个,或者安装在虚拟机当中。(例如VMware或者Qemu).

Cygwin(Windows)将不会被支持,因为它缺少一个对大小写敏感的文件系统。

旧的Buildroot版本的相关信息请参见: buildroot.exigence.old

 常见问题、性能信息以及一些常见优化请参见: development

环境要求

编译一个可以安装的OpenWrt固件镜像文件(大约8MB大小的),你需要:

  • 一个纯净的OpenWrt编译系统大约需要200MB的空间。
  • 一个包含feeds的OpenWrt编译系统大约需要300MB的空间。
  • 编译feeds中的软件包大约需要2.1GB的空间用于存放下载来的源代码。
  • 构建OpenWrt并生成固件文件需要大约3-4 GB的空间。
  • 编译OpenWrt需要大约1-4 GB的内存。

在Linux上的安装步骤


1. 请使用一个非root用户来完成这些工作!
2. 这里的所有命令都在OpenWrt编译系统的根目录下运行(例如~/openwrt/trunk/
3. 编译系统的绝对路径中不能含有空格!
4. 如果你使用root用户下载了源码,请把你下载来的源码的所有者更改为一个非root用户。(sudo chown -R user:user /openwrt/)
  1. 安装git以下载OpenWrt源码。安装编译工具以进行交叉编译:
    sudo apt-get updatesudo apt-get install git-core build-essential libssl-dev libncurses5-dev unzip
    feeds中的部分软件包可能只能通过subversion (缩写: svn)或者mercurial下载源代码。如果你需要安装这些软件包,你同时也应当安装svn和mercurial:
    sudo apt-get install subversion mercurial
  2. 通过git来下载OpenWrt bleeding edge(trunk版本):(参见Downloading Sources以获得更多选择):
    git clone git://git.openwrt.org/openwrt.git
    这将会创建'openwrt'这个目录。这个目录将会是OpenWrt的编译主目录。
    OpenWrt的交叉编译工具链也已经被包含在内。
  3. (可选)下载并安装所有可用的"feeds"(参见OpenWrt Feeds以获取更多选择):
    cd openwrt./scripts/feeds update -a./scripts/feeds install -a
  4. 运行下面的命令让OpenWrt编译系统检查你的编译环境中缺失的软件包:
    make defconfigmake prereqmake menuconfig
    在这里你讲可以选择你想要编译的软件包。
  5. 然后你就可以开始编译了。参见:build

各操作系统及编译条件对照表

下表所示为linux操作系统各发行版所需要的编译环境条件及软件包对照表:

名称DebianSUSERed HatOS X (via MacPorts)FedoraNetBSDArchGentoo
asciidocasciidocasciidocasciidocasciidocasciidoc?asciidocapp-text/asciidoc
GNU Bashbashbashbashbashbashbashbashapp-shells/bash
GNU bcbcbc  bc bcsys-devel/bc
GNU Binutilsbinutilsbinutilsbinutilsbinutilsbinutils?binutilssys-devel/binutils
bzip2bzip2bzip2bzip2bzip2bzip2?bzip2app-arch/bzip2
fastjarfastjarfastjarlibgcjfastjarlibgcj?fastjarapp-arch/fastjar
flexflexflexflexflexflex?flexsys-devel/flex
gitgit-coregit-coregitgit-coregit?gitdev-vcs/git
GNU C++ Compilerggcc-c?gccsys-devel/gcc   
GNU C Compilergccgccgcc?gcc?gccsys-devel/gcc
getoptutil-linuxutil-linuxutil-linuxgetoptutil-linuxgetoptutil-linuxsys-apps/util-linux
GNU awkgawkgawkgawkgawkgawk?gawksys-apps/gawk
gtk2.0-devlibgtk2.0-devgtk2-develgtk2-develgtk2gtk2-devel?gtk2x11-libs/gtk+:2
intltool-updateintltoolintltoolintltoolintltoolintltool?intltooldev-util/intltool
jikesjikespgjikes?jikes?aur/jikesdev-java/jikes
libz, libz-devzlib1g-devzlib-develzlib-develzlibzlib-devel?zlibsys-libs/zlib
Mercurial / hg mercurial  hg  dev-vcs/mercurial
makemakemakemakegmakemakegmakemakesys-devel/make
mkisofsgenisoimagegenisoimage??genisoimage?cdrkitvirtual/cdrtools
ncurseslibncurses5-devncurses-develncurses-develncursesncurses-devel?ncursessys-libs/ncurses
openssl/ssl.hlibssl-devlibopenssl-developenssl-developensslopenssl-devel?openssldev-libs/openssl
patchpatchpatchpatchpatchutilspatch?patchsys-devel/patch
perl-ExtUtils-MakeMakerperl-modulesperl-ExtUtils-MakeMakerperl-ExtUtils-MakeMakerp5-extutils-makemakerperl-ExtUtils-MakeMaker?perl-extutils-makemakervirtual/perl-ExtUtils-MakeMaker
python2.6-devpython2.6-devpython-devel?python26python-devel?python2dev-lang/python:2.6
rsyncrsyncrsyncrsyncrsyncrsync?rsyncnet-misc/rsync
rubyrubyruby?rubyruby?rubydev-lang/ruby
sdccsdccsdccsdccsdccsdcc?sdccdev-embedded/sdcc
unzipunzipunzipunzipunzipunzip?unzipapp-arch/unzip
GNU Wgetwgetwgetwgetwgetwget?wgetnet-misc/wget
xgettextgettextgettext-toolsgettextgettextgettext?gettextsys-devel/gettext
xsltprocxsltproclibxslt-tools?libxsltlibxslt?libxsltdev-libs/libxslt
zlib, zlib-staticzlib1g-devzlib-develzlib-develzlib-develzlib-devel,zlib-static?zlibsys-libs/zlib

但是,make config并不会检查所有软件包,比如:

PackagePrerequisiteDebian (8)SUSERed HatOSXFedoraNetBSDArchGentoo
boostbjam / boost-jamlibboost1.55-dev   boost-jamboostdev-util/boost-build
intltool[Perl] XML::Parserlibxml-parser-perl perl-XML-Parser perl-XML-Parser intltooldev-perl/XML-Parser
libftdilibusb-configlibusb-dev   libusb-devel libusbdev-libs/libusb-compat
liloas86,ld86bin86   dev86 bin86sys-devel/bin86
lilobccbcc   dev86 aur/bccsys-devel/dev86
lilouudecodesharutils   sharutils sharutilsapp-arch/sharutils
classpathjavac, gcjopenjdk-7-jdk   java-1.7.0-openjdk-devel jdk7-openjdkdev-java/oracle-jdk-bin, sys-devel/gcc[gcj], and one (or both) of dev-java/icedtea-bin:7 and dev-java/icedtea:7
mac80211b43-fwcutter    b43-fwcutter b43-fwcutternet-wireless/b43-fwcutter
jamvmzip    zip  app-arch/zip

安装编译所需软件包的例子

  • Arch Linux
    pacman -S --needed subversion asciidoc bash bc binutils bzip2 fastjar flex git gcc util-linux gawk intltool zlib make cdrkit ncurses openssl patch perl-extutils-makemaker rsync sdcc unzip wget gettext libxslt boost libusb bin86 sharutils b43-fwcutter findutils
  • Debian 7 Wheezy:
    apt-get install libncurses5-dev zlib1g-dev gawk
  • Fedora 22 - 64Bit :
    dnf install -y subversion binutils bzip2 gcc gcc-c++ gawk gettext flex ncurses-devel zlib-devel zlib-static make patch unzip perl-ExtUtils-MakeMaker glibc glibc-devel glibc-static quilt sed sdcc intltool sharutils bison wget openssl-devel
  • openSUSE 13.2
    zypper install asciidoc bash bc binutils bzip2 fastjar flex git-core gcc-c++ gcc util-linux gawk gtk2-devel intltool jikes zlib-devel mercurial make genisoimage ncurses-devel libopenssl-devel patch perl-ExtUtils-MakeMaker python-devel rsync ruby sdcc unzip wget gettext-tools libxslt-tools zlib-devel subversion
  • Ubuntu 12.04LTS:
    sudo apt-get install build-essential subversion git-core libncurses5-dev zlib1g-dev gawk flex quilt libssl-dev xsltproc libxml-parser-perl mercurial bzr ecj cvs unzip
  • Ubuntu 64bit:
    sudo apt-get install build-essential subversion libncurses5-dev zlib1g-dev gawk gcc-multilib flex git-core gettext libssl-dev
  • Centos x86-64:
    yum install subversion binutils bzip2 gcc gcc-c++ gawk gettext flex ncurses-devel zlib-devel make patch unzip perl-ExtUtils-MakeMaker  glibc glibc-devel glibc-static quilt ncurses-lib sed sdcc intltool sharutils bison wget git-core openssl-devel xz
  • Gentoo:
    $ echo     app-arch/{bzip2,fastjar,sharutils,unzip,zip}     app-text/asciidoc dev-java/{icedtea:7,jikes,oracle-jdk-bin}     dev-libs/{libusb-compat,libxslt,openssl} dev-util/intltool     dev-vcs/{git,mercurial} net-misc/{rsync,wget}     net-wireless/b43-fwcutter sys-apps/{gawk,util-linux}     sys-devel/{bc,bin86,binutils,dev86,flex,gcc[gcj],gettext}     sys-libs/{ncurses,zlib} virtual/{cdrtools,perl-ExtUtils-MakeMaker}     x11-libs/gtk+:2         | sed 's/\s/\n/g'             | sort                 | sudo tee /etc/portage/sets/openwrt-prerequisites                     && sudo emerge -DuvNa '@openwrt-prerequisites'

已知的不能编译OpenWrt的Linux发行版

  • alpine linux使用musl作为libc的替代品。一些工具无法被编译通过。(例如mtd-utils, e2fsprogs)也许相关的检测代码需要被重写。(gcc -dumpmachine outputs a result where some scripts will fail - tools/sed)

下载源代码的更多选择

GIT

使用以下命令之一可以通过git下载一份你想要的源码:

trunk (主开发分支)

开发版的源码 (trunk)包括了文档以及实验性的 补丁

从官方源下载

git clone git://git.openwrt.org/openwrt.git

更多额外的软件包在feeds中提供。(例如Luci, packages, routing, management等feed源)。请使用OpenWrt编译系统下载正确的feed源。

15.05分支(Chaos Calmer)

从官方源下载

git clone git://git.openwrt.org/15.05/openwrt.git

14.07分支(Barrier Breaker)

从官方源下载

git clone git://git.openwrt.org/14.07/openwrt.git

12.09分支(Attitude Adjustment)

从官方源下载

git clone git://git.openwrt.org/12.09/openwrt.git

额外的软件包

git clone git://git.openwrt.org/12.09/packages.git

SVN

参见:Deprecated Buildroot-Installation Howto

 连接我们的SVN服务器可能会导致你的IP被SVN服务器以及我们的论坛禁止访问。与Git相比,使用SVN检出一份完整的代码将会用时更久。OpenWrt开发者建议你们使用Git下载源代码。

--------------------------------------------------------------------------------------------------

以下是旧方法

1、安装编译环境

编译环境安装在ubuntu上,虚拟机或真实系统都可。

  1. root@lhc-vm:mkdir /work  
  2. root@lhc-vm:/work# apt-get install subversion build-essential libncurses5-dev zlib1g-dev gawk git ccache gettext libssl-dev xsltproc   

源代码的说明中提到需要安装的包有:
gcc, binutils, bzip2, flex, python, perl, make,grep, unzip, gawk, subversion, openssl-devel

2、下载源码

在 Openwrt 的官方网站 https://openwrt.org 上可以看到目前的最新稳定版为BarrierBreaker 14.07,在自己的虚拟机Ubuntu 系统中创建一个工作目录 

  1. root@zjh-vm:/home/work# mkdir openwrt   


最近貌似SVN下载不好使了,我们还可以用git下载源码,从这里获取不同版本的克隆地址。https://dev.openwrt.org/wiki/GetSource

然后

  1. #git clone git://git.openwrt.org/15.05/openwrt.git  

这样就可以代替后面SVN的步骤。


然后使用 svn工具下载最新稳定版的源代码,下载完成后,进入 barrier_breaker目录 

  1. root@zjh-vm:/home/work# cd openwrt   
  2. root@zjh-vm:/home/work/openwrt# svn co svn://svn.openwrt.org/openwrt/branches/barrier_breaker   
  3. root@zjh-vm:/home/work/openwrt# cd barrier_breaker/   


首先可以执行make help查看一些帮助 

  1. root@zjh-vm:/home/work/openwrt/barrier_breaker# make help   


This is the buildsystem for the OpenWrt Linux distribution. 
 
Please use "make menuconfig" to configure your appreciated 
configuration for the toolchain and firmware. 
 
You need to have installed gcc, binutils, bzip2, flex, python, perl, make, 
find, grep, diff, unzip, gawk, getopt, subversion, libz-dev and libc headers. 
 
Run "./scripts/feeds update -a" to get all the latest package definitions 
defined in feeds.conf / feeds.conf.default respectively 
and "./scripts/feeds install -a" to install symlinks of all of them into 
package/feeds/. 
 
Use "make menuconfig" to configure your image. 
 
Simply running "make" will build your firmware. 
It will download all sources, build the cross-compile toolchain,   
the kernel and all choosen applications. 
 
You can use "scripts/flashing/flash.sh" for remotely updating your embedded 
system via tftp. 
 
The OpenWrt system is documented in docs/. You will need a LaTeX distribution 
and the tex4ht package to build the documentation. Type "make -C docs/" to build it. 
 
To build your own firmware you need to have access to a Linux, BSD or MacOSX system 
(case-sensitive filesystem required). Cygwin will not be supported because of 
the lack of case sensitiveness in the file system. 
 
 
Sunshine! 
  Your OpenWrt Project 
  http://openwrt.org 

执行svn info查看当前下载的源码的修订版本 

  1. root@zjh-vm:/home/work/openwrt/barrier_breaker# svn info   


Path: . 
Working Copy Root Path: /home/work/openwrt/barrier_breaker 
URL: svn://svn.openwrt.org/openwrt/branches/barrier_breaker 
Relative URL: ^/branches/barrier_breaker 
Repository Root: svn://svn.openwrt.org/openwrt 
Repository UUID: 3c298f89-4303-0410-b956-a3cf2f4a3e73 
Revision: 43660 
Node Kind: directory 
Schedule: normal 
Last Changed Author: nbd 
Last Changed Rev: 43618 
Last Changed Date: 2014-12-11 22:39:40 +0800 (四, 11 12 月  2014) 

Openwrt会经常更新源码,可以执行 svn update 更新已下载的源码 

  1. root@zjh-vm:/home/work/openwrt/barrier_breaker# svn update   


Updating '.': 
Restored '.gitignore' 
U        target/linux/generic/patches-3.10/645-bridge_multicast_to_unicast.patch 
U        target/linux/generic/patches-3.10/644-bridge_optimize_netfilter_hooks.patch 
……………………………… 
U        tools/firmware-utils/src/mktplinkfw.c 
U        toolchain/Makefile 
Updated to revision 44071. 

更新Feeds 

  1. root@zjh-vm:/home/work/openwrt/barrier_breaker# ./scripts/feeds update -a   


Updating feed 'packages' from 'https://github.com/openwrt/packages.git;for-14.07' ... 
remote: Counting objects: 123, done. 
remote: Compressing objects: 100% (76/76), done. 
remote: Total 123 (delta 70), reused 92 (delta 39) 
Receiving objects: 100% (123/123), 13.89 KiB | 0 bytes/s, done. 

Resolving deltas: 100% (70/70), completed with 19 local objects. 

From https://github.com/openwrt/packages 
    ad7c25a..71719eb    for-14.07    -> origin/for-14.07 
Updating ad7c25a..71719eb 

使下载的软件包可以出现在make menuconfig配置菜单中 

  1. root@zjh-vm:/home/work/openwrt/barrier_breaker# ./scripts/feeds install <PACKAGENAME>   


 
或者 
  1. root@zjh-vm:/home/work/openwrt/barrier_breaker# ./scripts/feeds install –a   


 
注意:./scripts/feeds 这个脚本只是使软件包可以出现在 make menuconfig 配置菜单中,而并不是真正的安装或者编译
软件。 

3、配置

Openwrt默认不允许使用root用户操作,若要使用root用户操作可以修改 include/prereq-build.mk这个文件 

  1. root@zjh-vm:/home/work/openwrt/barrier_breaker# vi include/prereq-build.mk   


  1. define Require/non-root   
  2.   [ "$$(shell whoami)" != "root" ]   
  3. endef   
  4. $(eval $(call Require,non-root, \   
  5.   Please do not compile as root. \   
  6. ))   


这里首先定义了一段检查root用户的代码,然后通过 call函数调用这段代码。我们把调用部分屏蔽即可使用root用户
编译。 将如上内容改为如下内容保存。
  1. define Require/non-root   
  2.   [ "$$(shell whoami)" != "root" ]   
  3. endef   
  4. #$(eval $(call Require,non-root, \   
  5.   Please do not compile as root. \   
  6. ))   


注:最新的版本已经取消这个限制了。 

执行make menuconfig打开配置菜单 

  1. root@zjh-vm:/home/work/openwrt/barrier_breaker# make menuconfig   



每个选项前面都有一个[ ]标签,我们可以选择 y,m和n 
  选择 y设置为<*>,表示将软件包编译进固件image 文件; 
  选择 m 设置为<M>,表示软件包会被编译,但不会编译进固件 image 文件。Openwrt 会把设置为 M选项的软件包编译后再制作成一个以 ipk为后缀(.ipk)的文件,然后在设备上通过 opkg 来安装到设
  选择 n 设置为<>,表示不编译该软件包。 
 
配置主要包括4 个部分 
  Target system(目标系统) 
  Package selection(软件包选择) 
  Build system settings(编译系统设置) 
  Kernel modules(内核模块配置) 

我们这里先简单配置一下,具体的以后再讲。 
首先配置目标系统,根据自己的设备选择 SOC 类型,我使用的设备使用是 RT5350,是 Ralink 公司的 SOC,8MB  Flash,32MB SDRAM,从http://wiki.openwrt.org/toh/hame/mpr-a2 这个地址得知我们的设备是openwrt支持的设备


因此Target System 配置如下

 

Target Profile 对应上面列表的mpr-a2 
 
当配置完成并保存配置后,openwrt将根据你的配置创建一个配置文件.config 

4、编译

可以直接执行 make 进行编译 

  1. root@zjh-vm:/home/work/openwrt/barrier_breaker# make   


 
添加make 编译选项 
  1. root@zjh-vm:/home/work/openwrt/barrier_breaker# make -j 3 V=s   


-j:多进程编译,这样编译快些。-j指定的参数一般为你的 CPU核数+1,比如双核CPU就指定为3 V=s:输出编译的详细信息,这样编译出错时,我们才知道错在哪里 
 
编译成功后,会在bin目录下生成固件文件 

其中的 openwrt-ramips-rt305x-mpr-a2-squashfs-sysupgrade.bin就是用来烧写到设备的固件。 

5 、清理工程 

  1. root@zjh-vm:/home/work/openwrt/barrier_breaker# make clean   


删除/home/work/openwrt/barrier_breaker/bin和/ home/work/openwrt/barrier_breaker/ build_dir 这2 个目录 
 
  1. root@zjh-vm:/home/work/openwrt/barrier_breaker# make dirclean   


删除/home/work/openwrt/barrier_breaker/bin、/ home/work/openwrt/barrier_breaker/ build_dir、 
/ home/work/openwrt/barrier_breaker/staging_dir、/ home/work/openwrt/barrier_breaker/staging_di r/toolchain和 
/ home/work/openwrt/barrier_breaker/staging_dir 
 
  1. root@zjh-vm:/home/work/openwrt/barrier_breaker# make distclean   


删除所有编译的或者配置的和下载的 feeds内容以及下载的软件包源码,还有.config配置文件。 

6 、编译/清理单个软件包 
以uci这个软件包为例 

  1. root@zjh-vm:/home/work/openwrt/barrier_breaker# make package/system/uci/compile V=s    编译   
  2. root@zjh-vm:/home/work/openwrt/barrier_breaker# make package/system/uci/clean V=s    清理   



本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
小神器入手:迈入OpenWRT世界的第一步
完全新手教程:编译openwrt全过程
OpenWrt:Ubuntu 12.04搭建OpenWrt编译环境
luci
【详细教程】编译openwrt + njit
深入理解openwrt架构(一)--安装准备和目录分析
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服