#!/bin/sh
#   Copyright (c) 2002 Douglas Gregor <doug.gregor -at- gmail.com>
#
#   Distributed under the Boost Software License, Version 1.0.
#   (See accompanying file LICENSE_1_0.txt or copy at
#   http://www.boost.org/LICENSE_1_0.txt)

# User configuration
# (MAINTANERS: please, keep in synch with setup_boostbook.py)
DOCBOOK_XSL_VERSION=1.75.2
DOCBOOK_DTD_VERSION=4.2
FOP_VERSION=0.94
FOP_JDK_VERSION=1.4
FOP_MIRROR=http://mirrors.ibiblio.org/pub/mirrors/apache/xmlgraphics/fop/binaries
SOURCEFORGE_DOWNLOAD=http://sourceforge.net/projects/docbook/files/
HTTP_GET_CMD="curl -O -L"

# No user configuration below this point-------------------------------------

# Get the DocBook XSLT Stylesheets
DOCBOOK_XSL_TARBALL=docbook-xsl-$DOCBOOK_XSL_VERSION.tar.gz
DOCBOOK_XSL_URL=$SOURCEFORGE_DOWNLOAD/docbook-xsl/$DOCBOOK_XSL_VERSION/$DOCBOOK_XSL_TARBALL/download
if test -f $DOCBOOK_XSL_TARBALL; then
  echo "Using existing DocBook XSLT Stylesheets (version $DOCBOOK_XSL_VERSION)."
else
  echo "Downloading DocBook XSLT Stylesheets version $DOCBOOK_XSL_VERSION..."
  $HTTP_GET_CMD $DOCBOOK_XSL_URL
fi

DOCBOOK_XSL_DIR="$PWD/docbook-xsl-$DOCBOOK_XSL_VERSION"
if test ! -d docbook-xsl-$DOCBOOK_XSL_VERSION; then
  echo -n "Expanding DocBook XSLT Stylesheets into $DOCBOOK_XSL_DIR..."
  gunzip -cd $DOCBOOK_XSL_TARBALL | tar xf -
  echo "done."
fi

# Get the DocBook DTD
DOCBOOK_DTD_ZIP=docbook-xml-$DOCBOOK_DTD_VERSION.zip
DOCBOOK_DTD_URL=http://www.oasis-open.org/docbook/xml/$DOCBOOK_DTD_VERSION/$DOCBOOK_DTD_ZIP
if test -f $DOCBOOK_DTD_ZIP; then
  echo "Using existing DocBook XML DTD (version $DOCBOOK_DTD_VERSION)."
else
  echo "Downloading DocBook XML DTD version $DOCBOOK_DTD_VERSION..."
  $HTTP_GET_CMD $DOCBOOK_DTD_URL
fi

DOCBOOK_DTD_DIR="$PWD/docbook-dtd-$DOCBOOK_DTD_VERSION"
if test ! -d docbook-dtd-$DOCBOOK_DTD_VERSION; then
  echo -n "Expanding DocBook XML DTD into $DOCBOOK_DTD_DIR... "
  unzip -q $DOCBOOK_DTD_ZIP -d $DOCBOOK_DTD_DIR
  echo "done."
fi

# Find xsltproc, doxygen, and java
OLD_IFS=$IFS
IFS=:
for dir in $PATH; do
  if test -f $dir/xsltproc && test -x $dir/xsltproc; then
    XSLTPROC="$dir/xsltproc"
  fi
  if test -f $dir/doxygen && test -x $dir/doxygen; then
    DOXYGEN="$dir/doxygen"
  fi
  if test -f $dir/java && test -x $dir/java; then
    JAVA="$dir/java"
  fi
done
IFS=$OLD_IFS

# Make sure we have xsltproc
if test ! -f "$XSLTPROC" && test ! -x "$XSLTPROC"; then
  echo "Searching for xsltproc... NOT FOUND.";
  echo "ERROR: Unable to find xsltproc executable."
  echo "If you have already installed xsltproc, please set the environment"
  echo "variable XSLTPROC to the xsltproc executable. If you do not have"
  echo "xsltproc, you may download it from http://xmlsoft.org/XSLT/."
  exit 0;
else
  echo "Searching for xsltproc... $XSLTPROC.";
fi

