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的内存。
wip

在Linux上的安装步骤

→在~BSD上的安装步骤 →在Mac OS X上的安装步骤


1. 请使用一个非root用户来完成这些工作!
2. 这里的所有命令都在OpenWrt编译系统的根目录下运行(例如~/openwrt/trunk/
3. 编译系统的绝对路径中不能含有空格!
4. 如果你使用root用户下载了源码,请把你下载来的源码的所有者更改为一个非root用户。(sudo chown -R user:user /openwrt/)
  1. 安装 git以下载OpenWrt源码。安装 编译工具以进行交叉编译:
    sudo apt-get update
    sudo apt-get install git-core build-essential libssl-dev libncurses5-dev unzip
    feeds中的部分软件包可能只能通过 subversion (缩写:  svn)或者 mercurial下载源代码。如果你需要安装这些软件包,你同时也应当安装svn和mercurial:
    sudo apt-get install subversion mercurial
    • 关于编译环境的详细信息请参见: make和 build-essential
    • 关于git的详细信息请参见: git(7)
    • 关于subversion tool的详细信息请参见: svn和 subversion documentation (multiple languages)
  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 defconfig
    make prereq
    make menuconfig
    在这里你讲可以选择你想要编译的软件包。
  5. 然后你就可以开始编译了。参见: build

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

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

名称 Debian SUSE Red Hat OS X (via MacPorts) Fedora NetBSD Arch Gentoo
asciidoc asciidoc asciidoc asciidoc asciidoc asciidoc ? asciidoc app-text/asciidoc
GNU Bash bash bash bash bash bash bash bash app-shells/bash
GNU bc bc bc     bc   bc sys-devel/bc
GNU Binutils binutils binutils binutils binutils binutils ? binutils sys-devel/binutils
bzip2 bzip2 bzip2 bzip2 bzip2 bzip2 ? bzip2 app-arch/bzip2
fastjar fastjar fastjar libgcj fastjar libgcj ? fastjar app-arch/fastjar
flex flex flex flex flex flex ? flex sys-devel/flex
git git-core git-core git git-core git ? git dev-vcs/git
GNU C++ Compiler g gcc-c ? gcc sys-devel/gcc      
GNU C Compiler gcc gcc gcc ? gcc ? gcc sys-devel/gcc
getopt util-linux util-linux util-linux getopt util-linux getopt util-linux sys-apps/util-linux
GNU awk gawk gawk gawk gawk gawk ? gawk sys-apps/gawk
gtk2.0-dev libgtk2.0-dev gtk2-devel gtk2-devel gtk2 gtk2-devel ? gtk2 x11-libs/gtk+:2
intltool-update intltool intltool intltool intltool intltool ? intltool dev-util/intltool
jikes jikespg jikes ? jikes ? aur/jikes dev-java/jikes
libz, libz-dev zlib1g-dev zlib-devel zlib-devel zlib zlib-devel ? zlib sys-libs/zlib
Mercurial / hg   mercurial     hg     dev-vcs/mercurial
make make make make gmake make gmake make sys-devel/make
mkisofs genisoimage genisoimage ? ? genisoimage ? cdrkit virtual/cdrtools
ncurses libncurses5-dev ncurses-devel ncurses-devel ncurses ncurses-devel ? ncurses sys-libs/ncurses
openssl/ssl.h libssl-dev libopenssl-devel openssl-devel openssl openssl-devel ? openssl dev-libs/openssl
patch patch patch patch patchutils patch ? patch sys-devel/patch
perl-ExtUtils-MakeMaker perl-modules perl-ExtUtils-MakeMaker perl-ExtUtils-MakeMaker p5-extutils-makemaker perl-ExtUtils-MakeMaker ? perl-extutils-makemaker virtual/perl-ExtUtils-MakeMaker
python2.6-dev python2.6-dev python-devel ? python26 python-devel ? python2 dev-lang/python:2.6
rsync rsync rsync rsync rsync rsync ? rsync net-misc/rsync
ruby ruby ruby ? ruby ruby ? ruby dev-lang/ruby
sdcc sdcc sdcc sdcc sdcc sdcc ? sdcc dev-embedded/sdcc
unzip unzip unzip unzip unzip unzip ? unzip app-arch/unzip
GNU Wget wget wget wget wget wget ? wget net-misc/wget
xgettext gettext gettext-tools gettext gettext gettext ? gettext sys-devel/gettext
xsltproc xsltproc libxslt-tools ? libxslt libxslt ? libxslt dev-libs/libxslt
zlib, zlib-static zlib1g-dev zlib-devel zlib-devel zlib-devel zlib-devel,zlib-static ? zlib sys-libs/zlib

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

Package Prerequisite Debian (8) SUSE Red Hat OSX Fedora NetBSD Arch Gentoo
boost bjam / boost-jam libboost1.55-dev       boost-jam boost dev-util/boost-build
intltool [Perl] XML::Parser libxml-parser-perl   perl-XML-Parser   perl-XML-Parser   intltool dev-perl/XML-Parser
libftdi libusb-config libusb-dev       libusb-devel   libusb dev-libs/libusb-compat
lilo as86,ld86 bin86       dev86   bin86 sys-devel/bin86
lilo bcc bcc       dev86   aur/bcc sys-devel/dev86
lilo uudecode sharutils       sharutils   sharutils app-arch/sharutils
classpath javac, gcj openjdk-7-jdk       java-1.7.0-openjdk-devel   jdk7-openjdk dev-java/oracle-jdk-bin, sys-devel/gcc[gcj], and one (or both) of dev-java/icedtea-bin:7 and dev-java/icedtea:7
mac80211 b43-fwcutter         b43-fwcutter   b43-fwcutter net-wireless/b43-fwcutter
jamvm zip         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上,虚拟机或真实系统都可。

root@lhc-vm:mkdir /work
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 系统中创建一个工作目录 

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


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

然后

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

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


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

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


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

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查看当前下载的源码的修订版本 

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 更新已下载的源码 

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 

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配置菜单中 

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


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


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

3、配置

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

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


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


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


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

执行make menuconfig打开配置菜单 

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


openWrt从源码下载到编译(开发环境搭建)_第1张图片

每个选项前面都有一个[ ]标签,我们可以选择 y,m和n 
  选择 y设置为<*>,表示将软件包编译进固件image 文件; 
  选择 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支持的设备

openWrt从源码下载到编译(开发环境搭建)_第2张图片

因此Target System 配置如下

 

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

4、编译

可以直接执行 make 进行编译 

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


 
添加make 编译选项 
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 、清理工程 

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


删除/home/work/openwrt/barrier_breaker/bin和/ home/work/openwrt/barrier_breaker/ build_dir 这2 个目录 
 
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 
 
root@zjh-vm:/home/work/openwrt/barrier_breaker# make distclean 


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

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

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



你可能感兴趣的:(OpenWrt)