#!/bin/sh

t=makemake.targetd
T=makemake.TARGETS
S=makemake.SOURCES
trap 'rm -f *.tmp.$$ $T $S; rm -r $t' EXIT
rm -rf $t $T $S
mkdir -p $t
rm -f `cat TARGETS`

c() {
    echo "$*" >&2;
}

error() {
    echo "$0: Error: $*" >&2;
}

dependon() {
    for dep in $*; do
	echo "$dep" >&3
	target $dep
    done
}

formake() {
    echo "	$*" >&4
}

nosuchtarget() {
    if [ -r "$target" ]; then
	echo "$target" >>$S
    else
	error "No such target: $target"
    fi
}

directtarget() {
    # What is this supposed to do?
    :
}

dependcc() {
    dependon $1
    for file in $(sed -e '/^#include "/!d;s/"$//;s/^.*"//' $1 2>/dev/null);
    do
      dependcc $file
    done
}

depend() {
    # What is this supposed to do?
    # Invoked as: depend -ezmlm-warn.o=m
    :
}

target() {
    target=$1
    if [ -r $target -a ! -r ${target}.do ]; then
	echo $target >>$S
	return
    fi
    if [ -r $t/$target.deps ]; then
    	return
    fi
    #c target: $target
    starget=`echo $target | tr / :`
    tmp=$starget.tmp.$$
    (
	ext=${target##*.}
	base=${target%%.*}
	set -- $target $base $tmp
	if [ -f $target.do ]; then
	    . ./$target.do
	elif [ -f default.$ext.do ]; then
	    . ./default.$ext.do $target $base $tmp
	else
	    . ./default.do $target $base $tmp
	fi
    ) 3>$t/$starget.deps 4>$t/$starget.cmds
#    if [ -s $tmp ]; then
#	mv -f $tmp $target
#    else
#	rm -f $tmp
#    fi
}

echo "Calculating targets..."
target clean
target targets
rm -f $t/targets

echo "Building Makefile..."
(
    cat <<EOF
# This file is automatically generated, do not edit.
SHELL=/bin/sh
default: it
EOF
    cd $t
    for deps in *.deps; do
	target=${deps%.deps}
	cmds=$target.cmds
	target=`echo $target | tr : /`
	if [ -s $deps -o -s $cmds ]; then
	    echo
	    echo "$target: \\"
	    echo `uniq $deps`
	    cat $cmds
	    echo $target >&2
	fi
	rm -f $deps $cmds
    done
) >Makefile 2>$T

echo SOURCES >>$S
echo Makefile >>$S
sort -u $S >SOURCES
sort -u $T | fgrep -vxf SOURCES >TARGETS
rm -f $S $T

echo "done."
