Add a simple test target
[perf-null.git] / Makefile
1 PROGS = \
2         asm/null \
3         c/c-diet-null \
4         c/c-libc-static-null c/c-libc-dynamic-null \
5         c/c++-static-null c/c++-dynamic-null \
6         haskell/null-single haskell/null-threaded \
7         ocaml/null-byte ocaml/null-opt \
8         java/null-gcj-4.6 java/null-gcj-4.8 \
9         java/null-gcj-4.9 java/null-gcj-5
10
11 SCRIPTS = \
12         dash/null.dash bash/null.bash \
13         mksh/null.mksh mksh/null.mksh-static \
14         lua/null.lua51 lua/null.lua52 lua/null.luajit \
15         perl/null.pl \
16         awk/null.mawk awk/null.gawk \
17         ruby/null.rb18 ruby/null.rb19 \
18         php/null.php php/null.php-n \
19         tcl/null.tcl84 tcl/null.tcl85 tcl/null.tcl86
20
21 #METRICS = \
22 #       cycles,instructions,branches,branch-misses \
23 #       dtlb-loads,dtlb-load-misses,itlb-loads,itlb-load-misses \
24 #       cycles,instructions,cache-references,cache-misses \
25 #       cycles,instructions,stalled-cycles-frontend,stalled-cycles-backend
26
27 METRICS = cycles,instructions,branches,branch-misses,cpu-clock,task-clock,major-faults,minor-faults,cs
28
29 JAVA_VMS = server zero cacao jamvm
30 # see below for how this is called
31 JAVA_INVOCS = $(JAVA_VMS:%="java -cp java -% Null")
32
33 PYTHON_VERSIONS ?= python2.7 python3.4 pypy
34 PYTHON_VARIANTS = "" -O -S
35 PYTHON_INVOCS = $(foreach py,$(PYTHON_VERSIONS), \
36         $(foreach opt,$(PYTHON_VARIANTS), "$(py) $(opt) python/null.py"))
37
38 EXTRA_RUN = /bin/true
39
40 ALL_TARGETS = \
41   $(PROGS:%=./%) \
42   $(SCRIPTS:%=./%) \
43   $(JAVA_INVOCS) \
44   $(PYTHON_INVOCS) \
45   $(EXTRA_RUN)
46
47 REPS ?= 100
48
49 PERF ?= perf
50
51 all: $(PROGS) java/Null.class
52
53 $(PROGS): Makefile
54
55 asm/null: asm/null.s
56         as -o asm/null.o $<
57         ld -o $@ asm/null.o
58         strip $@
59
60 c-diet-%: %.c
61         diet gcc -O2 -Wall -o $@ $<
62         strip $@
63
64 c-libc-static-%: %.c
65         gcc -static -O2 -Wall -o $@ $<
66         strip $@
67
68 c-libc-dynamic-%: %.c
69         gcc -O2 -Wall -o $@ $<
70         strip $@
71
72 c++-static-%: %.c
73         g++ -static -O2 -Wall -o $@ $<
74         strip $@
75
76 c++-dynamic-%: %.c
77         g++ -O2 -Wall -o $@ $<
78         strip $@
79
80 haskell/null-single: haskell/null.hs
81         ghc --make -O2 -Wall -o $@ $<
82         strip $@
83
84 haskell/null-threaded: haskell/null.hs
85         ghc --make -O2 -Wall -threaded -o $@ $<
86         strip $@
87
88 ocaml/null-byte: ocaml/null.ml
89         ocamlc -o $@ $<
90         # no stripping as this is not an elf file
91
92 ocaml/null-opt: ocaml/null.ml
93         ocamlopt -o $@ $<
94         strip $@
95
96 java/null-gcj-%: java/Null.java
97         gcj-$* --main=Null -o $@ $<
98         strip $@
99
100 java/Null.class: java/Null.java Makefile
101         javac $<
102
103 log: $(PROGS) $(SCRIPTS) java/Null.class Makefile
104         @rm -f log; \
105         for prog in $(ALL_TARGETS); do \
106           echo $$prog; \
107           for metric in $(METRICS); do \
108             LC_ALL=C $(PERF) stat -e "$$metric" -r $(REPS) -o log --append $$prog; \
109           done; \
110         done
111
112 test: $(PROGS) $(SCRIPTS) java/Null.class Makefile
113         @for prog in $(ALL_TARGETS); do \
114           echo $$prog; \
115           $$prog; \
116         done
117
118 clean:
119         cd asm && rm -f *.o
120         cd haskell && rm -f *.hi *.o
121         cd ocaml && rm -f *.cmo *.cmi *.cmx *.o
122         cd java && rm -f *.class
123         rm -f $(PROGS)
124
125 report:
126         LC_ALL=en_US.UTF-8 awk -f dump.awk log
127
128 .PHONY: log clean report test