makeplist revision 1.20
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 97( 98cd "${prefix}" 99 100# 101# Match the directories. Use find(1) to avoid repeat calls to 102# 'test -d'. 103# 104# This is a little clever. I cannot use 'xargs find', because 105# find wants for the option arguments to follow the path arguments. 106# So I use 'xargs echo ${SELECTDIRS}' to make a maximum-length proto-command 107# line. I use 'read' to peel the options off the front of the 108# command-line, and 'find ${args} ${SELECTDIRS}' to put them at the end. 109# 110xargs echo ${SELECTDIRS} < "${filename}" | \ 111while read ignore ignore ignore args; do 112 [ -z "${args}" ] && break 113 ${FIND} ${args} ${SELECTDIRS} 114done | ${AWK} '{ print "@dirrm " $1; }' > "${dfilename}" 115 116# 117# Match the non-directories. Use find(1) to avoid repeat calls to 118# 'test ! -d'. See 'Match the directories' for an explanation of the 119# cleverness. 120# 121xargs echo ${SELECTNONDIRS} < "${filename}" | \ 122while read ignore ignore ignore ignore ignore ignore ignore ignore ignore \ 123 ignore args; do 124 [ -z "${args}" ] && break 125 ${FIND} ${args} ${SELECTNONDIRS} 126done > "${ffilename}" 127 128) 129 130echo "@cwd ${realprefix}" 131if [ -s "${ffilename}" ]; then 132 cat "${ffilename}" 133fi 134if [ -s "${dfilename}" ]; then 135 ${SORT} -r "${dfilename}" 136fi 137 138rm -f "${filename}" "${ffilename}" "${dfilename}" 139 140exit 0 141