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