1#!/bin/sh 2# 3# $NetBSD: maketars,v 1.55 2005/10/21 02:41:14 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# The X sets are "xbase xcomp xetc xfont xserver" 11# 12# If '-i installdir' is given, copy the given sets to installdir 13# (using pax -rw ...) instead of creating tar files. 14# In this case, remove "etc" and "xetc" from the list of default sets. 15# 16 17prog=${0##*/} 18 19# set defaults 20: ${HOST_SH:=sh} 21: ${MKTEMP:=mktemp} 22: ${MTREE:=/usr/sbin/mtree} 23: ${PAX:=pax} 24 25rundir=${0%/*} 26. ${rundir}/sets.subr 27lists=$nlists 28 29tars=$RELEASEDIR 30dest=$DESTDIR 31metalog= 32installdir= 33etcdir= 34setfilesonly=false 35 36usage() 37{ 38 cat 1>&2 <<USAGE 39Usage: ${prog} [-b] [-x] [-i idir] [-a arch] [-m machine] [-s setsdir] [-S] 40 [-M metalog] [-N etcdir] [-d dest] [-t targetdir] [setname ...] 41 -b Make both netbsd and x11 lists 42 -x Only make x11 lists 43 [Default: make netbsd lists] 44 -i idir Install sets to idir instead of creating tar files 45 -a arch Set arch (e.g, m68k, mipseb, mipsel, powerpc) [$MACHINE_ARCH] 46 -m machine Set machine (e.g, amiga, i386, macppc) [$MACHINE] 47 -s setsdir Directory to find sets [$setsdir] 48 -S Exit after creating set files $dest/etc/mtree/set.* 49 -M metalog metalog file 50 -N etcdir etc dir for metalog use [$dest/etc] 51 -d dest \$DESTDIR [$dest] 52 -t targetdir \$RELEASEDIR [$tars] 53 [setname ...] Sets to build [$lists] 54USAGE 55 exit 1 56} 57 58# handle args 59while getopts bxi:a:m:s:SM:N:d:t: ch; do 60 case ${ch} in 61 b) 62 lists="$nlists $xlists" 63 ;; 64 x) 65 lists="$xlists" 66 ;; 67 i) 68 installdir=${OPTARG} 69 ;; 70 a) 71 MACHINE_ARCH=${OPTARG} 72 MACHINE_CPU=$(arch_to_cpu ${OPTARG}) 73 ;; 74 m) 75 MACHINE=${OPTARG} 76 ;; 77 s) 78 setsdir=${OPTARG} 79 ;; 80 S) 81 setfilesonly=true 82 ;; 83 M) 84 metalog=${OPTARG} 85 ;; 86 N) 87 etcdir=${OPTARG} 88 ;; 89 d) 90 dest=${OPTARG} 91 ;; 92 t) 93 tars=${OPTARG} 94 ;; 95 *) 96 usage 97 ;; 98 esac 99done 100shift $((${OPTIND} - 1)) 101if [ -n "$installdir" ]; then # if -i, remove etc & xetc from the default list 102 lists=$(echo $lists | sed -e 's/ etc / /;s/ xetc / /') 103fi 104if [ -n "$*" ]; then 105 lists="$*" 106fi 107 108if [ -z "$tars" -a -z "$installdir" ]; then 109 echo 1>&2 \$RELEASEDIR must be set, or -i must be used 110 exit 1 111fi 112 113if [ -z "$dest" ]; then 114 echo 1>&2 \$DESTDIR must be set 115 exit 1 116fi 117: ${etcdir:=${dest}/etc} 118 119SDIR=$(${MKTEMP} -d /tmp/${prog}.XXXXXX) 120 121setlistdir=${dest}/etc/mtree 122 123cleanup() 124{ 125 es=$? 126 /bin/rm -rf $SDIR 127 exit $es 128} 129trap cleanup 0 2 3 13 # EXIT INT QUIT PIPE 130 131# 132# build the setfiles 133# 134 135if [ -n "$metalog" ]; then 136 ( 137 cat ${etcdir}/mtree/NetBSD.dist 138 echo "/unset all" 139 cat $metalog 2>/dev/null 140 ) | ${MTREE} -C -k all -N ${etcdir} > $SDIR/metalog 141 rv=$? 142 if [ $rv -ne 0 ]; then 143 echo 1>&2 "${prog}: mtree parse of ${metalog} failed" 144 exit $rv 145 fi 146fi 147for setname in $lists; do 148 ${HOST_SH} $setsdir/makeflist -a $MACHINE_ARCH -m $MACHINE \ 149 -s $setsdir $setname > $SDIR/flist.$setname 150 if [ -n "$metalog" ]; then 151 $setfilesonly && echo "Creating ${setlistdir}/set.${setname}" 152 awk -f $rundir/getdirs.awk $SDIR/flist.$setname \ 153 | sort -u > $SDIR/flist.$setname.full 154 ( 155 echo "/set uname=root gname=wheel" 156 awk -f $rundir/join.awk $SDIR/flist.$setname.full $SDIR/metalog 157 echo "./etc/mtree/set.${setname} type=file mode=0444" 158 ) > ${setlistdir}/set.${setname} 159 elif ! cmp -s ${SDIR}/flist.${setname} \ 160 ${setlistdir}/set.${setname} >/dev/null 2>&1; then 161 rm -f ${setlistdir}/set.${setname} 162 cp ${SDIR}/flist.${setname} ${setlistdir}/set.${setname} 163 fi 164done 165if $setfilesonly; then # exit after creating the set lists 166 exit 0 167fi 168 169# 170# now build the tarfiles 171# 172 173GZIP=-9 # for pax -z 174export GZIP 175es=0 176for setname in $lists; do 177 out=$setname.tgz 178 if [ -n "$installdir" ]; then 179 echo "Copying set $setname" 180 ( cd $dest ; \ 181 ${PAX} -O -rwpe -d -N${etcdir} ${metalog:+-M} \ 182 ${installdir} < ${setlistdir}/set.${setname} ) 183 else 184 if [ -n "$metalog" -a $tars/$out -nt "$metalog" ]; then 185 echo "$out is up to date" 186 continue 187 fi 188 echo "Creating $out" 189 rm -f ${tars}/$out 190 ( cd $dest ; \ 191 ${PAX} -O -w -d -z -N${etcdir} ${metalog:+-M} \ 192 < ${setlistdir}/set.${setname} ) > ${tars}/$out.tmp && 193 mv ${tars}/$out.tmp ${tars}/$out 194 fi 195 es=$(($es + $?)) 196done 197if [ $es -gt 255 ] ; then 198 es=255 199fi 200exit $es 201