# Just notify the user if we haven't found doxygen.
if test ! -f "$DOXYGEN" && test ! -x "$DOXYGEN"; then
  echo "Searching for Doxygen... not found.";
  echo "Warning: unable to find Doxygen executable. You will not be able to"
  echo "  use Doxygen to generate BoostBook documentation. If you have Doxygen,"
  echo "  please set the DOXYGEN environment variable to the path of the doxygen"
  echo "  executable."
  HAVE_DOXYGEN="no"
else
  echo "Searching for Doxygen... $DOXYGEN.";
  HAVE_DOXYGEN="yes"
fi

# Just notify the user if we haven't found Java. Otherwise, go get FOP.
if test ! -f "$JAVA" && test ! -x "$JAVA"; then
  echo "Searching for Java... not found.";
  echo "Warning: unable to find Java executable. You will not be able to"
  echo "  generate PDF documentation. If you have Java, please set the JAVA"
  echo "  environment variable to the path of the java executable."
  HAVE_FOP="no"
else
  echo "Searching for Java... $JAVA.";
  FOP_TARBALL="fop-$FOP_VERSION-bin-jdk$FOP_JDK_VERSION.tar.gz"
  FOP_URL="$FOP_MIRROR/$FOP_TARBALL"
  FOP_DIR="$PWD/fop-$FOP_VERSION"
  FOP="$FOP_DIR/fop"
  if test -f $FOP_TARBALL; then
    echo "Using existing FOP distribution (version $FOP_VERSION)."
  else
    echo "Downloading FOP distribution version $FOP_VERSION..."
    $HTTP_GET_CMD $FOP_URL
  fi

  if test ! -d $FOP_DIR; then
    echo -n "Expanding FOP distribution into $FOP_DIR... ";
    gunzip -cd $FOP_TARBALL | tar xf -
    echo "done.";
  fi
  HAVE_FOP="yes"
fi

# Find the input jamfile to configure
JAM_CONFIG_OUT="$HOME/user-config.jam"
if test -r "$HOME/user-config.jam"; then
  JAM_CONFIG_IN="user-config-backup.jam"
  cp $JAM_CONFIG_OUT user-config-backup.jam
  JAM_CONFIG_IN_TEMP="yes"
  echo -n "Updating Boost.Jam configuration in $JAM_CONFIG_OUT... "

elif test -r "$BOOST_ROOT/tools/build/v2/user-config.jam"; then
  JAM_CONFIG_IN="$BOOST_ROOT/tools/build/v2/user-config.jam";
  JAM_CONFIG_IN_TEMP="no"
  echo -n "Writing Boost.Jam configuration to $JAM_CONFIG_OUT... "
else
  echo "ERROR: Please set the BOOST_ROOT environment variable to refer to your"
  echo "Boost installation or copy user-config.jam into your home directory."
  exit 0
fi

cat > setup_boostbook.awk <<EOF
BEGIN { using_boostbook = 0; eaten=0 }

/^\s*using boostbook/ {
  using_boostbook = 1;
  print "using boostbook";
  print "  : $DOCBOOK_XSL_DIR";
  print "  : $DOCBOOK_DTD_DIR";
  eaten=1
}

using_boostbook==1 && /;/ { using_boostbook = 2 }
using_boostbook==1 { eaten=1 }

/^\s*using xsltproc.*$/ { eaten=1 }
/^\s*using doxygen.*$/ { eaten=1 }
/^\s*using fop.*$/ { eaten=1 }

/^.*$/             { if (eaten == 0) print; eaten=0 }

END {
  if (using_boostbook==0) {
    print "using boostbook";
    print "  : $DOCBOOK_XSL_DIR";
    print "  : $DOCBOOK_DTD_DIR";
    print "  ;"
  }
  print "using xsltproc : $XSLTPROC ;"
  if ("$HAVE_DOXYGEN" == "yes") print "using doxygen : $DOXYGEN ;";
  if ("$HAVE_FOP" == "yes") print "using fop : $FOP : : $JAVA ;";
}
EOF

awk -f setup_boostbook.awk $JAM_CONFIG_IN > $JAM_CONFIG_OUT
rm -f setup_boostbook.awk
echo "done."

echo "Done! Execute \"bjam --v2\" in a documentation directory to generate"
echo "documentation with BoostBook. If you have not already, you will need"
echo "to compile Boost.Jam."
