divert(-1) changequote([,]) define([getenv], [ define([$1], [esyscmd([echo -n $$1])]) ifelse($1, , [ ifelse($2, , [undefine([$1])], [define([$1], [$2])]) ])]) dnl For installing getenv([PREFIX], [./testprefix]) getenv([INCLUDEDIR], [PREFIX/include]) getenv([LIBDIR], [PREFIX/lib]) getenv([PROD]) divert(0) cflags = ifdef([PROD], [], [-Wall -Wextra -g]) -std=c99 -D_DEFAULT_SOURCE bin = build 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 # installing # TODO: make copying better and abstract this somehow pattern = dir = rule cpy_to_dir command = cp $$(/bin/ls $pattern 2> /dev/null) $dir 2> /dev/null build force: phony build $bin/files.dd: m4 scanbuild.m4 | force m4flags = -D BIN=$bin -D [LIBDIR]=LIBDIR -D [INCLUDEDIR]=INCLUDEDIR build libs: cpy_to_dir || $bin/files.dd dir = LIBDIR pattern = $bin/*.{so,a} dyndep = $bin/files.dd build includes: cpy_to_dir || $bin/files.dd dir = INCLUDEDIR pattern = $bin/*.h dyndep = $bin/files.dd # 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 install: phony libs includes build clean: ninja_clean build test: valgrind $bin/test 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