#!/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 "APR could not be found automatically."
    echo ""
    echo "Please refer to the documentation on APR in the httpd INSTALL file."
    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 are using APR 1.x but APR-util 1.x was not found."
        echo ""
        echo "Please refer to the documentation on APR in the httpd INSTALL file."
        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

# Remove possible bsd_converted file
rm -rf bsd_converted

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
