#!/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.

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

should_exit=0

if [ ! -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 "   svn co https://svn.apache.org/repos/asf/apr/apr/branches/0.9.x apr"
    echo "" 
    should_exit=1
fi

if [ ! -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 "   svn co https://svn.apache.org/repos/asf/apr/apr-util/branches/0.9.x apr-util"
    echo ""
    should_exit=1
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'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 [ "$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 [ "$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` 

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

# ensure that the mod_ssl expression parser sources are never regenerated
# when running make
echo fixing timestamps for mod_ssl sources
cd modules/ssl
touch ssl_expr_parse.y
sleep 1
touch ssl_expr_parse.c ssl_expr_parse.h ssl_expr_scan.l
sleep 1
touch ssl_expr_scan.c
cd ../..

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"

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

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
