#!/bin/sh # git-amb - git automake build utility # Copyright (C) 2007 Hans Ulrich Niedermann # # Build automake based git checkout in branch specific build and install trees. # That makes it easy to compare build results from different branches. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # Known to work and tested with # - git 1.5.3.4 # Should also work with git 1.2 and possibly older. unset CDPATH SED="${SED-sed}" self=`basename "$0"` selfdir=`dirname "$0"` selfdir=`cd "$selfdir" && pwd` . "$selfdir/git-ndim-sh" SUBDIRECTORY_OK="yes" USAGE=" [params...]" LONG_USAGE="\ Build automake based git checkout in branch specific build and install trees. For more details, see the ${self}(1) man page." . git-sh-setup require_work_tree amb_detect_configure() { for configure_ac in \ "${top_srcdir}/configure.ac" \ "${top_srcdir}/configure.in" do if test -s "${configure_ac}"; then break fi configure_ac="" done test -z "${configure_ac}" && die "configure.{ac,in} not found" configure="$top_srcdir/configure" } cond_cat_path() { path="." for dir do if echo "$dir" | grep '^/' > /dev/null; then path="$dir" else path="$path/$dir" fi done echo "$path" } amb_init() { # Equivalent bzr code: # bzr log -r -1.. | sed -n 's/^branch nick: //p' if test "x$1" = "x"; then # determine currently checked out branch git_branch="$(git-symbolic-ref HEAD | $SED -n 's|^refs/heads/||p')" elif git-rev-parse --verify "$1" > /dev/null 2>&1; then # $1 is valid branch: use it git_branch="${1}" else die "Invalid branch \"$1\" given." fi test "x$(git-rev-parse --is-inside-work-tree 2> /dev/null)" = "xtrue" top_srcdir="$(cd_to_toplevel && pwd)" tmp="$(git-config amb.builddir)" || tmp="$GIT_DIR/amb/build" amb_builddir="$(cond_cat_path "${top_srcdir}" "$tmp")" top_builddir="$(cond_cat_path "${top_srcdir}" "$tmp" "${git_branch}")" tmp="$(git-config amb.installdir)" || tmp="$GIT_DIR/amb/install" amb_installdir="$(cond_cat_path "${top_srcdir}" "$tmp")" top_installdir="$(cond_cat_path "${top_srcdir}" "$tmp" "$git_branch")" amb_detect_configure } amb_autoreconf() { echo "$self: Running autoreconf for branch ${git_branch}" autoreconf -vis "$@" "$top_srcdir" } amb_cond_autoreconf() { if test ! -s "$configure" || test "$configure_ac" -nt "$configure"; then amb_autoreconf fi } amb_configure() { amb_cond_autoreconf echo "$self: Running configure for branch ${git_branch}" mkdir -p "$top_builddir" cd "$top_builddir" "$top_srcdir/configure" --prefix="$top_installdir" --enable-maintainer-mode "$@" } amb_cond_configure() { test -s "$top_builddir/Makefile" || amb_configure } amb_make() { amb_cond_configure echo "$self: Running make for branch ${git_branch}" cd "$top_builddir" make "$@" } amb_printvars() { echo "$self: Settings for branch ${git_branch}" echo "$self: source dir $top_srcdir" echo "$self: build dir $top_builddir" echo "$self: install dir $top_installdir" } amb_purge() { echo "$self: Purging branch ${git_branch} build and install" echo "$self: Purging $top_builddir..." if test -d "$top_builddir"; then chmod -R u+w "$top_builddir"; fi rm -rf "$top_builddir" echo "$self: Purging $top_installdir..." rm -rf "$top_installdir" echo "$self: Finished." } amb_purge_all() { echo "$self: Purging ALL branches" echo "$self: Purging $amb_builddir..." if test -d "$amb_builddir"; then chmod -R u+w "$amb_builddir"; fi rm -rf "$amb_builddir" echo "$self: Purging $amb_installdir..." rm -rf "$amb_installdir" echo "$self: Finished." } amb_uninstall() { echo "$self: Uninstalling branch ${git_branch}" echo "$self: Purging $top_builddir..." rm -rf "$top_installdir" echo "$self: Finished." } amb_shell() { if test -d "$top_builddir"; then :; else die "Build directory does not exist yet: ${top_builddir}" fi echo "$self: Starting shell for branch ${git_branch}" export git_amb_srcdir="top_srcdir" export git_amb_builddir="top_builddir" export git_amb_installdir="top_installdir" amb_printvars export PS1="\ [Ctrl-D or 'exit' to quit $self shell for branch ${git_branch}]\n\ [<$self> \w]\n\ [<$(echo "$self" | sed 's/./-/g')> \u@\h \W]\$ \ " cd "$top_builddir" && ${SHELL} "$@" } # Abort on error set -e # The great command case command="$1" if shift; then case "$command" in builddir) amb_init "$@" echo "$top_builddir" ;; installdir) amb_init "$@" echo "$top_installdir" ;; autoreconf) amb_init amb_autoreconf "$@" amb_printvars ;; configure) amb_init amb_configure "$@" amb_printvars ;; make) amb_init amb_make "$@" amb_printvars ;; clean) amb_init "$@" amb_make clean amb_printvars ;; distclean) amb_init "$@" amb_make distclean amb_printvars ;; purge) amb_init "$@" amb_purge ;; purge-all) amb_init "$@" amb_purge_all ;; uninstall) amb_init "$@" amb_uninstall ;; sh) amb_init amb_shell "$@" amb_printvars ;; *) die "Invalid command line parameter: \"$command\"" ;; esac else amb_init amb_printvars fi # End of file.