SHELL := $(shell which bash) .ONESHELL: ATT = $(EXE:=.att) EXE = $(basename $(SRC)) GBM = $(basename $(shell grep -l benchmark.h $(SRC))) DEP = $(foreach i,$(EXE:=.d),.$i) SRC = $(sort $(wildcard *.cc)) CXXFLAGS = -flto -fno-exceptions -g -march=native -MF .$*.d -MMD -MP -O3 -std=c++23 -Wall $(GBM): CXXFLAGS += $(shell pkg-config --cflags benchmark) $(GBM): LDLIBS += $(shell pkg-config --libs benchmark) all: att test att: $(ATT) clean: -rm -fv $(ATT) $(DEP) $(EXE) $(GBM) {,vg}core{,.*} *~ -find -mindepth 2 -maxdepth 2 -iname makefile -execdir make $@ \; exe: $(EXE) leak: $(EXE) -@for i in $^; do make $$i.leak &> /dev/null if [ "$$?" == "0" ]; then echo "$$i no leaks" else echo "$$i LEAKS!!!" fi done run: $(EXE) @for i in $^; do printf "\e[32m%64s\n _$${i}\n%64s\n\e[0m" | tr ' _' '# ' ./$$i done test: $(filter-out $(GBM),$(EXE)) @for i in $^; do ./$$i 1> /tmp/$$i.tmp 2> /dev/null ret=$$? if [[ "$$ret" != "0" ]]; then printf '\e[1;31m' fi printf '%16s --> %i : ' $$i $$ret cat /tmp/$$i.tmp rm -f /tmp/$$i.tmp printf '\e[0m' done %.att: % objdump -Cd $< > $@ %.leak: % # -valgrind --leak-check=full --show-error-list=yes --show-leak-kinds=all --track-origins=yes --verbose ./$< -valgrind --leak-check=summary --show-leak-kinds=all --track-origins=yes ./$< %.ltrace: % ltrace -cfS ./$< |& c++filt -include $(DEP) .PHONY: all att clean exe leak run test .PRECIOUS: $(DEP)