15 MYSQL_SHARE_DIR ?= /x/stephentu/mysql-5.5.29/build/sql/share
21 # * factor-gc-nowriteinplace
22 # * factor-fake-compression
26 # run with 'MASSTREE=0' to turn off masstree
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
41 MASSTREE_CONFIG+=--enable-assertions
43 MASSTREE_CONFIG+=--disable-assertions
45 ifeq ($(CHECK_INVARIANTS_S),1)
47 MASSTREE_CONFIG+=--enable-invariants --enable-preconditions
49 MASSTREE_CONFIG+=--disable-invariants --disable-preconditions
51 ifeq ($(EVENT_COUNTERS_S),1)
54 OSUFFIX=$(OSUFFIX_D)$(OSUFFIX_S)$(OSUFFIX_E)
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
78 CXXFLAGS := -g -std=c++0x
79 CXXFLAGS += -MD -Ithird-party/lz4 -DCONFIG_H=\"$(CONFIG_H)\"
81 CXXFLAGS += -fno-omit-frame-pointer -DDEBUG
83 CXXFLAGS += -Werror -O2 -funroll-loops -fno-omit-frame-pointer
85 ifeq ($(CHECK_INVARIANTS_S),1)
86 CXXFLAGS += -DCHECK_INVARIANTS
88 ifeq ($(EVENT_COUNTERS_S),1)
89 CXXFLAGS += -DENABLE_EVENT_COUNTERS
91 ifeq ($(MASSTREE_S),1)
92 CXXFLAGS += -DNDB_MASSTREE -include masstree/config.h
93 OBJDEP += masstree/config.h
99 TOP := $(shell echo $${PWD-`pwd`})
100 LDFLAGS := -lpthread -lnuma -lrt
102 LZ4LDFLAGS := -Lthird-party/lz4 -llz4 -Wl,-rpath,$(TOP)/third-party/lz4
104 ifeq ($(USE_MALLOC_MODE_S),1)
105 CXXFLAGS+=-DUSE_JEMALLOC
107 MASSTREE_CONFIG+=--with-malloc=jemalloc
108 else ifeq ($(USE_MALLOC_MODE_S),2)
109 CXXFLAGS+=-DUSE_TCMALLOC
111 MASSTREE_CONFIG+=--with-malloc=tcmalloc
112 else ifeq ($(USE_MALLOC_MODE_S),3)
115 MASSTREE_CONFIG+=--with-malloc=flow
117 MASSTREE_CONFIG+=--with-malloc=malloc
120 ifneq ($(strip $(CUSTOM_LDPATH)), )
121 LDFLAGS+=$(CUSTOM_LDPATH)
124 SRCFILES = allocator.cc \
139 ifeq ($(MASSTREE_S),1)
140 MASSTREE_SRCFILES = masstree/compiler.cc \
143 masstree/straccum.cc \
147 OBJFILES := $(patsubst %.cc, $(O)/%.o, $(SRCFILES))
149 MASSTREE_OBJFILES := $(patsubst masstree/%.cc, $(O)/%.o, $(MASSTREE_SRCFILES))
151 BENCH_CXXFLAGS := $(CXXFLAGS)
152 BENCH_LDFLAGS := $(LDFLAGS) -ldb_cxx -lz -lrt -lcrypt -laio -ldl -lssl -lcrypto
154 BENCH_SRCFILES = benchmarks/bdb_wrapper.cc \
155 benchmarks/bench.cc \
156 benchmarks/encstress.cc \
158 benchmarks/masstree/kvrandom.cc \
159 benchmarks/queue.cc \
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
168 BENCH_CXXFLAGS += -DNO_MYSQL
171 BENCH_OBJFILES := $(patsubst %.cc, $(O)/%.o, $(BENCH_SRCFILES))
173 NEWBENCH_SRCFILES = new-benchmarks/bench.cc \
174 new-benchmarks/tpcc.cc
176 NEWBENCH_OBJFILES := $(patsubst %.cc, $(O)/%.o, $(NEWBENCH_SRCFILES))
180 $(O)/benchmarks/%.o: benchmarks/%.cc $(O)/buildstamp $(O)/buildstamp.bench $(OBJDEP)
182 $(CXX) $(BENCH_CXXFLAGS) -c $< -o $@
184 $(O)/benchmarks/masstree/%.o: benchmarks/masstree/%.cc $(O)/buildstamp $(O)/buildstamp.bench $(OBJDEP)
186 $(CXX) $(BENCH_CXXFLAGS) -c $< -o $@
188 $(O)/new-benchmarks/%.o: new-benchmarks/%.cc $(O)/buildstamp $(O)/buildstamp.bench $(OBJDEP)
190 $(CXX) $(CXXFLAGS) -c $< -o $@
192 $(O)/%.o: %.cc $(O)/buildstamp $(OBJDEP)
194 $(CXX) $(CXXFLAGS) -c $< -o $@
196 $(MASSTREE_OBJFILES) : $(O)/%.o: masstree/%.cc masstree/config.h
198 $(CXX) $(CXXFLAGS) -include masstree/config.h -c $< -o $@
200 third-party/lz4/liblz4.so:
201 make -C third-party/lz4 library
206 $(O)/test: $(O)/test.o $(OBJFILES) $(MASSTREE_OBJFILES) third-party/lz4/liblz4.so
207 $(CXX) -o $(O)/test $^ $(LDFLAGS) $(LZ4LDFLAGS)
210 persist_test: $(O)/persist_test
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)
216 stats_client: $(O)/stats_client
218 $(O)/stats_client: $(O)/stats_client.o
219 $(CXX) -o $(O)/stats_client $(O)/stats_client.o $(LDFLAGS)
221 masstree/config.h: $(O)/buildstamp.masstree masstree/configure masstree/config.h.in
223 cd masstree; ./configure $(MASSTREE_CONFIG)
224 if test -f $@; then touch $@; fi
226 masstree/configure masstree/config.h.in: masstree/configure.ac
227 cd masstree && autoreconf -i && touch configure config.h.in
230 dbtest: $(O)/benchmarks/dbtest
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)
236 kvtest: $(O)/benchmarks/masstree/kvtest
238 $(O)/benchmarks/masstree/kvtest: $(O)/benchmarks/masstree/kvtest.o $(OBJFILES) $(BENCH_OBJFILES)
239 $(CXX) -o $(O)/benchmarks/masstree/kvtest $^ $(BENCH_LDFLAGS)
242 newdbtest: $(O)/new-benchmarks/dbtest
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)
247 DEPFILES := $(wildcard $(O)/*.d $(O)/*/*.d $(O)/*/*/*.d masstree/_masstree_config.d)
252 #ifeq ($(wildcard masstree/GNUmakefile.in),)
253 #INSTALL_MASSTREE := $(shell git submodule init; git submodule update)
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)
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)
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)
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)
272 $(O)/buildstamp $(O)/buildstamp.bench $(O)/buildstamp.masstree:
279 make -C third-party/lz4 clean