203 lines
5.9 KiB
Bash
Executable File
203 lines
5.9 KiB
Bash
Executable File
#! /bin/sh
|
|
#
|
|
# $NetBSD: regpkgset,v 1.9 2007/02/05 18:26:01 apb Exp $
|
|
#
|
|
# Copyright (c) 2003 Alistair G. Crooks. All rights reserved.
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions
|
|
# are met:
|
|
# 1. Redistributions of source code must retain the above copyright
|
|
# notice, this list of conditions and the following disclaimer.
|
|
# 2. Redistributions in binary form must reproduce the above copyright
|
|
# notice, this list of conditions and the following disclaimer in the
|
|
# documentation and/or other materials provided with the distribution.
|
|
# 3. All advertising materials mentioning features or use of this software
|
|
# must display the following acknowledgement:
|
|
# This product includes software developed by Alistair G. Crooks.
|
|
# for the NetBSD project.
|
|
# 4. The name of the author may not be used to endorse or promote
|
|
# products derived from this software without specific prior written
|
|
# permission.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
|
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
|
# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
#
|
|
|
|
# Usage: regpkgset [options] set
|
|
#
|
|
# Options:
|
|
# -q Quiet.
|
|
# -v Verbose.
|
|
# -f Force.
|
|
# -m Ignore errors from missing files.
|
|
# -u Update.
|
|
# -c Cache some information in ${BUILD_INFO_CACHE}.
|
|
# -d destdir Sets DESTDIR.
|
|
# -t binpkgdir Create a binary package (in *.tgz format) in the
|
|
# specified directory. Without this option, a binary
|
|
# package is not created.
|
|
# -M metalog Use the specified metalog file to override file
|
|
# or directory attributes when creating a binary package.
|
|
# -N etcdir Use the specified directory for passwd and group files.
|
|
|
|
prog="${0##*/}"
|
|
toppid=$$
|
|
rundir="$(dirname "$0")" # ${0%/*} isn't good enough when there's no "/"
|
|
. "${rundir}/sets.subr"
|
|
|
|
: ${TARGET_ENDIANNESS:="$(arch_to_endian "${MACHINE_ARCH}")"}
|
|
export TARGET_ENDIANNESS
|
|
|
|
bomb()
|
|
{
|
|
kill ${toppid} # in case we were invoked from a subshell
|
|
exit 1
|
|
}
|
|
|
|
# A literal newline
|
|
nl='
|
|
'
|
|
|
|
#
|
|
# cleanup() deletes temporary files.
|
|
#
|
|
es=0
|
|
cleanup()
|
|
{
|
|
trap - 0
|
|
[ x"${BUILD_INFO_CACHE}" != x ] && rm -f "${BUILD_INFO_CACHE}"
|
|
exit ${es}
|
|
}
|
|
trap 'es=128; cleanup' 1 2 3 13 15 # HUP INT QUIT PIPE TERM
|
|
trap 'es=$?; cleanup' 0 # EXIT
|
|
|
|
#
|
|
# Parse command line args.
|
|
#
|
|
verbose=false
|
|
quiet=false
|
|
force=false
|
|
allowmissing=false
|
|
update=false
|
|
cache=false
|
|
pkgdir=""
|
|
metalog=""
|
|
etcdir=""
|
|
all_options=""
|
|
while [ $# -gt 1 ]; do
|
|
# XXX: ${all_options} doesn't correctly handle args with
|
|
# embedded shell special characters.
|
|
case "$1" in
|
|
-q) quiet=true; verbose=false ;;
|
|
-v) verbose=true; quiet=false ;;
|
|
-f) force=true ;;
|
|
-m) allowmissing=true ;;
|
|
-u) update=true ;;
|
|
-c) cache=true ;;
|
|
-d) DESTDIR="$2"; all_options="${all_options} $1"; shift ;;
|
|
-d*) DESTDIR="${1#-?}" ;;
|
|
-t) pkgdir="$2"; all_options="${all_options} $1"; shift ;;
|
|
-t*) pkgdir="${1#-?}" ;;
|
|
-M) metalog="$2"; all_options="${all_options} $1"; shift ;;
|
|
-M*) metalog="${1#-?}" ;;
|
|
-N) etcdir="$2"; all_options="${all_options} $1"; shift ;;
|
|
-N*) etcdir="${1#-?}" ;;
|
|
-*) echo "Usage: regpkgset [options] set ..."; bomb ;;
|
|
*) break ;;
|
|
esac
|
|
all_options="${all_options} $1"
|
|
shift
|
|
done
|
|
export DESTDIR
|
|
|
|
if [ $# -lt 1 ]; then
|
|
echo "Usage: regpkgset [options] set ..."
|
|
bomb
|
|
fi
|
|
|
|
case "$1" in
|
|
all) list="base comp etc games man misc text" ;;
|
|
*) list="$*" ;;
|
|
esac
|
|
|
|
if ${cache}; then
|
|
BUILD_INFO_CACHE="$(${MKTEMP} "/var/tmp/${prog}-BUILD_INFO.XXXXXX")"
|
|
export BUILD_INFO_CACHE
|
|
{
|
|
# These variables describe the build
|
|
# environment, not the target.
|
|
echo "OPSYS=$(${UNAME} -s)"
|
|
echo "OS_VERSION=$(${UNAME} -r)"
|
|
${MAKE} -B -f- all <<EOF
|
|
.include <bsd.own.mk>
|
|
all:
|
|
@echo OBJECT_FMT=${OBJECT_FMT}
|
|
@echo MACHINE_ARCH=${MACHINE_ARCH}
|
|
@echo MACHINE_GNU_ARCH=${MACHINE_GNU_ARCH}
|
|
EOF
|
|
# XXX: what's the point of reporting _PKGTOOLS_VER
|
|
# when we roll everything by hand without using
|
|
# the pkg tools?
|
|
echo "_PKGTOOLS_VER=$(${PKG_CREATE} -V)"
|
|
} > "${BUILD_INFO_CACHE}"
|
|
fi
|
|
|
|
#
|
|
# For each pkgset mentioned in ${list}, get a list of all pkgs in the pkgset.
|
|
#
|
|
# Sort all the pkgs into dependency order (with prerequisite pkgs before
|
|
# pkgs that depend on them).
|
|
#
|
|
# Invoke ${rundir}/regpkg for each pkg, taking care to do it in dependency
|
|
# order. If there were any pkgs for which we failed to find dependency
|
|
# information, handle them at the end.
|
|
#
|
|
pkgs="$(for pkgset in ${list}; do
|
|
${HOST_SH} "${rundir}/listpkgs" "${pkgset}" || bomb
|
|
done)"
|
|
tsort_input="$(${AWK} '{print $2 " " $1}' <"${rundir}/deps" || bomb)"
|
|
tsort_output="$(echo "${tsort_input}" | ${TSORT} || bomb)"
|
|
for pkg in ${tsort_output}; do
|
|
case "${nl}${pkgs}${nl}" in
|
|
*"${nl}${pkg}${nl}"*)
|
|
# We want this pkg.
|
|
pkgset="${pkg%%-*}"
|
|
${verbose} && echo "${prog}: registering ${pkg}"
|
|
${HOST_SH} "${rundir}/regpkg" ${all_options} \
|
|
"${pkgset}" "${pkg}" || bomb
|
|
;;
|
|
*) # pkg is mentioned in ${tsort_output} but not in ${pkgs}.
|
|
# We do not want this pkg.
|
|
;;
|
|
esac
|
|
done
|
|
for pkg in ${pkgs}; do
|
|
case "${nl}${tsort_output}${nl}" in
|
|
*"${nl}${pkg}${nl}"*)
|
|
# pkg was in the tsort output, so it would have been
|
|
# handled above.
|
|
;;
|
|
*) # This pkg was not in the tsort output.
|
|
# This is probably an error, but process the
|
|
# pkg anyway.
|
|
echo >&2 "${prog}: WARNING: ${pkg} is not mentioned in deps file"
|
|
pkgset="${pkg%%-*}"
|
|
${verbose} && echo "${prog}: registering ${pkg}"
|
|
${HOST_SH} "${rundir}/regpkg" ${all_options} \
|
|
"${pkgset}" "${pkg}" || bomb
|
|
;;
|
|
esac
|
|
done
|
|
|
|
exit 0
|