#!/bin/sh

cd `dirname "$0"`
. package/info

# Helper functions

usage () {
  cat <<EOF
Usage: $0 [OPTION]... [TARGET]

Defaults for the options are specified in brackets.

System types:
  --target=TARGET               configure to run on target TARGET [detected]
  --host=TARGET                 same as --target

Installation directories:
  --prefix=PREFIX               main installation prefix [/]

Fine tuning of the installation directories:
  --dynlibdir=DIR               shared library files [PREFIX/lib]
  --libdir=DIR                  static library files [PREFIX/lib]
  --includedir=DIR              include files for the C compiler [PREFIX/include]
  --sysconfdir=DIR              global configuration files [PREFIX/etc]
  --pkgconfdir=DIR              pkg-config .pc files [PREFIX/lib/pkgconfig]
  --sysdepdir=DIR               sysdeps directory [PREFIX/lib/$package/sysdeps]

If no --prefix option is given, by default libdir will be /usr/lib,
includedir will be /usr/include and sysdepdir will be /usr/lib/$package/sysdeps.

Dependencies:
  --with-include=DIR            add DIR to the list of searched directories for headers
  --with-lib=DIR                add DIR to the list of searched directories for static libraries
  --with-dynlib=DIR             add DIR to the list of searched directories for shared libraries

Optional features:
  --disable-shared              do not build shared libraries [enabled]
  --disable-static              do not build static libraries [enabled]
  --disable-all-pic             do not build static libraries as PIC [enabled]
  --enable-slashpackage[=ROOT]  assume /package installation at ROOT [disabled]
  --enable-pkgconfig            Build and install .pc files for pkg-config [disabled]

$package tuning options:
  --disable-ipv6                do not build IPv6 support [enabled]
  --enable-iopause-select       prefer select() over poll() for iopause implementation [disabled]
  --enable-tai-clock            build for a TAI-10 system clock instead of a UTC one [disabled]
  --with-default-path=PATH      default executable search path when PATH is undef [/usr/bin:/bin]

Sysdeps autodetection override:
  --with-sysdep-K=V             assume sysdep K has the value V [autodetected]

List of mandatory sysdeps to provide by hand for cross-compiling:
  devurandom (yes|no): =yes if you have a working /dev/urandom
  posixspawnearlyreturn (yes|no): =yes if you have an old glibc or otherwise bad posix_spawn
  procselfexe (path|none): =path if you can get the executable name via readlink(path)
EOF
  exit 0
}

# If your system does not have printf, you can comment this, but it is
# generally not a good idea to use echo.
# See http://www.etalabs.net/sh_tricks.html
echo () {
  printf %s\\n "$*"
}

echon () {
  printf %s "$*"
}

quote () {
  tr '\n' ' ' <<EOF | grep '^[-[:alnum:]_=,./:]* $' >/dev/null 2>&1 && { echo "$1" ; return 0 ; }
$1
EOF
  echo "$1" | sed -e "s/'/'\\\\''/g" -e "1s/^/'/" -e "\$s/\$/'/" -e "s#^'\([-[:alnum:]_,./:]*\)=\(.*\)\$#\1='\2#" -e "s|\*/|* /|g"
}

fail () {
  echo "$*" 1>&2
  exit 1
}

fnmatch () {
  eval "case \"\$2\" in $1) return 0 ;; *) return 1 ;; esac"
}

cmdexists () {
  type "$1" >/dev/null 2>&1
}

trycc () {
  test -z "$CC_AUTO" && cmdexists "$1" && CC_AUTO="$*"
}

stripdir () {
  while eval "fnmatch '*/' \"\${$1}\"" ; do
    eval "$1=\${$1%/}"
  done
}

tryflag () {
  echo "Checking whether compiler accepts $2 ..."
  echo "typedef int x;" > "$tmpc"
  if $CC_AUTO $CPPFLAGS_POST $CFLAGS_POST "$2" -c -o "$tmpo" "$tmpc" >/dev/null 2>&1 ; then
    echo "  ... yes"
    eval "$1=\"\${$1} \$2\""
    eval "$1=\${$1# }"
    return 0
  else
    echo "  ... no"
    return 1
  fi
}

