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