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