openWRT自学---对官方的开发指导文档的解读和理解 记录1:编译一个package
针对的是:http://kamikaze.openwrt.org/docs/openwrt.html#x1-390002
1.If you want, you can also modify the kernel config for the selected target system. simply run "make kernel_menuconfig" and the build system will unpack the kernel sources (if necessary), run menuconfig inside of the kernel tree, and then copy the kernel config to target/linux/<platform>/config so that it is preserved over "make clean" calls. ---- 如果你愿意,你也可以修改内核配置为选定的目标系统。简单地运行“make kernel_menuconfig”和构建系统将解压缩内核源代码(如果有必要)。此命令会展示针对内核的配置选择界面,然后其结果再复制内核配置到目标/ linux的/<platform>/配置。这样得到的针对内核的.config文件,在"make clean"后依然是保留的。
2.During the build process, buildroot will download all sources to the "dl" directory and will start patching and compiling them in the "build_dir/<arch> " directory. When finished, the resulting firmware will be in the "bin" directory and packages will be in the "bin/packages" directory -- 在编译过程中,buildroot会将所有的源下载到“dl”目录下,并在“build_dir/<arch>”目录中对它们进行patch和编译。完成后,所产生的固件将在“bin”目录,而各个package将在“bin/packages"目录中
3.openwrt中的一个典型的package目录结构:
- package/<name>/Makefile --- 必须存在;其作用是定义下载包和编译包的步骤
- package/<name>/patches --- 可有可无;是对所下载包的修复和优化,即补丁
- package/<name>/files --- 可有可无;是此包特有的启动脚本和配置文件
4.openwrt中的一个典型的package目录结构(以backfire的package/bridge-utils为例)。其makefile的内容如下:
#
# Copyright (C) 2006-2008 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=bridge-utils //The name of the package, as seen via menuconfig and ipkg。不过我在CPE上使用opkg list命令,看到的是bridge - 1.4-1;而通过make menuconfig看到的是 bridge(在Base System里面)。 此外,在package中有一个bridge-utils;在feeds/package中也有一个。到底这些如何对应呢?
PKG_RELEASE:=1 //The version of this package Makefile
PKG_SOURCE_URL:=@SF/bridge //Where to download the sources from (no trailing slash), you can add multiple download sources by separating them with a and a carriage return. @SF表示从SourceForge下载
ifeq ($(CONFIG_LINUX_2_4),y)
PKG_VERSION:=1.0.6
PKG_MD5SUM:=9b7dc52656f5cbec846a7ba3299f73bd
endif
ifeq ($(CONFIG_LINUX_2_6),y)
PKG_VERSION:=1.4 //The upstream version number that we are downloading
PKG_MD5SUM:=0182fcac3a2b307113bbec34e5f1c673 //A checksum to validate the download
endif
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz //The filename of the original sources,这里就是 bridge-utils-1.4.tar.gz
include $(INCLUDE_DIR)/package.mk //位于 backfire_10.03/include/package.mk,用于定义任何一个package下载的统一的方式脚本
define Package/bridge
SECTION:=net //The type of package (currently unused)
CATEGORY:=Base system //Which menu it appears in menuconfig: Network, Sound, Utilities, Multimedia ...
TITLE:=Ethernet bridging configuration utility //A short description of the package
URL:=http://bridge.sourceforge.net/ //Where to find the original software
endef
define Package/bridge/description
Manage ethernet bridging: a way to connect networks together to
form a larger network.
endef
CONFIGURE_ARGS += \
--with-linux-headers="$(LINUX_DIR)" \
define Build/Prepare //这是可选项。A set of commands to unpack and patch the sources. You may safely leave this undefined.
$(call Build/Prepare/Default)
( cd $(PKG_BUILD_DIR) ; \ //PKG_BUILD_DIR定义在下载包后将此包解压缩到$(BUILD_DIR)的具体位置。对于此bridge-util包,其位置在backfire_10.03/build_dir/linux-brcm47xx/bridge-utils-1.4 中;同时这就说明用的是package中的,而不是feeds/package中的
[ -f ./configure ] || { \
ln -sf configure.in configure.ac ; \
autoconf ; \
} \
)
endef
define Package/bridge/install
$(INSTALL_DIR) $(1)/usr/sbin //$(INSTALL_DIR)即为:install -d -m0755
$(INSTALL_BIN) $(PKG_BUILD_DIR)/brctl/brctl $(1)/usr/sbin/ //$(INSTALL_BIN)即为: install -m0755
endef
$(eval $(call BuildPackage,bridge)) //这是真正开始执行的位置。BuildPackage定义在package.mk中,其调用的参数是bridge。这样就会走到package.mk中的:define BuildPackage
$(Build/IncludeOverlay)
$(eval $(Package/Default))
$(eval $(Package/$(1))) //对应就是$(Package/bridge),从而又找到package/bridge-utils/Makefile中的 define Package/bridge 位置。
再举一个稍微复杂的例子,package/dropbear(一个轻量级的ssh客户端与服务端开源),其目录中包含了:files(内含配置文件和启动脚本),patches(内含补丁)和Makefile;如下是Makefile:
#
# Copyright (C) 2006-2009 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=dropbear //The name of the package, as seen via menuconfig and ipkg
PKG_VERSION:=0.52 //The upstream version number that we are downloading
PKG_RELEASE:=4 //The version of this package Makefile
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz //The filename of the original sources,这里就是 dropbear-0.52.tar.gz
PKG_SOURCE_URL:= \ //下载源码包的url地址,这里就写了多个地址,用回车换行+一个斜杠来排列表示
http://matt.ucc.asn.au/dropbear/releases/ \
http://www.mirrors.wiretapped.net/security/cryptography/apps/ssh/dropbear/
PKG_MD5SUM:=1c69ec674481d7745452f68f2ea5597e //MD5校验和
include $(INCLUDE_DIR)/package.mk //实际是include了 backfire_10.03/include/package.mk
define Package/dropbear/Default
URL:=http://matt.ucc.asn.au/dropbear/ //Where to find the original software
endef
define Package/dropbear //由 BuildPackage 命令调用
$(call Package/dropbear/Default)
SECTION:=net //The type of package (currently unused)
CATEGORY:=Base system //Which menu it appears in menuconfig: Network, Sound, Utilities, Multimedia ...
TITLE:=Small SSH2 client/server //A short description of the package
endef
define Package/dropbear/description
A small SSH2 server/client designed for small memory environments.
endef
define Package/dropbear/conffiles //此项可选,A list of config files installed by this package, one file per line.表示此package会安装的一些配置文件
/etc/dropbear/dropbear_rsa_host_key
/etc/dropbear/dropbear_dss_host_key
/etc/config/dropbear
endef
define Package/dropbearconvert //这是另一个package,也是从dropbear的源码包里面会得到的。
$(call Package/dropbear/Default)
SECTION:=utils
CATEGORY:=Utilities
TITLE:=Utility for converting SSH keys
endef
CONFIGURE_ARGS += \
--with-shared \
--disable-pam \
--enable-openpty \
--enable-syslog \
$(if $(CONFIG_SHADOW_PASSWORDS),,--disable-shadow) \
--disable-lastlog \
--disable-utmp \
--disable-utmpx \
--disable-wtmp \
--disable-wtmpx \
--disable-loginfunc \
--disable-pututline \
--disable-pututxline \
--disable-zlib
define Build/Configure //此项可选。用于编译时传递一些自定义参数
$(SED) 's,^/\* #define PKG_MULTI.*,#define PKG_MULTI,g' $(PKG_BUILD_DIR)/options.h
$(SED) 's,^#define DO_HOST_LOOKUP,/* & */,g' $(PKG_BUILD_DIR)/options.h
$(call Build/Configure/Default)
endef
define Build/Compile //此项可选。表示如何编译源码包
$(MAKE) -C $(PKG_BUILD_DIR) \
$(TARGET_CONFIGURE_OPTS) \
LD="$(TARGET_CC)" \
PROGRAMS="dropbear dbclient dropbearkey scp" \
MULTI=1 SCPPROGRESS=1
$(MAKE) -C $(PKG_BUILD_DIR) \
$(TARGET_CONFIGURE_OPTS) \
LD="$(TARGET_CC)" \
PROGRAMS="dropbearconvert"
endef
define Package/dropbear/install //A set of commands to copy files out of the compiled source and into the ipkg which is represented by the $(1) directory
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/dropbearmulti $(1)/usr/sbin/dropbear
$(INSTALL_DIR) $(1)/usr/bin
ln -sf ../sbin/dropbear $(1)/usr/bin/scp
ln -sf ../sbin/dropbear $(1)/usr/bin/ssh
ln -sf ../sbin/dropbear $(1)/usr/bin/dbclient
ln -sf ../sbin/dropbear $(1)/usr/bin/dropbearkey
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_DATA) ./files/dropbear.config $(1)/etc/config/dropbear
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./files/dropbear.init $(1)/etc/init.d/dropbear
$(INSTALL_DIR) $(1)/usr/lib/opkg/info
$(INSTALL_DIR) $(1)/etc/dropbear
touch $(1)/etc/dropbear/dropbear_rsa_host_key
touch $(1)/etc/dropbear/dropbear_dss_host_key
endef
define Package/dropbearconvert/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/dropbearconvert $(1)/usr/bin/dropbearconvert
endef
$(eval $(call BuildPackage,dropbear)) //调用package.mk中的BuildPackage,开始编译dropbear
$(eval $(call BuildPackage,dropbearconvert)) //调用package.mk中的BuildPackage,开始编译dropbearconvert
在你创建你的 package/<NAME>/ Makefile文件后,新的软件包会自动在下一次运行“make menuconfig时”,出现在菜单中。如果选中,此该package将在下一次make中被自动编译
openWRT自学---对官方的开发指导文档的解读和理解 记录1:编译一个package的更多相关文章
- openWRT自学---对官方的开发指导文档的解读和理解 记录3:一些常用方法
1.约定 configuration files follow the convention: <name>.conf init files follow the convention: ...
- openWRT自学---对官方的开发指导文档的解读和理解 记录2:如何控制内核模块的编译
openwrt对于kernel module的处理分两类:随内核主线而来的kernel module 和 其他作为独立project的kernel module.而这两种,openwrt将采用相同的模 ...
- Enterprise Solution 2.2 开发帮助文档集合
首先是一个PPT文档,从宏观层面展示Enterprise Soltion的几个功能特色. Enterprise Solution解决方案安装与配置 将源代码解决方案和演示程序在电脑中进行配置,作为了解 ...
- Spring MVC 指导文档解读(一)
22.1 指导文档章节 In the Web MVC framework, each DispatcherServlet has its own WebApplicationContext, whic ...
- WEB前端开发规范文档(转)
http://codeguide.bootcss.com/ 编写灵活.稳定.高质量的 HTML 和 CSS 代码的规范上面的文档 再结合下面的规范: 无论是从技术角度还是开发视角,对于web前端开发 ...
- Android APP开发需求文档范本
Android APP开发需求文档范本 软件需求文档格式的标准写法 1.引言 1.1 编写目的 • 阐明开发本软件的目的: 1.2 项目背景 • 标识待开发软件产品的名称.代码: • 列出本项目的任 ...
- 网站开发进阶(三十八)Web前端开发规范文档你需要知道的事
Web前端开发规范文档你需要知道的事 规范目的 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进 ...
- FlappyBird开发帮助文档
FlappyBird开发帮助文档 项目需求 完成FlappyBird游戏. 功能说明: 游戏开始后,间歇性的点击鼠标,让小鸟向上飞,不会掉下来,并且要穿过柱子的空隙,不能碰到柱子,碰到就dead了,穿 ...
- Web前端开发规范文档你需要知道的事
Web前端开发规范文档你需要知道的事 规范目的 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进 ...
随机推荐
- POJ 2761 Feed the dogs (主席树)(K-th 值)
Feed the dogs Time Limit: 6000MS Memor ...
- [Usaco2010 Nov]Visiting Cows
题目描述 经过了几周的辛苦工作,贝茜终于迎来了一个假期.作为奶牛群中最会社交的牛,她希望去拜访N(1<=N<=50000)个朋友.这些朋友被标号为1..N.这些奶牛有一个不同寻常的交通系统 ...
- Xamarin XAML语言教程基本页面ContentPage占用面积
Xamarin XAML语言教程基本页面ContentPage占用面积 基本页面和基本视图都是在开发应用程序时最为常用的.本章将讲解有关基本页面ContentPag.基本视图ContentView.控 ...
- socket第三方库 AsyncSocket(GCDAsyncSocket)
Socket描述了一个IP.端口对.它简化了程序员的操作,知道对方的IP以及PORT就可以给对方发送消息,再由服务器端来处理发送的这些消息.所以,Socket一定包含了通信的双发,即客户端(Clien ...
- Android-onInterceptTouchEvent()和onTouchEvent()
老实说,这两个小东东实在是太麻烦了,很不好懂,我自己那api文档都头晕,在网上找到很多资料,才知道是怎么回事,这里总结一下,记住这个原则就会很清楚了: 1.onInterceptTouchEvent( ...
- Vue 基础的开发环境
本期节目将手把手教你去 NPM 市场买最新鲜的食材,只为搭配 小鲜肉 Vue 下厨. 既然它是当红小鲜肉,我想有必要写一篇文章来帮助大家配置好 Vue 的生产环境,我给它的总体评价是“简单却不失优雅, ...
- zookeeper 学习笔记3
ZooKeeper 允许客户端向服务端注册一个 Watcher 监听, ZooKeeper 允许客户端向服务端注册一个 Watcher 监听, ZooKeeper 允许客户端向服务端注册一个 Watc ...
- superobject使用方法
superobject使用方法 ISuperObject.AsObject 可获取一个 TSuperTableString 对象. TSuperTableString 的常用属性: count.Get ...
- Unity3d UGUI 界面适配 实例解析 三种适配方式
之前做游戏都是用公司自己的引擎,对于界面的适配分Android和IOS两种系统处理. 对于IOS设备,由于数量有限,只要做到 960x640 1024x769 1136x640 (当时还没有ipho ...
- andriod 读取通讯录
package com.example.yanlei.wifi; import android.content.ContentResolver;import android.database.Curs ...