tryldflag () {
  echo "Checking whether linker accepts $2 ..."
  echo "typedef int x;" > "$tmpc"
  if $CC_AUTO $CPPFLAGS_POST $CFLAGS_POST $LDFLAGS_POST -nostdlib "$2" -o "$tmpe" "$tmpc" >/dev/null 2>&1 ; then
    echo "  ... yes"
    eval "$1=\"\${$1} \$2\""
    eval "$1=\${$1# }"
    return 0
  else
    echo "  ... no"
    return 1
  fi
}

# Sysdeps determination functions

iscached ()
{
  if test -r "$tmps" && grep -q "^${1}: " "$tmps" ; then
    grep "^${1}: " "$tmps" | tail -n 1 |
    {
      IFS=' '
      read -r k v ldlibs
      if test -n "$ldlibs" ; then
        echo "  ... user-provided: $v with linker args: $ldlibs"
        echo "$ldlibs" >&3
      else
        echo "  ... user-provided: $v"
      fi
      echo "${1}: $v" >> "$sysdeps/sysdeps"
      return 0 ;
    }
  else
    return 1 ;
  fi
}

choose () {
  what="$1"
  name="$2"
  echo "Checking whether system has $3..."
  if iscached "$name" ; then return ; fi
  shift 3
  libs="$*"
  r=true
  case "$what" in
    *c*) $CC_AUTO $CPPFLAGS_AUTO $CPPFLAGS $CPPFLAGS_POST $CFLAGS_AUTO $CFLAGS $CFLAGS_POST -o "$tmpo" -c src/sysdeps/try$name.c 2>/dev/null || r=false ;;
  esac
  if $r ; then
    case "$what" in
      *l*) $CC_AUTO $CFLAGS_AUTO $CFLAGS $CFLAGS_POST $LDFLAGS_AUTO $LDFLAGS $LDFLAGS_POST -o try$name "$tmpo" $libs 2>/dev/null || r=false ;;
    esac
  fi
  if $r ; then
    case "$what" in
     *r*) if test -n "$cross" ; then
            rm -f try$name
            fail "$0: sysdep $name cannot be autodetected when cross-compiling. Please manually provide a value with the --with-sysdep-${name}=yes|no|... option."
          fi
          ./try$name >/dev/null 2>&1 ; r=$?
          case "$r" in
           111) fail "$0: test crashed, aborting." ;;
           0) r=true ;;
           *) r=false ;;
          esac
    esac
  fi
  rm -f try$name
  if $r ; then
    echo "$name: yes" >> $sysdeps/sysdeps
    echo "  ... yes"
  else
    echo "$name: no" >> $sysdeps/sysdeps
    echo "  ... no"
  fi
}

choosevalue () {
  name="$1"
  if iscached "$name" ; then return ; fi
  if test -n "$cross" ; then
    rm -f try$name
    fail "$0: sysdep $name cannot be autodetected when cross-compiling. Please manually provide a value with the --with-sysdep-${name}=value... option."
  fi
  echo "Finding a suitable value for $2..."
  shift 2
  r=none
  if $CC_AUTO $CPPFLAGS_AUTO $CPPFLAGS $CPPFLAGS_POST $CFLAGS_AUTO $CFLAGS $CFLAGS_POST -o "$tmpo" -c src/sysdeps/try$name.c 2>/dev/null \
   && $CC_AUTO $CFLAGS_AUTO $CFLAGS $CFLAGS_POST $LDFLAGS_AUTO $LDFLAGS $LDFLAGS_POST -o try$name "$tmpo" 2>/dev/null ; then
    while test -n "$1" ; do
      ./try$name "$1" >/dev/null 2>&1
      case "$?" in
       111) fail "$0: test crashed, aborting." ;;
       0) r="$1" ; break ;;
      esac
    shift
    done
  fi
  rm -f try$name
  echo "$name: $r" >> $sysdeps/sysdeps
  echo "  ... $r"
}

trybasic () {
  $CC_AUTO $CPPFLAGS_AUTO $CPPFLAGS $CPPFLAGS_POST $CFLAGS_AUTO $CFLAGS $CFLAGS_POST -o "$tmpo" -c "$1" 2>/dev/null
}

