文章出处: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框架分析的更多相关文章

  1. openwrt<转载--openwrt框架分析 >

    这次讲讲openwrt的结构. 1. 代码上来看有几个重要目录package, target, build_root, bin, dl.... ---build_dir/host目录是建立工具链时的临 ...

  2. 转:openwrt 框架分析

    本文是本人对OpenWrt的Makefile的理解,并非转载.OpenWrt是一个典型的嵌入式Linux工程,了解OpenWrt的Makefile的工作过程对提高嵌入式Linux工程的开发能力有极其重 ...

  3. openwrt: Makefile 框架分析

    openwrt: Makefile 框架分析 原文链接:blog.chinaunix.net/uid-26675482-id-4704952.html 本篇的主要目的是想通过分析Makefile,了解 ...

  4. VS2010/MFC编程入门之四(MFC应用程序框架分析)

    VS2010/MFC编程入门之四(MFC应用程序框架分析)-软件开发-鸡啄米 http://www.jizhuomi.com/software/145.html   上一讲鸡啄米讲的是VS2010应用 ...

  5. SSH框架总结(环境搭建+框架分析+实例源码下载)

    一.SSH框架简介 SSH是struts+spring+hibernate集成的web应用程序开源框架. Struts:用来控制的,核心控制器是Controller. Spring:对Struts和H ...

  6. Android/Linux下CGroup框架分析及其使用

    1 cgroup介绍 CGroup是control group的简称,它为Linux kernel提供一种任务聚集和划分的机制,可以限制.记录.隔离进程组(process groups)所使用的资源( ...

  7. 几款开源的hybird移动app框架分析

    几款开源的Hybrid移动app框架分析 Ionic Onsen UI 与 ionic 相比 jQuery Mobile Mobile Angular UI 结论 很多移动开发者喜欢使用原生代码开发, ...

  8. 深入浅出 - Android系统移植与平台开发(十一) - Sensor HAL框架分析之一

    作者:唐老师,华清远见嵌入式学院讲师. 1. Sensor的概念 Sensor即传感器,在当前智能手机上大量存在:G-Sensor.LightsSensor. ProximitySensor.Temp ...

  9. 深入浅出 - Android系统移植与平台开发(八)- HAL Stub框架分析

    作者:唐老师,华清远见嵌入式学院讲师. 1. HAL Stub框架分析 HAL stub的框架比较简单,三个结构体.两个常量.一个函数,简称321架构,它的定义在:@hardware/libhardw ...

随机推荐

  1. plsql programming 12 集合(忽略, 个人感觉用不到)

    关联数组, 嵌套表, varray 个人并不推荐使用集合, 因为操作有别于普通字段. 集合中每一个元素的数据类型都是相同的, 因此这些元素都是同质的(同质元素) 这一章的内容先忽略吧, 因为个人感觉用 ...

  2. Python - except不指定异常类别(转)

    From:How to properly ignore Exceptions? try: doSomething() except: pass or try: doSomething() except ...

  3. Hook length formula 学习笔记 UVALive 6625

    最近做到一个关于杨氏矩阵的题目. UVALive 6625 题目大意是用n以内的数填充杨氏矩阵,要求行严格递增,列不严格递增. 求方案数. 数据范围很小,我直接上爆搜,结果TLE了. 后来发现一位学长 ...

  4. redhat ent 6.5 virtualbox虚拟机通过桥接方式配置主机-虚拟机的局域网

    感谢: http://www.linuxidc.com/Linux/2012-06/62544.htm http://www.2cto.com/os/201204/126178.html Virual ...

  5. linux 分卷压缩命令

    linux 分卷压缩命令 1.使用tar分卷压缩 格式 tar cvzf - filedir | split -d -b 50m - filename 样例: tar cvzf - ./picture ...

  6. 【转发】linux开发人员常用命令

    每个开发人员到了他们职业人生的某个阶段的时候,将会发现自己要寻找有关Linux的信息.我并不是这方面的专家.但是掌握了以下8个命令,我几乎可以得到我任何需要的东西. 注意:以下的命令都有很多扩展的文档 ...

  7. PHP中通过数组遍历找出最小值

    举例: $a = array(1,2,4,0,9,8,6);//定义一个数组 $len = count($a);//获取数组的长度 $min = $a[0];//默认情况下数组的第一个值是最小的 fo ...

  8. AdnroidUtils-常用工具类(showDiaLog/HTTP)

    1. HttpUtils 该工具类应用于Android客户端+Web服务器 /** * */ package com.nubb.auction.client.util; import java.uti ...

  9. 面试题:Spring的理解

    答案:D AOP为Aspect Oriented Programming的缩写, 意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. AOP是OOP的延续,是软件开发 ...

  10. Handler机制原理

    andriod提供了Handler 和 Looper 来满足线程间的通信.Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(MessageExchange). 1)Loo ...