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