tryendianness () {
  echo "Checking endianness..."
  if iscached endianness ; then return ; fi
  for i in endian.h sys/endian.h machine/endian.h sys/machine.h ; do
    cat > "$tmpc" <<EOF
#undef _POSIX_C_SOURCE
#undef _XOPEN_SOURCE
#ifndef _BSD_SOURCE
#define _BSD_SOURCE
#endif
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#ifndef _DEFAULT_SOURCE
#define _DEFAULT_SOURCE
#endif
#include <$i>
int a = LITTLE_ENDIAN ;
int b = BIG_ENDIAN ;
int c = BYTE_ORDER ;
EOF
    trybasic "$tmpc" || continue
    for j in little big pdp ; do
      k=`echo $j | tr '[:lower:]' '[:upper:]'`
      cat > "$tmpc" <<EOF
#undef _POSIX_C_SOURCE
#undef _XOPEN_SOURCE
#ifndef _BSD_SOURCE
#define _BSD_SOURCE
#endif
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#ifndef _DEFAULT_SOURCE
#define _DEFAULT_SOURCE
#endif
#include <$i>
int a[BYTE_ORDER == ${k}_ENDIAN ? 1 : -1] ;
EOF
      if trybasic "$tmpc" ; then
        echo "endianness: $j" >> "$sysdeps/sysdeps"
        echo "  ... $j"
        rm -f "$tmpc"
        return
      fi
    done
    rm -f "$tmpc"
    fail "$0: error: unable to determine endianness according to $i"
  done

  for j in little big ; do
    k=`echo $j | tr '[:lower:]' '[:upper:]'`
    cat > "$tmpc" <<EOF
#include <sys/isa_defs.h>
int a = _${k}_ENDIAN +1 ;
EOF
    if trybasic "$tmpc" ; then
      echo "endianness: $j" >> "$sysdeps/sysdeps"
      echo "  ... $j"
      rm -f "$tmpc"
      return
    fi
  done
  rm -f "$tmpc"
  fail "$0: error: unable to determine endianness: no suitable endian.h found"
}

trysigned () {
  cat > "$tmpc" <<EOF
#include <sys/types.h>
int a[($1)-1 < 0 ? 1 : -1] ;
EOF
  trybasic "$tmpc"
  r=$?
  rm -f "$tmpc"
  return $r
}

trysizes () {
  t="$1" ; shift
  for arg ; do
    cat > "$tmpc" <<EOF
#include <sys/types.h>
int a[sizeof($t) == $arg ? 1 : -1] ;
EOF
    if trybasic "$tmpc" ; then
      rm -f "$tmpc"
      echo "$arg"
      return
    fi
  done
  rm -f "$tmpc"
  fail "$0: error: unable to determine the size of $t on the target"
}

trystdtype () {
  t="$1" ; shift
  iscached "sizeofu$t" || { echon "sizeofu${t}: " ; trysizes "$t" "$@" ; } >> "$sysdeps/sysdeps"
}

trytypes () {
  echo "Checking size and signedness of standard types..."
  trystdtype short 2 4
  trystdtype int 4 8 2
  trystdtype long 8 4
  for t in size uid gid pid time dev ino ; do
    iscached "signed$t" || { echon "signed${t}: " ; if trysigned "${t}_t" ; then echo "yes" ; else echo "no" ; fi ; } >> "$sysdeps/sysdeps"
    iscached "sizeof$t" || { echon "sizeof${t}: " ; trysizes "${t}_t" 4 8 2 ; } >> "$sysdeps/sysdeps"
  done  
  echo "  ... done"
}

