From b676ca6e2f030622333e6f42ccd4ecfe90efb0ad Mon Sep 17 00:00:00 2001 From: tv Date: Tue, 5 Nov 2013 19:34:23 +0100 Subject: ship build: initial commit --- .gitignore | 1 + ship/bin/punani | 3 +-- ship/build | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ship/deploy | 6 +---- ship/lib/punani | 2 +- 5 files changed, 85 insertions(+), 8 deletions(-) create mode 100755 ship/build diff --git a/.gitignore b/.gitignore index b2ebdc11..4a3cb30c 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,4 @@ a.out /ovh/soapi/SOAPpy /Reaktor/IRC/irclib.py /Reaktor/public_commands/* +/ship/out 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_= -- cgit v1.2.3