18 MYSQL_SHARE_DIR ?= /x/stephentu/mysql-5.5.29/build/sql/share
24 # * factor-gc-nowriteinplace
25 # * factor-fake-compression
29 # run with 'MASSTREE=0' to turn off masstree
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
44 MASSTREE_CONFIG+=--enable-assertions
46 MASSTREE_CONFIG+=--disable-assertions
48 ifeq ($(CHECK_INVARIANTS_S),1)
50 MASSTREE_CONFIG+=--enable-invariants --enable-preconditions
52 MASSTREE_CONFIG+=--disable-invariants --disable-preconditions
54 ifeq ($(EVENT_COUNTERS_S),1)
57 OSUFFIX=$(OSUFFIX_D)$(OSUFFIX_S)$(OSUFFIX_E)
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
81 CXXFLAGS := -g -std=c++0x
82 CXXFLAGS += -MD -Ithird-party/lz4 -DCONFIG_H=\"$(CONFIG_H)\"
84 CXXFLAGS += -fno-omit-frame-pointer -DDEBUG
86 CXXFLAGS += -O2 -funroll-loops -fno-omit-frame-pointer
88 ifeq ($(CHECK_INVARIANTS_S),1)
89 CXXFLAGS += -DCHECK_INVARIANTS
91 ifeq ($(EVENT_COUNTERS_S),1)
92 CXXFLAGS += -DENABLE_EVENT_COUNTERS
94 ifeq ($(MASSTREE_S),1)
95 CXXFLAGS += -DNDB_MASSTREE -include masstree/config.h
96 OBJDEP += masstree/config.h
102 TOP := $(shell echo $${PWD-`pwd`})
103 LDFLAGS := -lpthread -lnuma -lrt
105 LZ4LDFLAGS := -Lthird-party/lz4 -llz4 -Wl,-rpath,$(TOP)/third-party/lz4
107 ifeq ($(USE_MALLOC_MODE_S),1)
108 CXXFLAGS+=-DUSE_JEMALLOC
110 MASSTREE_CONFIG+=--with-malloc=jemalloc
111 else ifeq ($(USE_MALLOC_MODE_S),2)
112 CXXFLAGS+=-DUSE_TCMALLOC
114 MASSTREE_CONFIG+=--with-malloc=tcmalloc
115 else ifeq ($(USE_MALLOC_MODE_S),3)
118 MASSTREE_CONFIG+=--with-malloc=flow
120 MASSTREE_CONFIG+=--with-malloc=malloc
123 ifneq ($(strip $(CUSTOM_LDPATH)), )
124 LDFLAGS+=$(CUSTOM_LDPATH)
127 SRCFILES = allocator.cc \
142 ifeq ($(MASSTREE_S),1)
143 MASSTREE_SRCFILES = masstree/compiler.cc \
146 masstree/straccum.cc \
150 OBJFILES := $(patsubst %.cc, $(O)/%.o, $(SRCFILES))
152 MASSTREE_OBJFILES := $(patsubst masstree/%.cc, $(O)/%.o, $(MASSTREE_SRCFILES))
154 BENCH_CXXFLAGS := $(CXXFLAGS)
155 BENCH_LDFLAGS := $(LDFLAGS) -ldb_cxx -lz -lrt -lcrypt -laio -ldl -lssl -lcrypto
157 BENCH_SRCFILES = benchmarks/bdb_wrapper.cc \
158 benchmarks/bench.cc \
159 benchmarks/encstress.cc \
161 benchmarks/masstree/kvrandom.cc \
162 benchmarks/queue.cc \
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
171 BENCH_CXXFLAGS += -DNO_MYSQL
174 BENCH_OBJFILES := $(patsubst %.cc, $(O)/%.o, $(BENCH_SRCFILES))
176 NEWBENCH_SRCFILES = new-benchmarks/bench.cc \
177 new-benchmarks/tpcc.cc
179 NEWBENCH_OBJFILES := $(patsubst %.cc, $(O)/%.o, $(NEWBENCH_SRCFILES))
183 $(O)/benchmarks/%.o: benchmarks/%.cc $(O)/buildstamp $(O)/buildstamp.bench $(OBJDEP)
185 $(CXX) $(BENCH_CXXFLAGS) -c $< -o $@
187 $(O)/benchmarks/masstree/%.o: benchmarks/masstree/%.cc $(O)/buildstamp $(O)/buildstamp.bench $(OBJDEP)
189 $(CXX) $(BENCH_CXXFLAGS) -c $< -o $@
191 $(O)/new-benchmarks/%.o: new-benchmarks/%.cc $(O)/buildstamp $(O)/buildstamp.bench $(OBJDEP)
193 $(CXX) $(CXXFLAGS) -c $< -o $@
195 $(O)/%.o: %.cc $(O)/buildstamp $(OBJDEP)
197 $(CXX) $(CXXFLAGS) -c $< -o $@
199 $(MASSTREE_OBJFILES) : $(O)/%.o: masstree/%.cc masstree/config.h
201 $(CXX) $(CXXFLAGS) -include masstree/config.h -c $< -o $@
203 third-party/lz4/liblz4.so:
204 make -C third-party/lz4 library
209 $(O)/test: $(O)/test.o $(OBJFILES) $(MASSTREE_OBJFILES) third-party/lz4/liblz4.so
210 $(CXX) -o $(O)/test $^ $(LDFLAGS) $(LZ4LDFLAGS)
213 persist_test: $(O)/persist_test
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)
219 stats_client: $(O)/stats_client
221 $(O)/stats_client: $(O)/stats_client.o
222 $(CXX) -o $(O)/stats_client $(O)/stats_client.o $(LDFLAGS)
224 masstree/config.h: $(O)/buildstamp.masstree masstree/configure masstree/config.h.in
226 cd masstree; ./configure $(MASSTREE_CONFIG)
227 if test -f $@; then touch $@; fi
229 masstree/configure masstree/config.h.in: masstree/configure.ac
230 cd masstree && autoreconf -i && touch configure config.h.in
233 dbtest: $(O)/benchmarks/dbtest
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)
239 kvtest: $(O)/benchmarks/masstree/kvtest
241 $(O)/benchmarks/masstree/kvtest: $(O)/benchmarks/masstree/kvtest.o $(OBJFILES) $(BENCH_OBJFILES)
242 $(CXX) -o $(O)/benchmarks/masstree/kvtest $^ $(BENCH_LDFLAGS)
245 newdbtest: $(O)/new-benchmarks/dbtest
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)
250 DEPFILES := $(wildcard $(O)/*.d $(O)/*/*.d $(O)/*/*/*.d masstree/_masstree_config.d)
255 #ifeq ($(wildcard masstree/GNUmakefile.in),)
256 #INSTALL_MASSTREE := $(shell git submodule init; git submodule update)
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)
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)
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)
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)
275 $(O)/buildstamp $(O)/buildstamp.bench $(O)/buildstamp.masstree:
282 make -C third-party/lz4 clean