regpkg revision 1.7
11.1Sagc#! /bin/sh
21.1Sagc#
31.7Sapb# $NetBSD: regpkg,v 1.7 2006/01/03 16:40:16 apb Exp $
41.1Sagc#
51.1Sagc# Copyright (c) 2003 Alistair G. Crooks.  All rights reserved.
61.1Sagc#
71.1Sagc# Redistribution and use in source and binary forms, with or without
81.1Sagc# modification, are permitted provided that the following conditions
91.1Sagc# are met:
101.1Sagc# 1. Redistributions of source code must retain the above copyright
111.1Sagc#    notice, this list of conditions and the following disclaimer.
121.1Sagc# 2. Redistributions in binary form must reproduce the above copyright
131.1Sagc#    notice, this list of conditions and the following disclaimer in the
141.1Sagc#    documentation and/or other materials provided with the distribution.
151.1Sagc# 3. All advertising materials mentioning features or use of this software
161.1Sagc#    must display the following acknowledgement:
171.1Sagc#	This product includes software developed by Alistair G. Crooks.
181.1Sagc#	for the NetBSD project.
191.1Sagc# 4. The name of the author may not be used to endorse or promote
201.1Sagc#    products derived from this software without specific prior written
211.1Sagc#    permission.
221.1Sagc#
231.1Sagc# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
241.1Sagc# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
251.1Sagc# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
261.1Sagc# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
271.1Sagc# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
281.1Sagc# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
291.1Sagc# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
301.1Sagc# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
311.1Sagc# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
321.1Sagc# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
331.1Sagc# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
341.1Sagc#
351.1Sagc
361.1Sagc# Usage: regpkg set pkgname
371.1Sagc
381.6Serhrundir=${0%/*}
391.6Serh
401.1SagcSYSPKGROOT=${PKG_DBDIR:-/var/db/pkg}
411.1Sagccase "${SYSPKG_DBDIR}" in
421.1Sagc"")	;;
431.1Sagc*)	SYSPKGROOT=${SYSPKG_DBDIR} ;;
441.1Sagcesac
451.1Sagc
461.1SagcPLIST=/tmp/.PLIST.$$
471.1Sagc
481.1Sagcverbose=""
491.1Sagcwhile [ $# -gt 2 ]; do
501.1Sagc	case $1 in
511.1Sagc	-v)	verbose=$1 ;;
521.1Sagc	*)	break ;;
531.1Sagc	esac
541.1Sagc	shift
551.1Sagcdone
561.1Sagc
571.1Sagcif [ $# -ne 2 ]; then
581.1Sagc	echo "Usage: regpkg set pkgname"
591.1Sagc	exit 1
601.1Sagcfi
611.1Sagc
621.1Sagcpkgset=$1
631.1Sagc
641.1Sagcpkg=$2
651.1Sagc
661.1Sagccase $verbose in
671.1Sagc-v)	echo "Making PLIST for \"$pkgset\" set and \"$pkg\" package" ;;
681.1Sagcesac
691.1Sagc
701.1Sagc# create the skeleton PLIST from the pkgset description
711.6Serh$rundir/makeplist $pkgset $pkg > $PLIST
721.1Sagc
731.2Sjwise# create the pkg tiny version
741.3Sagccase "${SYSPKG_DATES}" in
751.7Sapb"")	tinyvers=`${AWK} '$1 ~ '/$pkg/' { print $2 }' $rundir/versions`
761.3Sagc	case "$tinyvers" in
771.3Sagc	"")	tinyvers=0
781.3Sagc		;;
791.3Sagc	esac
801.3Sagc	if [ -f ../../sys/conf/osrelease.sh ]; then
811.7Sapb		osvers=`${HOST_SH} ../../sys/conf/osrelease.sh`
821.4Sdyoung		method=osreleases
831.3Sagc	else
841.7Sapb		osvers=`${UNAME} -r`
851.3Sagc		method=uname
861.3Sagc	fi
871.3Sagc	t=$osvers.$tinyvers
881.3Sagc	;;
891.7Sapb*)	args=`${AWK} '
901.3Sagc		/^@cwd/ { prefix = $2; next }
911.3Sagc		/^@dirrm/ { next }
921.3Sagc		{ printf("%s%s\n", prefix, $0) }' $PLIST`
931.3Sagc	# first try for any RCS identifiers in the files
941.3Sagc	t=0
951.3Sagc	case "$args" in
961.3Sagc	"")	;;
971.7Sapb	*)	t=`${IDENT} $args 2>/dev/null | ${AWK} '
981.3Sagc			BEGIN { last = 0 }
991.3Sagc			$2 == "crt0.c,v" { next }
1001.3Sagc			NF == 8 { t = $4; gsub("/", "", t); if (t > last) last = t; }
1011.3Sagc			END { print last }'`
1021.3Sagc		method=ident
1031.3Sagc		;;
1041.3Sagc	esac
1051.3Sagc	case "$t" in
1061.3Sagc	0)	# we need the last mtime of the files which make up the package
1071.7Sapb		t=`${ENV_CMD} TZ=UTC LOCALE=C ${LS} -lT $args | ${AWK} '
1081.3Sagc			BEGIN { newest = 0 }
1091.3Sagc			{
1101.3Sagc				t = $9 "";
1111.3Sagc				if ($6 == "Jan") t = t "01";
1121.3Sagc				if ($6 == "Feb") t = t "02";
1131.3Sagc				if ($6 == "Mar") t = t "03";
1141.3Sagc				if ($6 == "Apr") t = t "04";
1151.3Sagc				if ($6 == "May") t = t "05";
1161.3Sagc				if ($6 == "Jun") t = t "06";
1171.3Sagc				if ($6 == "Jul") t = t "07";
1181.3Sagc				if ($6 == "Aug") t = t "08";
1191.3Sagc				if ($6 == "Sep") t = t "09";
1201.3Sagc				if ($6 == "Oct") t = t "10";
1211.3Sagc				if ($6 == "Nov") t = t "11";
1221.3Sagc				if ($6 == "Dec") t = t "12";
1231.3Sagc				if ($7 < 10) t = t "0";
1241.3Sagc				t = t $7;
1251.3Sagc				#these next two lines add the 24h clock onto the date
1261.3Sagc				#gsub(":", "", $8);
1271.3Sagc				#t = sprintf("%s.%4.4s", t, $8);
1281.3Sagc				if (t > newest) newest = t;
1291.3Sagc			}
1301.3Sagc			END { print newest }'`
1311.3Sagc		method=ls
1321.3Sagc		;;
1331.3Sagc	esac
1341.2Sjwise	;;
1351.2Sjwiseesac
1361.2Sjwise
1371.3Sagc# print version number that we're using
1381.3Sagccase "$verbose" in
1391.3Sagc-v)	echo "$pkg - $t version using $method method" ;;
1401.3Sagcesac
1411.1Sagc
1421.1Sagc# create the directory and minimal contents
1431.1SagcSYSPKGDIR=${SYSPKGROOT}/$pkg-$t
1441.1Sagcif [ -d ${SYSPKGDIR} ]; then
1451.1Sagc	echo "There is already a $pkg-$t package installed (${SYSPKGDIR})"
1461.1Sagc	exit 1
1471.1Sagcfi
1481.1Sagc
1491.1Sagcmkdir -p ${SYSPKGDIR}
1501.1Sagc
1511.4Sdyoung# add the dependencies
1521.7Sapb${AWK} '$1 ~ '/$pkg/' { print $2 }' $rundir/deps | ${SORT} | \
1531.7Sapb    ${AWK} '{ print "@pkgdep " $1 "-[0-9]*" }' >> $PLIST
1541.4Sdyoung
1551.1Sagc# create the comment
1561.7Sapbcomment=`${AWK} '$1 ~ '/$pkg/' { print substr($0, length($1) + 2) }' \
1571.7Sapb	$rundir/comments`
1581.1Sagccase "$comment" in
1591.1Sagc"")	echo "***WARNING ***: no comment for \"$pkg\"" 2>&1
1601.1Sagc	comment="System package for $pkg"
1611.1Sagc	;;
1621.1Sagcesac
1631.1Sagcecho "$comment" > ${SYSPKGDIR}/+COMMENT
1641.1Sagc
1651.1Sagc# create the description
1661.7Sapbdescr=`${AWK} '$1 ~ '/$pkg/' { print substr($0, length($1) + 2) }' \
1671.7Sapb	$rundir/descrs`
1681.1Sagccase "$descr" in
1691.1Sagc"")	echo "***WARNING ***: no description for \"$pkg\"" 2>&1
1701.1Sagc	descr="System package for $pkg"
1711.1Sagc	;;
1721.1Sagcesac
1731.1Sagcecho "$descr" > ${SYSPKGDIR}/+DESC
1741.7Sapb${PRINTF} "\nHomepage:\nhttp://www.NetBSD.org/\n" >> ${SYSPKGDIR}/+DESC
1751.1Sagc
1761.1Sagc# create the build information
1771.5Sdyoungif [ x${BUILD_INFO_CACHE} = x ]; then
1781.5Sdyoung	{
1791.7Sapb	echo "OPSYS=`${UNAME} -s`"
1801.7Sapb	echo "OS_VERSION=`${UNAME} -r`"
1811.7Sapb	${MAKE} -f- all <<EOF
1821.4Sdyoung.include <bsd.own.mk>
1831.4Sdyoungall:
1841.4Sdyoung	@echo OBJECT_FMT=${OBJECT_FMT}
1851.4Sdyoung	@echo MACHINE_ARCH=${MACHINE_ARCH}
1861.4Sdyoung	@echo MACHINE_GNU_ARCH=${MACHINE_GNU_ARCH}
1871.4SdyoungEOF
1881.7Sapb	echo "_PKGTOOLS_VER=`${PKG_CREATE} -V`"
1891.5Sdyoung	} > ${SYSPKGDIR}/+BUILD_INFO
1901.5Sdyoungelse
1911.5Sdyoung	cp ${BUILD_INFO_CACHE} ${SYSPKGDIR}/+BUILD_INFO
1921.5Sdyoungfi
1931.1Sagc
1941.1Sagc# test for attributes
1951.1Sagcargs=""
1961.7Sapbattrs=`${AWK} '$1 ~ '/$pkg/' { print substr($0, length($1) + 2) }' \
1971.7Sapb	$rundir/attrs`
1981.1Sagcfor a in "$attrs"; do
1991.1Sagc	case "$attrs" in
2001.1Sagc	"")		;;
2011.1Sagc	preserve)	echo "$pkg-$t" > ${SYSPKGDIR}/+PRESERVE
2021.1Sagc			args="$args -n ${SYSPKGDIR}/+PRESERVE"
2031.1Sagc			;;
2041.1Sagc	esac
2051.1Sagcdone
2061.1Sagc
2071.7Sapb${PKG_CREATE} -v -c ${SYSPKGDIR}/+COMMENT \
2081.1Sagc	-d ${SYSPKGDIR}/+DESC \
2091.1Sagc	$args \
2101.1Sagc	-f $PLIST -l -b /dev/null -B ${SYSPKGDIR}/+BUILD_INFO \
2111.5Sdyoung	-s /dev/null -S /dev/null -O $pkg-$t.tgz \
2121.1Sagc		> ${SYSPKGDIR}/+CONTENTS
2131.1Sagc
2141.4Sdyoungrm $PLIST
215