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