#! /bin/sh

. sh/verbose.sh
. sh/echo-n.sh
. sh/base-conf.sh
. sh/tmp.sh

[ -d bin ] || mkdir bin  

## Modules
modules="`echo src/*.cc | sed 's,src/\([^ .][^ .]*\)\.cc,\1,g'`"
echo >&4 Found `echo $modules | wc -w` modules
echo >&5 List of modules:  $modules
$echo_n >&4  "Parsing module dependencies$echo_c"
dir=$TMP/babychess.$$
echo >&5 dir=$dir
[ -d $dir ] || mkdir $dir
for module in $modules
do
    $echo_n >&4  .$echo_c

    ## Output of g++ -M ...
    $CXX -M -MG $MANDATORY_CXXFLAGS src/$module.cc >$dir/$module.cxx-m

    ## Modules used by this module
    {
	<$dir/$module.cxx-m sed '
            s|\\|  |
            s/  */\
/g
            ' | 
	grep '^src/.*\.hh$' |
	sed 's/^src\/\(.*\)\.hh$/\1/g' |
	sort -u |
	{
	    while read used_module 
	    do
	        echo >&5 "Examining used module $used_module"
                ## only use module if .cc file exists
	        [ -r src/$used_module.cc ] && echo $used_module
	    done
	}
    } >$dir/$module.dep

    ## Make rule
    [ "$build_once" ] ||
    {
	$echo_n "bin/$module.o: $echo_c"
	echo `sh/dependencies $dir/$module.cxx-m` 
	echo '	'@echo \$\(CXX\) ... src/$module.cc -o \$@
	echo '	'@\$\(CXX\) \$\(CXXFLAGS\) -c src/$module.cc -o \$@
	echo
    }
done
echo >&4 


## Programs
programs="`echo src/baby*.cc | sed 's,src/baby\([^ ]*\)\.cc,\1,g'`"
used_modules= # spaces at beginning and end

if [ \! -d dep ] ; then mkdir dep ; fi
for program in $programs
do
    $echo_n >&4 Dependencies of baby$program:$echo_c
    [ $program = chess ] && echo ifndef build_without_gui
    echo $program | grep 'chess-\(dbg\|test\)' >/dev/null && echo ifndef build_without_test

    program_modules= # separated by two spaces
    pending=baby$program
    while [ "$pending" ]
    do
        new_pending=
	for module in $pending
	do
	    $echo_n >&4 .$echo_c
	    echo " $program_modules " | fgrep " $module " >/dev/null ||
	    {
		add="`cat $dir/$module.dep`"
		new_pending="$new_pending $add"
		program_modules="$program_modules  $module"
	    }
	done
	pending="`echo ' '$new_pending' ' | tr ' ' '
' | sort -u`"
    done

    used_modules=" $used_modules $program_modules "

    echo >&4 `echo $program_modules | wc -w` modules.
    echo >&5 Program baby$program uses modules: $program_modules 

    objects="`echo $program_modules | sed 's,\([a-z_0-9-][a-z_0-9-]*\),bin/\1.o,g'`"

    if [ "$build_once" ]
    then
	source=dep/baby$program.cc
    else
	source="$objects"
    fi

    ## Additional flags for the GUI program
    if [ $program = chess ]
    then
	ld_flags="`pkg-config --libs libgnomeui-2.0` -lpng"
    else 
	ld_flags=
    fi

    ## Overall program file
    if [ "$build_once" ]
    then
	    echo $program_modules | tr ' ' '
' | sed 's, *\([^ ][^ ]*\),#include "../src/\1.cc",g' >dep/baby$program.cc
    fi

    echo all: bin/baby$program
    $echo_n "bin/baby$program: $echo_c"
    if [ "$build_once" ]
    then
	$CXX -M -MG $MANDATORY_CXXFLAGS dep/baby$program.cc |
	    sh/dependencies |
	    tr '
' ' '
	echo 
    else
	echo $objects
    fi
    echo '	'@echo \$\(CXX\) ... $source -o \$@
    echo '	'@\$\(CXX\) \$\(CXXFLAGS\) \$\(LDFLAGS\) $source $ld_flags -o \$@
    echo
    [ $program = chess ] && echo endif
    echo $program | grep 'chess-\(dbg\|test\)' >/dev/null && echo endif
done

## Fail for unused modules
for module in $modules
do
    echo $used_modules | fgrep >/dev/null $module ||
	echo >&2 "*** warning:  unused module $module"
done

## MO files
#$echo_n all:$echo_c 
#echo po/[!+]*.po | sed 's,po/\([^ ]*\)\.po,po/\1/LC_MESSAGES/babychess.mo,g'
#echo 

##
## Translation files
##
languages="`echo po/*.po | sed 's,po/\([^ ][^ ]*\)\.po,\1,g'`"
for language in $languages
do
    echo all:  po/$language/LC_MESSAGES/babychess.mo
    echo po/$language/LC_MESSAGES/babychess.mo: po/$language.po
    echo '	'mkdir -p po/$language/LC_MESSAGES
    echo '	'msgfmt -o po/$language/LC_MESSAGES/babychess.mo po/$language.po
    echo po/$language.po:  po/babychess.pot
    echo '	'po/merge $language
    echo 
done

$echo_n pofiles:  po/babychess.pot " $echo_c"
echo $languages | sed 's,\([^ ]*\),po/\1.po,g'
echo

## List of files which include "../dep/strings.hh"
echo string_files:= `grep -l 'include *"\.\./dep/strings\.hh"' src/*.cc src/*.hh` 
echo

