shake

minimal build system that generates Ninja build files

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

commit 8f640e3e3247fb4a7c33634d15d35191abd9e435
parent 6f7052b93ba3f1ad248c212add06d9861f2d0b24
Author: Jul <jul@9o.is>
Date:   Sun, 15 Mar 2026 16:31:27 +0800

save ninja files to .shake directory

Diffstat:
Mexample/nested/.gitignore | 2+-
Mexample/simple/.gitignore | 2+-
Mshake | 31++++++++++++++++---------------
3 files changed, 18 insertions(+), 17 deletions(-)

diff --git a/example/nested/.gitignore b/example/nested/.gitignore @@ -1,5 +1,5 @@ .shake/ -*.ninja +build.ninja *.o *.a bin/hello diff --git a/example/simple/.gitignore b/example/simple/.gitignore @@ -1,4 +1,4 @@ .shake/ -*.ninja +build.ninja *.o /hello diff --git a/shake b/shake @@ -4,13 +4,12 @@ set -eu SHAKE_BIN="$0" TARGET= TARGET_ROUTE= -BUILDDIR=.shake +SHAKEDIR=./.shake DIR=. OUTDIR=. -NINJA_FN=local -NINJA_FILES=$DIR/$NINJA_FN.ninja +NINJA_FILES=$SHAKEDIR/local.ninja GEN_FILES="./Shakefile $SHAKE_BIN" -GEN_OUTS=$DIR/$NINJA_FN.ninja +GEN_OUTS=$SHAKEDIR/local.ninja usage() { printf "usage: shake [options] [directory] @@ -88,25 +87,27 @@ _shake_out() { } sub() { - printf 'subninja $dir/%s.ninja\n' "$1" + printf 'subninja %s/%s.ninja\n' "$SHAKEDIR" "$1" { [ "${2-}" ] && eval "$2 $1" $1 [ "${3-}" ] && eval "$3 $1" - } | _shake_out "$DIR" "$OUTDIR" "$DIR/$1.ninja" + } | _shake_out "$DIR" "$OUTDIR" "$SHAKEDIR/$1.ninja" } shake() { - printf 'subninja $dir/%s/%s.ninja\n' "$1" "$NINJA_FN" + printf 'subninja %s/%s/local.ninja\n' "$SHAKEDIR" "$1" NINJA_FILES="$NINJA_FILES $dir/$1/ninja" if in_target_route $1; then + mkdir -p $SHAKEDIR/$1 { DIR=$DIR/$1 OUTDIR=$OUTDIR/$1 - NINJA_FILES=$DIR/$NINJA_FN.ninja + SHAKEDIR=$SHAKEDIR/$1 GEN_FILES="$GEN_FILES $DIR/Shakefile" - GEN_OUTS=$DIR/$NINJA_FN.ninja + GEN_OUTS=$SHAKEDIR/local.ninja + NINJA_FILES=$SHAKEDIR/local.ninja var dir $dir/$1 var outdir $outdir/$1 @@ -115,7 +116,7 @@ shake() { . $DIR/Shakefile [ "${2-}" ] && eval "$3 $1" fini_gen - } | _shake_out "$DIR/$1" "$OUTDIR/$1" "$DIR/$1/$NINJA_FN.ninja" & + } | _shake_out "$DIR/$1" "$OUTDIR/$1" "$SHAKEDIR/$1/local.ninja" & fi } @@ -231,7 +232,7 @@ fi # recursively check if there's a build directory PWD="$(pwd)" ROOTDIR="$PWD" -while [ ! -d "$ROOTDIR/$BUILDDIR" ]; do +while [ ! -d "$ROOTDIR/$SHAKEDIR" ]; do if [ ! "$ROOTDIR" ]; then ROOTDIR="$(pwd)" break @@ -265,11 +266,11 @@ if [ "$TARGET" ]; then set_target_route $TARGET fi -mkdir -p $BUILDDIR +mkdir -p $SHAKEDIR { var ninja_required_version 1.8 - var builddir $BUILDDIR + var builddir $SHAKEDIR var dir $DIR var outdir $OUTDIR @@ -284,9 +285,9 @@ mkdir -p $BUILDDIR phony build.ninja: ninja bind generator 1 -} | _shake_out "$DIR" "$OUTDIR" "$DIR/$NINJA_FN.ninja" +} | _shake_out "$DIR" "$OUTDIR" "$SHAKEDIR/local.ninja" if [ ! -L build.ninja ]; then rm -f build.ninja - ln -s local.ninja build.ninja + ln -s $SHAKEDIR/local.ninja build.ninja fi