divert(-1) changequote([,]) define([getenv], [ define([$1], [esyscmd([echo -n $$1])]) ifelse($1, , [undefine([$1])]) ]) getenv([PROD]) getenv([BIN]) divert(0) cflags = ifdef([PROD], [], [-Wall -Wextra -g]) -std=c99 -D_DEFAULT_SOURCE bin = ifdef([BIN], [BIN], [bin]) m4flags = # building rule cc command = gcc $cflags $in -o $out rule obj command = gcc -MD -MF $out.d $cflags -c $in -o $out depfile = $out.d rule ar command = ar rcs $out $in rule m4 command = m4 $m4flags $in > $out rule cpy command = cp $in $out build $bin/msgpack.o: obj msgpack.c build $bin/msgpack.h: cpy msgpack.h build $bin/libmsgpack.a: ar $bin/msgpack.o build $bin/libmsgpack.so: cc $bin/msgpack.o cflags = $cflags -fPIC -shared build $bin/libmsgpack.h: m4 msgpack.h | msgpack.c m4flags = -D SOURCE=msgpack.c # testing build $bin/test: cc msgpack.c test.c rule valgrind command = valgrind -s --leak-check=full --show-leak-kinds=all $in # named targets rule ninja_clean command = ninja -t clean build static: phony $bin/libmsgpack.a $bin/msgpack.h build shared: phony $bin/libmsgpack.so $bin/msgpack.h build header: phony $bin/libmsgpack.h build test: valgrind $bin/test build clean: ninja_clean default ifdef([PROD], [static], [test]) # regeneration rule regen command = m4 ninja.m4 > build.ninja generator=1 build build.ninja: regen ninja.m4 build configure: regen