makeplist revision 1.19
1#!/bin/sh 2# 3# Print out the files in some or all lists. 4# Usage: makeplist [options] setname pkgname 5# options: 6# -a arch set arch (e.g, m68k, mips, powerpc) 7# -m machine set machine (e.g, amiga, i386, macppc) 8# -s setsdir directory to find sets 9# -p prefix prefix for package creation 10# -I realprefix prefix for eventual installation 11# setname pkgname set and package to build plist for 12# 13 14rundir="$(dirname "$0")" # ${0%/*} isn't good enough when there's no "/" 15. "${rundir}/sets.subr" 16prefix=/ 17realprefix=/ 18got_realprefix=false 19 20usage() { 21 cat 1>&2 <<USAGE 22Usage: $0 [options] setname pkgname" 23options:" 24 -a arch set arch (e.g, m68k, mips, powerpc) [${MACHINE_ARCH}] 25 -m machine set machine (e.g, amiga, i386, macppc) [${MACHINE}] 26 -s setsdir directory to find sets [${setsdir}] 27 -p prefix prefix for created plist [${prefix}] 28 -I realprefix prefix for eventual installation [${realprefix}] 29 setname pkgname set and package to build plist for 30USAGE 31 exit 1 32} 33 34# handle args 35while getopts a:I:m:p:s: ch; do 36 case ${ch} in 37 a) 38 MACHINE_ARCH="${OPTARG}" 39 MACHINE_CPU="$(arch_to_cpu "${OPTARG}")" 40 ;; 41 I) 42 realprefix=${OPTARG} 43 got_realprefix=true 44 ;; 45 m) 46 MACHINE="${OPTARG}" 47 ;; 48 p) 49 prefix="${OPTARG}" 50 ;; 51 s) 52 setsdir="${OPTARG}" 53 ;; 54 *) 55 usage 56 ;; 57 esac 58done 59shift $((${OPTIND} - 1)) 60if [ $# -ne 2 ]; then 61 usage 62fi 63setname="$1" 64pkgname="$2" 65 66if ! ${got_realprefix}; then 67 realprefix="${prefix}" 68fi 69 70filename="/tmp/makeplist.$$" 71ffilename="/tmp/makeplist.files.$$" 72dfilename="/tmp/makeplist.dirs.$$" 73 74list_set_files "${setname}" | \ 75 ${ENV_CMD} PLISTPKG="${pkgname}" ${AWK} ' 76 $2 == ENVIRON["PLISTPKG"] { 77 sub("^\\./", "", $1); 78 print $1 79 }' | ${SORT} -u > "${filename}" 80 81SELECTDIRS="-prune -type d" 82SELECTNONDIRS="! -type d -print -o ( -type d -prune )" 83 84# 85# XXX: The "lists" do not differentiate between directories and files. 86# But we need to differentiate between them, so we do so by checking 87# what's actually present in the file system. Files or directories that 88# are listed in the "lists" but that do not exist in the file system end 89# up not appearing in our output, and this subverts a large part of the 90# purpose of the "lists". 91# 92# XXX: Given that we have to figure out what is or is not a directory 93# without assistance from the "lists", it would be much more efficient 94# to consult the metalog instead of the file system. 95# 96 97cd "${prefix}" 98# 99# Match the directories. Use find(1) to avoid repeat calls to 100# 'test -d'. 101# 102# This is a little clever. I cannot use 'xargs find', because 103# find wants for the option arguments to follow the path arguments. 104# So I use 'xargs echo ${SELECTDIRS}' to make a maximum-length proto-command 105# line. I use 'read' to peel the options off the front of the 106# command-line, and 'find ${args} ${SELECTDIRS}' to put them at the end. 107# 108xargs echo ${SELECTDIRS} < "${filename}" | \ 109while read ignore ignore ignore args; do 110 [ -z "${args}" ] && break 111 ${FIND} ${args} ${SELECTDIRS} 112done | ${AWK} '{ print "@dirrm " $1; }' > "${dfilename}" 113 114# 115# Match the non-directories. Use find(1) to avoid repeat calls to 116# 'test ! -d'. See 'Match the directories' for an explanation of the 117# cleverness. 118# 119xargs echo ${SELECTNONDIRS} < "${filename}" | \ 120while read ignore ignore ignore ignore ignore ignore ignore ignore ignore \ 121 ignore args; do 122 [ -z "${args}" ] && break 123 ${FIND} ${args} ${SELECTNONDIRS} 124done > "${ffilename}" 125 126cd - 127 128echo "@cwd ${realprefix}" 129if [ -s "${ffilename}" ]; then 130 cat "${ffilename}" 131fi 132if [ -s "${dfilename}" ]; then 133 ${SORT} -r "${dfilename}" 134fi 135 136rm -f "${filename}" "${ffilename}" "${dfilename}" 137 138exit 0 139