#!/bin/sh

shout() { echo "$0: $@" >&2; }
barf() { shout "fatal: $@"; exit 111; }
safe() { "$@" || barf "cannot $@"; }

safe umask 022
[ -d package ] || barf "no package directory"
[ -d src     ] || barf "no src directory"

here=`env - PATH=$PATH pwd`

[ -d compile ] || safe mkdir -p compile
[ -d commmand ] || safe mkdir -p command
[ -r compile/home ] || echo $here > compile/home
[ -h compile/src  ] || safe ln -s $here/src compile/src

for i in `ls src`
do
  [ ! -d src/$i ] && [ -h compile/$i ] || safe ln -sf src/$i compile/$i
done

for i in `sed -e '/^it-/!d' -e 's/^it-//' < compile/it=d`
do
  [ "$i" != "setup" ] && all="$all $i"
done

other="`grep -v '^it-' compile/it=d`"
usage() { shout "usage: package/compile [ [-]$all ]"; exit 100; }

targets=""
if [ $# -eq 0 ]
then
  targets="$all"
else
  if [ "$1" = "-" ]
  then
    shift
    suppress=":"
    for i in ${1+"$@"}
    do
      case "$all " in
	*\ $i\ *)
	  ;;
	*)
	  usage
	  ;;
      esac
      suppress="$suppress$i:"
    done
    for i in $all
    do
      case "$suppress" in
	*:$i:*)
	  ;;
	*)
	  targets="$targets $i"
	  ;;
      esac
    done
  else
    for i in ${1+"$@"}
    do
      case "$all " in
	*\ $i\ *)
	  ;;
	*)
	  usage
	  ;;
      esac
      targets="$targets $i"
    done
  fi
fi

[ "X$all" != "X" ] && [ "X$targets" = "X" ] && usage

commands=""
for i in $targets
do
  commands="$commands `cat package/commands-$i`"
done

safe cd compile
safe make $other `echo "$targets" | sed -e 's/ / it-/g'`
safe cd $here

for i in $commands
do
  i=${i%:}
  safe rm -f command/$i'{new}'
  safe cp -p compile/$i command/$i'{new}'
  safe mv -f command/$i'{new}' command/$i
done

exit 0
