文章出处: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. Redis 哈希槽

    Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余 ...

  2. HTML 网页中以超链接的方式调用iphone 手机的app

    2011-11-13 14:36:33|  分类: 随笔 |  标签:iphone  调用iphone手机app  |举报|字号 订阅     <1>. 调用iphone 手机地图APP的 ...

  3. Android Notification使用方法

    1.http://www.cnblogs.com/plokmju/p/android_Notification.html 2.http://blog.csdn.net/vipzjyno1/articl ...

  4. python 面向对象三大特性(封装 多态 继承)

    今天我们来学习一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)注:Java和C#来说只支持面向对象编程,而python比较灵活即支持面 ...

  5. 用于ARM上的FFT与IFFT源代码-C语言

    /********************************************************************************* 程序名称:快速傅里叶变换(FFT) ...

  6. ios -生成推广海报

    #import "ViewController.h" #import "Masonry.h" @interface ViewController () @end ...

  7. iOS QQ的AppID转换16进制的方法

    801312852为QQ的AppID 打开终端 echo 'ibase=10;obase=16;801312852'|bc   红色框内的即为转换后的16进制

  8. hihocoder 1279(状压)

    坑爹的题目.不过不能说不是一道挺好的题目. 坑主要坑在,妹的我一样的复杂度,写的姿势略差了点然后就一直超时. 比赛的时候我还直接就看错题目,把AND运算看成了OR...还敲完交了一发. 这题很容易想到 ...

  9. servlet;jsp;cookies;session

  10. C#快速整理代码格式

    删除最后一个大括号,再添加.vs自动整理代码结构.