summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAvery Pennarun <apenwarr@gmail.com>2011-02-26 18:10:06 -0800
committerAvery Pennarun <apenwarr@gmail.com>2011-02-26 18:16:44 -0800
commit0658c85ffe322812f7bfef364ee9e5f572d5a04f (patch)
treee697bfbf921fcb4581156081f29315099386ac54
parent90a55a33a255941081623b6efe03789f6fc5c86a (diff)
Replace make-based build with redo-based build.
Including a copy of minimal/do as 'do' in the top directory. To build, just run './do' or 'make'. This also builds the ui-macos directory automatically if you're on MacOS.
-rw-r--r--.gitignore3
-rw-r--r--Makefile21
-rw-r--r--all.do4
-rw-r--r--clean.do2
-rw-r--r--default.8.do7
-rwxr-xr-xdo150
6 files changed, 172 insertions, 15 deletions
diff --git a/.gitignore b/.gitignore
index b7f8e7e..152e0e5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,6 @@
*.pyc
*~
*.8
+/.do_built
+/.do_built.dir
+/.redo
diff --git a/Makefile b/Makefile
index 5958871..c167744 100644
--- a/Makefile
+++ b/Makefile
@@ -1,19 +1,10 @@
-PANDOC:=$(shell \
- if pandoc </dev/null 2>/dev/null; then \
- echo pandoc; \
- else \
- echo "Warning: pandoc not installed; can't generate manpages." >&2; \
- echo '@echo Skipping: pandoc'; \
- fi)
+all:
-default: all
+Makefile:
+ @
-all: sshuttle.8
+%: FORCE
+ +./do $@
-sshuttle.8: sshuttle.md
+.PHONY: FORCE
-%.8: %.md
- $(PANDOC) -s -r markdown -w man -o $@ $<
-
-clean:
- rm -f *~ */*~ .*~ */.*~ *.8 *.tmp */*.tmp *.pyc */*.pyc
diff --git a/all.do b/all.do
new file mode 100644
index 0000000..7a7f6b9
--- /dev/null
+++ b/all.do
@@ -0,0 +1,4 @@
+UI=
+[ "$(uname)" = "Darwin" ] && UI=ui-macos/all
+redo-ifchange sshuttle.8 $UI
+
diff --git a/clean.do b/clean.do
new file mode 100644
index 0000000..2baeb36
--- /dev/null
+++ b/clean.do
@@ -0,0 +1,2 @@
+redo ui-macos/clean
+rm -f *~ */*~ .*~ */.*~ *.8 *.tmp */*.tmp *.pyc */*.pyc
diff --git a/default.8.do b/default.8.do
new file mode 100644
index 0000000..6d8dc8c
--- /dev/null
+++ b/default.8.do
@@ -0,0 +1,7 @@
+exec >&2
+if pandoc </dev/null 2>/dev/null; then
+ pandoc -s -r markdown -w man -o $3 $1.md
+else
+ echo "Warning: pandoc not installed; can't generate manpages."
+ redo-always
+fi
diff --git a/do b/do
new file mode 100755
index 0000000..901e4f3
--- /dev/null
+++ b/do
@@ -0,0 +1,150 @@
+#!/bin/sh
+#
+# A minimal alternative to djb redo that doesn't support incremental builds.
+# For the full version, visit http://github.com/apenwarr/redo
+#
+# The author disclaims copyright to this source file and hereby places it in
+# the public domain. (2010 12 14)
+#
+
+# By default, no output coloring.
+GREEN=""
+BOLD=""
+PLAIN=""
+
+if [ -n "$TERM" -a "$TERM" != "dumb" ] && tty <&2 >/dev/null 2>&1; then
+ GREEN="$(printf '\033[32m')"
+ BOLD="$(printf '\033[1m')"
+ PLAIN="$(printf '\033[m')"
+fi
+
+_dirsplit()
+{
+ base=${1##*/}
+ dir=${1%$base}
+}
+
+_dirsplit "$0"
+export REDO=$(cd "${dir:-.}" && echo "$PWD/$base")
+
+DO_TOP=
+if [ -z "$DO_BUILT" ]; then
+ DO_TOP=1
+ [ -n "$*" ] || set all # only toplevel redo has a default target
+ export DO_BUILT=$PWD/.do_built
+ : >>"$DO_BUILT"
+ echo "Removing previously built files..." >&2
+ sort -u "$DO_BUILT" | tee "$DO_BUILT.new" |
+ while read f; do printf "%s\0%s.did\0" "$f" "$f"; done |
+ xargs -0 rm -f 2>/dev/null
+ mv "$DO_BUILT.new" "$DO_BUILT"
+ DO_PATH=$DO_BUILT.dir
+ export PATH=$DO_PATH:$PATH
+ rm -rf "$DO_PATH"
+ mkdir "$DO_PATH"
+ for d in redo redo-ifchange; do
+ ln -s "$REDO" "$DO_PATH/$d";
+ done
+ [ -e /bin/true ] && TRUE=/bin/true || TRUE=/usr/bin/true
+ for d in redo-ifcreate redo-stamp redo-always; do
+ ln -s $TRUE "$DO_PATH/$d";
+ done
+fi
+
+
+_find_dofile_pwd()
+{
+ DOFILE=default.$1.do
+ while :; do
+ DOFILE=default.${DOFILE#default.*.}
+ [ -e "$DOFILE" -o "$DOFILE" = default.do ] && break
+ done
+ EXT=${DOFILE#default}
+ EXT=${EXT%.do}
+ BASE=${1%$EXT}
+}
+
+
+_find_dofile()
+{
+ PREFIX=
+ while :; do
+ _find_dofile_pwd "$1"
+ [ -e "$DOFILE" ] && break
+ [ "$PWD" = "/" ] && break
+ TARGET=${PWD##*/}/$TARGET
+ PREFIX=${PWD##*/}/$PREFIX
+ cd ..
+ done
+ BASE=$PREFIX$BASE
+}
+
+
+_run_dofile()
+{
+ export DO_DEPTH="$DO_DEPTH "
+ export REDO_TARGET=$PWD/$TARGET
+ set -e
+ read line1 <"$PWD/$DOFILE"
+ cmd=${line1#"#!/"}
+ if [ "$cmd" != "$line1" ]; then
+ /$cmd "$PWD/$DOFILE" "$@" >"$TARGET.tmp2"
+ else
+ . "$PWD/$DOFILE" >"$TARGET.tmp2"
+ fi
+}
+
+
+_do()
+{
+ DIR=$1
+ TARGET=$2
+ if [ ! -e "$TARGET" ] || [ -e "$TARGET/." -a ! -e "$TARGET.did" ]; then
+ printf '%sdo %s%s%s%s\n' \
+ "$GREEN" "$DO_DEPTH" "$BOLD" "$DIR$TARGET" "$PLAIN" >&2
+ echo "$PWD/$TARGET" >>"$DO_BUILT"
+ DOFILE=$TARGET.do
+ BASE=$TARGET
+ EXT=
+ [ -e "$TARGET.do" ] || _find_dofile "$TARGET"
+ if [ ! -e "$DOFILE" ]; then
+ echo "do: $TARGET: no .do file" >&2
+ return 1
+ fi
+ [ ! -e "$DO_BUILD" ] || : >>"$TARGET.did"
+ ( _run_dofile "$BASE" "$EXT" "$TARGET.tmp" )
+ RV=$?
+ if [ $RV != 0 ]; then
+ printf "do: %s%s\n" "$DO_DEPTH" \
+ "$DIR$TARGET: got exit code $RV" >&2
+ rm -f "$TARGET.tmp" "$TARGET.tmp2"
+ return $RV
+ fi
+ mv "$TARGET.tmp" "$TARGET" 2>/dev/null ||
+ ! test -s "$TARGET.tmp2" ||
+ mv "$TARGET.tmp2" "$TARGET" 2>/dev/null
+ rm -f "$TARGET.tmp2"
+ else
+ echo "do $DO_DEPTH$TARGET exists." >&2
+ fi
+}
+
+
+redo()
+{
+ for i in "$@"; do
+ _dirsplit "$i"
+ ( cd "$dir" && _do "$dir" "$base" ) || return 1
+ done
+}
+
+
+set -e
+redo "$@"
+
+if [ -n "$DO_TOP" ]; then
+ echo "Removing stamp files..." >&2
+ [ ! -e "$DO_BUILT" ] ||
+ while read f; do printf "%s.did\0" "$f"; done <"$DO_BUILT" |
+ xargs -0 rm -f 2>/dev/null
+fi