#!/bin/sh
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# buildconf: Build the support scripts needed to compile from a
#            checked-out version of the source code.

# version check for AC_PROG_CC_C99
ac_version=`${AUTOCONF:-autoconf} --version 2>/dev/null|sed -e 's/^[^0-9]*//;s/[a-z]* *$//;q'`
case "$ac_version" in
# versions older than 2.50 are denied by AC_PREREQ
2.5*)
    echo WARNING: You are using an outdated version of autoconf.
    echo WARNING: This may lead to less than optimal performance of httpd.
    echo WARNING: You should use autoconf 2.60 or newer.
    sleep 1
    ;;
esac

# 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 ../apr"
apu_src_dir=""

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
#

should_exit=0
apr_found=0
apu_found=0
apr_major_version=2

for dir in $apr_src_dir
do
    if [ -f "${dir}/build/apr_common.m4" ]; then
        echo "found apr source: ${dir}"
        apr_src_dir=$dir
        apr_found=1
        break
    fi
done

if [ $apr_found -lt 1 ]; then
    echo ""
    echo "You don't have a copy of the apr source in srclib/apr. "
    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 "   svn co http://svn.apache.org/repos/asf/apr/apr/trunk srclib/apr"
    echo ""
    should_exit=1
else
    apr_major_version=`grep "#define APR_MAJOR_VERSION" \
                      $apr_src_dir/include/apr_version.h | sed 's/[^0-9]//g'`
fi

if [ $apr_major_version -lt 2 ] ; then
    if test -z "$apu_src_dir"; then
        apu_src_dir=`echo $apr_src_dir | sed -e 's#/apr#/apr-util#g;'`
        apu_src_dir="$apu_src_dir `echo $apr_src_dir | sed -e 's#/apr#/aprutil#;g'`"
        apu_src_dir="$apu_src_dir srclib/apr-util ../apr-util"
    fi

    for dir in $apu_src_dir
    do
        if [ -f "${dir}/Makefile.in" ]; then
            echo "found apr-util source: ${dir}"
            apu_src_dir=$dir
            apu_found=1
            break
        fi
    done

    if [ $apu_found -lt 1 ]; then
        echo ""
        echo "You don't have a copy of the apr-util source in srclib/apr-util. "
        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 "   svn co http://svn.apache.org/repos/asf/apr/apr-util/branches/1.5.x srclib/apr-util"
        echo ""
        should_exit=1
    fi
fi

if [ $should_exit -gt 0 ]; then
    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 cache directories
rm -rf autom4te*.cache

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

apr_configure="$apr_src_dir/configure"
if [ $apr_major_version -lt 2 ] ; then
    aprutil_configure="$apu_src_dir/configure"
fi
config_h_in="include/ap_config_auto.h.in"

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

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

apr_src_dir=`cd $apr_src_dir && pwd` 

if [ $apr_major_version -lt 2 ] ; then
    if [ "$apu_src_dir" = "srclib/apr-util" ]; then
        echo rebuilding $aprutil_configure
        (cd srclib/apr-util && ./buildconf --with-apr=$apr_src_dir) || {
            echo "./buildconf failed for apr-util" 
            exit 1
        }
        rm -f srclib/apr-util/apr-util.spec
    fi

    apu_src_dir=`cd $apu_src_dir && pwd`
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 build
if [ $apr_major_version -lt 2 ] ; then
    cp $apu_src_dir/build/find_apu.m4 build
fi

# 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 $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"

# Remove autoconf 2.5x cache directories
rm -rf autom4te*.cache

if [ -f `which cut` ]; then
  echo rebuilding rpm spec file
  ( VMMN=`build/get-version.sh mmn include/ap_mmn.h MODULE_MAGIC_NUMBER`
    EPOCH=`build/get-version.sh epoch include/ap_release.h AP_SERVER`
    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/" \
        -e "s/APACHE_EPOCH/$EPOCH/" \
    > httpd.spec )
fi

# ensure that the ap_expr expression parser sources are never regenerated
# when running make
echo fixing timestamps for ap_expr sources
cd server
touch util_expr_parse.y util_expr_scan.l
sleep 1
touch util_expr_parse.c util_expr_parse.h util_expr_scan.c
cd ..

exit 0
