shake

minimal build system that generates Ninja build files

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

commit 7150ba7ee340879ddeb2af280858b59c8dba102b
parent c20d3465ce39563a4424994fa5edf1b38b5882ac
Author: Jul <jul@9o.is>
Date:   Thu, 12 Mar 2026 21:31:36 +0800

move inlining from shell to awk

Diffstat:
Mshake | 24+++---------------------
Mshakeout.awk | 33++++++++++++++++++++++++++++-----
2 files changed, 31 insertions(+), 26 deletions(-)

diff --git a/shake b/shake @@ -127,18 +127,12 @@ shake() { } var() { - _v1=$1 - shift - inline _vs $* - printf 'shake:var %s %s\n' "$_v1" "$_vs" - eval "$_v1='\$$_v1'" + printf 'shake:var %s %s\n' "$1" "${*:2}" + eval "$1='\$$1'" } bind() { - _v1=$1 - shift - inline _vs $* - printf 'shake:bind %s %s\n' "$_v1" "$_vs" + printf 'shake:bind %s %s\n' "$1" "${*:2}" } build() { @@ -215,18 +209,6 @@ prefix() { eval "$_var='$_vs'" } -inline() { - _var=$1 - _vs= - shift - - for _v in $*; do - _vs="$_vs $_v" - done - - eval "$_var='$_vs'" -} - error() { printf "shake: %s: %s\n" "$DIR" "$*" >&2 exit 1 diff --git a/shakeout.awk b/shakeout.awk @@ -4,33 +4,56 @@ function print_tail(start, i) { } } +function reset() { + state = "" + printf "\n" +} + +BEGIN { + state = "" +} + /^shake:build / { - printf "\nbuild %s", $2 + reset() + printf "build %s", $2 print_tail(3) + state = "inline" next } /^shake:var / { - printf "\n%s =", $2 + reset() + printf "%s =", $2 print_tail(3) + state = "inline" next } /^shake:bind / { - printf "\n %s =", $2 + reset() + printf " %s =", $2 print_tail(3) + state = "inline" next } /^shake:default / { - printf "\ndefault %s", $2 + reset() + printf "default %s", $2 print_tail(3) + state = "inline" next } /^shake:(rule|subninja) / { + reset() split($1, parts, ":") - printf "\n%s %s", parts[2], $2 + printf "%s %s", parts[2], $2 + next +} + +state == "inline" { + print_tail(1) next }