#!/bin/bash
ulimit -s unlimited
shopt -s extglob

# httpd.SlackBuild
# Heavily based on the original Slackware build scripts,
# Modified by Stuart Winter <mozes@slackware.com>
#
# Copyright 2006-2026  Patrick J. Volkerding, Sebeka, MN, USA
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
#  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 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 AUTHOR 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 script was written using the one from slackbuilds.org as a reference,
# so thanks to Adis Nezirovic ( adis _at_ linux.org.ba ) for the original work.

# Record toolchain & other info for the build log:
slackbuildinfo

# Paths to skeleton port's source & real Slackware source tree:
slackset_var_cwds

# Temporary build locations:
export TMPBUILD=$TMP/build-$PKGNAM
export PKG=$TMP/package-$PKGNAM
mkpkgdirs # Delete & re-create temporary directories then cd into $TMPBUILD

# Extract source:
tar xf $CWD/$PKGNAM-$VERSION.tar.!(*sign|*asc|*sig)
cd $PKGNAM-$VERSION || failextract
slackhousekeeping

# Fix config.layout to use lib${LIBDIRSUFFIX}:
sed -i -e "s#lib/httpd#lib${LIBDIRSUFFIX}/httpd#" config.layout

# If /var/run becomes a tmpfs or a link to /run, subdirectories could be a problem.
# Just use /var/run rather than /var/run/httpd.
sed -i -e "s#/run/httpd#/run#" config.layout

# Configure:
LDFLAGS="-Wl,-z,relro -Wl,--as-needed -Wl,-z,now" \
CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
./configure \
   --enable-layout=Slackware-FHS \
   --with-apr=/usr \
   --with-apr-util=/usr \
   --enable-mods-shared=all \
   --enable-so \
   --enable-mpms-shared=all \
   --enable-pie \
   --enable-cgi \
   --with-pcre \
   --enable-ssl \
   --enable-http2 \
   --enable-rewrite \
   --enable-vhost-alias \
   --enable-proxy \
   --enable-proxy-http \
   --enable-proxy-http2 \
   --enable-proxy-ftp \
   --enable-cache \
   --enable-mem-cache \
   --enable-file-cache \
   --enable-disk-cache \
   --enable-dav \
   --enable-ldap \
   --enable-md \
   --enable-authnz-ldap \
   --enable-authn-anon \
   --enable-authn-alias \
   --build=${SLK_ARCH_BUILD} || failconfig

# Build:
make $NUMJOBS || make || failmake

# Install into package:
make install DESTDIR=$PKG || failinstall
rmdir $PKG/usr/bin

# Tweak default apache configuration
( cd $PKG
  zcat $CWD/httpd.runasapache.diff.gz | patch -p1 --verbose || exit 1
  # mod_proxy_balancer should be commented out, as otherwise httpd
  # will not start without additional configuration:
  sed -i "s/^LoadModule proxy_balancer_module/#LoadModule proxy_balancer_module/g" $PKG/etc/httpd/httpd.conf
  # This module issues a warning unless some non-default modules are loaded:
  sed -i "s/^LoadModule lbmethod_heartbeat_module/#LoadModule lbmethod_heartbeat_module/g" $PKG/etc/httpd/httpd.conf
  rm -f $PKG/etc/httpd/httpd.conf~ $PKG/etc/httpd/httpd.conf.orig
) || exit 1
# Change config files to .new:
( cd $PKG/etc/httpd
  mv -fv httpd.conf httpd.conf.new
  for file in extra/*; do
    mv -fv $file "${file}.new"
  done
)

cat << EOF >> $PKG/etc/httpd/httpd.conf.new

# Uncomment the following line to enable PHP:
#
#Include /etc/httpd/mod_php.conf

# Uncomment the following lines (and mod_dav above) to enable svn support:
#
#LoadModule dav_svn_module lib${LIBDIRSUFFIX}/httpd/modules/mod_dav_svn.so
#LoadModule authz_svn_module lib${LIBDIRSUFFIX}/httpd/modules/mod_authz_svn.so

EOF

rmdir $PKG/var/log/httpd

mkdir -p $PKG/etc/rc.d
cat $CWD/rc.httpd > $PKG/etc/rc.d/rc.httpd.new

mkdir -p $PKG/etc/logrotate.d
cat $CWD/logrotate.httpd > $PKG/etc/logrotate.d/httpd.new

# Add symlink that letsencrypt wants:
( cd $PKG/usr/sbin
  ln -vsf apachectl apache2ctl )

mkdir -p $PKG/usr/doc/$PKGNAM-$VERSION/
cp -fav \
  ABOUT_APACHE CHANGES INSTALL LICENSE NOTICE README* ROADMAP VERSIONING \
  $PKG/usr/doc/$PKGNAM-$VERSION
changelogliposuction CHANGES $PKGNAM $VERSION # Trim down a "ChangeLog" file

# Other distributions also strip the manual down to just English.
# If this isn't your language of choice, mea culpa.
( cd $PKG/srv/httpd/htdocs/manual
  for file in $(find . -type f -name "*.html") ; do
    if [ -f ${file}.en ]; then
      cp ${file}.en ${file}
      rm -f ${file}.*
    fi
  done
)

## DISABLED. Don't make these symlinks prior to packaging any more, as it is
## possibly dangerous to an existing document root created in the place where
## these symlinks are normally found. Instead, we make them in the install
## script (only if nothing exists there already)
#( cd $PKG/srv
#  ln -sf /var/www .
#  ln -sf /var/www httpd
#)

# On Slackware, the traditional location for the Apache document root has always
# been "/var/www/htdocs/".  We can avoid an unpleasant surprise for people by
# leaving things where they've always been, and comply with the FHS by providing
# symlinks allowing access through the FHS-approved pathnames.  KDE, for example,
# will look for htdig's htsearch here:  /var/www/cgi-bin/htsearch
mv -fv $PKG/srv/httpd $PKG/var/www

# OK, it's just not generally good form to put your web site in /var/www/htdocs,
# but people do it every day.  Like all new .new files, this won't save them this
# time, but if they don't learn their lesson now then it will the next time:
mv -fv $PKG/var/www/htdocs/index.html $PKG/var/www/htdocs/index.html.new

# Apply generic Slackware packaging policies:
cd $PKG
slackstripall   # strip all .a archives and all ELFs
#slackstriprpaths     # strip rpaths
slack_delete_lafiles # delete usr/lib{,64}/*.la
slackgzpages -i # compress man & info pages and delete usr/info/dir
slackslack      # chown -R root:root, chmod -R og-w, slackchown, slack644docs
slackdesc       # install slack-desc and doinst.sh
slackmp         # run makepkg -l y -c n

# Perform any final checks on the package:
cd $PKG
slackhlinks     # search for any hard links
