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