edit
[c11concurrency-benchmarks.git] / silo / Makefile
1 -include config.mk
2
3 ### Options ###
4
5 CC=../gcc
6 CXX=../g++
7
8 DEBUG ?= 0
9 CHECK_INVARIANTS ?= 0
10
11 # 0 = libc malloc
12 # 1 = jemalloc
13 # 2 = tcmalloc
14 # 3 = flow
15 USE_MALLOC_MODE ?= 1
16
17 MYSQL ?= 1
18 MYSQL_SHARE_DIR ?= /x/stephentu/mysql-5.5.29/build/sql/share
19
20 # Available modes
21 #   * perf
22 #   * backoff
23 #   * factor-gc
24 #   * factor-gc-nowriteinplace
25 #   * factor-fake-compression
26 #   * sandbox
27 MODE ?= perf
28
29 # run with 'MASSTREE=0' to turn off masstree
30 MASSTREE ?= 1
31
32 ###############
33
34 DEBUG_S=$(strip $(DEBUG))
35 CHECK_INVARIANTS_S=$(strip $(CHECK_INVARIANTS))
36 EVENT_COUNTERS_S=$(strip $(EVENT_COUNTERS))
37 USE_MALLOC_MODE_S=$(strip $(USE_MALLOC_MODE))
38 MODE_S=$(strip $(MODE))
39 MASSTREE_S=$(strip $(MASSTREE))
40 MASSTREE_CONFIG:=--enable-max-key-len=1024
41
42 ifeq ($(DEBUG_S),1)
43         OSUFFIX_D=.debug
44         MASSTREE_CONFIG+=--enable-assertions
45 else
46         MASSTREE_CONFIG+=--disable-assertions
47 endif
48 ifeq ($(CHECK_INVARIANTS_S),1)
49         OSUFFIX_S=.check
50         MASSTREE_CONFIG+=--enable-invariants --enable-preconditions
51 else
52         MASSTREE_CONFIG+=--disable-invariants --disable-preconditions
53 endif
54 ifeq ($(EVENT_COUNTERS_S),1)
55         OSUFFIX_E=.ectrs
56 endif
57 OSUFFIX=$(OSUFFIX_D)$(OSUFFIX_S)$(OSUFFIX_E)
58
59 ifeq ($(MODE_S),perf)
60         O := out-perf$(OSUFFIX)
61         CONFIG_H = config/config-perf.h
62 else ifeq ($(MODE_S),backoff)
63         O := out-backoff$(OSUFFIX)
64         CONFIG_H = config/config-backoff.h
65 else ifeq ($(MODE_S),factor-gc)
66         O := out-factor-gc$(OSUFFIX)
67         CONFIG_H = config/config-factor-gc.h
68 else ifeq ($(MODE_S),factor-gc-nowriteinplace)
69         O := out-factor-gc-nowriteinplace$(OSUFFIX)
70         CONFIG_H = config/config-factor-gc-nowriteinplace.h
71 else ifeq ($(MODE_S),factor-fake-compression)
72         O := out-factor-fake-compression$(OSUFFIX)
73         CONFIG_H = config/config-factor-fake-compression.h
74 else ifeq ($(MODE_S),sandbox)
75         O := out-sandbox$(OSUFFIX)
76         CONFIG_H = config/config-sandbox.h
77 else
78         $(error invalid mode)
79 endif
80
81 CXXFLAGS := -g -std=c++0x
82 CXXFLAGS += -MD -Ithird-party/lz4 -DCONFIG_H=\"$(CONFIG_H)\"
83 ifeq ($(DEBUG_S),1)
84         CXXFLAGS += -fno-omit-frame-pointer -DDEBUG
85 else
86         CXXFLAGS += -O2 -funroll-loops -fno-omit-frame-pointer
87 endif
88 ifeq ($(CHECK_INVARIANTS_S),1)
89         CXXFLAGS += -DCHECK_INVARIANTS
90 endif
91 ifeq ($(EVENT_COUNTERS_S),1)
92         CXXFLAGS += -DENABLE_EVENT_COUNTERS
93 endif
94 ifeq ($(MASSTREE_S),1)
95         CXXFLAGS += -DNDB_MASSTREE -include masstree/config.h
96         OBJDEP += masstree/config.h
97         O := $(O).masstree
98 else
99         O := $(O).silotree
100 endif
101
102 TOP     := $(shell echo $${PWD-`pwd`})
103 LDFLAGS := -lpthread -lnuma -lrt
104
105 LZ4LDFLAGS := -Lthird-party/lz4 -llz4 -Wl,-rpath,$(TOP)/third-party/lz4
106
107 ifeq ($(USE_MALLOC_MODE_S),1)
108         CXXFLAGS+=-DUSE_JEMALLOC
109         LDFLAGS+=-ljemalloc
110         MASSTREE_CONFIG+=--with-malloc=jemalloc
111 else ifeq ($(USE_MALLOC_MODE_S),2)
112         CXXFLAGS+=-DUSE_TCMALLOC
113         LDFLAGS+=-ltcmalloc
114         MASSTREE_CONFIG+=--with-malloc=tcmalloc
115 else ifeq ($(USE_MALLOC_MODE_S),3)
116         CXXFLAGS+=-DUSE_FLOW
117         LDFLAGS+=-lflow
118         MASSTREE_CONFIG+=--with-malloc=flow
119 else
120         MASSTREE_CONFIG+=--with-malloc=malloc
121 endif
122
123 ifneq ($(strip $(CUSTOM_LDPATH)), )
124         LDFLAGS+=$(CUSTOM_LDPATH)
125 endif
126
127 SRCFILES = allocator.cc \
128         btree.cc \
129         core.cc \
130         counter.cc \
131         memory.cc \
132         rcu.cc \
133         stats_server.cc \
134         thread.cc \
135         ticker.cc \
136         tuple.cc \
137         txn_btree.cc \
138         txn.cc \
139         txn_proto2_impl.cc \
140         varint.cc
141
142 ifeq ($(MASSTREE_S),1)
143 MASSTREE_SRCFILES = masstree/compiler.cc \
144         masstree/str.cc \
145         masstree/string.cc \
146         masstree/straccum.cc \
147         masstree/json.cc
148 endif
149
150 OBJFILES := $(patsubst %.cc, $(O)/%.o, $(SRCFILES))
151
152 MASSTREE_OBJFILES := $(patsubst masstree/%.cc, $(O)/%.o, $(MASSTREE_SRCFILES))
153
154 BENCH_CXXFLAGS := $(CXXFLAGS)
155 BENCH_LDFLAGS := $(LDFLAGS) -ldb_cxx -lz -lrt -lcrypt -laio -ldl -lssl -lcrypto
156
157 BENCH_SRCFILES = benchmarks/bdb_wrapper.cc \
158         benchmarks/bench.cc \
159         benchmarks/encstress.cc \
160         benchmarks/bid.cc \
161         benchmarks/masstree/kvrandom.cc \
162         benchmarks/queue.cc \
163         benchmarks/tpcc.cc \
164         benchmarks/ycsb.cc
165
166 ifeq ($(MYSQL_S),1)
167 BENCH_CXXFLAGS += -DMYSQL_SHARE_DIR=\"$(MYSQL_SHARE_DIR)\"
168 BENCH_LDFLAGS := -L/usr/lib/mysql -lmysqld $(BENCH_LDFLAGS)
169 BENCH_SRCFILES += benchmarks/mysql_wrapper.cc
170 else
171 BENCH_CXXFLAGS += -DNO_MYSQL
172 endif
173
174 BENCH_OBJFILES := $(patsubst %.cc, $(O)/%.o, $(BENCH_SRCFILES))
175
176 NEWBENCH_SRCFILES = new-benchmarks/bench.cc \
177         new-benchmarks/tpcc.cc
178
179 NEWBENCH_OBJFILES := $(patsubst %.cc, $(O)/%.o, $(NEWBENCH_SRCFILES))
180
181 all: $(O)/test
182
183 $(O)/benchmarks/%.o: benchmarks/%.cc $(O)/buildstamp $(O)/buildstamp.bench $(OBJDEP)
184         @mkdir -p $(@D)
185         $(CXX) $(BENCH_CXXFLAGS) -c $< -o $@
186
187 $(O)/benchmarks/masstree/%.o: benchmarks/masstree/%.cc $(O)/buildstamp $(O)/buildstamp.bench $(OBJDEP)
188         @mkdir -p $(@D)
189         $(CXX) $(BENCH_CXXFLAGS) -c $< -o $@
190
191 $(O)/new-benchmarks/%.o: new-benchmarks/%.cc $(O)/buildstamp $(O)/buildstamp.bench $(OBJDEP)
192         @mkdir -p $(@D)
193         $(CXX) $(CXXFLAGS) -c $< -o $@
194
195 $(O)/%.o: %.cc $(O)/buildstamp $(OBJDEP)
196         @mkdir -p $(@D)
197         $(CXX) $(CXXFLAGS) -c $< -o $@
198
199 $(MASSTREE_OBJFILES) : $(O)/%.o: masstree/%.cc masstree/config.h
200         @mkdir -p $(@D)
201         $(CXX) $(CXXFLAGS) -include masstree/config.h -c $< -o $@
202
203 third-party/lz4/liblz4.so:
204         make -C third-party/lz4 library
205
206 .PHONY: test
207 test: $(O)/test
208
209 $(O)/test: $(O)/test.o $(OBJFILES) $(MASSTREE_OBJFILES) third-party/lz4/liblz4.so
210         $(CXX) -o $(O)/test $^ $(LDFLAGS) $(LZ4LDFLAGS)
211
212 .PHONY: persist_test
213 persist_test: $(O)/persist_test
214
215 $(O)/persist_test: $(O)/persist_test.o third-party/lz4/liblz4.so
216         $(CXX) -o $(O)/persist_test $(O)/persist_test.o $(LDFLAGS) $(LZ4LDFLAGS)
217
218 .PHONY: stats_client
219 stats_client: $(O)/stats_client
220
221 $(O)/stats_client: $(O)/stats_client.o
222         $(CXX) -o $(O)/stats_client $(O)/stats_client.o $(LDFLAGS)
223
224 masstree/config.h: $(O)/buildstamp.masstree masstree/configure masstree/config.h.in
225         rm -f $@
226         cd masstree; ./configure $(MASSTREE_CONFIG)
227         if test -f $@; then touch $@; fi
228
229 masstree/configure masstree/config.h.in: masstree/configure.ac
230         cd masstree && autoreconf -i && touch configure config.h.in
231
232 .PHONY: dbtest
233 dbtest: $(O)/benchmarks/dbtest
234
235 $(O)/benchmarks/dbtest: $(O)/benchmarks/dbtest.o $(OBJFILES) $(MASSTREE_OBJFILES) $(BENCH_OBJFILES) third-party/lz4/liblz4.so
236         $(CXX) -o $(O)/benchmarks/dbtest $^ $(BENCH_LDFLAGS) $(LZ4LDFLAGS)
237
238 .PHONY: kvtest
239 kvtest: $(O)/benchmarks/masstree/kvtest
240
241 $(O)/benchmarks/masstree/kvtest: $(O)/benchmarks/masstree/kvtest.o $(OBJFILES) $(BENCH_OBJFILES)
242         $(CXX) -o $(O)/benchmarks/masstree/kvtest $^ $(BENCH_LDFLAGS)
243
244 .PHONY: newdbtest
245 newdbtest: $(O)/new-benchmarks/dbtest
246
247 $(O)/new-benchmarks/dbtest: $(O)/new-benchmarks/dbtest.o $(OBJFILES) $(MASSTREE_OBJFILES) $(NEWBENCH_OBJFILES) third-party/lz4/liblz4.so
248         $(CXX) -o $(O)/new-benchmarks/dbtest $^ $(LDFLAGS) $(LZ4LDFLAGS)
249
250 DEPFILES := $(wildcard $(O)/*.d $(O)/*/*.d $(O)/*/*/*.d masstree/_masstree_config.d)
251 ifneq ($(DEPFILES),)
252 -include $(DEPFILES)
253 endif
254
255 #ifeq ($(wildcard masstree/GNUmakefile.in),)
256 #INSTALL_MASSTREE := $(shell git submodule init; git submodule update)
257 #endif
258
259 #ifeq ($(MASSTREE_S),1)
260 #UPDATE_MASSTREE := $(shell cd ./`git rev-parse --show-cdup` && cur=`git submodule status --cached masstree | head -c 41 | tail -c +2` && if test -z `cd masstree; git rev-list -n1 $$cur^..HEAD 2>/dev/null`; then (echo Updating masstree... 1>&2; cd masstree; git checkout -f master >/dev/null; git pull; cd ..; git submodule update masstree); fi)
261 #endif
262
263 ifneq ($(strip $(DEBUG_S).$(CHECK_INVARIANTS_S).$(EVENT_COUNTERS_S)),$(strip $(DEP_MAIN_CONFIG)))
264 DEP_MAIN_CONFIG := $(shell mkdir -p $(O); echo >$(O)/buildstamp; echo "DEP_MAIN_CONFIG:=$(DEBUG_S).$(CHECK_INVARIANTS_S).$(EVENT_COUNTERS_S)" >$(O)/_main_config.d)
265 endif
266
267 ifneq ($(strip $(MYSQL_S)),$(strip $(DEP_BENCH_CONFIG)))
268 DEP_BENCH_CONFIG := $(shell mkdir -p $(O); echo >$(O)/buildstamp.bench; echo "DEP_BENCH_CONFIG:=$(MYSQL_S)" >$(O)/_bench_config.d)
269 endif
270
271 ifneq ($(strip $(MASSTREE_CONFIG)),$(strip $(DEP_MASSTREE_CONFIG)))
272 DEP_MASSTREE_CONFIG := $(shell mkdir -p $(O); echo >$(O)/buildstamp.masstree; echo "DEP_MASSTREE_CONFIG:=$(MASSTREE_CONFIG)" >masstree/_masstree_config.d)
273 endif
274
275 $(O)/buildstamp $(O)/buildstamp.bench $(O)/buildstamp.masstree:
276         @mkdir -p $(@D)
277         @echo >$@
278
279 .PHONY: clean
280 clean:
281         rm -rf out-*
282         make -C third-party/lz4 clean