文章出处: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. 15:开发Rsync服务启动脚本案例

    [root@m01 ~]# rsn_count="ps -ef|grep 'rsync --d[a]emon'|wc -l" [root@m01 ~]# echo ${rsn_co ...

  2. OpenCV中Kinect的使用(2)

    接OpenCV中Kinect的使用(1),主要讲述OpenCV中关于Kinect接口(类 VideoCapture )的一些使用介绍. 类 VideoCapture 支持Kinect传感器.使用 Vi ...

  3. jdbc 中 excute executeUpdate的用法作用

    Statement 接口提供了三种执行 SQL 语句的方法:executeQuery.executeUpdate 和 execute.使用哪一个方法由 SQL 语句所产生的内容决定. 方法execut ...

  4. JavaScript 函数和事件

    上面例子中的 JavaScript 语句,会在页面加载时执行. 通常,我们需要在某个事件发生时执行代码,比如当用户点击按钮时. 如果我们把 JavaScript 代码放入函数中,就可以在事件发生时调用 ...

  5. apache+svn No installed service name 'Apache2' 【转载】

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://zys0597.blogbus.com/logs/32763815.html 问题:第一次在winxp下   安装apac ...

  6. Unity3D学习笔记——NGUI之UIGrid

    UIGrid:这个组件可以轻松的让你排列你的组件,并且在运行或是编辑的时候都可以. 效果图如下: 一:使用步骤 1.选择一个panel然后右键Create——Grid 2.为Grid创建几个子Spri ...

  7. linux 下Shell编程(四)

    for循环应用实例 for 循环可以对一个记录集中地数据依次集中地数据依次进行处理. #!/bin/bash #4.13.sh for clear     #看下图区别 for((i=1:i<1 ...

  8. C#安装,启动,停止,卸载Windows服务

    public class OptionServices    {        //安装服务        public static void InstallService(string filep ...

  9. 如何在MySQL客户端Navicat 上创建存储过程返回结果集

    下述引用自<MySQL 必知必会> MySQL命令行客户机的分隔符 如果你使用的是MySQL命令行实用程序,应该仔细阅读此说明.默认的MySQL语句分隔符为;(正如你已经在迄今为止所使用的 ...

  10. The Intriguing Obsession

    C. The Intriguing Obsession time limit per test 1 second memory limit per test 256 megabytes input s ...