regpkg revision 1.6
11.1Sagc#! /bin/sh
21.1Sagc#
31.6Serh# $NetBSD: regpkg,v 1.6 2004/07/23 15:11:26 erh 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.6Serh"")	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.3Sagc		osvers=`sh ../../sys/conf/osrelease.sh`
821.4Sdyoung		method=osreleases
831.3Sagc	else
841.3Sagc		osvers=`uname -r`
851.3Sagc		method=uname
861.3Sagc	fi
871.3Sagc	t=$osvers.$tinyvers
881.3Sagc	;;
891.3Sagc*)	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.3Sagc	*)	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.3Sagc		t=`env 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.6Serhawk '$1 ~ '/$pkg/' { print $2 }' $rundir/deps | sort | \
1531.4Sdyoung    awk '{ print "@pkgdep " $1 "-[0-9]*" }' >> $PLIST
1541.4Sdyoung
1551.1Sagc# create the comment
1561.6Serhcomment=`awk '$1 ~ '/$pkg/' { print substr($0, length($1) + 2) }' $rundir/comments`
1571.1Sagccase "$comment" in
1581.1Sagc"")	echo "***WARNING ***: no comment for \"$pkg\"" 2>&1
1591.1Sagc	comment="System package for $pkg"
1601.1Sagc	;;
1611.1Sagcesac
1621.1Sagcecho "$comment" > ${SYSPKGDIR}/+COMMENT
1631.1Sagc
1641.1Sagc# create the description
1651.6Serhdescr=`awk '$1 ~ '/$pkg/' { print substr($0, length($1) + 2) }' $rundir/descrs`
1661.1Sagccase "$descr" in
1671.1Sagc"")	echo "***WARNING ***: no description for \"$pkg\"" 2>&1
1681.1Sagc	descr="System package for $pkg"
1691.1Sagc	;;
1701.1Sagcesac
1711.1Sagcecho "$descr" > ${SYSPKGDIR}/+DESC
1721.1Sagcprintf "\nHomepage:\nhttp://www.NetBSD.org/\n" >> ${SYSPKGDIR}/+DESC
1731.1Sagc
1741.1Sagc# create the build information
1751.5Sdyoungif [ x${BUILD_INFO_CACHE} = x ]; then
1761.5Sdyoung	{
1771.5Sdyoung	echo "OPSYS=`uname -s`"
1781.5Sdyoung	echo "OS_VERSION=`uname -r`"
1791.5Sdyoung	make -f- all <<EOF
1801.4Sdyoung.include <bsd.own.mk>
1811.4Sdyoungall:
1821.4Sdyoung	@echo OBJECT_FMT=${OBJECT_FMT}
1831.4Sdyoung	@echo MACHINE_ARCH=${MACHINE_ARCH}
1841.4Sdyoung	@echo MACHINE_GNU_ARCH=${MACHINE_GNU_ARCH}
1851.4SdyoungEOF
1861.5Sdyoung	echo "_PKGTOOLS_VER=`pkg_create -V`"
1871.5Sdyoung	} > ${SYSPKGDIR}/+BUILD_INFO
1881.5Sdyoungelse
1891.5Sdyoung	cp ${BUILD_INFO_CACHE} ${SYSPKGDIR}/+BUILD_INFO
1901.5Sdyoungfi
1911.1Sagc
1921.1Sagc# test for attributes
1931.1Sagcargs=""
1941.6Serhattrs=`awk '$1 ~ '/$pkg/' { print substr($0, length($1) + 2) }' $rundir/attrs`
1951.1Sagcfor a in "$attrs"; do
1961.1Sagc	case "$attrs" in
1971.1Sagc	"")		;;
1981.1Sagc	preserve)	echo "$pkg-$t" > ${SYSPKGDIR}/+PRESERVE
1991.1Sagc			args="$args -n ${SYSPKGDIR}/+PRESERVE"
2001.1Sagc			;;
2011.1Sagc	esac
2021.1Sagcdone
2031.1Sagc
2041.1Sagcpkg_create -v -c ${SYSPKGDIR}/+COMMENT \
2051.1Sagc	-d ${SYSPKGDIR}/+DESC \
2061.1Sagc	$args \
2071.1Sagc	-f $PLIST -l -b /dev/null -B ${SYSPKGDIR}/+BUILD_INFO \
2081.5Sdyoung	-s /dev/null -S /dev/null -O $pkg-$t.tgz \
2091.1Sagc		> ${SYSPKGDIR}/+CONTENTS
2101.1Sagc
2111.4Sdyoungrm $PLIST
212