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

# By default, touch the checked-in sources to suppress regeneration of
# the ap_expr parser.
regen_expr=no

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

    --with-apr-util=*)
        apu_src_dir=$optarg
        ;;

    --with-regen-expr)
        regen_expr=yes
        ;;

    --with-errors)
        autoconf_args="$autoconf_args -Werror"
        ;;
    
    -h|--help)
        cat <<EOF
buildconf: generates the files needed to configure httpd.

Usage: $0 [OPTION]...

Configuration:
  -h, --help               display this help and exit

  --with-apr=SRCDIR        define a space-separated list of directories to
                           search for the APR source code. If, instead of a
                           directory, an apr-config executable name is passed,
                           APR-Config Mode is enabled (see below). Defaults to
                           "srclib/apr ../apr"
  --with-apr-util=SRCDIR   define a space-separated list of directories to
                           search for the APR-util source code. Defaults to the
                           same location as the --with-apr SRCDIR, but with
                           "apr" replaced with "apr-util" or "aprutil". Ignored
                           in APR-Config Mode.

  --with-regen-expr        suppress the timestamp adjustment which prevents the 
                           rebuild of the ap_expr expression parser

  --with-errors            fail on autoconf generation warnings

APR-Config Mode:

  When passing an apr-config executable to --with-apr, buildconf will attempt to
  copy build scripts from various installed locations on your system instead of
  an APR source tree. This allows you to configure httpd from source without
  also requiring you to download the APR and/or APR-util sources.

  For example:

      ./buildconf --with-apr=apr-1-config

  For this functionality to work reliably, you must have automake >= 1.12 and be
  using a distribution that includes both find_apr.m4 and find_apu.m4 in the
  --installbuilddir pointed to by apr-config.

Environment variables used by buildconf:
  AUTOCONF           autoconf executable name [autoconf]
  AUTOMAKE           automake executable name [automake]
  AUTOHEADER         autoheader executable name [autoheader]
EOF
        exit
        ;;

    *)
        echo "unknown option $1 (try --help for usage)"
        exit 1
        ;;
    esac

    shift
done

#
# Check to be sure that we have the srclib dependencies checked-out, or that a
# working apr-config installation has been specified.
#

should_exit=0
apr_config=         # path to apr-config (empty if using a source directory)
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
    elif which "${dir}" >/dev/null 2>&1; then
        # We're using apr-config. Do a sanity check.
        apr_config=`which "${dir}"`
        echo "testing apr-config executable: ${apr_config}"

        version=`"${apr_config}" --version`
        version=`echo "${version}" | sed -n '/^[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$/p'`

        if [ -z "${version}" ]; then
            echo "apr-config gave us an invalid --version"
            apr_config=
            continue
        fi

        echo "using apr-config version ${version}"
        apr_major_version=${version} # we'll make a real "major version" later
        apr_src_dir=`"${apr_config}" --installbuilddir`
        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
elif [ -n "${apr_config}" ]; then
    apr_major_version=`echo "${apr_major_version}" | sed 's/\..*//'`
else
    apr_major_version=`grep "#define APR_MAJOR_VERSION" \
                      $apr_src_dir/include/apr_version.h | sed 's/[^0-9]//g'`
fi

# Find APR-util. Note: if we're using apr-config, we can completely skip this,
# even if APR is version 1. That's because we only end up caring about
# find_apu.m4, which is not actually installed in the standard APR-util
# distribution to begin with.
if [ -z "${apr_config}" -a $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 buildconf: copying build files
if [ -n "${apr_config}" ]; then
    # If we're using apr-config, we switch things up a little bit:
    # - use automake's config.* scripts instead of APR's
    # - use the included PrintPath instead of copying from APR
    # - assume find_apu.m4 is also in APR's --installbuilddir

    # Figure out where to copy config.* from.
    automake=${AUTOMAKE:-automake}
    am_libdir=`"${automake}" --print-libdir`
    cp "${am_libdir}/config.guess" "${am_libdir}/config.sub" build

    # Remember that in this case, $apr_src_dir points to the build directory.
    cp "$apr_src_dir/apr_common.m4" "$apr_src_dir/find_apr.m4" build
    if [ $apr_major_version -lt 2 ] ; then
        cp "$apr_src_dir/find_apu.m4" build
    fi
else
    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
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)

if [ -z "${apr_config}" ]; then
    # 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
fi

echo buildconf: rebuilding $config_h_in
rm -f $config_h_in
if ${AUTOHEADER:-autoheader} ${autoconf_args}; then
    :
else
    echo buildconf: ERROR: autoheader failed, bailing out.
    exit 1
fi

# The PACKAGE_* definitions are unused here since AC_INIT is not given
# the package arguments, and only pollute the namespace of anything
# which includes the installed header.
echo buildconf: removing PACKAGE_ definitions from $config_h_in
sed -i -e '/^#undef PACKAGE_/d' $config_h_in

echo buildconf: rebuilding configure
rm -f config.cache
if ${AUTOCONF:-autoconf} ${autoconf_args}; then
    :
else
    echo buildconf: ERROR: autoconf failed, bailing out.
    exit 2
fi

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

if [ x$regen_expr = xno ]; then
    # ensure that the ap_expr expression parser sources are never regenerated
    # when running make
    echo buildconf: Fixing timestamps for ap_expr sources to prevent regeneration
    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 ..
else
    echo buildconf: Fixing timestamps for ap_expr sources to ensure regeneration
    touch server/util_expr_parse.[yl]
fi

exit 0