detectlibs () {
  args=
  name=$1
  shift
  if $CC_AUTO $CPPFLAGS_AUTO $CPPFLAGS $CPPFLAGS_POST $CFLAGS_AUTO $CFLAGS $CFLAGS_POST -c -o try$name.o src/sysdeps/try$name.c 2>/dev/null ; then
    until $CC_AUTO $CFLAGS_AUTO $CFLAGS $CFLAGS_POST $LDFLAGS_AUTO $LDFLAGS $LDFLAGS_POST -o "$tmpe" try$name.o $args 2>/dev/null ; do
      if test -z "$*" ; then
        rm -f try$name.o
        return 1
      fi
      args="$args $1"
      shift
    done
    echo ${args# }
    rm -f try$name.o
    return 0
  else
    return 1
  fi
}

trylibs () {
  name="$1"
  libvar="$2"_lib
  libfile="$2".lib
  echo "Checking whether system has $3..."
  shift 3
  if { args=`iscached $name 3>&1 1>&4 4>&-` ; } 4>&1 ; then :
  elif args=`detectlibs "$name" "$@"` ; then
    echo "${name}: yes" >> "${sysdeps}/sysdeps"
    if test -z "$args" ; then
      echo "  ... yes"
    else
      echo "  ... yes, with linker args: $args"
    fi
  else
    echo "${name}: no" >> ${sysdeps}/sysdeps
    echo "  ... no"
  fi
  eval "${libvar}=\"$args\""
  echo "$args" > "${sysdeps}/$libfile"
}


# The script starts HERE.

# Initialize variables
CC_AUTO=
CPPFLAGS_AUTO="-D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700 -Isrc/include"
CPPFLAGS_POST="$CPPFLAGS"
CPPFLAGS=
CFLAGS_AUTO="-pipe -Wall"
CFLAGS_POST="$CFLAGS"
CFLAGS="-O2"
LDFLAGS_AUTO=
LDFLAGS_POST="$LDFLAGS"
LDFLAGS=
LDFLAGS_NOSHARED=
LDFLAGS_SHARED=-shared
prefix=
dynlibdir='$prefix/lib'
libdir='$prefix/lib'
includedir='$prefix/include'
sysconfdir='$prefix/etc'
pkgconfdir='$prefix/lib/pkgconfig'
sysdepdir='$prefix/lib/$package/sysdeps'
sysdeplist=
shlibext=so
shared=true
static=true
allpic=true
slashpackage=false
ipv6=true
select=false
taiclock=false
ddefaultpath=/usr/bin:/bin
defaultpath=$ddefaultpath
dpathorig=true
pcw=false
sproot=
home=
exthome=
addincpath=''
addlibspath=''
addlibdpath=''
depincpath=''
deplibpath=''
vpaths=''
vpathd=''
build=

# Parse command line
for arg ; do
  case "$arg" in
    --help) usage ;;
    --prefix=*) prefix=${arg#*=} ;;
    --dynlibdir=*) dynlibdir=${arg#*=} ;;
    --libdir=*) libdir=${arg#*=} ;;
    --includedir=*) includedir=${arg#*=} ;;
    --sysconfdir=*) sysconfdir=${arg#*=} ;;
    --pkgconfdir=*) pkgconfdir=${arg#*=} ;;
    --sysdepdir=*) sysdepdir=${arg#*=} ;;
    --with-include=*) var=${arg#*=} ; stripdir var ; addincpath="$addincpath -I$var" ; depincpath="${depincpath}${depincpath:+ }-I$var" ;;
    --with-lib=*) var=${arg#*=} ; stripdir var ; addlibspath="$addlibspath -L$var" ; deplibpath="${deplibpath}${deplibpath:+ }-L$var" ; vpaths="$vpaths $var" ;;
    --with-dynlib=*) var=${arg#*=} ; stripdir var ; addlibdpath="$addlibdpath -L$var" ; vpathd="$vpathd $var" ;;
    --enable-shared|--enable-shared=yes) shared=true ;;
    --disable-shared|--enable-shared=no) shared=false ;;
    --enable-static|--enable-static=yes) static=true ;;
    --disable-static|--enable-static=no) static=false ;;
    --enable-all-pic|--enable-all-pic=yes) allpic=true ;;
    --disable-all-pic|--enable-all-pic=no) allpic=false ;;
    --enable-pkgconfig|--enable-pkgconfig=yes) pcw=true ;;
    --disable-pkgconfig|--enable-pkgconfig=no) pcw=false ;;
    --enable-slashpackage=*) sproot=${arg#*=} ; slashpackage=true ; ;;
    --enable-slashpackage) sproot= ; slashpackage=true ;;
    --disable-slashpackage) sproot= ; slashpackage=false ;;
    --enable-ipv6|--enable-ipv6=yes) ipv6=true ;;
    --disable-ipv6|--enable-ipv6=no) ipv6=false ;;
    --enable-iopause-select|--enable-iopause-select=yes) select=true ;;
    --disable-iopause-select|--enable-iopause-select=no) select=false ;;
    --enable-tai-clock|--enable-tai-clock=yes) taiclock=true ;;
    --disable-tai-clock|--enable-tai-clock=no) taiclock=false ;;
    --enable-monotonic|--enable-monotonic=yes) echo "$0: warning: --enable-monotonic is now obsolete" 1>&2 ;;
    --disable-monotonic|--enable-monotonic=no) ;;
    --with-default-path=*) defaultpath=${arg#*=} ; dpathorig=false ;;
    --without-default-path) defaultpath=$ddefaultpath ; dpathorig=true ;;
    --with-sysdep-*=*) sysdeplist="$sysdeplist ${arg#--with-sysdep-}" ;;
    --without-sysdep-*) sysdeplist="$sysdeplist ${arg#--without-sysdep-}=no" ;; 
    --enable-*|--disable-*|--with-*|--without-*|--*dir=*) ;;
    --host=*|--target=*) target=${arg#*=} ;;
    --build=*) build=${arg#*=} ;;
    -* ) echo "$0: unknown option $arg" ;;
    *=*) eval "${arg%%=*}=\${arg#*=}" ;;
    *) target=$arg ;;
  esac
