From: PHO Date: Wed, 23 May 2012 09:45:52 +0000 (+0900) Subject: initial commit X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=autobuild.git;a=commitdiff_plain;h=c2ea50bfc34d91da768690e945ebbd3f8b6a69d3 initial commit --- c2ea50bfc34d91da768690e945ebbd3f8b6a69d3 diff --git a/Build b/Build new file mode 100755 index 0000000..023e7dc --- /dev/null +++ b/Build @@ -0,0 +1,193 @@ +#!/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 diff --git a/Build.rc b/Build.rc new file mode 100644 index 0000000..09795f9 --- /dev/null +++ b/Build.rc @@ -0,0 +1,40 @@ +# -*- 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" + +# -----------------------------------------------------------------------------