应用程序包开发者指南

案例研究文件

pkginfo 文件

PKG=SUNWsst
NAME=Simple SCSI Target Driver
VERSION=1
CATEGORY=system
ARCH=sparc
VENDOR=Sun Microsystems
BASEDIR=/opt
CLASSES=sed

prototype 文件

例如,此案例研究使用软件包对象的分层布局,如下图所示。

图 5–1 分层软件包目录结构

下文对该图形进行了说明。

软件包对象的安装位置与上图 pkg 目录中的位置相同。驱动程序模块(sstsst.conf)安装在 /usr/kernel/drv 中,而头文件安装在 /usr/include/sys/scsi/targets 中。sstsst.confsst_def.h 文件是绝对对象。测试程序 sstest.c 及其目录 SUNWsst 是可重定位对象;它们的安装位置由 BASEDIR 参数设置。

软件包的其余组件(所有控制文件)安装在开发计算机上软件包的顶层目录中,但 sed 类脚本除外。它根据所修改的文件命名为 devlink.tab 并安装到 etc,该目录包含实际的 devlink.tab 文件。

pkg 目录运行 pkgproto 命令,如下所示:


find usr SUNWsst -print | pkgproto > prototype

上述命令的输出如下所示:

d none usr 0775 pms mts
d none usr/include 0775 pms mts
d none usr/include/sys 0775 pms mts
d none usr/include/sys/scsi 0775 pms mts
d none usr/include/sys/scsi/targets 0775 pms mts
f none usr/include/sys/scsi/targets/sst_def.h 0444 pms mts
d none usr/kernel 0775 pms mts
d none usr/kernel/drv 0775 pms mts
f none usr/kernel/drv/sst 0664 pms mts
f none usr/kernel/drv/sst.conf 0444 pms mts
d none SUNWsst 0775 pms mts
f none SUNWsst/sstest.c 0664 pms mts

prototype 文件并不是完整文件。要完成此文件,您需要进行以下修改:

以下是最终的 prototype 文件:

i pkginfo
i postinstall
i preremove
i copyright
e sed /etc/devlink.tab ? ? ?
f none /usr/include/sys/scsi/targets/sst_def.h 0644 bin bin
f none /usr/kernel/drv/sst 0755 root sys
f none /usr/kernel/drv/sst.conf 0644 root sys
d none SUNWsst 0775 root sys
f none SUNWsst/sstest.c 0664 root sys

sed 脚本条目中的问号表明不应更改安装计算机上现有文件的访问权限和拥有权。

sed 类操作脚本 (/etc/devlink.tab)

在驱动程序示例中,sed 类脚本用于向 /etc/devlink.tab 文件中添加一个驱动程序条目。devlinks 命令使用此文件创建从 /dev/devices 的符号链接。以下是 sed 脚本:

# sed class script to modify /etc/devlink.tab
!install
/name=sst;/d
$i\
type=ddi_pseudo;name=sst;minor=character	rsst\\A1

!remove
/name=sst;/d

pkgrm 命令不运行该脚本的删除部分。您可能需要向 preremove 脚本中添加一行,以便直接运行 sed/etc/devlink.tab 文件删除条目。

postinstall 安装脚本

在此示例中,该脚本所需要做的只是运行 add_drv 命令。

# Postinstallation script for SUNWsst
# This does not apply to a client.
if [$PKG_INSTALL_ROOT = "/" -o -z $PKG_INSTALL_ROOT]; then
   SAVEBASE=$BASEDIR
   BASEDIR=””; export BASEDIR
   /usr/sbin/add_drv sst
   STATUS=$?
   BASEDIR=$SAVEBASE; export BASEDIR
   if [ $STATUS -eq 0 ]
   then
	     exit 20
   else
	     exit 2
   fi
else
   echo "This cannot be installed onto a client."
   exit 2
fi

add_drv 命令使用 BASEDIR 参数,因此该脚本必须在运行此命令之前取消设置 BASEDIR,并在以后恢复它。

add_drv 命令的操作之一是运行 devlinks,它使用由 sed 类脚本放置在 /etc/devlink.tab 中的条目为驱动程序创建 /dev 条目。

postinstall 脚本的退出代码作用很重要。退出代码 20 告诉 pkgadd 命令告知用户重新引导系统(安装驱动程序后必须这样做),而退出代码 2 则告诉 pkgadd 命令告知用户安装部分失败。

preremove 删除脚本

在此驱动程序示例中,该脚本删除 /dev 中的链接并对驱动程序运行 rem_drv 命令。

# Pre removal script for the sst driver
echo “Removing /dev entries”
/usr/bin/rm -f /dev/rsst*

echo “Deinstalling driver from the kernel”
SAVEBASE=$BASEDIR
BASEDIR=””; export BASEDIR
/usr/sbin/rem_drv sst
BASEDIR=$SAVEBASE; export BASEDIR

exit 

该脚本删除 /dev 条目本身; /devices 条目由 rem_drv 命令删除。

copyright 文件

以下是一个包含版权声明文本的简单 ASCII 文件。该声明在软件包安装开始时显示,显示时与此文件中的形式完全相同。


	Copyright (c) 1999 Drivers-R-Us, Inc.
	10 Device Drive, Thebus, IO 80586

All rights reserved. This product and related documentation is
protected by copyright and distributed under licenses 
restricting its use, copying, distribution and decompilation. 
No part of this product or related documentation may be 
reproduced in any form by any means without prior written 
authorization of Drivers-R-Us and its licensors, if any.