maketars revision 1.46
1#!/bin/sh
2#
3# $NetBSD: maketars,v 1.46 2003/12/19 22:25:54 jmc Exp $
4#
5# Make release tar files for some or all lists.  Usage:
6# maketars [-b] [-x] [-i installdir] [-a arch] [-m machine] [-s setsdir]
7#	[-M metalog] [-N etcdir] [-d destdir] [-t tardir] [setname ...]
8#
9# The default sets are "base comp etc games man misc text"
10#
11# If '-i installdir' is given, copy the given sets to installdir
12# (using pax -rw ...) instead of creating tar files.
13# In this case, remove "etc" from the list of default sets.
14#
15
16prog=${0##*/}
17
18# set defaults
19: ${PAX=pax}
20: ${MKTEMP=mktemp}
21: ${MTREE=mtree}
22
23. $(dirname $0)/sets.defaults
24
25setd=$(pwd)
26nlists=$lists
27xlists="xbase xcomp xcontrib xfont xserver xmisc"
28tars=$RELEASEDIR
29dest=$DESTDIR
30metalog=
31installdir=
32etcdir=
33
34# handle args
35while : ; do
36	case $1 in
37	-b*)
38		lists="$xlists $nlists"
39		;;
40	-x*)
41		lists=$xlists
42		;;
43	-i*)
44		installdir=$2; shift
45		;;
46	-a*)
47		machine_arch=$2; shift
48		;;
49	-M*)
50		metalog=$2; shift
51		;;
52	-m*)
53		machine=$2; shift
54		;;
55	-N*)
56		etcdir=$2; shift
57		;;
58	-s*)
59		setd=$2; shift
60		;;
61	-d*)
62		dest=$2; shift
63		;;
64	-t*)
65		tars=$2; shift
66		;;
67	-*)
68		cat 1>&2 <<USAGE
69Usage: ${prog} [-b] [-x] [-i idir] [-a arch] [-m machine] [-s setsdir]
70	    [-M metalog] [-N etcdir] [-d dest] [-t targetdir] [setname ...]
71	-b		make netbsd + x11 lists
72	-x		only make x11 lists
73	-i idir		install sets to idir instead of creating tar files
74	-a arch		set arch (e.g, m68k, mipseb, mipsel, powerpc) [$machine_arch]
75	-m machine	set machine (e.g, amiga, i386, macppc) [$machine]
76	-s setsdir	directory to find sets [$setd]
77	-M metalog	metalog file
78	-N etcdir	etc dir for metalog use [$dest/etc]
79	-d dest		\$DESTDIR	[$dest]
80	-t targetdir	\$RELEASEDIR	[$tars]
81	[setname ...]	sets to build 	[$lists]
82USAGE
83		exit 1
84		;;
85	*)
86		break
87		;;
88	esac
89	shift
90done
91if [ -n "$installdir" ]; then		# if -i, remove etc from default list
92	lists=$(echo $lists | sed -e 's/ etc / /')
93fi
94if [ -n "$*" ]; then
95	lists="$*"
96fi
97
98if [ -z "$tars" -a -z "$installdir" ]; then
99	echo \$RELEASEDIR must be set, or -i must be used
100	exit 1
101fi
102
103if [ -z "$dest" ]; then
104	echo \$DESTDIR must be set
105	exit 1
106fi
107: ${etcdir:=${dest}/etc}
108
109SDIR=$(${MKTEMP} -d /tmp/${prog}.XXXXXX)
110
111es=0
112cleanup()
113{
114	es=$?
115	/bin/rm -rf $SDIR
116	exit $es
117}
118trap cleanup 0 2 3 13		# EXIT INT QUIT PIPE
119
120if [ -n "$metalog" ]; then
121	echo "Parsing $metalog"
122	(
123		cat ${etcdir}/mtree/NetBSD.dist
124		echo "/unset all"
125		cat $metalog 2>/dev/null
126	) | ${MTREE} -C -k all -N ${etcdir} > $SDIR/metalog
127	rv=$?
128	if [ $rv -ne 0 ]; then
129		echo "${prog}: mtree failed, exiting"
130		exit $rv
131	fi
132fi
133
134GZIP=-9			# for pax -z
135export GZIP
136
137for setname in $lists; do
138	out=$setname.tgz
139	if [ -n "$installdir" ]; then
140		echo "Copying set $setname"
141	else
142		if [ -n "$metalog" -a $tars/$out -nt "$metalog" ]; then
143			echo "$out is up to date"
144			continue
145		fi
146		echo "Creating $out"
147	fi
148	sh $setd/makeflist -a $machine_arch -m $machine -s $setd $setname \
149	    > $SDIR/flist.$setname
150	if [ -n "$metalog" ]; then
151		awk -f getdirs.awk $SDIR/flist.$setname | sort -u \
152		    > $SDIR/flist.$setname.full
153		(
154			echo "/set uname=root gname=wheel"
155			awk -f join.awk $SDIR/flist.$setname.full $SDIR/metalog
156		) > $SDIR/plist.$setname
157	else
158		mv $SDIR/flist.$setname $SDIR/plist.$setname
159	fi
160
161	if [ -n "$installdir" ]; then
162		( cd $dest ; \
163		    ${PAX} -O -rwpe -d -N${etcdir} ${metalog:+-M} \
164		    $installdir < ${SDIR}/plist.$setname )
165	else
166		( cd $dest ; \
167		    ${PAX} -O -w -d -z -N${etcdir} ${metalog:+-M} \
168		    < ${SDIR}/plist.$setname ) > ${tars}/$out
169	fi
170	es=$(($es + $?))
171done
172if [ $es -gt 255 ] ; then
173	es=255
174fi
175exit $es
176