done

# Add /usr in the default default case
if test -z "$prefix" ; then
  if test "$libdir" = '$prefix/lib' ; then
    libdir=/usr/lib
  fi
  if test "$includedir" = '$prefix/include' ; then
    includedir=/usr/include
  fi
  if test "$pkgconfdir" = '$prefix/lib/pkgconfig' ; then
    pkgconfdir=/usr/lib/pkgconfig
  fi
  if test "$sysdepdir" = '$prefix/lib/$package/sysdeps' ; then
    sysdepdir=/usr/lib/$package/sysdeps
  fi
fi

# Expand installation directories
stripdir prefix
for i in exec_prefix dynlibdir libdir includedir sysconfdir pkgconfdir sysdepdir sysdepspre sproot ; do
  eval tmp=\${$i}
  eval $i=$tmp
  stripdir $i
done

# Set slashpackage values
if $slashpackage ; then
  home=${sproot}/package/${category}/${package}-${version}
  exthome=${sproot}/package/${category}/${package}
  sysdepdir=${home}/sysdeps
  binprefix=${home}/command
  extbinprefix=${exthome}/command
  dynlibdir=${home}/library.so
  libdir=${home}/library
  includedir=${home}/include
  pkgconfdir=${home}/pkgconfig
  if $dpathorig ; then
    if echo $defaultpath | tr : '\n' | grep -q '^/command$' ; then : ; else
      defaultpath="/command:$defaultpath"
    fi
  fi
fi

# Get usable temp filenames
i=0
set -C
while test "$i" -lt 50 ; do
  i=$(($i+1))
  tmpc="./tmp-configure-$$-$PPID-$i.c"
  tmpo="./tmp-configure-$$-$PPID-$i.o"
  tmpe="./tmp-configure-$$-$PPID-$i.tmp"
  tmps="./tmp-configure-$$-$PPID-$i.sysdeps"
  2>|/dev/null > "$tmpc" && break
  2>|/dev/null > "$tmpo" && break
  2>|/dev/null > "$tmpe" && break
  2>|/dev/null > "$tmps" && break
done
if test "$i" -gt 50 ; then
  fail "$0: cannot create temporary files"
fi
set +C
trap 'rm -f "$tmpc" "$tmpo" "$tmpe" "$tmps"' EXIT ABRT INT QUIT TERM HUP

