#!/bin/sh
#
# Build a single-group source release of one program group. 
#
# Invocation:   sh/build-src GROUP 
#
# GROUP is the group name;  see `grp' for a group list.  The source
# release is built in a temporary directory.  
#
# The source release is built in bin/baby$group-$version_number
#
# The following files must exist:
#       bin/GROUP.group-package-modules    
#       bin/Makefile.GROUP
#       bin/%.program.cc
#

. sh/temp-dir.sh
. sh/tools.sh
. sh/verbose.sh

if [ -z "$1" ]
then
    echo 1>&2 "$0:  error:  missing group name."
    echo 1>&2 "Invocation:     $0 GROUP"
    exit 1
fi

group="$1"

echo 1>&4 "Building source directory of $group."

if [ \! -r grp/$group ]
then
    echo 1>&2 "$0:  $group:  no such program group."
    exit 1
fi

dir="bin/baby$group-$version_number"

if [ -d $dir ]
then
    if sh/do rm -r $dir
    then
	true
    else
	echo 1>&2 "$0:  error:  directory \`$dir' exists and cannot be created."
	exit 1
    fi
fi    

if sh/do mkdir $dir
then
    true
else
    echo 1>&2 "$0:  error:  cannot make \`$dir'."
    exit 1
fi

#
# Directories that contain module-specific files. 
#
moddirs="doc grp macro share src desktop"

for dire in $moddirs
do
    if sh/do mkdir $dir/$dire
    then
	true
    else
	echo 1>&2 "$0:  error:  cannot create directory."
	exit 1
    fi    
done

#
# Files with fixed names. 
#
files="AUTHORS COPYING NEWS grp/README LICENSING \
       INSTALL configure doc/README \
       macro/README desktop/README Howto.cook"

for file in $files
do
    if sh/do cp $file $dir/$file
    then
	true
    else
	echo 1>&2 "$0:  error:  cannot copy file to \`$dir'."
	exit 1
    fi
done

#
# Directories that are copied entirely
#
dirs="etc sh mimelnk"

for name in $dirs
do
    if sh/do mkdir $dir/$name
    then
	true
    else
	echo 1>&2 "$0:  error:  cannot create \`$dir/$name'."
	exit 1
    fi
    if sh/do cp `ls -1 $name | grep '^[0-9a-zA-Z][^~ ]*$' | $sed "s/\<\(.*\)\>/${name}\/\1/"` $dir/$name
    then
	true
    else
	echo 1>&2 "$0:  error:  cannot copy files to \`$dir/$name'."
	exit 1
    fi
done

modules="`cat bin/$group.group-package-modules`"

had=

for module in $modules
do
    if echo "$had" | grep -wv $module >/dev/null
    then
	files="doc/$module.hh desktop/$module.png \
	       macro/$module.sh src/$module.hh src/$module.cc"
 	for file in $files
	do
	    if [ -r $file ]
	    then
		if sh/do cp $file $dir/$file
		then
		    true
		else
		    echo 1>&2 "$0:  error:  cannot create \`$dir/$file'."
		    exit 1
		fi
	    fi
	done
	if [ -d share/$module ]
	then
	    if sh/do cp -r share/$module $dir/share
	    then
		true
	    else
		echo 1>&2 "$0:  error:  cannot create \`$dir/share/$module'."
		exit 1
	    fi
	fi
	had="$had $module"
    fi
done

if sh/do cp grp/$group grp/$group.description $dir/grp
then
    true
else
    echo 1>&2 "$0:  error:  cannot write into \`$dir/grp'."
    exit 1
fi

if [ -r desktop/$group.png ]
then
    if sh/do cp desktop/$group.png $dir/desktop
    then
	true
    else
	echo 1>&2 "$0:  error:  cannot create \`$dir/desktop/$group.png'."
    fi
fi

if sh/do cp desktop/baby.png $dir/desktop
then
    true
else
    echo 1>&2 "$0:  error:  cannot write \`$dir/desktop/baby.png'."
    exit 1
fi

if sh/do cp grp/$group.README $dir/grp
then
    true
else
    echo 1>&2 "$0:  error:  cannot write \`$dir/grp/$group.README'."
    exit 1
fi

if sh/do cp grp/$group.README $dir/README
then
    true
else
    echo 1>&2 "$0:  error:  cannot write \`$dir/README'."
    exit 1
fi

#
# Build the Makefile
#

sh/do cp bin/Makefile.$group $dir/Makefile
sh/do mkdir $dir/bin
for program in `cat bin/$group.group-all-programs`
do
  sh/do cp bin/$program.program.cc $dir/bin
done
sh/do cp bin/$group.group-all-programs bin/$group.group-all-modules $dir/bin 

#
# Set mode of source 
#
chmod -R og-rwx $dir 

echo 1>&4 "Group $group compiled into \`$dir'."

exit 0
