mirror of
https://github.com/gophernicus/gophernicus.git
synced 2025-01-03 14:56:43 -05:00
1720740bdd
This build system is very different to the old build system, and is much more inuitive. It leverages a hand made configure script to generate the Makefile. The listener is no longer auto-detected, unless specifically specified, and no longer activated by default. That is not the place for a build system. Along with the focus of moving to distribution repositiories, this 'feature' is clearly unwanted by distributions. Multiple listeners are now also supported, primarily for distributions. Lastly, parallelism now works as well.
311 lines
9.7 KiB
Bash
Executable File
311 lines
9.7 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
# Is similar to an autoconf configure script, but is written by hand
|
|
|
|
usage() {
|
|
printf "Usage: %s [options]\\n\\n" "$0"
|
|
printf " --prefix=/usr/local Prefix for all files\\n"
|
|
printf " --bindir=PREFIX/bin Prefix for binaries\\n"
|
|
printf " --sbindir=PREFIX/sbin Prefix for system binaries\\n"
|
|
printf " --mandir=PREFIX/share/man Prefix for manpages\\n"
|
|
printf " --man1dir=MANDIR/man1 Prefix for section 1 manpages\\n"
|
|
printf " --gopherroot=/var/gopher Path to gopher root\\n"
|
|
printf " --sysconfig=/etc/sysconfig Path to sysconfig directory\\n\\n"
|
|
printf " --default=/etc/default Path to 'default' configuration directory\\n\\n"
|
|
printf " --launchd=/Library/LaunchDaemons Path to launchd for MacOS\\n"
|
|
printf " --haikusrv=/boot/common/settings/network/services Path to services directory in Haiku\\n\\n"
|
|
printf " --os=autodetected Your target OS, one of linux, mac, haiku, netbsd, openbsd or freebsd\\n"
|
|
printf " --listener=autodetected Program to recieve and pass network requests; one or more of systemd, inetd, xinetd, comma-seperated, or autodetect, mac or haiku (parameter required, mac/haiku required on respective OSes)\\n"
|
|
printf " --hostname=autodetected Desired hostname for gophernicus to identify as\\n"
|
|
}
|
|
|
|
# Set values for each option
|
|
while [ "$#" -gt 0 ] ; do
|
|
opt="${1%%=*}"
|
|
opt="${opt##--}"
|
|
value="${1##*=}"
|
|
case "${opt}" in
|
|
prefix) PREFIX="${value}"; shift ;;
|
|
bindir) BINDIR="${value}"; shift ;;
|
|
sbindir) SBINDIR="${value}"; shift ;;
|
|
docdir) DOCDIR="${value}"; shift ;;
|
|
mandir) MANDIR="${value}"; shift ;;
|
|
man1dir) MAN1DIR="${value}"; shift ;;
|
|
gopherroot) GOPHERROOT="${value}"; shift ;;
|
|
sysconfig) SYSCONFIG="${value}"; shift ;;
|
|
default) DEFAULTCONF="${value}"; shift ;;
|
|
os) OS="${value}"; shift ;;
|
|
launchd) LAUNCHD="${value}"; shift ;;
|
|
haikusrv) HAIKUSRV="${value}"; shift ;;
|
|
listener) LISTENER="${value}"; shift ;;
|
|
hostname) HOSTNAME="${value}"; shift ;;
|
|
help) usage; exit 0 ;;
|
|
*) usage; exit 2 ;;
|
|
esac
|
|
done
|
|
|
|
# Set default values
|
|
: ${PREFIX:=/usr/local}
|
|
: ${BINDIR:=${PREFIX}/bin}
|
|
: ${SBINDIR:=${PREFIX}/sbin}
|
|
: ${DOCDIR:=${PREFIX}/share/doc}
|
|
: ${MANDIR:=${PREFIX}/share/man}
|
|
: ${MAN1DIR:=${MANDIR}/man1}
|
|
: ${GOPHERROOT:=/var/gopher}
|
|
: ${SYSCONFIG:=/etc/sysconfig}
|
|
: ${DEFAULTCONF:=/etc/default}
|
|
: ${LAUNCHD:=/Library/LaunchDaemons}
|
|
: ${HAIKUSRV:=/boot/common/settings/network/services}
|
|
: ${CC:=cc}
|
|
: ${CFLAGS:=-O2}
|
|
: ${HOSTNAME:=autodetect}
|
|
|
|
# Check for a compiler that actually works
|
|
printf "checking for working compiler... "
|
|
cat > conftest.c <<EOF
|
|
#include <stdlib.h>
|
|
int main() { return 0; }
|
|
EOF
|
|
if ! ${CC} -o conftest conftest.c; then
|
|
printf "no\\n"
|
|
exit 1
|
|
else
|
|
printf "${CC}\\n"
|
|
fi
|
|
|
|
# Autodetect the OS
|
|
if ! [ "${OS:=1}" ]; then
|
|
# If it can't find uname, it needs to be manually specified
|
|
printf "checking for uname... "
|
|
if ! UNAME="$(command -v uname)"; then
|
|
printf "please provide OS in options\\n"
|
|
exit 1
|
|
else
|
|
printf "%s\\n" "${UNAME}"
|
|
fi
|
|
|
|
# If it can, it presses on
|
|
printf "checking for OS... "
|
|
case "$(${UNAME})" in
|
|
Linux) OS=linux ;;
|
|
Haiku) OS=haiku
|
|
INSTALL_HAIKU="install-haiku" ;;
|
|
Darwin) OS=mac
|
|
INSTALL_OSX="install-osx" ;;
|
|
NetBSD) OS=netbsd ;;
|
|
OpenBSD) OS=openbsd ;;
|
|
FreeBSD) OS=freebsd ;;
|
|
*) printf "unknown, pressing on anyway\\n" ;;
|
|
esac
|
|
printf "%s\\n" "${OS}"
|
|
fi
|
|
|
|
# Checks for an install command and falls back to install-sh
|
|
printf "checking for install... "
|
|
if ! INSTALL="$(command -v install)"; then
|
|
printf "install-sh"
|
|
INSTALL=build-aux/install-sh
|
|
else
|
|
printf "%s" "${INSTALL}"
|
|
fi
|
|
printf "\\n"
|
|
|
|
# Check for listener validity and autodetect if required
|
|
# Checks that take place:
|
|
# mac OS = mac listener (both ways)
|
|
# haiku OS = haiku listener (both ways)
|
|
# systemd listener = linux OS
|
|
printf "checking for listener... "
|
|
if [ -z "${LISTENER}" ]; then
|
|
printf "not given\\n"
|
|
exit 1
|
|
elif [ "${LISTENER}" = "mac" ] && [ "${OS}" != "mac" ]; then
|
|
printf "mac listener only valid with macos\\n"
|
|
exit 1
|
|
elif [ "${LISTENER}" = "haiku" ] && [ "${OS}" != "haiku" ]; then
|
|
printf "haiku listener only valid with haiku\\n"
|
|
exit 1
|
|
elif [ "${LISTENER}" = "systemd" ] && [ "${OS}" != "linux" ]; then
|
|
printf "systemd listener only valid with linux\\n"
|
|
exit 1
|
|
elif [ "${LISTENER}" = "autodetect" ]; then
|
|
# OS-specific listeners
|
|
case "${OS}" in
|
|
mac)
|
|
LISTENER=mac
|
|
printf "mac\\n"
|
|
break ;;
|
|
haiku)
|
|
LISTENER=haiku
|
|
printf "haiku\\n"
|
|
break ;;
|
|
esac
|
|
|
|
if [ -d "/lib/systemd/system" ] ; then
|
|
LISTENER=systemd
|
|
printf "systemd\\n"
|
|
break
|
|
fi
|
|
|
|
printf "checking for inetd... "
|
|
if command -v update-inetd; then
|
|
LISTENER=inetd
|
|
printf "inetd\\n"
|
|
break
|
|
fi
|
|
|
|
printf "checking for xinetd... "
|
|
if XINETD="$(command -v xinetd)"; then
|
|
LISTENER=xinetd
|
|
printf "xinetd\\n"
|
|
break
|
|
fi
|
|
|
|
# Ensure we detected something
|
|
if [ "${LISTENER}" = "autodetect" ]; then
|
|
printf "unable to autodetect, please manually specify\\n"
|
|
exit 1
|
|
fi
|
|
elif [ "${OS}" = "haiku" ] && [ "${LISTENER}" != "haiku" ]; then
|
|
printf "only haiku listener supported on haiku\\n"
|
|
exit 1
|
|
elif [ "${OS}" = "mac" ] && [ "${LISTENER}" != "mac" ]; then
|
|
printf "only mac listener supported on mac\\n"
|
|
exit 1
|
|
else
|
|
printf "%s\\n" "${LISTENER}"
|
|
fi
|
|
|
|
# Act accordingly based on whichever listener we are given
|
|
case "${LISTENER}" in
|
|
systemd)
|
|
INSTALL_SYSTEMD="install-systemd"
|
|
UNINSTALL_SYSTEMD="uninstall-systemd" ;;
|
|
xinetd)
|
|
INSTALL_XINETD="install-xinetd"
|
|
UNINSTALL_XINETD="uninstall-xinetd"
|
|
XINETD_CONF="/etc/xinetd.d/gophernicus" ;;
|
|
inetd)
|
|
INSTALL_INETD="install-inetd"
|
|
INETD_CONF="/etc/inetd.conf"
|
|
printf "checking for update-inetd... "
|
|
if ! UPDATE_INETD="$(command -v update-inetd)"; then
|
|
printf "not found\\n"
|
|
INSTALL_INETD_MANUAL="install-inetd-manual"
|
|
UNINSTALL_INETD_UPDATE="uninstall-inetd-update"
|
|
else
|
|
printf "%s\\n" "${UPDATE_INETD}"
|
|
INSTALL_INETD_UPDATE="install-inetd-update"
|
|
UNINSTALL_INETD_UPDATE="uninstall-inetd-update"
|
|
fi
|
|
;;
|
|
mac) INSTALL_OSX="install-osx" UNINSTALL_OSX="uninstall-osx" ;;
|
|
haiku) INSTALL_HAIKU="install-haiku" UNINSTALL_HAIKU="uninstall-haiku" ;;
|
|
*) printf "The listener %s is not offically supported; continuing anyway.\\n" "${LISTENER}" ;;
|
|
esac
|
|
|
|
# Try to detect hostname
|
|
printf "getting hostname... "
|
|
if [ "${HOSTNAME}" = "autodetect" ]; then
|
|
HOSTNAME="$(hostname)"
|
|
# If no hostname then we couldn't autodetect
|
|
if [ $? != 0 ] || [ -z "${HOSTNAME}" ]; then
|
|
printf "unable to detect hostname\\n"
|
|
exit 1
|
|
fi
|
|
fi
|
|
printf "%s\\n" "${HOSTNAME}"
|
|
|
|
# Use libwrap when it is avaliable
|
|
printf "checking for libwrap... "
|
|
cat > conftest.c <<EOF
|
|
#include <tcpd.h>
|
|
int main() {}
|
|
EOF
|
|
if ${CC} -o conftest -lwrap conftest.c 2>/dev/null; then
|
|
LIBWRAP="-DHAVE_LIBWRAP"
|
|
printf "yes"
|
|
else
|
|
LIBWRAP=
|
|
printf "no, but program will still work"
|
|
fi
|
|
printf "\\n"
|
|
|
|
# Check and use SHM if avaliable
|
|
printf "checking for ipcrm (SHM management)... "
|
|
if ! IPCRM="$(command -v ipcrm)"; then
|
|
printf "not found"
|
|
else
|
|
printf "%s" "${IPCRM}"
|
|
CLEAN_SHM="clean-shm"
|
|
fi
|
|
printf "\\n"
|
|
|
|
# Trying to autodetect make
|
|
printf "checking for make... "
|
|
if ! MAKE="$(command -v make)"; then
|
|
printf "not found, please pass MAKE=/path/to/make to make invocation"
|
|
MAKE="make"
|
|
else
|
|
printf "%s" "${MAKE}"
|
|
fi
|
|
printf "\\n"
|
|
|
|
# Don't replace an existing root
|
|
printf "checking for existing gopher root... "
|
|
if [ -d "${GOPHERROOT}" ] || [ -f "${GOPHERROOT}/gophermap" ]; then
|
|
INSTALL_ROOT="install-root"
|
|
printf "yes"
|
|
else
|
|
printf "no"
|
|
fi
|
|
printf "\\n"
|
|
|
|
# Sub in values
|
|
cp Makefile.in Makefile
|
|
|
|
printf "creating Makefile... "
|
|
sed -i "s:@CC@:${CC}:" Makefile
|
|
sed -i "s:@LIBWRAP@:${LIBWRAP}:" Makefile
|
|
sed -i "s:@INSTALL@:${INSTALL}:" Makefile
|
|
sed -i "s:@MAKE@:${MAKE}:" Makefile
|
|
|
|
sed -i "s:@PREFIX@:${PREFIX}:" Makefile
|
|
sed -i "s:@BINDIR@:${BINDIR}:" Makefile
|
|
sed -i "s:@SBINDIR@:${SBINDIR}:" Makefile
|
|
sed -i "s:@DOCDIR@:${DOCDIR}:" Makefile
|
|
sed -i "s:@MANDIR@:${MANDIR}:" Makefile
|
|
sed -i "s:@MAN1DIR@:${MAN1DIR}:" Makefile
|
|
|
|
sed -i "s:@IPCRM@:${IPCRM}:" Makefile
|
|
sed -i "s:@CLEAN_SHM@:${CLEAN_SHM}:" Makefile
|
|
|
|
sed -i "s:@SYSCONF@:${SYSCONFIG}:" Makefile
|
|
sed -i "s:@DEFAULT@:${DEFAULTCONF}:" Makefile
|
|
sed -i "s:@HOSTNAME@:${HOSTNAME}:" Makefile
|
|
sed -i "s:@ROOT@:${GOPHERROOT}:" Makefile
|
|
|
|
sed -i "s:@HAIKUSRV@:${HAIKUSRV}:" Makefile
|
|
sed -i "s:@LAUNCHD@:${LAUNCHD}:" Makefile
|
|
sed -i "s:@INSTALL_ROOT@:${INSTALL_ROOT}:" Makefile
|
|
|
|
sed -i "s:@INSTALL_OSX@:${INSTALL_OSX}:" Makefile
|
|
sed -i "s:@INSTALL_INETD_MANUAL@:${INSTALL_INETD_MANUAL}:" Makefile
|
|
sed -i "s:@INSTALL_INETD_UPDATE@:${INSTALL_INETD_UPDATE}:" Makefile
|
|
sed -i "s:@INSTALL_XINETD@:${INSTALL_XINETD}:" Makefile
|
|
sed -i "s:@INSTALL_SYSTEMD@:${INSTALL_SYSTEMD}:" Makefile
|
|
sed -i "s:@INSTALL_HAIKU@:${INSTALL_HAIKU}:" Makefile
|
|
sed -i "s:@UNINSTALL_OSX@:${UNINSTALL_OSX}:" Makefile
|
|
sed -i "s:@UNINSTALL_INETD_MANUAL@:${UNINSTALL_INETD_MANUAL}:" Makefile
|
|
sed -i "s:@UNINSTALL_INETD_UPDATE@:${UNINSTALL_INETD_UPDATE}:" Makefile
|
|
sed -i "s:@UNINSTALL_XINETD@:${UNINSTALL_XINETD}:" Makefile
|
|
sed -i "s:@UNINSTALL_SYSTEMD@:${UNINSTALL_SYSTEMD}:" Makefile
|
|
sed -i "s:@UNINSTALL_HAIKU@:${UNINSTALL_HAIKU}:" Makefile
|
|
|
|
sed -i "s:@INETD_CONF@:${INETD_CONF}:" Makefile
|
|
sed -i "s:@XINETD_CONF@:${XINETD_CONF}:" Makefile
|
|
printf "done\\n"
|
|
|
|
# Cleanup
|
|
rm -f conftest conftest.c
|