regpkg revision 1.7
1#! /bin/sh 2# 3# $NetBSD: regpkg,v 1.7 2006/01/03 16:40:16 apb Exp $ 4# 5# Copyright (c) 2003 Alistair G. Crooks. All rights reserved. 6# 7# Redistribution and use in source and binary forms, with or without 8# modification, are permitted provided that the following conditions 9# are met: 10# 1. Redistributions of source code must retain the above copyright 11# notice, this list of conditions and the following disclaimer. 12# 2. Redistributions in binary form must reproduce the above copyright 13# notice, this list of conditions and the following disclaimer in the 14# documentation and/or other materials provided with the distribution. 15# 3. All advertising materials mentioning features or use of this software 16# must display the following acknowledgement: 17# This product includes software developed by Alistair G. Crooks. 18# for the NetBSD project. 19# 4. The name of the author may not be used to endorse or promote 20# products derived from this software without specific prior written 21# permission. 22# 23# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 24# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 25# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 27# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 29# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 30# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 31# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 32# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 33# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34# 35 36# Usage: regpkg set pkgname 37 38rundir=${0%/*} 39 40SYSPKGROOT=${PKG_DBDIR:-/var/db/pkg} 41case "${SYSPKG_DBDIR}" in 42"") ;; 43*) SYSPKGROOT=${SYSPKG_DBDIR} ;; 44esac 45 46PLIST=/tmp/.PLIST.$$ 47 48verbose="" 49while [ $# -gt 2 ]; do 50 case $1 in 51 -v) verbose=$1 ;; 52 *) break ;; 53 esac 54 shift 55done 56 57if [ $# -ne 2 ]; then 58 echo "Usage: regpkg set pkgname" 59 exit 1 60fi 61 62pkgset=$1 63 64pkg=$2 65 66case $verbose in 67-v) echo "Making PLIST for \"$pkgset\" set and \"$pkg\" package" ;; 68esac 69 70# create the skeleton PLIST from the pkgset description 71$rundir/makeplist $pkgset $pkg > $PLIST 72 73# create the pkg tiny version 74case "${SYSPKG_DATES}" in 75"") tinyvers=`${AWK} '$1 ~ '/$pkg/' { print $2 }' $rundir/versions` 76 case "$tinyvers" in 77 "") tinyvers=0 78 ;; 79 esac 80 if [ -f ../../sys/conf/osrelease.sh ]; then 81 osvers=`${HOST_SH} ../../sys/conf/osrelease.sh` 82 method=osreleases 83 else 84 osvers=`${UNAME} -r` 85 method=uname 86 fi 87 t=$osvers.$tinyvers 88 ;; 89*) args=`${AWK} ' 90 /^@cwd/ { prefix = $2; next } 91 /^@dirrm/ { next } 92 { printf("%s%s\n", prefix, $0) }' $PLIST` 93 # first try for any RCS identifiers in the files 94 t=0 95 case "$args" in 96 "") ;; 97 *) t=`${IDENT} $args 2>/dev/null | ${AWK} ' 98 BEGIN { last = 0 } 99 $2 == "crt0.c,v" { next } 100 NF == 8 { t = $4; gsub("/", "", t); if (t > last) last = t; } 101 END { print last }'` 102 method=ident 103 ;; 104 esac 105 case "$t" in 106 0) # we need the last mtime of the files which make up the package 107 t=`${ENV_CMD} TZ=UTC LOCALE=C ${LS} -lT $args | ${AWK} ' 108 BEGIN { newest = 0 } 109 { 110 t = $9 ""; 111 if ($6 == "Jan") t = t "01"; 112 if ($6 == "Feb") t = t "02"; 113 if ($6 == "Mar") t = t "03"; 114 if ($6 == "Apr") t = t "04"; 115 if ($6 == "May") t = t "05"; 116 if ($6 == "Jun") t = t "06"; 117 if ($6 == "Jul") t = t "07"; 118 if ($6 == "Aug") t = t "08"; 119 if ($6 == "Sep") t = t "09"; 120 if ($6 == "Oct") t = t "10"; 121 if ($6 == "Nov") t = t "11"; 122 if ($6 == "Dec") t = t "12"; 123 if ($7 < 10) t = t "0"; 124 t = t $7; 125 #these next two lines add the 24h clock onto the date 126 #gsub(":", "", $8); 127 #t = sprintf("%s.%4.4s", t, $8); 128 if (t > newest) newest = t; 129 } 130 END { print newest }'` 131 method=ls 132 ;; 133 esac 134 ;; 135esac 136 137# print version number that we're using 138case "$verbose" in 139-v) echo "$pkg - $t version using $method method" ;; 140esac 141 142# create the directory and minimal contents 143SYSPKGDIR=${SYSPKGROOT}/$pkg-$t 144if [ -d ${SYSPKGDIR} ]; then 145 echo "There is already a $pkg-$t package installed (${SYSPKGDIR})" 146 exit 1 147fi 148 149mkdir -p ${SYSPKGDIR} 150 151# add the dependencies 152${AWK} '$1 ~ '/$pkg/' { print $2 }' $rundir/deps | ${SORT} | \ 153 ${AWK} '{ print "@pkgdep " $1 "-[0-9]*" }' >> $PLIST 154 155# create the comment 156comment=`${AWK} '$1 ~ '/$pkg/' { print substr($0, length($1) + 2) }' \ 157 $rundir/comments` 158case "$comment" in 159"") echo "***WARNING ***: no comment for \"$pkg\"" 2>&1 160 comment="System package for $pkg" 161 ;; 162esac 163echo "$comment" > ${SYSPKGDIR}/+COMMENT 164 165# create the description 166descr=`${AWK} '$1 ~ '/$pkg/' { print substr($0, length($1) + 2) }' \ 167 $rundir/descrs` 168case "$descr" in 169"") echo "***WARNING ***: no description for \"$pkg\"" 2>&1 170 descr="System package for $pkg" 171 ;; 172esac 173echo "$descr" > ${SYSPKGDIR}/+DESC 174${PRINTF} "\nHomepage:\nhttp://www.NetBSD.org/\n" >> ${SYSPKGDIR}/+DESC 175 176# create the build information 177if [ x${BUILD_INFO_CACHE} = x ]; then 178 { 179 echo "OPSYS=`${UNAME} -s`" 180 echo "OS_VERSION=`${UNAME} -r`" 181 ${MAKE} -f- all <<EOF 182.include <bsd.own.mk> 183all: 184 @echo OBJECT_FMT=${OBJECT_FMT} 185 @echo MACHINE_ARCH=${MACHINE_ARCH} 186 @echo MACHINE_GNU_ARCH=${MACHINE_GNU_ARCH} 187EOF 188 echo "_PKGTOOLS_VER=`${PKG_CREATE} -V`" 189 } > ${SYSPKGDIR}/+BUILD_INFO 190else 191 cp ${BUILD_INFO_CACHE} ${SYSPKGDIR}/+BUILD_INFO 192fi 193 194# test for attributes 195args="" 196attrs=`${AWK} '$1 ~ '/$pkg/' { print substr($0, length($1) + 2) }' \ 197 $rundir/attrs` 198for a in "$attrs"; do 199 case "$attrs" in 200 "") ;; 201 preserve) echo "$pkg-$t" > ${SYSPKGDIR}/+PRESERVE 202 args="$args -n ${SYSPKGDIR}/+PRESERVE" 203 ;; 204 esac 205done 206 207${PKG_CREATE} -v -c ${SYSPKGDIR}/+COMMENT \ 208 -d ${SYSPKGDIR}/+DESC \ 209 $args \ 210 -f $PLIST -l -b /dev/null -B ${SYSPKGDIR}/+BUILD_INFO \ 211 -s /dev/null -S /dev/null -O $pkg-$t.tgz \ 212 > ${SYSPKGDIR}/+CONTENTS 213 214rm $PLIST 215