--- /dev/null
+#!/usr/bin/env bash
+# -----------------------------------------------------------------------------
+# Build automation script designed to work with autotools.
+# -----------------------------------------------------------------------------
+set -e
+
+# -----------------------------------------------------------------------------
+# Functions used by Build.rc
+#
+declare prefix
+function setPrefix () {
+ if (( $# != 1 )); then
+ echo "Usage: $0 PREFIX" >&2
+ return 1
+ fi
+ prefix="$1"
+}
+
+function setPath () {
+ if (( $# == 0 )); then
+ echo "Usage: $0 VAR [PATH, ...]" >&2
+ return 1
+ fi
+
+ local -r var="$1"
+ local paths=("${@:2}")
+
+ case ${#paths[@]} in
+ 0)
+ unset $var;;
+ 1)
+ export $var="$paths";;
+ *)
+ export $var="${paths[0]}"
+ local path
+ for path in "${paths[@]:1}"; do
+ local val=$(eval echo \$$var)
+ export $var="$val:$path"
+ done
+ esac
+
+ # Special case for PATH: we prepend "$prefix/bin" to it.
+ if [[ $var = "PATH" ]]; then
+ PATH="$prefix/bin:$PATH"
+ fi
+}
+
+declare -a configArgs
+function setConfigArgs () {
+ configArgs=( \
+ --prefix="$prefix" \
+ PATH="$PATH" \
+ "$@" \
+ )
+}
+
+declare buildTarget
+function setBuildTarget () {
+ if (( $# != 1 )); then
+ echo "Usage: $0 TARGET" >&2
+ return 1
+ fi
+ buildTarget="$1"
+}
+
+declare docDirectory
+function setDocDirectory () {
+ if (( $# != 1 )); then
+ echo "Usage: $0 DIRECTORY" >&2
+ return 1
+ fi
+ docDirectory="$1"
+}
+
+declare docTarget
+function setDocTarget () {
+ if (( $# != 1 )); then
+ echo "Usage: $0 TARGET" >&2
+ return 1
+ fi
+ docTarget="$1"
+}
+
+# -----------------------------------------------------------------------------
+# Setting variables
+#
+setPrefix "/usr/local"
+setPath PATH "/usr/bin" "/bin"
+setConfigArgs
+setBuildTarget "all"
+setDocDirectory "."
+setDocTarget "all"
+
+if [ -f "Build.rc" ]; then
+ . "Build.rc"
+fi
+
+# -----------------------------------------------------------------------------
+# Main
+#
+function run () {
+ if (( $# == 0 )); then
+ echo "run: Usage: run CMD [ARG...]" >&2
+ return 1
+ fi
+
+ if [[ -t 1 ]]; then
+ # Bold + Green
+ echo -ne "\e[1;32m"
+ echo "$@"
+ echo -ne "\e[0m"
+ else
+ echo "$@"
+ fi
+
+ $@
+}
+
+function detectNumCPUs () {
+ if sysctl -n "hw.ncpu" 2>/dev/null; then
+ # This works for most BSDs.
+ :
+ elif grep -qF processor /proc/cpuinfo 2>/dev/null; then
+ # Linux sucks...
+ grep -cF processor /proc/cpuinfo
+ else
+ echo "WARNING: I don't know how to detect the number of processors on this platform." >&2
+ echo 1
+ fi
+}
+
+function runMake () {
+ run gmake -w -j $(detectNumCPUs) $@
+}
+
+function configure () {
+ if [[ ! -f configure.ac && ! -f configure.in ]]; then
+ echo "ERROR: Neither configure.ac nor configure.in exists in the current directory." >&2
+ return 1
+ fi
+
+ if [[ ! -f configure ]]; then
+ run autoreconf -v -i -f
+ fi
+
+ if [[ ! -f "_build/Makefile" ]]; then
+ run mkdir -p _build
+ run pushd _build
+ run ../configure "${configArgs[@]}"
+ run popd
+ fi
+}
+
+function build () {
+ configure
+ runMake -C "_build" $buildTarget
+}
+
+function doc () {
+ configure
+ runMake -C "_build/$docDirectory" $docTarget
+}
+
+function check () {
+ build
+ runMake -C "_build" check
+}
+
+function clean () {
+ run rm -rf "_build"
+}
+
+function dist () {
+ configure
+ runMake -C "_build" dist
+}
+
+function install () {
+ build
+ runMake -C "_build" install
+}
+
+case "$1" in
+ ""|"build") build ;;
+ "doc" ) doc ;;
+ "check" ) check ;;
+ "clean" ) clean ;;
+ "dist" ) dist ;;
+ "install" ) install;;
+ *)
+ echo "Usage: $0 [build | doc | check | clean | dist | install]" >&2
+ exit 1
+esac
--- /dev/null
+# -*- sh -*-
+# -----------------------------------------------------------------------------
+# Configuration file for ./Build
+
+# -----------------------------------------------------------------------------
+# The installation prefix, defaulting to "/usr/local". You can later
+# refer to the prefix by a variable named "prefix".
+#
+setPrefix "/usr/local"
+
+# -----------------------------------------------------------------------------
+# The PATH environment variable to be set during the build. (Default:
+# "/usr/bin:/bin")
+#
+setPath PATH \
+ "/usr/pkg/bin" \
+ "/usr/bin" \
+ "/bin"
+
+# -----------------------------------------------------------------------------
+# The extra arguments to be passed to "./configure".
+#
+setConfigArgs \
+ --enable-maintainer-mode
+
+# -----------------------------------------------------------------------------
+# The name of "make" target called by "./Build" or "./Build
+# build". (Default: "all")
+#
+setBuildTarget "all"
+
+# -----------------------------------------------------------------------------
+# The name of subdirectory in which the source tree of documentation
+# resides, and the name of "make" target to build it. (Default: target
+# "all" in the current directory)
+#
+setDocDirectory "."
+setDocTarget "all"
+
+# -----------------------------------------------------------------------------