#!/bin/sh
#
# $Id$
#
# Copyright (C) 1997-2005 by Dimitri van Heesch.
# 
# Permission to use, copy, modify, and distribute this software and its
# documentation under the terms of the GNU General Public License is hereby 
# granted. No representations are made about the suitability of this software 
# for any purpose. It is provided "as is" without express or implied warranty.
# See the GNU General Public License for more details.
# 
# Documents produced by Doxygen are derivative works derived from the
# input used in their production; they are not affected by this license.
# 
# shell script to configure doxygen

doxygen_version_major=1
doxygen_version_minor=4
doxygen_version_revision=7

#NOTE: Setting version_mmn to "NO" will omit mmn info from the package.
doxygen_version_mmn=20060809

bin_dirs=`echo $PATH | sed -e "s/:/ /g"`

f_debug=NO
f_shared=YES
f_make=NO
f_dot=NO
f_perl=NO
f_plf_auto=NO
f_prefix=/usr/local
f_insttool=NO
f_english=NO
f_wizard=NO
f_app=NO
f_thread=NO
f_langs=nl,se,cz,fr,id,it,de,jp,je,es,fi,ru,hr,pl,pt,hu,kr,ke,ro,si,cn,no,br,dk,sk,ua,gr,tw,sr,ca,lt,za,ar,fa

while test -n "$1";  do
  case $1 in
    --prefix | -prefix)
       shift; f_prefix=$1
       ;;
    --docdir | -docdir)
       shift; f_docdir=$1/doxygen
       ;;
    --shared | -shared)
       f_shared=YES
       ;;
    --static | -static)
       f_shared=NO
       ;;
    --release | -release)
       f_debug=NO
       ;;
    --debug | -debug)
       f_debug=YES
       ;;
    --english-only | -english-only)
       f_english=YES
       ;;
    --enable-langs | -enable-langs)
       shift; f_langs=$1
       ;;
    --platform | -platform)
       shift; f_platform=$1
       ;;
    --make | -make)
       shift; f_make=$1
       ;;
    --dot | -dot)
       shift; f_dot=$1
       ;;
    --perl | -perl)
       shift; f_perl=$1
       ;;
    --install | -install)
       shift; f_insttool=$1
       ;;
    --with-doxywizard | -with-doxywizard)
       f_wizard=YES
       ;;
    --with-doxyapp | -with-doxyapp)
       f_app=YES
       ;;
    -h | -help | --help)
       f_help=y
       ;;
    *)
       echo $1: unknown argument
       f_help=y
       f_error=y
       ;;
  esac
  shift
done

if test "$f_help" = y; then
  cat <<EOF
Usage: $0 [--help] [--shared] [--static] [--release] [--debug] 
          [--perl name] [--make name] [--dot name] [--platform target] 
          [--prefix dir] [--docdir dir] [--install name] [--english-only] 
          [----enable-langs list] [--with-doxywizard] 

