]> gitweb @ CieloNegro.org - autobuild.git/commitdiff
initial commit
authorPHO <pho@cielonegro.org>
Wed, 23 May 2012 09:45:52 +0000 (18:45 +0900)
committerPHO <pho@cielonegro.org>
Wed, 23 May 2012 09:45:52 +0000 (18:45 +0900)
Build [new file with mode: 0755]
Build.rc [new file with mode: 0644]

diff --git a/Build b/Build
new file mode 100755 (executable)
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 (file)
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"
+
+# -----------------------------------------------------------------------------