shake

minimal build system that generates Ninja build files

git clone https://9o.is/git/shake.git

commit a0dd193ed9246ea8069769afa619d119d2a8be5e
parent be28ad60ce28d10b34e2ec35b302b49f881a31c9
Author: Jul <jul@9o.is>
Date:   Thu, 12 Mar 2026 19:58:16 +0800

introduce awk script

Diffstat:
Mshake | 18+++++++++---------
Ashakeout.awk | 39+++++++++++++++++++++++++++++++++++++++
2 files changed, 48 insertions(+), 9 deletions(-)

diff --git a/shake b/shake @@ -83,7 +83,7 @@ shakeout() { _f=$3 if [ ! "$TARGET" ] || [ $TARGET = "$1" ]; then printf '' >$_f.tmp - $(type -P cat) >$_f.tmp + $(type -P awk) -f $SHAKE_LIB/shakeout.awk >$_f.tmp if cmp -s $_f.tmp $_f; then rm -f $_f.tmp else @@ -95,7 +95,7 @@ shakeout() { } sub() { - printf 'subninja $dir/%s.ninja\n' "$1" + printf 'shake:subninja $dir/%s.ninja\n' "$1" { [ "${2-}" ] && eval "$2 $1" $1 @@ -104,7 +104,7 @@ sub() { } shake() { - printf 'subninja $dir/%s/%s.ninja\n' "$1" "$NINJA_FN" + printf 'shake:subninja $dir/%s/%s.ninja\n' "$1" "$NINJA_FN" NINJA_FILES="$NINJA_FILES $dir/$1/ninja" if in_target_route $1; then @@ -130,7 +130,7 @@ var() { _v1=$1 shift inline _vs $* - printf '%s = %s\n' "$_v1" "$_vs" + printf 'shake:var %s %s\n' "$_v1" "$_vs" eval "$_v1='\$$_v1'" } @@ -138,7 +138,7 @@ bind() { _v1=$1 shift inline _vs $* - printf ' %s = %s\n' "$_v1" "$_vs" + printf 'shake:bind %s %s\n' "$_v1" "$_vs" } build() { @@ -147,7 +147,7 @@ build() { shift 2 prefix _vs $dir $* build_parse $_vs - printf 'build %s: %s %s %s %s\n' "$_v2" "$_v1" "$_vs" "$_vd" "$_vo" + printf 'shake:build %s: %s %s %s %s\n' "$_v2" "$_v1" "$_vs" "$_vd" "$_vo" } build_parse() { @@ -174,7 +174,7 @@ rule() { _rule=$1 _cmd="$2" - printf 'rule %s\n' "$_rule" + printf 'shake:rule %s\n' "$_rule" bind command "$_cmd" _d= @@ -189,13 +189,13 @@ rule() { default() { prefix _v $dir $1 - printf 'default %s\n' "$_v" + printf 'shake:default %s\n' "$_v" } phony() { prefix _v $dir $1 shift - printf 'build %s: phony %s\n' "$_v" "$*" + printf 'shake:build %s: phony %s\n' "$_v" "$*" } prefix() { diff --git a/shakeout.awk b/shakeout.awk @@ -0,0 +1,39 @@ +function print_tail(start, i) { + for(i=start; i<=NF; i++) { + printf " %s", $i + } +} + +/^shake:build / { + printf "\nbuild %s", $2 + print_tail(3) + next +} + +/^shake:var / { + printf "\n%s =", $2 + print_tail(3) + next +} + +/^shake:bind / { + printf "\n %s =", $2 + print_tail(3) + next +} + +/^shake:default / { + printf "\ndefault %s", $2 + print_tail(3) + next +} + +/^shake:(rule|subninja) / { + split($1, parts, ":") + printf "\n%s %s", parts[2], $2 + next +} + +END { + print "" +}