SHELL = /usr/bin/bash .ONESHELL: ATT = $(EXE:=.att) CAL = $(EXE:=.cal) CCG = $(EXE:=.ccg) BST = $(basename $(shell grep -l 'include.*boost' $(SRC))) DAT = $(EXE:=.dat) DEP = $(foreach i,$(EXE:=.d),.$(i)) EXE = $(basename $(SRC)) LOG = $(EXE:=.log) PTH = $(basename $(shell grep -l 'pthread_create' $(SRC))) REC = $(EXE:=.rec) SRC = $(wildcard *.c *.cc) VER = $(EXE:=.ver) CFLAGS = -g -march=native -MF .$*.d -MMD -MP -O3 -Wall CXXFLAGS = $(CFLAGS) all: exe @if make -qs $(LOG); then make -s sort else make -s programa fi att: $(ATT) clave: @printf "%48s\n" | tr ' ' '-' echo " mensajes: suma de los mensajes emitidos = número de señales" echo " tiempo: tiempo de cpu consumido (usuario + núcleo)" echo " ratio: mensajes / tiempo" printf "%48s\n" | tr ' ' '-' printf "%12s%12s%12s%12s\n" programa mensajes tiempo ratio printf "%48s\n" | tr ' ' '-' clean: -rm -fv $(ATT) $(CAL) $(CCG) $(DAT) $(DEP) $(EXE) $(LOG) $(REC) perf.data* *~ -find -mindepth 2 -maxdepth 2 -name makefile -execdir make $@ \; dat: $(DAT) exe: $(EXE) log: $(LOG) @for i in $^; do printf "[$$i]%32s\n" | tr ' ' '-' cat $$i done mensajes: clave @make -s ver | sort -k 2,2nr -k 3,3n -k 4,4nr programa: clave ver ratio: clave @make -s ver | sort -k 4,4nr -k 3,3n -k 2,2nr sort: ratio tiempo: clave @make -s ver | sort -k 3,3n -k 4,4nr -k 2,2nr ver: $(VER) $(BST): LDLIBS += -lboost_chrono -lboost_context -lboost_fiber -lboost_system -lboost_thread $(PTH): LDLIBS += -lpthread %.att: % objdump -Cd $< > $@ %.cal: % -valgrind --branch-sim=yes --cacheuse=yes --callgrind-out-file=$@ --cache-sim=yes --collect-jumps=yes --demangle=yes --dump-instr=yes --instr-atstart=yes -q --separate-threads=yes --tool=callgrind --trace-jump=yes ./$< %.ccg: % valgrind --cachegrind-out-file=$@ --trace-children=yes --tool=cachegrind ./$< %.cga: %.ccg cg_annotate --auto=yes $< %.dat %.log: % @/usr/bin/time -f "%U %S" ./$< 2> $*.dat | grep -v 'Temporizador' 2> /dev/null | sort | uniq -c > $*.log sed -i '/terminated/d' $*.dat %.kcg: %.cal kcachegrind $< %.ltrace: % @printf "%79s\n \t$*\n%79s\n" | tr ' ' '#' ltrace -cf ./$< |& c++filt | cut -c 1-$$(tput cols) %.perf: %.rec perf report -g 'graph,0.5,caller' -i $< %.rec: % -perf record --call-graph dwarf --freq=max -o $@ -- ./$< %.strace: % @printf "%79s\n \t$*\n%79s\n" | tr ' ' '#' strace -cf -qq ./$< |& c++filt | cut -c 1-$$(tput cols) %.trace: % @printf "%79s\n \t$*\n%79s\n" | tr ' ' '#' ltrace -cfS ./$< |& c++filt | cut -c 1-$$(tput cols) %.ver: %.dat %.log @n=0; while read i j; do (( n += i )); done < $*.log t=0; while read u s; do t=$$(bc -l <<< "$$u + $$s"); done < $*.dat printf "%12s%12s%12s%12s\n" "$*" "$$n" "$$t" "$$(bc <<< "$$n / $$t")" -include $(DEP) .PHONY: all att clean exe log mensajes ratio sort programa ver .PRECIOUS: $(CAL) $(CCG) $(DAT) $(LOG) $(REC)