【转载】openwrt框架分析
文章出处:http://blog.csdn.net/kingvenll/article/details/27545221
这次讲讲openwrt的结构.
1. 代码上来看有几个重要目录package, target, build_root, bin, dl....
---build_dir/host目录是建立工具链时的临时目录
---build_dir/toolchain-<arch>*是对应硬件的工具链的目录
---staging_dir/toolchain-<arch>* 则是工具链的安装位置
---target/linux/<platform>目录里面是各个平台(arch)的相关代码
---target/linux/<platform>/config-3.10文件就是配置文件了
---dl目录是'download'的缩写, 在编译前期,需要从网络下载的数据包都会放在这个目录下,这些软件包的一个特点就是,会自动安装在所编译的固件中,也就是我们make menuconfig的时候,为固件配置的一些软件包。如果我们需要更改这些源码包,只需要将更改好的源码包打包成相同的名字放在这个目录下,然后开始编译即可。编译时,会将软件包解压到build_dir目录下。
---而在build_dir/目录下进行解压,编译和打补丁等。
---package目录里面包含了我们在配置文件里设定的所有编译好的软件包。默认情况下,会有默认选择的软件包。在openwrt中ipk就是一切, 我们可以使用
$ ./scripts/feeds update来对软件包进行更新.
$ ./scripts/feeds search nmap 查找软件包'nmap'
Search results in feed ’packages’:
nmap
Network exploration and/or security auditing utility
$
./scripts/feeds install nmap 安装'nmap'这个软件
$ make
package/symlinks //估计意思是更新软件源之类的
---bin目录下生成了很多bin文件,根据不同的平台来区分。另外bin/<platform>/package目录,里面有很多ipk后缀的文件,都是package目录下的源码在build_dir目录下编译后的生成的结果。
2.
新建自己的packages
对于自己新建的package,而这个package又不需要随固件一起安装,换句话说,就是可以当做一个可选软件包的话。我们可以利用我们的SDK环境来单独编译,编译后会生成一个ipk的文件包。然后利用
opkg install xxx.ipk 来安装这个软件。
下面具体说下,如何编译一个helloword的软件包。
(1)首先,编写helloworld程序
编写helloworld.c
/****************
*
Helloworld.c
* The most simplistic C program ever written.
* An epileptic
monkey on crack could write this code.
*****************/
#include
<stdio.h>
#include <unistd.h>
int main(void)
{
printf("Hell! O' world, why won't my code compile?\n\n");
return
0;
}
编写Makefile文件
# build helloworld
executable when user executes "make"
helloworld: helloworld.o
$(CC) $(LDFLAGS) helloworld.o -o helloworld
helloworld.o: helloworld.c
$(CC) $(CFLAGS) -c helloworld.c
# remove object files and executable when
user executes "make clean"
clean:
rm *.o helloworld
在这两个文件的目录下,执行make
应该可以生成helloworld的可执行文件。执行helloworld后,能够打印出“Hell!O' world, why won't my code
compile?”。 这一步,主要保证我们的源程序是可以正常编译的。
下面我们将其移植到OpenWRT上。
(2)将OpenWrt-SDK-brcm47xx-for-Linux-x86_64-gcc-4.3.3+cs_uClibc-0.9.30.1.tar.bz2解压
tar
–xvf
OpenWrt-SDK-brcm47xx-for-Linux-x86_64-gcc-4.3.3+cs_uClibc-0.9.30.1.tar.bz2
(3)进入SDK
cd
OpenWrt-SDK-brcm47xx-for-Linux-x86_64-gcc-4.3.3+cs_uClibc-0.9.30.1
可以看到里面的目录结构跟我们之前source的目录结构基本相同,所需要编译的软件包,需要放置在package目录下
(4)在package目录下创建helloworld目录
cd
package
mkdir helloworld
cd helloworld
(5)创建src目录,拷贝
helloworld文件
mkdir src
cp /home/wrt/test/helloworld.c src
cp
/home/wrt/test/Makefile
src
(6)在helloworld目录下创建Makefile文件
这个Makefile文件是给OpenWRT读的,而之前写的那个Makefile文件是针对helloworld给编译其读的。两个Makefile不在同一层目录下。
touch Makefile
vim Makefile
Makefile文件模板内容如下:
##############################################
#
OpenWrt Makefile for helloworld program
#
#
# Most of the variables
used here are defined in
# the include directives below. We just need to
#
specify a basic description of the package,
# where to build our program,
where to find
# the source files, and where to install the
# compiled
program on the router.
#
# Be very careful of spacing in this file.
#
Indents should be tabs, not spaces, and
# there should be no trailing
whitespace in
# lines that are not
commented.
#
##############################################
include
$(TOPDIR)/rules.mk
# Name and release number of this
package
PKG_NAME:=helloworld
PKG_RELEASE:=1
# This specifies
the directory where we're going to build the program.
# The root build
directory, $(BUILD_DIR), is by default the build_mipsel
# directory in your
OpenWrt SDK directory
PKG_BUILD_DIR :=
$(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
#
Specify package information for this program.
# The variables defined here
should be self explanatory.
# If you are running Kamikaze, delete the
DESCRIPTION
# variable below and uncomment the Kamikaze define
# directive
for the description below
define Package/helloworld
SECTION:=utils
CATEGORY:=Utilities
TITLE:=Helloworld --
prints a snarky message
endef
# Uncomment portion below for
Kamikaze and delete DESCRIPTION variable above
define
Package/helloworld/description
If you can't figure out what this
program does, you're probably
brain-dead and need immediate medical
attention.
endef
# Specify what needs to be done to prepare for
building the package.
# In our case, we need to copy the source files to the
build directory.
# This is NOT the default. The default uses the
PKG_SOURCE_URL and the
# PKG_SOURCE which is not defined here to download the
source from the web.
# In order to just build a simple program that we have
just written, it is
# much easier to do it this way.
define
Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./src/*
$(PKG_BUILD_DIR)/
endef
# We do not need to define Build/Configure
or Build/Compile directives
# The defaults are appropriate for compiling a
simple program such as this one
# Specify where and how to install
the program. Since we only have one file,
# the helloworld executable,
install it by copying it to the /bin directory on
# the router. The $(1)
variable represents the root directory on the router running
# OpenWrt. The
$(INSTALL_DIR) variable contains a command to prepare the install
# directory
if it does not already exist. Likewise $(INSTALL_BIN) contains the
# command
to copy the binary file from its current location (in our case the build
#
directory) to the install directory.
define Package/helloworld/install
$(INSTALL_DIR) $(1)/bin
$(INSTALL_BIN)
$(PKG_BUILD_DIR)/helloworld $(1)/bin/
endef
# This line executes
the necessary commands to compile our program.
# The above define directives
specify all the information needed, but this
# line calls BuildPackage which
in turn actually uses this information to
# build a package.
$(eval $(call
BuildPackage,helloworld))
(7)返回到SDK的根目录
执行make进行编译
编译过程会在build_dir目录下完成
编译结果会放在
bin/[yourtarget]/package目录下helloworld_1_bcm47xx.ipk
(8)上传helloworld_1_bcm47xx.ipk
上传helloworld_1_bcm47xx.ipk至路由器
执行#
opkg install
helloworld_1_bcm47xx.ipk
然后输入hello然后按Tab键,发现openwrt中已经有helloworld可执行命令。
执行
helloworld命令来查看程序的效果。
Hell! O' world, why won't my code compile?
【转载】openwrt框架分析的更多相关文章
- openwrt<转载--openwrt框架分析 >
这次讲讲openwrt的结构. 1. 代码上来看有几个重要目录package, target, build_root, bin, dl.... ---build_dir/host目录是建立工具链时的临 ...
- 转:openwrt 框架分析
本文是本人对OpenWrt的Makefile的理解,并非转载.OpenWrt是一个典型的嵌入式Linux工程,了解OpenWrt的Makefile的工作过程对提高嵌入式Linux工程的开发能力有极其重 ...
- openwrt: Makefile 框架分析
openwrt: Makefile 框架分析 原文链接:blog.chinaunix.net/uid-26675482-id-4704952.html 本篇的主要目的是想通过分析Makefile,了解 ...
- VS2010/MFC编程入门之四(MFC应用程序框架分析)
VS2010/MFC编程入门之四(MFC应用程序框架分析)-软件开发-鸡啄米 http://www.jizhuomi.com/software/145.html 上一讲鸡啄米讲的是VS2010应用 ...
- SSH框架总结(环境搭建+框架分析+实例源码下载)
一.SSH框架简介 SSH是struts+spring+hibernate集成的web应用程序开源框架. Struts:用来控制的,核心控制器是Controller. Spring:对Struts和H ...
- Android/Linux下CGroup框架分析及其使用
1 cgroup介绍 CGroup是control group的简称,它为Linux kernel提供一种任务聚集和划分的机制,可以限制.记录.隔离进程组(process groups)所使用的资源( ...
- 几款开源的hybird移动app框架分析
几款开源的Hybrid移动app框架分析 Ionic Onsen UI 与 ionic 相比 jQuery Mobile Mobile Angular UI 结论 很多移动开发者喜欢使用原生代码开发, ...
- 深入浅出 - Android系统移植与平台开发(十一) - Sensor HAL框架分析之一
作者:唐老师,华清远见嵌入式学院讲师. 1. Sensor的概念 Sensor即传感器,在当前智能手机上大量存在:G-Sensor.LightsSensor. ProximitySensor.Temp ...
- 深入浅出 - Android系统移植与平台开发(八)- HAL Stub框架分析
作者:唐老师,华清远见嵌入式学院讲师. 1. HAL Stub框架分析 HAL stub的框架比较简单,三个结构体.两个常量.一个函数,简称321架构,它的定义在:@hardware/libhardw ...
随机推荐
- 虚拟化笔记05 OpenFiler configuration
5.OpenFiler configuration 登录Openfiler 步骤1:安装 FireFox 步骤2:通过FireFox以HTTPS://server-ip:446 远程访问OpenFil ...
- (转)txt读写 操作封装
[code]csharpcode: using UnityEngine; using System.Collections.Generic; using System.IO; using System ...
- python3----练习题(三级菜单)
三级菜单程序. 运行程序输出第一级菜单. 选择一级菜单某项,输出二级菜单,同理输出三级菜单. 退出时返回上一级菜单 menu = { '北京市': { '东城区': { 'aa', 'bb', }, ...
- iOS-毛玻璃、navigationBar滑动颜色渐变
1.毛玻璃实现 iOS8以上,官方提供了系统方法实现毛玻璃,代码如下: // iOS8 UIVisualEffectView UIImageView *bgView = [[UIImageView a ...
- C++11写算法之二分查找
同样的,二分查找很好理解,不多做解释,要注意二分查找的list必须是排好序的. 这里实现了两种二分查找的算法,一种递归一种非递归,看看代码应该差不多是秒懂.想试验两种算法,改变一下findFunc函数 ...
- day4笔记
今日讲解内容:1,int数字:运算.1 ,2,3... # 数字类型:int #范围.用于运算, + - * / // %.... bit_lenth :十进制数字用二进制表示的最小位数 a=10 p ...
- ASSERT(m_hWnd == hWndOrig) - 解决之
该问题产生的原因为:创建类型为regular dll 的MFC dll中的窗口创建与其它DLL或EXE中的窗口创建混乱. 比如:dll1 中函数 fun1() 调用 dll2 中函数 fun2(),在 ...
- NoSQL-MongoDB with python
前言: MongoDB,文档存储型数据库(document store).NoSQL数据库中,它独占鳌头,碾压其他的NoSQL数据库. 使用C++开发的,性能仅次C.与redis一样,开源.高扩展.高 ...
- [Spring Data MongoDB]学习笔记--MongoTemplate插入修改操作
插入操作: 直接给个例子 import static org.springframework.data.mongodb.core.query.Criteria.where; import static ...
- 【BZOJ1266】[AHOI2006]上学路线route Floyd+最小割
[BZOJ1266][AHOI2006]上学路线route Description 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林 ...