linux源码编译ipk,openwrt SDK, 利用SDK生成自己的ipk安装包

Openwrt SDK是一个可再定位的,预编译好的OpenWrt工具链,适用于在不从头开始编译整个系统的前提下,针对一个特定平台交叉编译单个用户空间包。

使用SDK的原因:

为了保证二进制和特性兼容性,针对特定的发行版编译自定义软件

编译更新版本的指定包文件

使用自定义的补丁或者不同特性来重新编译已经存在的包

#-----官方文档如下

This is the OpenWrt SDK. It contains a stripped-down version of the buildroot. You can use it to test/develop packages without having to compile your own toolchain or any of the libraries included with OpenWrt.

To use it, just put your buildroot-compatible package directory in the subdir 'package/' and run 'make' from this directory.

#------ OPENWRT集成非官方包之Makefile规则

include $(TOPDIR)/rules.mk

PKG_NAME:=[软件包名字 和文件夹名称一样]

PKG_VERSION:=[软件包版本 自己写个]

PKG_RELEASE:=1

PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)

include $(INCLUDE_DIR)/package.mk

define Package/$(PKG_NAME)

SECTION:=utils

CATEGORY:=[软件包在menuconfig里的位置 比如Base system]

DEPENDS:=[依赖包 两个之间通过空格分隔 前面加+为默认显示 选中该软件包自动选中依赖包 不加+为默认不显示 选中依赖包才显示]

TITLE:=[标题]

PKGARCH:=[平台 比如ar71xx 全部写all]

MAINTAINER:=[作者]

endef

define Package/$(PKG_NAME)/description

[软件包简介]

endef

#非本目录下的源码文件, 拷贝到此相应目录下.

# 如../../xucommon/xucommon.c, 则将 xucommon.c 拷贝到此目录下的源码的 ../../

define Build/Prepare

mkdir -p $(PKG_BUILD_DIR)

