summaryrefslogtreecommitdiffstats
path: root/ship
diff options
context:
space:
mode:
Diffstat (limited to 'ship')
-rwxr-xr-xship/bin/punani3
-rwxr-xr-xship/build81
-rwxr-xr-xship/deploy6
-rw-r--r--ship/lib/punani2
4 files changed, 84 insertions, 8 deletions
diff --git a/ship/bin/punani b/ship/bin/punani
index 1e3fab87..99a5a813 100755
--- a/ship/bin/punani
+++ b/ship/bin/punani
@@ -1,4 +1,3 @@
#!/bin/sh
-# include core
-# include punani
+#@include punani
punani "$@"
diff --git a/ship/build b/ship/build
new file mode 100755
index 00000000..6c26e6f3
--- /dev/null
+++ b/ship/build
@@ -0,0 +1,81 @@
+#! /bin/sh
+set -euf
+
+## SYNOPSIS
+# build compile SRCFILE DSTFILE
+# build deps SRCFILE
+build() {
+ case "$1" in
+ compile) build_compile "$2" "$3";;
+ deps) build_deps "$2";;
+ *) echo "build: $1: bad command" >&2; return 23;;
+ esac
+}
+
+## build directives
+build_include_directive='#@include \([0-9A-Za-z]\+\)'
+
+## usage: build_compile SRCFILE DSTFILE
+build_compile() {
+ cp "$1" "$2"
+
+ while needs_compilation "$2"; do
+ script="$(make_sedscript_maker_shellscript "$2" | sh)"
+ sed -n "$script" "$2" >"$2.tmp"
+ mv "$2.tmp" "$2"
+ done
+
+ chmod +x "$2"
+}
+
+## usage: needs_compilation SRCFILE
+# Returns true if SRCFILE contains compilation directives.
+needs_compilation() {
+ grep -q "^$build_include_directive$" "$1"
+}
+
+## usage: make_sedscript_maker_shellscript SRCFILE
+# Print a shellscript that creates a sedscript that resolves all the build
+# directives in SRCFILE.
+make_sedscript_maker_shellscript() {
+ echo 'set -euf'
+ deps="$(build_deps "$1")"
+ for lib in $deps; do
+ echo "_build_include_$(basename $lib)=$lib"
+ done
+ nl -b a -s ' ' "$1" |
+ sed '
+ s:^ *::
+ s:^\([0-9]\+\) '"$build_include_directive"'$:\1a\\\\\
+# BEGIN \2\
+ \1r\$_build_include_\2\
+ \1a\\\\\
+# END \2:
+ s:^\([0-9]\+\) .*:\1p:
+
+ 1s:^:echo ":
+ $s:$:":
+ '
+}
+
+## usage: build_deps SRCFILE
+build_deps() {
+ for libname in $(sed -n 's:^'"$build_include_directive"'$:\1:p' "$1"); do
+ build_resolve "$libname"
+ done
+}
+
+## usage: build_resolve LIBNAME
+build_resolve() {
+ echo "$BUILD_PATH" | tr : \\n |
+ xargs -I: printf '%s/%s\n' : "$1" |
+ xargs -I: ls -d : 2>/dev/null |
+ head -n 1 |
+ grep . ||
+ {
+ echo "build resolve: $1: library not found" >&2
+ return 23
+ }
+}
+
+build "$@"
diff --git a/ship/deploy b/ship/deploy
index 5c282398..0f3e5219 100755
--- a/ship/deploy
+++ b/ship/deploy
@@ -4,11 +4,7 @@ cd $(dirname $0)
bindir=$PWD/bin/
libdir=$PWD/lib/
outdir=$PWD/out/
-# Hill-Billy style package builder
for file in `ls -1 $bindir`;do
- # cat every lib and the file itself afterwards into outfile
- find $libdir -type f -exec cat '{}' \; > $outdir/$file
- cat $bindir/$file >> $outdir/$file
+ BUILD_PATH=$libdir ./build compile bin/$file out/$file
chmod 755 $outdir/$file
done
-
diff --git a/ship/lib/punani b/ship/lib/punani
index beaee27c..e4a5a5e9 100644
--- a/ship/lib/punani
+++ b/ship/lib/punani
@@ -1,5 +1,5 @@
#!/bin/sh
-#include core
+#@include core
## begin punani DB
_punanidb_pacman_=