# Preprocess user-provided sysdeps
rm -f "$tmps"
if test -n "$sysdeplist" ; then
  :> "$tmps"
  for i in $sysdeplist ; do
    k=${i%%=*}
    echo ${i#*=} | sed 's/,/ /g' |
    {
      read v extras
      if test -z "$k" || test -z "$v" ; then fail "$0: invalid user-provided sysdep: $i" ; fi
      if test "$v" = "true" ; then v=yes
      elif test "$v" = "false" ; then v=no
      fi
      if grep -q -e "^${k}: " "$tmps" ; then
        grep -v -e "^${k}: " "$tmps" > "$tmpe"
        mv -f "$tmpe" "$tmps"
      fi
      if test -n "$extras" ; then
        echo "${k}: $v $extras"
      else
        echo "${k}: $v"
      fi >> "$tmps"
    }
  done
fi

# Find a C compiler to use
if test -n "$target" && test x${build} != x${target} ; then
  cross=${target}-
else
  cross=
fi
echo "Checking for C compiler..."
trycc ${CC}
if test -n "$CC_AUTO" ; then
  b=`basename "$CC"`
  adjust_cross=false
  if test "$b" != "$CC" ; then
    adjust_cross=true
    echo "$0: warning: compiler $CC is declared with its own path. If it's not accessible via PATH, you will need to pass AR, RANLIB and STRIP make variables to the make invocation." 1>&2
  fi
  if test -n "$cross" ; then
    if test "$b" = "${b##$cross}" ; then
      echo "$0: warning: compiler $CC is declared as a cross-compiler for target $target but does not start with prefix ${cross}" 1>&2
    elif $adjust_cross ; then
      cross=`dirname "$CC"`/"$cross"
    fi
  fi
fi
trycc ${cross}gcc
trycc ${cross}clang
trycc ${cross}cc
test -n "$CC_AUTO" || fail "$0: cannot find a C compiler"
echo "  ... $CC_AUTO"
echo "Checking whether C compiler works... "
echo "typedef int x;" > "$tmpc"
if $CC_AUTO $CPPFLAGS_AUTO $CPPFLAGS $CPPFLAGS_POST $CFLAGS_AUTO $CFLAGS $CFLAGS_POST -c -o "$tmpo" "$tmpc" 2>"$tmpe" ; then
  echo "  ... yes"
else
  echo "  ... no. Compiler output follows:"
  cat < "$tmpe"
  exit 1
fi

echo "Checking target system type..."
if test -z "$target" ; then
  if test -n "$build" ; then
    target=$build ;
  else
    target=$($CC_AUTO -dumpmachine 2>/dev/null) || target=unknown
  fi
fi
echo "  ... $target"

echo "Shared libraries will be named ..."
libc="${target##*-}"
if test "${libc##darwin}" != "$libc" ; then
  shlibext=dylib
fi
echo "  ... *.$shlibext"

# Produce automatic compilation flags
if $allpic ; then
  tryflag CPPFLAGS_AUTO -fPIC
fi
tryflag CFLAGS_AUTO -std=c99
tryflag CFLAGS -fomit-frame-pointer
tryflag CFLAGS_AUTO -fno-exceptions
tryflag CFLAGS_AUTO -fno-unwind-tables
tryflag CFLAGS_AUTO -fno-asynchronous-unwind-tables
tryflag CPPFLAGS_AUTO -Werror=implicit-function-declaration
tryflag CPPFLAGS_AUTO -Werror=implicit-int
tryflag CPPFLAGS_AUTO -Werror=pointer-sign
tryflag CPPFLAGS_AUTO -Werror=pointer-arith
tryflag CPPFLAGS_AUTO -Wno-unused-value
tryflag CPPFLAGS_AUTO -Wno-parentheses
tryflag CFLAGS_AUTO -ffunction-sections
tryflag CFLAGS_AUTO -fdata-sections
tryldflag LDFLAGS_AUTO -Wl,--as-needed
tryldflag LDFLAGS_AUTO -Wl,--sort-section=alignment
tryldflag LDFLAGS_AUTO -Wl,--sort-common
if $shared ; then
  tryldflag LDFLAGS -Wl,--hash-style=both
fi

# And now, determine a big fat batch of sysdeps.

sysdeps=sysdeps.cfg
mkdir -p $sysdeps
echo "$target" > $sysdeps/target
:> "$sysdeps/sysdeps"

util_lib=
echo > $sysdeps/util.lib

echo 'Checking required linker flags for socket functions...'
socket_lib=`detectlibs lsock -lsocket -lnsl` || fail "$0: unable to determine required linker flags for socket functions"
if test -n "$socket_lib" ; then
  echo "  ... $socket_lib"
else
  echo "  ... none"
fi
echo "$socket_lib" > $sysdeps/socket.lib

trylibs clockrt sysclock 'clock_gettime()' -lrt
choose cl clockmon CLOCK_MONOTONIC $sysclock_lib
choose cl clockboot CLOCK_BOOTTIME $sysclock_lib
trylibs posixspawn spawn 'posix_spawn()' -lrt
trylibs timer timer 'timer_create()' -lrt
trylibs pthread pthread 'pthread support' -lpthread -lrt

tryendianness
trytypes
choose cl accept4 'accept4()'
choose c cmsgcloexec 'MSG_CMSG_CLOEXEC'
choose cl dirfd 'dirfd()'
choose cl fdopendir 'fdopendir()'
choose cl eventfd 'eventfd()'
choose cl flock 'flock()'
choose cl getpeereid 'getpeereid()'
choose cl sopeercred 'SO_PEERCRED'
choose cl getpeerucred 'getpeerucred()'
choose cl ipv6 'IPv6 support' $socket_lib
choose c msgdontwait 'MSG_DONTWAIT'
choose c ocloexec 'O_CLOEXEC'
choose c odirectory 'O_DIRECTORY'
choose cl openat 'openat()'
choose cl linkat 'linkat()'
choose cl memmem 'memmem()'
choose cl pipe2 'pipe2()'
choose cl ppoll 'ppoll()'
choose cl qsortr_posix 'POSIX qsort_r()'
choose cl qsortr_freebsd 'old FreeBSD qsort_r()'
choose cl revoke 'revoke()'
choose cl sendfile 'sendfile()'
choose cl setgroups 'setgroups()'
choose cl settimeofday 'settimeofday()'
choose cl signalfd 'signalfd()'
choose cl splice 'splice()'
choose c statim 'st.st_atim'
choose c statimespec 'st.st_atimespec'
choose cl strcasestr 'strcasestr()'
choose cl strnlen 'strnlen()'
choose c uint64t 'uint64_t'
choose cl waitid 'waitid()'
choose cl futimens 'futimens()'
choose cl futimes 'futimes()'
choose cl arc4random 'arc4random()'
choose cl arc4random_addrandom 'arc4random_addrandom()'
choose cl itimer 'setitimer()'
choose cl namespaces 'namespaces'
choose cl nsgetparent 'NS_GET_PARENT'
choose cl explicit_bzero 'explicit_bzero()'
choose cl getrandom 'getrandom()'
choose cl grndinsecure 'GRND_INSECURE'
choose cl chroot 'chroot()'
choose cl clonenewpid 'clone3() with CLONE_NEWPID'
choose cl posixspawnsetsid 'POSIX_SPAWN_SETSID' $spawn_lib
choose cl posixspawnsetsidnp 'POSIX_SPAWN_SETSID_NP' $spawn_lib
choose cl posixspawnchdir 'posix_spawn_file_actions_addchdir()' $spawn_lib
choose cl posixspawnchdirnp 'posix_spawn_file_actions_addchdir_np()' $spawn_lib
choose cl getauxval 'getauxval()'
choose cl kernprocpathname 'the KERN_PROC_PATHNAME sysctl'
choose cl _nsgetexecutablepath '_NSGetExecutablePath()'
choose cl getexecname 'getexecname()'
choose cl dladdr 'dladdr()'
choose c pidfd_open 'pidfd_open()'
choose cl prctl 'prctl()'
choose cl procctl 'procctl()'
choose cl kevent 'kevent()'
choose cl kqueue1 'kqueue1()'

# Here are the evil irreducible run-time sysdeps.
choose clr devurandom '/dev/urandom'
choose clr posixspawnearlyreturn 'posix_spawn() return early' $spawn_lib
choosevalue procselfexe '/proc/self/exe' /proc/self/exe /proc/curproc/exe /proc/curproc/file /proc/self/path/a.out


# Finally, produce config.mak and config.h

rm -f "$tmps"
echo "Creating config.mak..."
cmdline=$(quote "$0")
for i ; do cmdline="$cmdline $(quote "$i")" ; done
exec 3>&1 1>config.mak
cat << EOF
# This file was generated by:
# $cmdline
# Any changes made here will be lost if configure is re-run.

target := $target
package := $package
prefix := $prefix
sysconfdir := $sysconfdir
sysdepdir := $sysdepdir
dynlibdir := $dynlibdir
libdir := $libdir
includedir := $includedir
pkgconfdir := $pkgconfdir
sysdeps := $sysdeps
version := $version
sproot := $sproot
home := $home
exthome := ${exthome}
extra_includedirs :=$depincpath
extra_libdirs :=$deplibpath
ipv6 := ${ipv6}
SOCKET_LIB := ${socket_lib}
UTIL_LIB := ${util_lib}
PTHREAD_LIB := ${pthread_lib}
SYSCLOCK_LIB := ${sysclock_lib}
TIMER_LIB := ${timer_lib}
SPAWN_LIB := ${spawn_lib}
CC := ${CC_AUTO}
CPPFLAGS_AUTO := $CPPFLAGS_AUTO
CPPFLAGS := $CPPFLAGS $CPPFLAGS_POST
CFLAGS_AUTO := $CFLAGS_AUTO
CFLAGS := $CFLAGS $CFLAGS_POST
LDFLAGS_AUTO := $LDFLAGS_AUTO
LDFLAGS := $LDFLAGS $LDFLAGS_POST
LDFLAGS_NOSHARED := $LDFLAGS_NOSHARED
LDFLAGS_SHARED := $LDFLAGS_SHARED
CROSS_COMPILE := ${cross}
SHLIB_EXT := ${shlibext}
EOF
if test -n "$vpaths" ; then
  echo "vpath lib%a$vpaths"
fi
if test -n "$vpathd" ; then
  echo "vpath lib%.${shlibext}$vpathd"
fi

if $static ; then
  echo "STATIC_LIBS := libskarnet.a.xyzzy"
else
  echo "STATIC_LIBS :="
fi
if $shared ; then
  echo "SHARED_LIBS := libskarnet.${shlibext}.xyzzy"
else
  echo "SHARED_LIBS :="
fi
if $pcw ; then
  echo "DO_PKGCONFIG := 1"
else
  echo "DO_PKGCONFIG :="
fi
if $allpic ; then
  echo "STATIC_LIBS_ARE_PIC := 1"
else
  echo "STATIC_LIBS_ARE_PIC :="
fi

exec 1>&3 3>&-
echo "  ... done."

echo "Creating src/include/${package}/config.h..."
mkdir -p -m 0755 src/include/${package}
exec 3>&1 1> src/include/${package}/config.h
cat <<EOF
/* ISC license. */

/* Generated by: $cmdline */

#ifndef ${package_macro_name}_CONFIG_H
#define ${package_macro_name}_CONFIG_H

#define ${package_macro_name}_VERSION "$version"
#define ${package_macro_name}_DEFAULTPATH "$defaultpath"
#define ${package_macro_name}_ETC "$sysconfdir"
#define ${package_macro_name}_SPROOT "$sproot"
#define ${package_macro_name}_HOME "$home"
EOF
if $taiclock ; then
  echo "#define ${package_macro_name}_FLAG_CLOCKISTAI"
else
  echo "#undef ${package_macro_name}_FLAG_CLOCKISTAI"
fi
if $ipv6 ; then
  echo "#define ${package_macro_name}_FLAG_WANTIPV6"
else
  echo "#undef ${package_macro_name}_FLAG_WANTIPV6"
fi
if $select ; then
  echo "#define ${package_macro_name}_FLAG_PREFERSELECT"
else
  echo "#undef ${package_macro_name}_FLAG_PREFERSELECT"
fi

echo
echo "#endif"
exec 1>&3 3>&-
echo "  ... done."