Options: 

  --help                Print this help
  --shared | --static   Build using shared or static linking
		        [default: shared]
  --release | --debug   Build for release or debug 
		        [default: release]
  --perl name           Use \`name' as the name of the perl interpreter 
		        [default: autodetect]
  --make name           Use \`name' as the name of the GNU make tool
		        [default: autodetect]
  --dot name            Use \`name' as the name of the dot tool that
                        is part of the Graphviz package.
                        [default: autodetect]
  --platform target     Do not detect platform but use \`target' instead.
                        See PLATFORMS for a list of possibilities
  --prefix dir          Installation prefix directory (doxygen will be
                        put in PREFIX/bin/doxygen)
                        [default: $f_prefix]
  --docdir dir          Documentation is installed in DOCDIR/doxygen/
                        [default: PREFIX/share/doc/packages]
  --install name        Use \`name' as the name of the GNU install tool
                        [default: autodetect]
  --english-only        Include support for English only.
  --enable-langs list 	Include support for output languages listed in list.
  			[default: $f_langs]
  --with-doxywizard     Build the GUI frontend for doxygen. This
                        requires Qt 3.3.x

EOF
  test "$f_error" = y && exit 1
  exit 0;
fi

u_release=`(uname -r) 2>/dev/null` || u_release=unknown
u_system=`(uname -s) 2>/dev/null` || u_system=unknown

if test -z "$f_platform"; then
  f_platforms="`cat PLATFORMS`"
  
  case "$u_system:$u_release" in
    AIX*)
      f_platform=aix-xlc
      ;;
    BeOS*)
      f_platform=beos-g++
      ;;
    dgux:*)
      f_platform=dgux-g++
      ;;
    Darwin:*)
      f_platform=macosx-c++
      if test "$f_insttool" = NO; then
        f_insttool=/usr/bin/install
      fi
      if test -n "`ls /Developer/SDKs/MacOSX10.*u.sdk`"; then
        f_platform=macosx-uni-c++
      fi
      ;;
    FreeBSD:*)
      f_platform=freebsd-g++
      if test "$f_insttool" = NO; then
        f_insttool=/usr/bin/install
      fi
      ;;
    HP-UX:*)
      f_platform=hpux-g++
      if test "$f_insttool" = NO; then
        f_insttool=/usr/bin/install
      fi
      ;;
    IRIX64:*)
      f_platform=irix-64
      ;;
    IRIX:*)
      f_platform=irix-n32
      ;;
    Linux:*|GNU:*|GNU/*:*)
      f_platform=linux-g++
      ;;
    NetBSD:*)
      f_platform=netbsd-g++
      ;;
    OpenBSD:*)
      f_platform=openbsd-g++
      ;;
    OSF1:*)
      f_platform=osf1-g++
      ;;
    QNX:*)
      f_platform=qnx-g++
      ;;
    *:3.2)
      f_platform=sco-g++
      ;;
    SunOS:4*)
      f_platform=sunos-g++
      ;;
    SunOS:5*)
      f_platform=solaris-g++
      if test "$f_insttool" = NO; then
        f_insttool=/usr/bin/install
      fi
      ;;
    ULTRIX:*)
      f_platform=ultrix-g++
      ;;
    UNIX_SV:4.2*)
      f_platform=unixware-g++
      ;;
    Cygwin:*)
      f_platform=win32-g++
      ;;
    *MiNT:*)
      f_platform=m68k-atari-mint-g++
      ;;
    *)
    echo
    echo "Your platform was not recognised by this configure script"
    echo "Please use the -platform option to specify one of platforms"
    echo "in this list:"
    echo
    for p in $f_platforms
    do
      echo "    $0 $* -platform $p"
    done
    echo
    exit 2
  esac 
  echo "  Autodetected platform $f_platform... "
  f_plf_auto=YES
fi

if test -z "$f_docdir"; then
  f_docdir=$f_prefix/share/doc/packages/doxygen
fi

if test "$f_plf_auto" = NO; then
  echo -n "  Checking for platform $f_platform... "
  if test '!' -d tmake/lib/$f_platform; then
    echo "not supported!" 
    echo
    exit 2
  fi
  echo "supported"
fi

#- check for qt --------------------------------------------------------------
 
LIBDIR=lib
if test "$f_wizard" = YES; then
  if test -z "$QTDIR"; then
    echo "  QTDIR environment variable not set!"
    echo -n "  Checking for Qt..."
    for d in /usr/{lib,share,qt}/{qt-3,qt3,qt,qt*,3}; do
      if test -d "$d/lib" -a -d "$d/include" -a -x "$d/bin/moc"; then
        QTDIR=$d
      fi
    done
  else
    echo "  Detected Qt via the QTDIR environment variable..."
    echo -n "                    "
  fi
  if test -z "$QTDIR"; then
    echo "QTDIR not set and Qt not found at standard locations!"
    echo
    echo "tmake requires the QTDIR environment variable to be set."
    echo "check the Qt installation instructions!"
    exit 2
  else
    if test ! -d "$QTDIR/lib"; then
      if test ! -d "$QTDIR/lib64"; then
        echo "QTDIR is set to $QTDIR, but library directory $QTDIR/lib does not exist!"
        exit 2
      fi
      LIBDIR=lib64
    fi
    if test ! -d "$QTDIR/include"; then
      echo "QTDIR is set to $QTDIR, but include directory $QTDIR/include does not exist!"
      exit 2
    fi
    if test ! -x "$QTDIR/bin/moc"; then
      echo "QTDIR is set to $QTDIR, but the moc tool could not be found in $QTDIR/bin!"
      exit 2
    fi
    echo " headers $QTDIR/include,"
    echo "                     libraries $QTDIR/$LIBDIR"  
    if test -n "`ls $QTDIR/$LIBDIR/* | grep qt-mt`"; then
      f_thread=YES
    fi
  fi
fi
   
# - check for make ------------------------------------------------------------

echo -n "  Checking for GNU make tool... "
if test "$f_make" = NO; then
  make_names="gmake make"
  make_dirs="/usr/bin /usr/local/bin /bin /sbin $bin_dirs"
  make_prog=NO
  for i in $make_names; do
    for j in $make_dirs; do
      if test -x "$j/$i"; then
        if test -n "`$j/$i --version 2>/dev/null | grep GNU`"; then
          make_prog="$j/$i"
          break 2
        fi
      fi
    done
  done
  f_make="$make_prog" 
fi

if test "$f_make" = NO; then
  echo "not found!";
  echo
  exit 2
fi
echo "using $f_make"

# - check for install ------------------------------------------------------------

echo -n "  Checking for GNU install tool... "
if test "$f_insttool" = NO; then
  install_names="ginstall install"
  install_dirs="/usr/bin /usr/local/bin /bin /sbin /usr/ucb $bin_dirs"
  install_prog=NO
  install_found=NO
  for i in $install_names; do
    for j in $install_dirs; do
      if test -x "$j/$i"; then
        if test -n "`$j/$i --version 2>/dev/null | grep utils`"; then
          install_found=YES
          install_prog="$j/$i"
          break 2
        fi
      fi
    done
  done
  f_insttool="$install_prog" 
fi

if test "$f_insttool" = NO; then
  if test "$install_found" = YES; then
    echo;
  else
    echo "not found!";
    echo
  fi
  echo "GNU version of install is required: this is part of the fileutils/coreutils package: "
  echo "see http://www.gnu.org/software/fileutils/fileutils.html"
  echo
  exit 2
fi
echo "using $f_insttool";


# - check for dot ------------------------------------------------------------

echo -n "  Checking for dot (part of GraphViz)... "
if test "$f_dot" = NO; then
  dot_dirs="$bin_dirs"
  dot_prog=NO
  for j in $dot_dirs; do
    if test -x "$j/dot"; then
      dot_prog="$j/dot"
      break 2
    fi
  done
  f_dot="$dot_prog" 
fi

if test "$f_dot" = NO; then
  echo "not found!";
else
  echo "using $f_dot"
fi

# - check for perl ------------------------------------------------------------

echo -n "  Checking for perl... "
if test "$f_perl" = NO; then
  perl_names="perl perl5"
  perl_dirs="/usr/bin /usr/local/bin /bin /sbin $bin_dirs"
  perl_prog=NO
  perl_found=NO
  for i in $perl_names; do
    for j in $perl_dirs; do
      if test -x "$j/$i"; then
        perl_found=YES
        if $j/$i -e 'require 5.000;' 2>/dev/null ; then
          perl_prog="$j/$i"
          break 2
        fi
      fi
    done
  done
  f_perl="$perl_prog" 
fi

if test "$f_perl" = NO; then
  if test "$perl_found" = YES; then
    echo "version is too old (5.000 or higher is required)."
  else
    echo "not found!";
  fi
  echo
  exit 2
fi
echo "using $f_perl";


# -----------------------------------------------------------------------------

#
# Make VERSION file
#
echo "  Creating VERSION file."
# Output should be something like 1.4.5-20051010
if test "$doxygen_version_mmn" = NO; then
  echo "$doxygen_version_major.$doxygen_version_minor.$doxygen_version_revision" > VERSION
else
  echo "$doxygen_version_major.$doxygen_version_minor.$doxygen_version_revision-$doxygen_version_mmn" > VERSION
fi

test -f .makeconfig && rm .makeconfig
test -f .tmakeconfig && rm .tmakeconfig

if test -z $PWD; then
  PWD=`pwd`
fi

cat > .makeconfig <<EOF
DOXYGEN   = $PWD
TMAKEPATH = $PWD/tmake/lib/$f_platform
ENV       = env TMAKEPATH=\$(TMAKEPATH)
TMAKE     = $PWD/tmake/bin/tmake
MAKE      = $f_make
PERL      = $f_perl
RM        = rm -f
CP        = cp
VERSION   = `cat VERSION`
INSTALL   = $f_prefix
INSTTOOL  = $f_insttool
DOXYDOCS  = ..
DOCDIR    = $f_docdir
QTDIR     = $QTDIR
EOF

if test "$f_dot" != NO; then
  cat >> .makeconfig <<EOF
HAVE_DOT  = $f_dot
EOF
fi

if test "$f_platform" = "m68k-atari-mint-g++"; then
  cat >> .makeconfig <<EOF
TMAKE += -unix
EOF
fi


# Make doxygen.spec...
#
echo "  Created doxygen.spec file, for rpm generation."

echo "%define version $doxygen_version_major.$doxygen_version_minor.$doxygen_version_revision" > spec.tmp
if test "$doxygen_version_mmn" = NO; then
  echo "%define revision 1" >> spec.tmp
  echo "%define mmn 1"      >> spec.tmp
else
  echo "%define revision $doxygen_version_mmn" >> spec.tmp
  echo "%define mmn $doxygen_version_mmn"      >> spec.tmp
fi

mkdir -p packages
mkdir -p packages/rpm

if test "$f_wizard" = YES; then
  cat spec.tmp ./packages/rpm/doxygen.spec.in > ./packages/rpm/doxygen.spec
else
  cat spec.tmp ./packages/rpm/doxygen-nodoxywizard.spec.in > ./packages/rpm/doxygen.spec
fi

rm -f spec.tmp


# make .tmakeconfig
#
touch .tmakeconfig
if test "$f_shared" = NO; then
  if test "$f_platform" = "osf1-cxx" -o "$f_platform" = "irix-n32"; then
  cat >> .tmakeconfig <<EOF
    TMAKE_LFLAGS += -non_shared
EOF
  elif test "$f_platform" = "solaris-cc"; then
  cat >> .tmakeconfig <<EOF
    TMAKE_LFLAGS += -Bstatic
EOF
  elif test "$f_platform" = "hpux-cc"; then
  cat >> .tmakeconfig <<EOF
    TMAKE_LFLAGS += -noshared
EOF
  else
  cat >> .tmakeconfig <<EOF
    TMAKE_LFLAGS += -static
EOF
  fi
fi
if test "$f_wizard" = YES; then
  cat >> .tmakeconfig <<EOF
TMAKE_MOC = $QTDIR/bin/moc
EOF
fi

if test "$f_english" = YES; then
  cat >> .tmakeconfig <<EOF
TMAKE_CXXFLAGS += -DENGLISH_ONLY
EOF
fi

f_inmakefiles="Makefile.in qtools/Makefile.in src/Makefile.in examples/Makefile.in doc/Makefile.in addon/doxywizard/Makefile.in addon/doxmlparser/src/Makefile.in addon/doxmlparser/test/Makefile.in addon/doxmlparser/examples/metrics/Makefile.in libpng/Makefile.in libmd5/Makefile.in addon/doxyapp/Makefile.in"

for i in $f_inmakefiles ; do
     SRC=$i
     DST=`echo $i|sed 's%\(.*\).in$%\1%'`
     TIME=`date`
     cat > $DST <<EOF
#
# This file was generated from `basename $i` on $TIME
#

EOF
     cat .makeconfig >> $DST
     if test $i = Makefile.in; then
       echo "" >> $DST
       echo "all: src/version.cpp " >> $DST
       echo "	\$(MAKE) -C qtools" >> $DST
       echo "	\$(MAKE) -C libpng" >> $DST
       echo "	\$(MAKE) -C libmd5" >> $DST
       echo "	\$(MAKE) -C src" >> $DST
       if test $f_wizard = YES; then
         echo "	\$(MAKE) -C addon/doxywizard" >> $DST
       fi
       if test $f_app = YES; then
         echo "	\$(MAKE) -C addon/doxyapp" >> $DST
       fi
       echo "" >> $DST
       echo "doxywizard_install:" >> $DST
       if test $f_wizard = YES; then
         echo "	\$(MAKE) -C addon/doxywizard install" >> $DST
       fi
       echo "" >> $DST
     fi
     cat $SRC >> $DST
     echo "  Created $DST from $SRC..."
done

f_inprofiles="qtools/qtools.pro.in src/libdoxygen.pro.in src/libdoxycfg.pro.in src/doxygen.pro.in src/doxytag.pro.in addon/doxywizard/doxywizard.pro.in addon/doxmlparser/src/doxmlparser.pro.in addon/doxmlparser/test/xmlparse.pro.in addon/doxmlparser/examples/metrics/metrics.pro.in libpng/libpng.pro.in libmd5/libmd5.pro.in addon/doxyapp/doxyapp.pro.in" 

for i in $f_inprofiles ; do
     SRC=$i
     DST=`echo $i|sed 's%\(.*\).in$%\1%'`
     TIME=`date`
     cat > $DST <<EOF
#
# This file was generated from `basename $i` on $TIME
#

EOF
     if test "$f_debug" = NO; then
       realopts="release"
     else
       realopts="debug"
     fi
     if test "$f_thread" = YES; then
       realopts="$realopts thread"
     fi
     cat $SRC .tmakeconfig | sed -e "s/\$extraopts/$realopts/g" >> $DST
     echo "  Created $DST from $SRC..."
done

# - generating src/lang_cfg.h 

if test -f "src/lang_cfg.h"; then
    chmod u+w src/lang_cfg.h   # make sure file can be overwritten
fi
echo -n "  Generating src/lang_cfg.h..."
echo $f_langs | $f_perl -e '@l=split(/,/,<STDIN>); 
        chomp @l; 
	@allowed=(split(/,/,"NL,SE,CZ,FR,ID,IT,DE,JP,JE,ES,FI,RU,HR,PL,PT,HU,KR,KE,RO,SI,CN,NO,BR,DK,SK,UA,GR,TW,SR,CA,LT,ZA,AR,FA"));
	foreach my $elem (@l){ 
	     $elem =~ tr/a-z/A-Z/;
	     $r=0;
	     foreach my $tst (@allowed){
		if ($tst eq $elem) { $r=1; last; } 		
	     }	    
	     if ($r!=1) { die "ERROR: Invalid language $elem was selected!\n"; } 
	     print "#define LANG_$elem\n";
        };' > ./src/lang_cfg.h   
echo
