峯言凬语 O ever youthful O ever weeping~
本无意与众不同,怎奈何口味太重。
首页
平水韵
颜色表
ABOUT
文章分类
友情链接
OP 开发 package 软件包的基础说明
2022-05-28 |Nonni | Material

valentines-day.gif

举个栗子
cd package

mkdir hello

mkdir src

cd src

vim hello.c

include <stdio.h>

int main(void){
printf("nnhello world !nn");
return 0;
}

vim Makefile

all:

    $(CC) $(CFLAGS) hello.c -o hello

clean:

    rm *.o hello

cd ..

cd hello

vim Makefile

Makefile for the Linux Wireless network device drivers.

include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk

PKG_NAME:=hello
PKG_VERSION:=1
PKG_RELEASE:=1.0

PKG_SOURCE:=
PKG_SOURCE_URL:=https://nonni.cn
PKG_MD5SUM:=

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

include $(INCLUDE_DIR)/package.mk

define Package/$(PKG_NAME)
SECTION:=utils
CATEGORY:=hello
TITLE:=$(PKG_NAME)
MAINTAINER:=Nonni
endef

define Build/Prepare

    mkdir -p $(PKG_BUILD_DIR)
    $(CP)  ./src/* $(PKG_BUILD_DIR)

endef

define Build/Compile

    $(MAKE) -C $(PKG_BUILD_DIR) \
            $(TARGET_CONFIGURE_OPTS) \
            CFLAGS="$(TARGET_CFLAGS)" \
            CPPFLAGS="$(TARGET_CPPFLAGS)" \
            LDFLAGS="$(TARGET_LDFLAGS)"

endef

define Package/$(PKG_NAME)/install

    $(INSTALL_DIR) $(1)/lib/ko
    $(CP) $(PKG_BUILD_DIR)/$(PKG_NAME)  $(1)/lib/ko/

endef

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

include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
include $(INCLUDE_DIR)/package.mk

rules.mk 一般在文件的开头,定义各种OpenWrt全局变量,让所有的makefile包含和使用,eg:INSTALL_BIN、INSTALL_DIR。
kernel.mk 软件包为内核模块时不可缺少
package.mk 一般在软件包的基本信息PKG_NAME PKG_SOURCE等完成再引入,用于编译一般的软件包
模版主要是编译包的定义,程序的编译包以 Package/ 开头,然后接着软件名,在 Package 定义中的软件名可以与软件包不一样,还可以多个定义:
PKG_NAME 包名称,在 menuconfig 和 ipk 显示
PKG_VERSION 版本号
PKG_RELEASE Makefile 的版本号
PKG_SOURCE 源码文件名。
PKG_SOURCE_URL 源代码下载位置,@SF表示sourceforge网站,@GNU表示GNU网站,还有@GNOME、@KERNEL。获取方式可以为:Git、svn、cvs、hg、bzr等。有关下载方法可参考 $(INCLUDE_DIR)/download.mk 和 $(SCRIPT_DIR)/download.pl
PKG_MD5SUM 源代码文件效验码
PKG_CAT 源码的解压方法,包括 zcat,bzcat,unzip 等
PKG_BUILD_DIR 软件包编译目录,父目录为 $(BUILD_DIR),不指定默认为 $(BUILD_DIR)/$( PKG_NAME)$( PKG_VERSION)

其它一些源代码的定义:
PKG_SOURCE_SUBDIR
PKG_SOURCE_PROTO
PKG_SOURCE_MIRROR
PKG_MIRROR_MD5SUM
PKG_SOURCE_VERSION
可以在 include/package.mk 中查找定义

编译
用户软件包使用 Package
内核模块软件包使用 KernelPackage

Package/$(PKG_NAME) 将会在 menuconfig 菜单中显示软件包的基本信息
define Package/$(PKG_NAME)
SECTION:=utils
CATEGORY:=hello
TITLE:=$(PKG_NAME)
MAINTAINER:=Nonni
endef

SECTION 包的类型,预留
CATEGORY 分类,在 menuconfig 的菜单中显示
TITLE 软件包的简短描述
DESCRIPTION 软件包的详细描述
URL 软件包的下载位置
MAINTAINER 维护者
DEPENDS 与其他软件的依赖.如果存在多个依赖,则每个依赖需用空格分开,依赖前使用+号表示默认显示(即依赖对象没有选中时也会显示这个软件包),依赖前使用@,则默认为不显示(即当依赖对象选中后才显示当前这个软件包)

Build/Prepare:
define Build/Prepare

    mkdir -p $(PKG_BUILD_DIR)
    $(CP)  ./src/* $(PKG_BUILD_DIR)

endef

patches 补丁文件
files 配置文件
src 源文件

Build/Compile
使用默认的编译方法:Build/Compile/Default

define Build/Compile

    $(MAKE) -C $(PKG_BUILD_DIR) \
            $(TARGET_CONFIGURE_OPTS) \
            CFLAGS="$(TARGET_CFLAGS)" \
            CPPFLAGS="$(TARGET_CPPFLAGS)" \
            LDFLAGS="$(TARGET_LDFLAGS)"

endef

Package/$(PKG_NAME)/install
软件包的安装包括一系列拷贝编译好的文件到指定位置,调用时会带一些参数,$(1)表示嵌入式系统的镜像目录
一般可以采用下面的方法:

define Package/$(PKG_NAME)/install

    $(INSTALL_DIR) $(1)/lib/ko
    $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(PKG_NAME)  $(1)/lib/ko/

endef

INSTALL_DIR:=install -d -m0755 创建所属用户可读写可执行,其他用户可执行的目录
INSTALL_BIN:=install -m0755 将编译好的文件拷贝到镜像文件目录,并具有可执行属性

Package/$(PKG_NAME)/conffiles
本包安装配置文件,一行一个,如果文件结尾使用/,则表示为目录。用于备份配置文件说明,在 sysupgrade 命令执行时将会用到。

Package/$(PKG_NAME)/description
软件包的详细描述,会取代 Package/$(PKG_NAME) 下的 DESCRIPTION。

Package/$(PKG_NAME)/preinst
软件包安装前处理方法,使用脚本语言定义第一行需要下面的格式:

!/bin/sh

Package/$(PKG_NAME)/postinst
软件包安装后处理方法,使用脚本语言

Package/$(PKG_NAME)/prerm
软件包删除前处理方法,使用脚本语言

Package/$(PKG_NAME)/postrm
软件包删除后处理方法,使用脚本语言

respond-post-702

添加新评论

请填写称呼
请填写合法的电子邮箱地址
请填写合法的网站地址
请填写内容