总结openwrt中如何新建一个package包的方法
)
例如,需要在base system 选项下添加一个用于工厂测试的包
在代码目录的package下新建一个专门用于存放自开发的目录,然后将需要添加的包,都统一的放在里面。
这里新建的目录为zowee
然后在zowee目录下创建包名目录
包目录文件结构
创建一级目录 files src和文件Makefile
files目录下创建etc目录
etc目录下创建目录init.d 和文件myapp.conf
init.d目录下创建文件myapp
src目录下主要创建文件myapp.c 和Makefile
下面介绍每个文件的内容
etc目录的内容会被打包到具体的
mapp.conf存放自定义的配置信息,一般为空
init.d/myapp 配置该应用自启动和默认的控制方式
如下:
#!/bin/sh /etc/rc.common 通过脚本/etc/rc.common中的语句来执行shell命令
#Copyright © 2015 OpenWrt.org 版权信息,标记当前openwrt系统的版本
START=97 内核启动该应用的顺序标记为97
start() {
/usr/bin/myapp -C /etc/myapp.conf
}
启动改应用的命令包装到start()下,可以通过prolinecmd start 启动应用,这里
/etc/myapp.conf文本中内容通过传参传递到应用main()函数中。
stop() {
killall myapp
}
关闭myapp这个应用的进程
restart() {
stop
sleep 1
start
}
重新开启myapp这个应用。
src/Makefile 文件
all: prolinecmd
prolinecmd:
$(CC) $(CFLAGS) -o $@ myapp.c netport_circle.c -Wall
clean:
rm -f prolinecmd
这个Makefile描述了prolinecmd这个应用生成的规则
all: prolinecmd 目标all 依赖prolinecmd
$(CC) $(CFLAGS) -o $@ myapp.c netport_circle.c -Wall
$(CC) 编译工具CC
$(CFLAGS) 编译时的标志
-o 表示以可执行文件的方式生成
$@ 全部目标 这里是prolinecmd
myapp.c netport_circle.c 被编译的文件
-Wall 编译出错时输出必要打印
clean: rm -f prolinecmd
make clean时执行的动作为删除prolinecmd
./Makefile 文件
include $(TOPDIR)/rules.mk
PKG_NAME:=prolinecmd
PKG_VERSION:=
PKG_RELEASE:=1
PKG_SOURCE:=
PKG_SOURCE_URL:=
PKG_MD5SUM:=
PKG_FLAGS:=nonshared
PKG_BUILD_DIR :=
(
B
U
I
L
D
D
I
R
)
/
(BUILD_DIR)/
(BUILDDIR)/(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
define Package/prolinecmd
SECTION:=utils
CATEGORY:=Base system
TITLE:=prolinecmd app for zowee
endef
define Package/prolinecmd/description
This is my firist package
endef
define Build/Configure
endef
#define Build/Prepare
#mkdir -p KaTeX parse error: Expected 'EOF', got '#' at position 17: …PKG_BUILD_DIR) #̲(CP) ./src/* $(PKG_BUILD_DIR)/
#endef
define Build/Compile
$(MAKE) -C
(
P
K
G
B
U
I
L
D
D
I
R
)
C
C
=
"
(PKG_BUILD_DIR) \ CC="
(PKGBUILDDIR) CC="(TARGET_CC)"
CFLAGS=“
(
T
A
R
G
E
T
C
F
L
A
G
S
)
−
W
a
l
l
"
L
D
F
L
A
G
S
=
"
(TARGET_CFLAGS) -Wall" \ LDFLAGS="
(TARGETCFLAGS)−Wall" LDFLAGS="(TARGET_LDFLAGS)”
endef
define Package/prolinecmd/install
$(CP) ./files/* $(1)/
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/prolinecmd $(1)/usr/bin/
endef
$(eval $(call BuildPackage,prolinecmd))
解析:
include $(TOPDIR)/rules.mk 将顶层目录下的rules.mk 导入到当前的文件中来
PKG_NAME:=prolinecmd 软件包的名字
PKG_VERSION:= 软件包的版本
PKG_RELEASE:=1 这个makefile的版本
PKG_REV 要下载软件包在git或这svn上版本号
PKG_SOURCE:= 要下载软件包的名字,一般是由PKG_NAME和PKG_VERSION组成
PKG_SOURCE_URL:= 下载这个软件包的链接
PKG_MD5SUM:= 数据完整性校验码
PKG_FLAGS:=nonshared 软件包标志
PKG_BUILD_DIR :=
(
B
U
I
L
D
D
I
R
)
/
(BUILD_DIR)/
(BUILDDIR)/(PKG_NAME)
BUILD_DIR:$(TOPDIR)/build_dir 实际编译路径
include
(
I
N
C
L
U
D
E
D
I
R
)
/
p
a
c
k
a
g
e
.
m
k
I
N
C
L
U
D
E
D
I
R
:
(INCLUDE_DIR)/package.mk INCLUDE_DIR :
(INCLUDEDIR)/package.mkINCLUDEDIR:(TOPDIR)/include 依赖的安装包执行下载操作
define Package/prolinecmd
SECTION:=utils
CATEGORY:=Base system
TITLE:=prolinecmd app for zowee
endef
描述软件包在menuconfig和ipkg中的信息
SECTION:=utils 软件包类型
CATEGORY:=Base system 软件包在menuconfig里的位置
TITLE:=prolinecmd app for zowee 软件包标题
define Package/prolinecmd/description
This is my firist package
endef
软件包的描述信息
define Build/Configure
endef
如果源代码编译前需要configure或者调用配置脚本,那么就定义这个宏。
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/
endef
编译之前的准备动作,创建PKG_BUILD_DIR目录,然后将源码复制到这个目录中
define Build/Compile
$(MAKE) -C
(
P
K
G
B
U
I
L
D
D
I
R
)
C
C
=
"
(PKG_BUILD_DIR) \ CC="
(PKGBUILDDIR) CC="(TARGET_CC)"
CFLAGS=“
(
T
A
R
G
E
T
C
F
L
A
G
S
)
−
W
a
l
l
"
L
D
F
L
A
G
S
=
"
(TARGET_CFLAGS) -Wall" \ LDFLAGS="
(TARGETCFLAGS)−Wall" LDFLAGS="(TARGET_LDFLAGS)”
endef
源代码编译规则,默认已经设置好,一般不需要自定义,只有当需要指定一些特殊的规则时采用到。
define Package/prolinecmd/install
$(CP) ./files/* $(1)/
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/prolinecmd $(1)/usr/bin/
endef
软件包的安装方法,主要就是将一系列编译好的文件、启动脚本、UCI配置文件等拷贝到指定位置
$(1):表示:
staging_dir\target-arm_cortex-a9_musl_eabi\root-triductor
$(CP) ./files/*
(
1
)
/
将
f
i
l
e
s
下的目录文件移动到
(1)/ 将files下的目录文件移动到
(1)/将files下的目录文件移动到(1)目录下
$(INSTALL_DIR) $(1)/usr/bin :修改该目录的权限
$(INSTALL_BIN) $(PKG_BUILD_DIR)/prolinecmd $(1)/usr/bin/ 将生成的文件复制到这个目录下