regpkgset revision 1.11
1#! /bin/sh 2# 3# $NetBSD: regpkgset,v 1.11 2009/10/17 23:43:22 agc Exp $ 4# 5# Copyright (c) 2003,2009 The NetBSD Foundation, Inc. 6# All rights reserved. 7# 8# This code is derived from software contributed to The NetBSD Foundation 9# by Alistair Crooks (agc@NetBSD.org) 10# 11# Redistribution and use in source and binary forms, with or without 12# modification, are permitted provided that the following conditions 13# are met: 14# 1. Redistributions of source code must retain the above copyright 15# notice, this list of conditions and the following disclaimer. 16# 2. Redistributions in binary form must reproduce the above copyright 17# notice, this list of conditions and the following disclaimer in the 18# documentation and/or other materials provided with the distribution. 19# 20# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 21# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 24# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30# POSSIBILITY OF SUCH DAMAGE. 31# 32 33# Usage: regpkgset [options] set 34# 35# Options: 36# -q Quiet. 37# -v Verbose. 38# -f Force. 39# -m Ignore errors from missing files. 40# -u Update. 41# -c Cache some information in ${BUILD_INFO_CACHE}. 42# -d destdir Sets DESTDIR. 43# -t binpkgdir Create a binary package (in *.tgz format) in the 44# specified directory. Without this option, a binary 45# package is not created. 46# -M metalog Use the specified metalog file to override file 47# or directory attributes when creating a binary package. 48# -N etcdir Use the specified directory for passwd and group files. 49 50prog="${0##*/}" 51toppid=$$ 52rundir="$(dirname "$0")" # ${0%/*} isn't good enough when there's no "/" 53. "${rundir}/sets.subr" 54 55: ${TARGET_ENDIANNESS:="$(arch_to_endian "${MACHINE_ARCH}")"} 56export TARGET_ENDIANNESS 57 58bomb() 59{ 60 kill ${toppid} # in case we were invoked from a subshell 61 exit 1 62} 63 64# A literal newline 65nl=' 66' 67 68# 69# cleanup() deletes temporary files. 70# 71es=0 72cleanup() 73{ 74 trap - 0 75 [ x"${BUILD_INFO_CACHE}" != x ] && rm -f "${BUILD_INFO_CACHE}" 76 exit ${es} 77} 78trap 'es=128; cleanup' 1 2 3 13 15 # HUP INT QUIT PIPE TERM 79trap 'es=$?; cleanup' 0 # EXIT 80 81# 82# Parse command line args. 83# 84verbose=false 85quiet=false 86force=false 87allowmissing=false 88update=false 89cache=false 90pkgdir="" 91metalog="" 92etcdir="" 93all_options="" 94while [ $# -gt 1 ]; do 95 # XXX: ${all_options} doesn't correctly handle args with 96 # embedded shell special characters. 97 case "$1" in 98 -q) quiet=true; verbose=false ;; 99 -v) verbose=true; quiet=false ;; 100 -f) force=true ;; 101 -m) allowmissing=true ;; 102 -u) update=true ;; 103 -c) cache=true ;; 104 -d) DESTDIR="$2"; all_options="${all_options} $1"; shift ;; 105 -d*) DESTDIR="${1#-?}" ;; 106 -t) pkgdir="$2"; all_options="${all_options} $1"; shift ;; 107 -t*) pkgdir="${1#-?}" ;; 108 -M) metalog="$2"; all_options="${all_options} $1"; shift ;; 109 -M*) metalog="${1#-?}" ;; 110 -N) etcdir="$2"; all_options="${all_options} $1"; shift ;; 111 -N*) etcdir="${1#-?}" ;; 112 -*) echo "Usage: regpkgset [options] set ..."; bomb ;; 113 *) break ;; 114 esac 115 all_options="${all_options} $1" 116 shift 117done 118export DESTDIR 119 120if [ $# -lt 1 ]; then 121 echo "Usage: regpkgset [options] set ..." 122 bomb 123fi 124 125case "$1" in 126all) list="base comp etc games man misc tests text" ;; 127*) list="$*" ;; 128esac 129 130if ${cache}; then 131 BUILD_INFO_CACHE="$(${MKTEMP} "/var/tmp/${prog}-BUILD_INFO.XXXXXX")" 132 export BUILD_INFO_CACHE 133 { 134 # These variables describe the build 135 # environment, not the target. 136 echo "OPSYS=$(${UNAME} -s)" 137 echo "OS_VERSION=$(${UNAME} -r)" 138 ${MAKE} -B -f- all <<EOF 139.include <bsd.own.mk> 140all: 141 @echo OBJECT_FMT=${OBJECT_FMT} 142 @echo MACHINE_ARCH=${MACHINE_ARCH} 143 @echo MACHINE_GNU_ARCH=${MACHINE_GNU_ARCH} 144EOF 145 # XXX: what's the point of reporting _PKGTOOLS_VER 146 # when we roll everything by hand without using 147 # the pkg tools? 148 echo "_PKGTOOLS_VER=$(${PKG_CREATE} -V)" 149 } > "${BUILD_INFO_CACHE}" 150fi 151 152# 153# For each pkgset mentioned in ${list}, get a list of all pkgs in the pkgset. 154# 155# Sort all the pkgs into dependency order (with prerequisite pkgs before 156# pkgs that depend on them). 157# 158# Invoke ${rundir}/regpkg for each pkg, taking care to do it in dependency 159# order. If there were any pkgs for which we failed to find dependency 160# information, handle them at the end. 161# 162pkgs="$(for pkgset in ${list}; do 163 ${HOST_SH} "${rundir}/listpkgs" "${pkgset}" || bomb 164 done)" 165tsort_input="$(${AWK} '{print $2 " " $1}' <"${rundir}/deps" || bomb)" 166tsort_output="$(echo "${tsort_input}" | ${TSORT} || bomb)" 167for pkg in ${tsort_output}; do 168 case "${nl}${pkgs}${nl}" in 169 *"${nl}${pkg}${nl}"*) 170 # We want this pkg. 171 pkgset="${pkg%%-*}" 172 ${verbose} && echo "${prog}: registering ${pkg}" 173 ${HOST_SH} "${rundir}/regpkg" ${all_options} \ 174 "${pkgset}" "${pkg}" || bomb 175 ;; 176 *) # pkg is mentioned in ${tsort_output} but not in ${pkgs}. 177 # We do not want this pkg. 178 ;; 179 esac 180done 181for pkg in ${pkgs}; do 182 case "${nl}${tsort_output}${nl}" in 183 *"${nl}${pkg}${nl}"*) 184 # pkg was in the tsort output, so it would have been 185 # handled above. 186 ;; 187 *) # This pkg was not in the tsort output. 188 # This is probably an error, but process the 189 # pkg anyway. 190 echo >&2 "${prog}: WARNING: ${pkg} is not mentioned in deps file" 191 pkgset="${pkg%%-*}" 192 ${verbose} && echo "${prog}: registering ${pkg}" 193 ${HOST_SH} "${rundir}/regpkg" ${all_options} \ 194 "${pkgset}" "${pkg}" || bomb 195 ;; 196 esac 197done 198 199exit 0 200