#!/bin/sh
# ====================================================================
# The Apache Software License, Version 1.1
#
# Copyright (c) 2000-2003 The Apache Software Foundation.  All rights
# reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in
#    the documentation and/or other materials provided with the
#    distribution.
#
# 3. The end-user documentation included with the redistribution,
#    if any, must include the following acknowledgment:
#       "This product includes software developed by the
#        Apache Software Foundation (http://www.apache.org/)."
#    Alternately, this acknowledgment may appear in the software itself,
#    if and wherever such third-party acknowledgments normally appear.
#
# 4. The names "Apache" and "Apache Software Foundation" must
#    not be used to endorse or promote products derived from this
#    software without prior written permission. For written
#    permission, please contact apache@apache.org.
#
# 5. Products derived from this software may not be called "Apache",
#    nor may "Apache" appear in their name, without prior written
#    permission of the Apache Software Foundation.
#
# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
# ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
# ====================================================================
#
# This software consists of voluntary contributions made by many
# individuals on behalf of the Apache Software Foundation.  For more
# information on the Apache Software Foundation, please see
# <http://www.apache.org/>.
#

# buildconf: Build the support scripts needed to compile from a
#            checked-out version of the source code.

# set a couple of defaults for where we should be looking for our support libs.
# can be overridden with --with-apr=[dir] and --with-apr-util=[dir]

apr_src_dir=srclib/apr
apu_src_dir=srclib/apr-util

while test $# -gt 0 
do
  # Normalize
  case "$1" in
  -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
  *) optarg= ;;
  esac

  case "$1" in
  --with-apr=*)
  apr_src_dir=$optarg
  ;;
  esac

  case "$1" in
  --with-apr-util=*)
  apu_src_dir=$optarg
  ;;
  esac

  shift
done

#
# Check to be sure that we have the srclib dependencies checked-out
#

if [ ! -d "$apr_src_dir" -o ! -f "$apr_src_dir/build/apr_common.m4" ]; then
    echo ""
    echo "You don't have a copy of the apr source in $apr_src_dir. " 
    echo "Please get the source using the following instructions," 
    echo "or specify the location of the source with " 
    echo "--with-apr=[path to apr] :"
    echo ""
    echo "   cd srclib"
    echo "   cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic login"
    echo "      (password 'anoncvs')"
    echo ""
    echo "   cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic co \\"
    echo "      -r APR_0_9_BRANCH apr"
    echo ""
    exit 1
fi
if [ ! -d "$apu_src_dir" -o ! -f "$apu_src_dir/Makefile.in" ]; then
    echo ""
    echo "You don't have a copy of the apr-util source in $apu_src_dir. "
    echo "Please get one the source using the following instructions, "
    echo "or specify the location of the source with "
    echo "--with-apr-util=[path to apr-util]:"
    echo ""
    echo "   cd srclib"
    echo "   cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic login"
    echo "      (password 'anoncvs')"
    echo ""
    echo "   cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic co \\"
    echo "      -r APU_0_9_BRANCH apr-util"
    echo ""
    exit 1
fi

# These are temporary until Roy finishes the other build changes
#
touch .deps
rm -f aclocal.m4
rm -f generated_lists

# Remove autoconf 2.5x's cache directory
rm -rf autom4te*.cache

case "`uname`" in
*BSD/OS*)
    ./build/bsd_makefile;;
esac
#
# end temporary stuff

apr_configure="$apr_src_dir/configure"
aprutil_configure="$apu_src_dir/configure"
pcre_configure="srclib/pcre/configure"
config_h_in="include/ap_config_auto.h.in"

cross_compile_warning="warning: AC_TRY_RUN called without default to allow cross compiling"

if [ -d srclib/apr ]; then
    echo rebuilding $apr_configure
    (cd srclib/apr && ./buildconf) || {
        echo "./buildconf failed for apr"
        exit 1
    }
fi

if [ -d srclib/apr-util ]; then
    echo rebuilding $aprutil_configure
    (cd srclib/apr-util && ./buildconf) || {
        echo "./buildconf failed for apr-util" 
        exit 1
    }
fi

echo copying build files
cp $apr_src_dir/build/config.guess $apr_src_dir/build/config.sub \
   $apr_src_dir/build/PrintPath $apr_src_dir/build/apr_common.m4 \
   $apr_src_dir/build/find_apr.m4 $apu_src_dir/build/find_apu.m4 build

# Remove any libtool files so one can switch between libtool 1.3
# and libtool 1.4 by simply rerunning the buildconf script.
(cd build ; rm -f ltconfig ltmain.sh)

# Optionally copy libtool-1.3.x files
if [ -f $apr_src_dir/build/ltconfig ]; then
    cp $apr_src_dir/build/ltconfig build
fi
if [ -f $apr_src_dir/build/ltmain.sh ]; then
    cp $apr_src_dir/build/ltmain.sh build
fi

echo rebuilding $pcre_configure
(cd srclib/pcre && ${AUTOCONF:-autoconf})

echo rebuilding $config_h_in
rm -f $config_h_in
${AUTOHEADER:-autoheader} 2>&1 | grep -v "$cross_compile_warning"

echo rebuilding configure
rm -f config.cache
${AUTOCONF:-autoconf} 2>&1 | grep -v "$cross_compile_warning"

echo rebuilding rpm spec file
( VMMN=`build/get-version.sh mmn include/ap_mmn.h MODULE_MAGIC_NUMBER`
  REVISION=`build/get-version.sh all include/ap_release.h AP_SERVER`
  VERSION=`echo $REVISION | cut -d- -s -f1`
  RELEASE=`echo $REVISION | cut -d- -s -f2`
  if [ "x$VERSION" = "x" ]; then
    VERSION=$REVISION
    RELEASE=1
  fi
  cat ./build/rpm/httpd.spec.in | \
  sed -e "s/APACHE_VERSION/$VERSION/" \
      -e "s/APACHE_RELEASE/$RELEASE/" \
      -e "s/APACHE_MMN/$VMMN/" \
  > httpd.spec )

exit 0
