OpenWrt开发:06---OpenWrt源码的下载与编译

一、OpenWrt的代码管理工具

  • OpenWrt社区同时使用Subversion和Git两种工具来管理代码
  • 备注:OpenWrt的外围代码已经逐渐转到github提供的Git托管空间上,直到2016年3月将代码库由Subversion彻底转换为GIT

Subversion工具管理代码的目录:

Subversion管理代码非常灵活,通常会创建 tags、branches和trunk共3个目录管理代码

  • trunk目录:用 来保存开发的主线,一般最新的功能均在 trunk 目录提交
  • branches目录:存放分支, 用于功能开发完成之后创建分支、修改 BUG 及发布版本使用,或者某些功能开发分支
  • tags目录:保存标签复制,一个标签是一个项目在某一时间点的“快照”,用来给发布版 本的代码创建快照,以便多数开发人员基于这个版本进行开发修改及测试使用,一般 永远不再修改

Subversion管理OpenWrt代码的目录配置:

OpenWrt在上面那些目录的基础上,还增加了 docs、feeds 和 packages 这3个目录

  • 分支(branches目录):用于功能开发完成之后创建分支、修改 bug 及发布版本使用, 或者某些功能开发分支。OpenWrt 社区每隔两年左右会创建一个分支用于发布特定版本, 最新的代码线分支为 chaos_calmer。社区在 2015 年 9 月 12 日发布了 15.05 版本,但未使用 SVN 创建标签。最近3个分支信息地址见下表(修改时间为2015年10月12日)
  • docs目录:保存文档,使用 SVN 来查看修改历史信息, 现在 OpenWrt 已经不再使用这个目录
  • feeds目录:保存一些额外扩展的软件包,也逐渐不再使用, 其中代码已转到使用 Git 仓库来管理。地址为 https://github.com/openwrt
  • packages目录保存 OpenWrt 基础软件包,会被经常用到
  • 标签(tags目录):为发布版本代码,最近稳定版本标签有 backfire_10.03.1, attitude_adjustment_12.09。以后版本未创建标签
  • 主干(trunk目录):始终是最新的代码,OpenWrt 社区将最新的代码线命名为“Designated Driver”。最新代码包含实验性质的代码,可能会碰到编译或运行的问题,建议新手不要采用
  • OpenWrt版本对比表如下:

OpenWrt开发:06---OpenWrt源码的下载与编译_第1张图片

二、OpenWrt源码的下载

①通过GitHub网址下载

  • https://github.com/openwrt
git clone https://github.com/openwrt/openwrt.git

②下载我们的优化后的源码

  • GitHub中下载的官方源码,安装软件包时会从国外的网址进行下载,导致编译速度很慢,我们对官方源码进行优化,添加了两个文件(feeds.conf.default、feeds.conf),在其中添加了我们国内的镜像源,这样在编译时速度会快些
  • 百度云链接:https://pan.baidu.com/s/1JY8men7tJOxM_HBl1iP7Tg(提取码:9hj7 )
  • CSDN下载链接:https://download.csdn.net/download/qq_41453285/11870828

三、OpenWrt源码的配置及编译

  • 在前面的文章中我们搭建好了源码编译的SDK环境:https://blog.csdn.net/qq_41453285/article/details/102498957,然后下载上面我们自己优化后的源码,下面就可以开始配置和编译

第一步:

  • 解压下载的压缩包
tar xvf openwrt-17.01.4-17.01.4.tar

第二步:

  • 进入openwrt目录,输入下面命令更新和安装所有可选的软件包
cd openwrt-17.01.4-17.01.4

./scripts/feeds update       #更新最新的包定义

./scripts/feeds install -a   #安装所有的包
  • feedss命令将安装扩展代码包编译选项。如果不运行该命令,在menuconfig配置时将没有选择这些扩展包的机会

第三步:

  • 输入“make defconfig”,在这里会检查所需的编译工具是否齐备,并生成默认的编译配置文件“.config”
