regpkg revision 1.8
1#! /bin/sh 2# 3# $NetBSD: regpkg,v 1.8 2006/01/03 18:31:09 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="$(dirname "$0")" # ${0%/*} isn't good enough when there's no "/" 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