$(CP) ./src/* $(PKG_BUILD_DIR)/

endef

define Build/Configure

endef

define Build/Compile

endef

define Package/$(PKG_NAME)/conffiles

[升级时保留文件/备份时备份文件 一个文件一行]

endef

define Package/$(PKG_NAME)/install

$(CP) ./files/* $(1)/

endef

define Package/$(PKG_NAME)/preinst

[安装前执行的脚本 记得加上#!/bin/sh 没有就空着]

#!/bin/sh

uci -q batch

delete ucitrack.@aria2[-1]

add ucitrack aria2

set ucitrack.@aria2[-1].init=aria2

commit ucitrack

EOF

exit 0

endef

define Package/$(PKG_NAME)/postinst

[安装后执行的脚本 记得加上#!/bin/sh 没有就空着]

#!/bin/sh

rm -f /tmp/luci-indexcache

exit 0

endef

Package/$(PKG_NAME)/prerm

[删除前执行的脚本 记得加上#!/bin/sh 没有就空着]

endef

Package/$(PKG_NAME)/postrm

[删除后执行的脚本 记得加上#!/bin/sh 没有就空着]

endef

$(eval $(call BuildPackage,$(PKG_NAME)))

---------------------------------------------------------------------

# --- 自己的例程: httpclient 目录下的 Makefile

include $(TOPDIR)/rules.mk

PKG_NAME:=httpclient

PKG_RELEASE:=1

PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)

include $(INCLUDE_DIR)/package.mk

define Package/httpclient

SECTION:=utils

CATEGORY:=Utilities

TITLE:=HTTP Client Demo

endef

define Package/httpclient/description

HTTP Client Demo

endef

define Build/Prepare

mkdir -p $(PKG_BUILD_DIR)

$(CP) ./src/* $(PKG_BUILD_DIR)/

endef

define Package/httpclient/install

$(INSTALL_DIR) $(1)/usr/sbin

$(INSTALL_BIN) $(PKG_BUILD_DIR)/httptest $(1)/usr/sbin/

$(INSTALL_DIR) $(1)/etc/config

$(INSTALL_CONF) ./files/test.lua $(1)/etc/config/test.lua

endef

$(eval $(call BuildPackage,$(PKG_NAME)))

#--- ser2net 之Makefile

include $(TOPDIR)/rules.mk

PKG_NAME:=ser2net

PKG_VERSION:=2.7

PKG_RELEASE:=2

PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz

PKG_SOURCE_URL:=@SF/ser2net

PKG_MD5SUM:=22977477789868923a5de09a85e847dd

PKG_FIXUP:=libtool

PKG_INSTALL:=1

include $(INCLUDE_DIR)/package.mk

define Package/ser2net

SECTION:=net

CATEGORY:=Network

TITLE:=Serial port TCP/IP redirector

URL:=

endef

define Package/ser2net/description

This is ser2net, a program for allowing network connections to serial ports.

See the man page for information about using the program. Note that ser2net

supports RFC 2217 (remote control of serial port parameters), but you must

have a complient client.

endef

define Package/ser2net/conffiles

/etc/ser2net.conf

endef

# uses GNU configure

define Package/ser2net/install

$(INSTALL_DIR) $(1)/usr/sbin

$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/ser2net $(1)/usr/sbin/

$(INSTALL_DIR) $(1)/etc

$(INSTALL_CONF) $(PKG_BUILD_DIR)/ser2net.conf $(1)/etc/

endef

$(eval $(call BuildPackage,ser2net))

#--- uhttpd 之 Makefile

include $(TOPDIR)/rules.mk

PKG_NAME:=uhttpd

PKG_RELEASE:=31

PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)

PKG_CONFIG_DEPENDS := \

CONFIG_PACKAGE_uhttpd-mod-lua \

CONFIG_PACKAGE_uhttpd-mod-tls \

CONFIG_PACKAGE_uhttpd-mod-tls_cyassl \

CONFIG_PACKAGE_uhttpd-mod-tls_openssl

include $(INCLUDE_DIR)/package.mk

define Package/uhttpd/default

SECTION:=net

CATEGORY:=Network

SUBMENU:=Web Servers/Proxies

TITLE:=uHTTPd - tiny, single threaded HTTP server

MAINTAINER:=Jo-Philipp Wich

endef

define Package/uhttpd

$(Package/uhttpd/default)

MENU:=1

endef

define Package/uhttpd/description

uHTTPd is a tiny single threaded HTTP server with TLS, CGI and Lua

support. It is intended as a drop-in replacement for the Busybox

HTTP daemon.

endef

define Package/uhttpd-mod-tls

$(Package/uhttpd/default)

TITLE+= (TLS plugin)

DEPENDS:=uhttpd +PACKAGE_uhttpd-mod-tls_cyassl:libcyassl +PACKAGE_uhttpd-mod-tls_openssl:libopenssl

endef

define Package/uhttpd-mod-tls/description

The TLS plugin adds HTTPS support to uHTTPd.

endef

define Package/uhttpd-mod-tls/config

choice

depends on PACKAGE_uhttpd-mod-tls

prompt "TLS Provider"

default PACKAGE_uhttpd-mod-tls_cyassl

config PACKAGE_uhttpd-mod-tls_cyassl

bool "CyaSSL"

config PACKAGE_uhttpd-mod-tls_openssl

bool "OpenSSL"

endchoice

endef

UHTTPD_TLS:=

TLS_CFLAGS:=

TLS_LDFLAGS:=

ifneq ($(CONFIG_PACKAGE_uhttpd-mod-tls_cyassl),)

UHTTPD_TLS:=cyassl

TLS_CFLAGS:=-I$(STAGING_DIR)/usr/include/cyassl -DTLS_IS_CYASSL

TLS_LDFLAGS:=-lcyassl -lm

endif

ifneq ($(CONFIG_PACKAGE_uhttpd-mod-tls_openssl),)

UHTTPD_TLS:=openssl

TLS_CFLAGS:=-DTLS_IS_OPENSSL

TLS_LDFLAGS:=-lssl

endif

define Package/uhttpd-mod-lua

$(Package/uhttpd/default)

TITLE+= (Lua plugin)

DEPENDS:=uhttpd +liblua

endef

define Package/uhttpd-mod-lua/description

The Lua plugin adds a CGI-like Lua runtime interface to uHTTPd.

endef

TARGET_CFLAGS += $(TLS_CFLAGS)

TARGET_LDFLAGS += -Wl,-rpath-link=$(STAGING_DIR)/usr/lib

MAKE_VARS += \

FPIC="$(FPIC)" \

LUA_SUPPORT="$(if $(CONFIG_PACKAGE_uhttpd-mod-lua),1)" \

TLS_SUPPORT="$(if $(CONFIG_PACKAGE_uhttpd-mod-tls),1)" \

UHTTPD_TLS="$(UHTTPD_TLS)" \

TLS_CFLAGS="$(TLS_CFLAGS)" \

TLS_LDFLAGS="$(TLS_LDFLAGS)"

define Build/Prepare

mkdir -p $(PKG_BUILD_DIR)

$(CP) ./src/* $(PKG_BUILD_DIR)/

endef

define Package/uhttpd/conffiles

/etc/config/uhttpd

/etc/uhttpd.crt

/etc/uhttpd.key

endef

define Package/uhttpd/install

$(INSTALL_DIR) $(1)/etc/init.d

$(INSTALL_BIN) ./files/uhttpd.init $(1)/etc/init.d/uhttpd

$(INSTALL_DIR) $(1)/etc/config

$(INSTALL_CONF) ./files/uhttpd.config $(1)/etc/config/uhttpd

$(INSTALL_DIR) $(1)/usr/sbin

$(INSTALL_BIN) $(PKG_BUILD_DIR)/uhttpd $(1)/usr/sbin/uhttpd

endef

define Package/uhttpd-mod-tls/install

$(INSTALL_DIR) $(1)/usr/lib

$(INSTALL_BIN) $(PKG_BUILD_DIR)/uhttpd_tls.so $(1)/usr/lib/

endef

define Package/uhttpd-mod-lua/install

$(INSTALL_DIR) $(1)/usr/lib

$(INSTALL_BIN) $(PKG_BUILD_DIR)/uhttpd_lua.so $(1)/usr/lib/

endef

$(eval $(call BuildPackage,uhttpd))

$(eval $(call BuildPackage,uhttpd-mod-tls))

$(eval $(call BuildPackage,uhttpd-mod-lua))

具体操作如下:

利用 SDK 生成自己的ipk安装包,

下载

1. 解压

tar jxvf OpenWrt-SDK-ar71xx-for-linux-i486-gcc-4.6-linaro_uClibc-0.9.33.2.tar.bz2

2. 进入目录

cd OpenWrt-SDK-ar71xx-for-linux-i486-gcc-4.6-linaro_uClibc-0.9.33.2

3. 将自己的代码目录拷贝到本目录的 package目录下

注意 Makefile 必须遵守openwrt的规则, 可参考

http://blog.chinaunix.net/uid-27194309-id-3432651.html

4. 编译, 成功后在bin/ar71xx/packages目录下可以看到相关的ipk文件, 可用winscp 拷贝出来

#编译所有组件

make V=99

#单独编译某个组件

make package/hid/compile

5. 安装到路由器上实验, 这个你们都懂的

#注: SDK的目录不要改动, 否则出现如下错误

xxg@xxg-desktop:~/SDK-ar71xx-gcc-4.6-linaro_uClibc-0.9.33.2$ make

/bin/sh: /home/xxg/OpenWrt-SDK-ar71xx-for-linux-i486-gcc-4.6-linaro_uClibc-0.9.33.2/staging_dir/host/bin/find: not found

/bin/sh: /home/xxg/OpenWrt-SDK-ar71xx-for-linux-i486-gcc-4.6-linaro_uClibc-0.9.33.2/staging_dir/host/bin/find: not found

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值