make defconfig

第四步:

  • 输入“make menuconfig”后系统将进入配置工具选项菜单来配置编译固件的内容,你可以在这里选择想要编译的目标平台,编译哪些工具和模块,在这里选择的内容就是接下来第四步编译的内容。如下图所示:
make menuconfig

OpenWrt开发:06---OpenWrt源码的下载与编译_第2张图片

  • 顶层菜单选项含义如下:
编译配置选项 含 义
Target System (x86) 目标平台,例如一般 Windows 系统均为 X86 系统架构,嵌入式路由器通常有ARM、MIPS系统和博通系统等
Target Images 编译生成物控制,根据目标平台不同选项不同。例如根文件系统格式、 内核空间大小和是否生成VMware或VirtualBox映像文件等
Global build settings 全局编译设置,例如是否打开内核namespace等
Advanced configuration option (for developers) 针对开发人员的高级配置选项,包含设置下载文件目录、编译 log 和外 部编译工具目录等
Build the OpenWrt SDK 是否生成 OpenWrt 的软件开发包,这样就可以离开 OpenWrt 整体环境 而进行模块编译和增加功能
Image configuration 固件生成的软件包模块,即是否打开 feed.conf 中的各个模块
Base system OpenWrt 基本系统。包括 OpenWrt 的基本文件系统 base-files 模块、实 现 DHCP 和 DNS 代理的 dnsmasq 模块、软件包管理模块 opkg、通用库 ubox、系统总线 ubus 和防火墙 firewall,等等
Development 开发包,例如调试工具 gdb,代码检查和调优工具 valgrind 等
Firmware 各种硬件平台固件
Kernel modules 内核模块,运行在操作系统内部。例如加密模块、各种 USB 驱动和 netfilter 扩展模块等
Languages 不是国际化中的多语言支持模块,而是软件开发语言模块,现在可选的有perl和lua
libraries 一些动态链接库。例如XML语言解析库libxml2,和内核进行通信的libnfnetlink库,压缩和解压缩算法库zlib,微型数据库libsqlite3等
luCI OpenWrt管理UI模块,例如动态DNS管理模块luci-app-ddns、防火墙管理模块luci-app-firewall 和QOS管理模块luci-app-qos等
Mail 邮件传输客户端模块,例如 msmtp 软件包
MultiMedia 多媒体模块,例如 ffmpeg
Network 网络功能,OpenWrt 最具特色的核心模块。例如防火墙、路由、VPN 和文件传输等
Sound 音频模块
Utilities 一些不常用的实用工具模块
  • 进入选项菜单之后的使用方法:
    • 配置选项和 Linux 内核的编译配置非常相似,使用上下左右箭头按键来在编 译选项菜单上导航
    • 按Enter键进入子菜单,连续两次按下 Esc 键返回上一级菜单
    • 输入问号键将获取帮助信息
    • OpenWrt 提供模块化选择编译, 每一个模块通常都有3个选项[Y|N|M]可供选择,输入Y该模块将包含在固件中;输入 M 将作为一个模块来编译,可以后续再进行安装;输入 N 将不编译该模块
    • 还有一些是单选选项菜单,按空格键进行选择,再次按空格键则取消选择
    • 还有一些高级功能可以输入字符串进行配置。例如下载文件夹路径设置,可以不使用编译系统默认的源代码下载目录 dl,输入系统路径“/opt/dl”来设置,这样在很多人 使用同一服务器来编译代码时,不用多次下载相同的代码文件
  • 编译时,选择x86目标平台,方法如下:
    • 选择“Target System”选项然后回车,进入第二张图中,在其中将光标置于“x86”选项,然后按下“Space”键选择x86

OpenWrt开发:06---OpenWrt源码的下载与编译_第3张图片OpenWrt开发:06---OpenWrt源码的下载与编译_第4张图片

  • 编译时,安装LuCI工具,方法如下:
    • 主菜单选择“LuCI”,进入第二张图进入“Collections”,进入第三张图选择前两个(备注:“luci-ssl”和“luci-ssl-openssl”两者只能选择一个,否则后面编译时可能会出错)

