#!/bin/csh -f

#-clear

set RC=0

echo " "
echo "+------------------------------+"
echo "| Automatic Makefile Generator |"
echo "+------------------------------+"
echo " "

if ( $#argv < 1 ) then
  echo "Usage: $0 [program_name | all | prog1 prog2 ... progN]"
  echo " "
  exit 1
endif

if ( $#argv > 1 ) then
  set progs="$*"
  foreach PROGRAM ( $progs )
    $0 $PROGRAM
  end
  exit 0
else if ("$1" == "all") then
  set progs=`cat program.list | awk '{print $1}'`
  foreach PROGRAM ( $progs )
    $0 $PROGRAM
  end
  exit 0
else
  set PROGRAM=`basename $1 /`
  echo " "
  echo ">>> $PROGRAM <<<"
  echo " "
endif

set SOURCEDIR=${PROGRAM}/src
set MF=makefile

if (! -d ${SOURCEDIR} ) then
  echo "Program's '$PROGRAM' source file directory ${SOURCEDIR} not found"
  set RC=1
  goto finish
endif

if ( "$PROGRAM" == "lib" ) then
  echo "Please check timer source- & makefiles under lib/src before compilation."
  echo " "
  goto finish
endif

set FLAGFILE=make.flags
if ( ! -f $FLAGFILE ) then
  echo "Compiler/Linker flagfile '$FLAGFILE' not found"
  set RC=1
  goto finish
endif

if ( ! -f $FLAGFILE ) then
  echo "Compiler/Linker flagfile '$FLAGFILE' not found"
  set RC=1
  goto finish
endif

echo ">>> Compiler/Linker flags will be taken from file '$FLAGFILE'"
echo " "
sleep 1


if ( -f ${SOURCEDIR}/${MF} ) then
  echo "Makefile '${SOURCEDIR}/${MF}' already exist. Renaming it."
  /bin/mv ${SOURCEDIR}/${MF} ${SOURCEDIR}/${MF}.old
endif

if ( -f ${SOURCEDIR}/${MF} ) then
  echo "Makefile '${SOURCEDIR}/${MF}' still exist."
  echo "Can't proceed."
  set RC=1
  goto finish
endif


#
# Extract programming language used for *this* $PROGRAM
#

set USEDLANG=`grep "^$PROGRAM " $FLAGFILE | awk -F- '{print $2}' | awk '{print $1}'`
if ( "$USEDLANG" == "C" || "$USEDLANG" == "c" ) then
  set LANG=c
else
  set LANG=F
endif

#
# Get options for *this* $PROGRAM
#

set COMOPT=`grep "^$PROGRAM " $FLAGFILE | awk -F\# '{print $2}'`

echo " "
echo ">>> Program $PROGRAM has been written in '${USEDLANG}'"
echo " "


if ( "$LANG" == "c")  then
  set INC=h
else
  set INC=inc
endif

cd ${SOURCEDIR}

echo "Searching for source files *.${LANG} ..."
set files=`ls *.$LANG`   # Source files
echo "Showing include files *.${INC} (if any):"
ls -l *.$INC

echo "Creating makefile:"
echo "	$PWD/$MF"

echo "# " > $MF
echo "# A makefile to create executable for $PROGRAM" >> $MF
echo "# Date generated:  `date`" >> $MF
echo "# For `hostname` (`uname -a`)" >> $MF
echo "# " >> $MF

echo "SHELL=/bin/sh" >> $MF
echo "PROGRAM=$PROGRAM" >> $MF
echo "USEDLANGUAGE=$LANG" >> $MF
echo "TIMER=../../lib/timers.a" >> $MF
echo "EXE=../${PROGRAM}.exe" >> $MF

set FLAGFILE=../../$FLAGFILE

echo "# The following are taken from '$FLAGFILE':" >>$MF 
awk -F\; '/^;/ {print $2}' $FLAGFILE >> $MF

echo "# The following are specifically for the ${PROGRAM}-program:" >>$MF 
echo "$COMOPT" | awk -F\; '{for(i=1;i<=NF;i=i+1) print $i}' >> $MF


set count=0
foreach FILE ( $files )
  set count=`expr $count \+ 1`
end

if ( $count == 0 ) then
  echo "Hey, you don't have any source files"
  set RC=1
  goto finish
endif

echo " "
echo ">>> ${PROGRAM}: $count source file(s)"
echo " "

echo " " >> $MF
set newcount=0
foreach FILE ( $files )
  set OBJ=`basename $FILE .$LANG`.o
  set newcount=`expr $newcount \+ 1`

  if ( $newcount == 1 && $newcount != $count ) then
    echo "OBJS=$OBJ \" >> $MF
  else if ( $newcount == 1 && $newcount == $count ) then
    echo "OBJS=$OBJ" >> $MF
  else if ( $newcount != $count ) then
    echo "     $OBJ \" >> $MF
  else
    echo "     $OBJ" >> $MF
  endif

end

echo " " >> $MF
echo '.SUFFIXES:  $(SUFFIXES) '".$LANG .$INC" >> $MF
echo " " >> $MF
echo '$(EXE): $(TIMER) $(OBJS)' >> $MF
echo '	$(LD) $(LFLAGS) $(OBJS) $(LIBS) -o $@' >> $MF

echo " " >> $MF
echo '# rules:' >> $MF
echo " " >> $MF
echo '.c.o:' >> $MF
echo '	$(CC) -c $(CFLAGS) $<' >> $MF
echo '.F.f:' >> $MF
echo '	$(CPP) $(CPPFLAGS) $< > $*.f' >> $MF
echo '.f.o:' >> $MF
echo '	$(FC) -c $(FFLAGS) $<' >> $MF

echo " " >> $MF
echo '# dependencies:' >> $MF
echo " " >> $MF
echo '$(TIMER):' >> $MF
echo '	(cd ../../lib/src ; make)' >> $MF
echo " " >> $MF

# egrep -v '^C|^c|^\*' is same as
# grep -v '^C' | grep -v '^c' | grep -v '^\*'

foreach FILE ( $files )
  echo -n " $FILE"
  set OBJ=`basename $FILE .$LANG`.o
  if ( "$LANG" == "c" ) then
    set hfiles=`awk -F\" '/#include/ {print $2}' $FILE | sort | uniq`
    if ( "$hfiles" != "" ) then
      echo -n "($hfiles)"
    endif
    echo "${OBJ}: makefile $FILE $hfiles" >> $MF
  else
    set hfiles=`cat $FILE | grep -i include | egrep -v '^C|^c|^\*' | awk '{print $1,$2}' | grep -i include | awk -F\' '{print $2}' | sort | uniq`
    if ( "$hfiles" != "" ) then
      echo -n "($hfiles)"
    endif
    set FILEf=`basename $FILE .$LANG`.f
    echo "${OBJ}: $FILEf" >> $MF
    echo "${FILEf}: makefile $FILE $hfiles" >> $MF
    echo " " >> $MF
  endif
end
echo " "
sleep 2

echo " " >> $MF
echo '# utilities:' >> $MF
echo " " >> $MF
echo 'tidy:' >> $MF
echo '	-/bin/rm -f a.out *~' >> $MF
echo '	-/bin/rm -f *.o' >> $MF
echo " " >> $MF
echo 'cleanf:' >> $MF
echo '	-/bin/rm -f *.f' >> $MF
echo " " >> $MF
echo 'clean:' >> $MF
echo '	-/bin/rm -f a.out *~' >> $MF
echo '	-/bin/rm -f *.o' >> $MF
echo '	-/bin/rm -f *.f' >> $MF
echo '	-/bin/rm -f $(EXE)' >> $MF

echo "*** $PWD/$MF ***"
cat $MF

finish:

echo -n 'Hit <RETURN> to continue ... '
#-set a="$<"

exit $RC
