shake

minimal build system that generates Ninja build files

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

commit 1a3315ffeff541663ead15e76439902a471b783f
parent 55c931e4bc4ad378deaf09a7bcb0f318feb6e4a6
Author: Jul <jul@9o.is>
Date:   Mon,  9 Mar 2026 20:49:19 +0800

cd to root directory and set target on child

Diffstat:
Mshake | 68++++++++++++++++++++++++++++++++++++++++++++------------------------
1 file changed, 44 insertions(+), 24 deletions(-)

diff --git a/shake b/shake @@ -3,6 +3,7 @@ set -eu SHAKE_BIN="$0" TARGET= +TARGET_ROUTE= BUILDDIR=.shake DIR=. OUTDIR=. @@ -45,15 +46,11 @@ while [ $# -gt 0 ]; do *) [ $# -gt 1 ] && usage TARGET="$1" + shift ;; esac done -if [ ! -f Shakefile ]; then - printf "shake: cannot find Shakefile\n" >&2 - exit 1 -fi - init_file() { if persist && [ -e $DIR/$NINJA_FILE.tmp ]; then rm -f $DIR/$NINJA_FILE.tmp @@ -83,24 +80,6 @@ import() { . $DIR/$1 } -set_target() { - TARGET_ROUTE= - - case "$TARGET" in - .|./) - TARGET=. - ;; - '') - return - ;; - *) - TARGET=${1%/} - TARGET=./${TARGET#./} - set_target_route $TARGET - ;; - esac -} - set_target_route() { TARGET_ROUTE="$TARGET_ROUTE $1" if [ $1 = . ]; then return; fi @@ -284,7 +263,48 @@ foreach() { GEN_FILES="$GEN_FILES $DIR/$1" } -set_target +if [ "$TARGET" ] && [ ! -f "$TARGET/Shakefile" ]; then + printf "shake: target is missing Shakefile: %s\n" "$TARGET" >&2 + exit 1 +fi + +# recursively check if there's a build directory +PWD="$(pwd)" +ROOTDIR="$PWD" +while [ ! -d "$ROOTDIR/$BUILDDIR" ]; do + if [ "$ROOTDIR" = '/' ]; then + ROOTDIR="$(pwd)" + break + fi + + ROOTDIR="${ROOTDIR%/*}" +done + +if [ "$ROOTDIR" != "$PWD" ]; then + TARGET="${PWD#$ROOTDIR}/$TARGET" + cd "$ROOTDIR" 2>/dev/null || { + printf "shake: cannot change to root directory: %s\n" "$ROOTDIR" >&2 + exit 1 + } + PWD="$(pwd)" +fi + +if [ ! -f Shakefile ]; then + printf "shake: cannot find %s/Shakefile\n" "$PWD" >&2 + exit 1 +fi + +case "$TARGET" in +'') ;; +.|./) TARGET=.;; +*) + TARGET=${TARGET%/} + TARGET=${TARGET#/} + TARGET=./${TARGET#./} + set_target_route $TARGET + ;; +esac + init_file var ninja_required_version 1.8