OpenWrt开发:06---OpenWrt源码的下载与编译_第5张图片

  • 编译时,选择系统编译成功之后,生成一个.vmdk镜像文件,供我们在VMware虚拟机中使用,方法如下:
    • 主菜单中选择“Image configuration”,然后再勾选“Build VMware image files”即可

  • “make menuconfig”保存退出之后,会根据自己的选择更改.config文件的内容

第五步:

  • 输入make命令就可以开始编译
make  V=s  -j2

//V=s:可以输出编译过程中每一步的执行动作,出错后显示详细的错误信息
//-j2: 使用 2 个线程进行并行编译,这样编译速度将大大加快

OpenWrt开发:06---OpenWrt源码的下载与编译_第6张图片

编译的大致流程与注意事项:

  • 大致流程:编译过程首先检查编译环境,然后编译 host 工具,再编译编译工具链,最后编译目标平台的各个软件包。编译make进入各个模块进行编译时,首先下载代码压缩包,然后解压缩,并打补丁,再根据设置选项来生成 Makefile,最后根据生成的 Makefile 进行编译和 安装
  • 注意事项:在编译时需要连接互联网,因为OpenWrt采用补丁包方式来管理代码,第三方的代码不放在它自己的代码库中,仅在编译前从第三方服务器下载(编译时首先从Internet 上下载软件模块代码,因为OpenWrt 仅有编译及配置指令,各种依赖的代码包在上游网站及代码仓库里面。 OpenWrt 网站也有第三方的代码包镜像,在上游网站不可用时将使用 OpenWrt 自己的服 务器地址,下载地址为 http://downloads.openwrt.org/sources/)

第六步

  • 编译完成的结果是:在顶级目录下生成一个bin目录,这个目录下就包含我们所有的编译结果

四、使用OpenWrt系统的镜像文件

  • 我们在上面编译好OpenWrt源码之后,根据在menuconfig中选择的.vmdk,就会编译产生一个openwrt系统的.vmdk的镜像文件,接下来我们新建一个虚拟机,打开这个镜像文件
  • 第一步:将bin/targets/x86/generic目录下的.vmdk文件移到Windows中(各种镜像有什么区别,见文章:https://blog.csdn.net/qq_41453285/article/details/101223847)

  • 第二步:使用VMware新建一个虚拟机(步骤省略,具体步骤见文章:https://blog.csdn.net/qq_41453285/article/details/101223847),选择我们刚才的.vmdk镜像,然后打开,可以看到启动成功

OpenWrt开发:06---OpenWrt源码的下载与编译_第7张图片

五、模块的单独编译以及其他make用法

单独编译模块

下面我们以TcpDump为例:

  • “make package/tcpdump/clean”清除编译生成的文件,包含安装包及编译过程生成的 临时文件
  • “make package/tcpdump/prepare”进行编译准备,包含下载软件代码包、并解压缩和 打补丁
  • “make package/tcpdump/configure”根据设置选项进行配置并生成 Makefile
  • “make package/tcpdump/compile”根据生成的 Makefile 进行编译
  • “make package/tcpdump/install”生成安装包

以上编译命令都可以添加“V=s”来查看详细编译过程

其他全局编译命令

  • “make download”下载所有已选择的软件代码压缩包
  • “make clean”删除编译目录
  • “make dirclean”除了删除编译目录之外还删除编译工具目录
  • “make printdb”输出所有的编译变量定义

六、编译过程中遇到的问题

问题一

OpenWrt开发:06---OpenWrt源码的下载与编译_第8张图片

  • 解决办法:(不同版本中pkg-config-XX的目录名可能不一致,以自己的目录名为准)
cd build_dir/host/pkg-config-0.29.1/glib

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

 

你可能感兴趣的:(OpenWrt开发)