#!/bin/ksh 
#----------------------------------------------------------------------------#
#     To create a Makefile with the tool "s.dependencies.pl"       
#     Assuming the source code is on the trunk directory.
#      Under trunk, there are three subdirectory,
#      ./trunk/shared
#      ./trunk/modulopt
#      ./trunk/bgcheck  
#   
#----------------------------------------------------------------------------#

 
 LIST_SUFIX="ftn h inc ftn90 cdk cdk90" 
# 
 list_Makefile_sect01 ()
 {
  
 outmake0=${wkdir}/.Makefile_sect0 

echo ".SUFFIXES :">$outmake0  
echo ".SUFFIXES : .cdk .cdk90 .ftn .ftn90 .f .f90 .o ">>$outmake0  

echo "SHELL = /bin/bash ">>$outmake0 

echo "CPP = /lib/cpp ">>$outmake0

echo "COMPILE = compile" >>$outmake0

echo "DEFINE = " >>$outmake0  

echo "FFLAGS = ">>$outmake0  

echo "CFLAGS = -I\$(ARMNLIB)/include ">>$outmake0 

echo "CPPFLAGS = -I\$(ARMNLIB)/include">>$outmake0 

echo "ASFLAGS = ">>$outmake0  

echo "DOC = ">>$outmake0 

echo "MALIB =  malib.a">>$outmake0 

echo "IGNORE_ERRORS = set -e" >>$outmake0 

echo "AR = r.ar -arch \$(BASE_ARCH) ">>$outmake0 

echo ".PRECIOUS: \$(MALIB)" >>$outmake0 
echo ".DEFAULT:">>$outmake0 
echo "	collectsrc \$@" >>$outmake0 

echo "RCOMPIL = s.compile">>$outmake0 
echo "RBUILD  = s.compile">>$outmake0 
echo "FCOMPF =   ">>$outmake0  
echo "CCOMPF = ">>$outmake0 
#echo "FFLAGS = -static">>$outmake0  
echo "COMPF = -openmp -mpi ">>$outmake0  

echo "FC = \$(RCOMPIL) -arch \$(ARCH) -abi \$(ABI)  -defines \"=\$(DEFINE)\" -O \$(OPTIL) -optf=\"\$(FFLAGS)\" -bindir \$(LCLPO) \$(COMPF) \$(FCOMPF) -src ">>$outmake0 
echo "FTNC = \$(RCOMPIL) -arch \$(ARCH) -abi \$(ABI)  -defines \"=\$(DEFINE)\" -optf=\"\$(FFLAGS) \$(CPPFLAGS)\" -P \$(COMPF) \$(FCOMPF) -src">>$outmake0 


echo ".ftn.o:">>$outmake0 
echo "	rm -f $*.f">>$outmake0 
echo "	\$(FC) $< ">>$outmake0 
echo ".ftn.f:">>$outmake0 
echo "	rm -f $*.f">>$outmake0 
echo "	\$(FTNC) $<" >>$outmake0 
echo ".f90.o:" >>$outmake0 
echo "	\$(FC) $<">>$outmake0 
echo ".f.o:" >>$outmake0 
echo "	\$(FC) $<">>$outmake0 
echo ".ftn90.o:" >>$outmake0 
echo "	rm -f $*.f90 ">>$outmake0 
echo "	\$(FC) $<" >>$outmake0 

echo ".cdk.o: ">>$outmake0 
echo "	\$(FC) $< ">>$outmake0 
echo ".cdk90.o: ">>$outmake0 
echo "	\$(FC) $<" >>$outmake0 
echo ".cdk.f: " >>$outmake0 
echo "	rm -f $*.f90 ">>$outmake0
echo ".cdk90.f90:">>$outmake0 
echo "	rm -f $*.f90">>$outmake0
echo "	\$(FTNC) $< ">>$outmake0 

echo ".ftn90.f90:" >>$outmake0 
echo "	rm -f $*.f90 ">>$outmake0 
echo "	\$(FTNC) $<" >>$outmake0 
echo "                 " >>$outmake0  
 }

 Create_Master_make ()
 {
   master=$1 
   echo "         ">$master
   echo "all:	base envar">>$master
   echo "         ">>$master
   echo "envar:">>$master
   echo "	\$(MAKE) -f Makefile_main \$@">>$master
   echo "     ">>$master 
   echo "envar_nompi:">>$master
   echo "	\$(MAKE) -f Makefile_main \$@">>$master 
   echo "     ">>$master 
   echo "libshare:">>$master
   echo "	(cd shared && \$(MAKE) -f Makefile_shared lib )">>$master
   echo "         ">>$master
   echo "libmodulopt:">>$master
   echo "	(cd modulopt && \$(MAKE) -f Makefile_opt lib)">>$master
   echo "         ">>$master
   echo  "base:	libmodulopt libshare">>$master
   echo "         ">>$master
   echo "         ">>$master
   echo "clean_shared:">>$master
   echo "	(cd shared && \$(MAKE) clean -f Makefile_shared)">>$master
   echo "clean_modulopt:">>$master
   echo "	(cd modulopt && \$(MAKE) clean -f Makefile_opt )">>$master
   echo "clean_main:">>$master
   echo "	\$(MAKE) clean -f Makefile_main">>$master
   echo "clean:	clean_shared clean_modulopt clean_main">>$master 
   cp $master $wkdir/. 
   return 0  
 }

 USAGE ()
 {
   this=$1 
   echo "Usage: " 
   echo "$this -t [trunk directory where the source code is stored] "
   echo "   -d [the destination directory where the envar Abs will go.] "
   echo "   -o [main | shared | modulopt | base | all ] "
   echo "   -h 1 [ help information ] "
 
    exit 0 
 }

 dependent_search_for_include ()
 {
   srcfile=$1
   if [[ $# -eq 0 ]];then
     echo "Need input a source file! Abort"
     exit 1
   fi
   tmpincludes=$TMPDIR/tmp_includes
   grep -i  "#include " $srcfile >$tmpincludes
   if [[ -s $tmpincludes ]];then
      dlist1=$(cat  $tmpincludes   |awk '{print $2}'|awk -F"\"" '{print $2}')
      dlist2=$(cat  $tmpincludes  |awk '{print $2}'|awk -F"<" '{print $2}'|awk -F">" '{print $1}' )   
      dlist="$dlist1 $dlist2"
      dependentlist="" 
      for str in `echo $dlist`;do
         dependentlist="$dependentlist $str"
      done   
      [[ -n $dependentlist ]] && echo $dependentlist
   fi 
   return 0 
 }

 update_toplevelcontrol_mod ()
 {
   [[ -s ${wkdir}/toplevelcontrol_mod.ftn90 ]] && return 0 
   #revpath=$(ssh pollux "cd $trunkdir; svn info | awk '/^URL/ {print \$2}'")
   #revnum=$(ssh pollux "cd $trunkdir;  svnversion")
   #!!
   revpath="svn://mrbsvn/assimilation/var/trunk"
   revnum="492M" 
   collectsrc toplevelcontrol_mod.ftn90_template  
   if [[ $? != 0 ]];then
     echo "Search comct0_template.cdk" 
     collectsrc comct0_template.cdk
     cat ./comct0_template.cdk |sed "s!XXXXX!${revnum} ${revpath}!g" > ${wkdir}/comct0.cdk
   else
     cat toplevelcontrol_mod.ftn90_template |sed "s!XXXXX!${revnum} ${revpath}!g" > ${wkdir}/toplevelcontrol_mod.ftn90
 
   fi 
 }



 Makefile_sufix  ()
 {
   libname=$1
   recettesnm=$2 
echo "     " >$recettesnm   
echo "all: \$(OBJECTS) " >$recettesnm   
echo "lib: all" >>$recettesnm 
echo "	ar cru $libname \$(OBJECTS)" >>$recettesnm 
echo "clean:  ">>$recettesnm  
echo "	rm -f *.f *.f90 *.o *.mod  ">>$recettesnm  
 }


 search_the_source ()
 {
   srcdir=$1
   destdir=$2
   list_sufix="$LIST_SUFIX" 
   
   if [[ -n $destdir ]] ;then
      mkdir -p $destdir 
   else
      destdir=$PWD
   fi 
   echo "Search $srcdir for source files.. "
 
   tmp_dir=$destdir 
   cd $tmp_dir 
   for sufix in $list_sufix;do
      cd $srcdir
      file_list=$(echo *.${sufix})  
      if [[ -n $file_list ]];then
          for file in $file_list;do
              #ln ${srcdir}/$file ${tmp_dir}/. 
              if [[ "${file}" != "*.${sufix}" ]];then
                cp ${srcdir}/$file ${tmp_dir}/. 
              fi 
          done 
       fi 
   done 
   return 0 
 }

 search_current_dir ()
 {
   curdir=$1 
   outdir=$2 
   typeset sufix 
   cd $curdir 
   echo "Search current direcory : $curdir " 
   for sufix  in $LIST_SUFIX ; do
       for file in $(echo *.$sufix );do
          if [[ "${file}" != "$sufix" ]];then
             if [[ -f $file ]] ;then
                rm -f $outdir/$file 
                cp $file $outdir/. 
             fi 
          fi 
       done
   done  
 }

 add_dependency()
 {
   curdir=$1
   mkfile=$2
   cd $curdir 
   filelist=$(find .) 
   for file in $filelist ;do
      dependent_search_for_include $file 
      if [[ -n $dependentlist ]];then 
         objnm=$(echo $file |awk -F"./" '{print $2}'|awk -F. '{print $1}') 
         objfile=${objnm}.o
         rpline=$(grep "${objfile}:" $mkfile) 
         dependObj0=$(echo $rpline | awk -F":" '{print $2}') 
         rpline1="${objfile}:       ${dependentlist} ${dependObj0}"  
         if [[ -n $rpline && -n ${rpline1} ]];then
            rm -f Makefile_tmp1
            sed "s/${rpline}/${rpline1}/g" <$mkfile  > Makefile_tmp1
            [[ -s Makefile_tmp1 ]] && cp Makefile_tmp1 $mkfile 
         fi 
      fi 
    done  
    rm -f Makefile_tmp1
    return 0  
 }

 create_Makefile_main ()
 {

  rm -f $tmpwork/* 
  # 1. Search for the source directory... 
  # 1.1  for the trunk.. and trunk/bgcheck/.  
  search_the_source $trunkdir $tmpwork 
  search_the_source ${trunkdir}/bgcheck $tmpwork 
  
  [[ -f ${trunkdir}/Makefile_${BASE_ARCH} ]] && cp ${trunkdir}/Makefile_${BASE_ARCH}  $dest/.  
 #  
 

 # 1.2. Search for the current directory.. 
  search_current_dir $wkdir $tmpwork 

  cd $tmpwork
  # 1.2  remove mpi_mood.ftn90 since it is included in modulopt.. 
  rm -f mpi_mod.ftn90 
  find . | s.dependencies.pl -soft-restriction -deep-include   >Makefile_tmp   
  #add_dependency ${PWD} Makefile_tmp  

  cat ${wkdir}/.Makefile_sect0 >Makefile  
  cat Makefile_tmp >> Makefile 
  [[ -f ${trunkdir}/recettes ]] && cp ${trunkdir}/recettes .  
  cat recettes     >>Makefile  

  cp Makefile $dest/Makefile_main  
  rm -f $tmpwork/*  
 }

 create_Makefile_libs ()
 {
   wkdirlib=$1
   libname=$2 
   searchdir=$3
   srcMakesect0=$4 
   Makesufx=$5
   nmrecette=$6 

 
    rm -f $tmpwork/* 
    cd $wkdirlib 
   search_the_source $searchdir $tmpwork 

 # 2.2. Search for the current directory.. 
   search_current_dir $wkdirlib $tmpwork
 #2.3 for moduleopt , search a special file: mpi_mod.ftn90 from trunk. 
   cd $tmpwork 
   if [ "$libname" = "libmodulopt.a" ];then
      collectsrc mpi_mod.ftn90
   fi 

 
   #find . | s.dependencies.pl -soft-restriction  >Makefile_tmp
   find . | s.dependencies.pl   >Makefile_tmp
   add_dependency ${PWD} Makefile_tmp
   cat ${srcMakesect0}/.Makefile_sect0 >$Makesufx 
   cat Makefile_tmp >>$Makesufx 
   Makefile_sufix $libname $nmrecette    
   cat $nmrecette >>$Makesufx   
   [[ -f $Makesufx ]] && cp $Makesufx $wkdirlib  
   rm -f  $tmpwork/*
 }

 checkfiles ()
 {
   mkopt=$1
   if [[ "${mkopt}" = "all" ]];then
      if [[ -s $wkdir/Makefile && -s $wkdir/Makefile_main && -s $wkdir/shared/Makefile_shared && -s $wkdir/modulopt/Makefile_opt ]];then
        echo "=== All Makefile are created! ===" 
      else
        echo "=== Errors ! Abort! ===="   
        exit 1  
      fi 
   elif [[ "${mkopt}" = "base" ]];then
      if [[ -s $wkdir/Makefile && -s $wkdir/shared/Makefile_shared && -s $wkdir/modulopt/Makefile_opt ]];then
         echo "=== Makefile_shared and Makefile_opt are created! ==="
      else
         echo "Errors to create Makefile_shared and Makefile_opt! Abort!" 
         exit 1  
      fi 
   elif [[ "${mkopt}" = "shared" ]];then
       if [[ -s $wkdir/Makefile && -s $wkdir/shared/Makefile_shared ]];then
          echo "=== Makefile_shared is created! ===" 
       else 
          echo "Errors to create Makefile_shared ! Abort!" 
          exit 1 
       fi 
   elif [[ "${mkopt}" = "modulopt" ]];then
      if [[ -s $wkdir/Makefile && -s $wkdir/modulopt/Makefile_opt ]];then
          echo "=== Makefile_opt is created! ===" 
      else
          echo "Errors to create Makefile_opt ! Abort!" 
          exit 1 
      fi 
   elif [[ "${mkopt}" = "main" ]];then
      if [[ -s $wkdir/Makefile && -s $wkdir/Makefile_main ]];then
         echo  "=== Makefile_main are created! ==="
      else
         echo "Errors to create Makefile_opt ! Abort!"
         exit 1 
      fi 
   else
     echo "Wrong option for mkopt: $mkopt" 
     exit 1 
   fi 
 }



#--------------------------------------------------------------------------
#  Main start here.... 
# ------------------------------------------------------------------------
 
 dest=$PWD
 mkwt=main  
 help=0 
 if [[ $# > 0 ]];then
    while getopts t:d:o:h: opt; do
       case $opt in
          t) trunkdir=$OPTARG;;
          d) dest=$OPTARG;;
          o) mkwt=$OPTARG;;
          h) help=$OPTARG
             USAGE $(basename $0) ;;
          *) USAGE $(basename $0) ;;
       esac
    done 

    if [ -z $trunkdir ];then
       if [ -f ./.trunkdir ];then
         .  ./.trunkdir 
         trunkdir=${TRUNKDIR}
       else
         trunkdir=$PWD 
       fi 
    fi    
 else
     if [[ -f ./.trunkdir ]];then
        . ./.trunkdir
     else
        echo "Please submit trunkdir with $(basename $0) -t xxxxx "
        echo "    " 
        USAGE $(basename $0) 
     fi 
     trunkdir=${TRUNKDIR}
 fi 
 export TRUNKDIR=$trunkdir 
 echo "Create a Makefile with the tool s.dependencies.pl " 
 

 # Protect the dest is not the HOME directory...    
 if [[ "$dest" = "$HOME" ]];then
    echo "Please make sure the dest.directory is not same as your HOME!"
   exit 1 
 fi 
 if [[ ! -d ${trunkdir}/shared || ! -d ${trunkdir}/modulopt || ! -d ${trunkdir}/bgcheck ]];then
    echo "the given trunkdir is not correct. Abort!"
    exit 1 
 fi 
 mkdir -p $dest  
 wkdir=$dest 
 cd $wkdir 
#...  
 #rm -f $wkdir/* 
 list_Makefile_sect01 

 # 1. accuess s.dependencies.pl  
 . s.ssmuse.dot devtools
   
 tmpwork=${TMPDIR}/tmp_work 
 mkdir -p $tmpwork 
 cd $tmpwork
 rm -f * 

 if [[ ${mkwt} = "modutopt" || ${mkwt} = "all" || ${mkwt} = "base" ]];then 

 # 2. Search for the source from trunkdir/shared and trunkdir/modulopt
 # 2.1 Search for source in trunk/modulop   
     wkdir1=$wkdir/modulopt
     mkdir -p $wkdir1 
     
     create_Makefile_libs  $wkdir1 libmodulopt.a ${trunkdir}/modulopt $wkdir Makefile_opt recettes_opt          
     echo "TRUNKDIR=$trunkdir">$wkdir1/.trunkdir 
 fi 
#   
 # 3. Search for source in trunk/shared 
 if [[ ${mkwt} = "shared" || ${mkwt} = "all" || ${mkwt} = "base" ]];then
     wkdir2=$wkdir/shared  
     mkdir -p $wkdir2 
     cd $wkdir2  
     collectsrc maincompileswitch.inc
     create_Makefile_libs  $wkdir2 libenv_shared.a ${trunkdir}/shared $wkdir Makefile_shared recettes_share 
     echo "TRUNKDIR=$trunkdir">$wkdir2/.trunkdir 
 fi 

 if [[ ${mkwt} = "main" || ${mkwt} = "all" ]] ; then 
 
  #4. create Main Makefile.. 
     update_toplevelcontrol_mod  # 
     create_Makefile_main   
 fi 

 # 5. create the master Makefile.. 
 Create_Master_make Makefile   #  
 #
 # 6. record the trunkdir for Makefile.  
   echo "Record the trunkdir to the file .trunkdir " 
  echo "trunkdir = $trunkdir "   
   echo "TRUNKDIR=$trunkdir">${wkdir}/.trunkdir 
 #
 # Last check... 
  checkfiles $mkwt 

 exit 0 
