文章出处: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. oracle怎么卸载

    Oracle Database,又名Oracle RDBMS,或简称Oracle.是甲骨文公司的一款关系数据库管理系统.到目前仍在数据库市场上占有主要份额.劳伦斯·埃里森和他的朋友,之前的同事Bob ...

  2. python greenlet背景介绍与实现机制

    并发处理的技术背景 并行化处理目前很受重视, 因为在很多时候,并行计算能大大的提高系统吞吐量,尤其在现在多核多处理器的时代, 所以像lisp这种古老的语言又被人们重新拿了起来, 函数式编程也越来越流行 ...

  3. [MongoDB]学习笔记--Linux 安装和运行MongoDB

    背景知识 MongoDB 是用C++写的, 开源的, NoSQL(Not Only SQL)文档数据库. 特点:high performance(高性能), high availability(高可靠 ...

  4. 【BZOJ3209】花神的数论题 数位DP

    [BZOJ3209]花神的数论题 Description 背景众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦.描述话说花神这天又来讲课了.课后照例有超级 ...

  5. FZU 2099 魔法阵(计算几何)

     Problem 2099 魔法阵 Accept: 120    Submit: 289 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Probl ...

  6. api文档的书写

    写文档写要与写代码一样,增加复用. 比如 model 说明就只需要一个,api中含有哪些字段,就在api说明中增加到那些 models 的链接. 使用 sophinx 如何生成目录 .. toctre ...

  7. Service Name Port Number Transport Protocol tcp udp 端口号16bit

    https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol The DHCP employs a connectionless  ...

  8. python基础里的那些为什么?

    一.执行python脚本的两种方式? 直接在解释器里编写并在解释器里执行 文件编写,并在终端通过 python 路径  这种方式执行 好,我们就以输出hello world这个例子来比较两种方式的不同 ...

  9. Linux Debian 如何部署 Qt?

    Linux Debian 如何部署 Qt? 在这里以 HelloWorld 为例 目录结构如下: . ├── HelloWorld ├── HelloWorld.sh ├── imageformats ...

  10. setdefault函数的用法及个人理解

    setdefault函数的用法及理解 dict.setdefault(key, default=None) 功能:如果键不存在于字典中,将会添加该键并将default的值设为该键的默认值,如果键存在于 ...