Makefile 82.7 KB
Newer Older
J
jorlow@chromium.org 已提交
1 2 3 4
# Copyright (c) 2011 The LevelDB Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file. See the AUTHORS file for names of contributors.

5
# Inherit some settings from environment variables, if available
J
jorlow@chromium.org 已提交
6

7
#-----------------------------------------------
8

J
Jonathan Lee 已提交
9 10
BASH_EXISTS := $(shell which bash)
SHELL := $(shell which bash)
11
# Default to python3. Some distros like CentOS 8 do not have `python`.
12 13 14
ifeq ($(origin PYTHON), undefined)
	PYTHON := $(shell which python3 || which python || echo python3)
endif
15
export PYTHON
J
Jonathan Lee 已提交
16

17
CLEAN_FILES = # deliberately empty, so we can append below.
18 19 20 21
CFLAGS += ${EXTRA_CFLAGS}
CXXFLAGS += ${EXTRA_CXXFLAGS}
LDFLAGS += $(EXTRA_LDFLAGS)
MACHINE ?= $(shell uname -m)
T
Tomas Kolda 已提交
22 23
ARFLAGS = ${EXTRA_ARFLAGS} rs
STRIPFLAGS = -S -x
24

25 26
# Transform parallel LOG output into something more readable.
perl_command = perl -n \
27 28 29
  -e '@a=split("\t",$$_,-1); $$t=$$a[8];'				\
  -e '$$t =~ /.*if\s\[\[\s"(.*?\.[\w\/]+)/ and $$t=$$1;'		\
  -e '$$t =~ s,^\./,,;'							\
Y
Yueh-Hsuan Chiang 已提交
30 31 32
  -e '$$t =~ s, >.*,,; chomp $$t;'					\
  -e '$$t =~ /.*--gtest_filter=(.*?\.[\w\/]+)/ and $$t=$$1;'		\
  -e 'printf "%7.3f %s %s\n", $$a[3], $$a[6] == 0 ? "PASS" : "FAIL", $$t'
33 34
quoted_perl_command = $(subst ','\'',$(perl_command))

35 36 37 38 39 40 41 42 43
# DEBUG_LEVEL can have three values:
# * DEBUG_LEVEL=2; this is the ultimate debug mode. It will compile rocksdb
# without any optimizations. To compile with level 2, issue `make dbg`
# * DEBUG_LEVEL=1; debug level 1 enables all assertions and debug code, but
# compiles rocksdb with -O2 optimizations. this is the default debug level.
# `make all` or `make <binary_target>` compile RocksDB with debug level 1.
# We use this debug level when developing RocksDB.
# * DEBUG_LEVEL=0; this is the debug level we use for release. If you're
# running rocksdb in production you most definitely want to compile RocksDB
A
agiardullo 已提交
44
# with debug level 0. To compile with level 0, run `make shared_lib`,
45 46
# `make install-shared`, `make static_lib`, `make install-static` or
# `make install`
47 48 49

# Set the default DEBUG_LEVEL to 1
DEBUG_LEVEL?=1
50

51 52 53 54 55 56 57
# LIB_MODE says whether or not to use/build "shared" or "static" libraries.
# Mode "static" means to link against static libraries (.a)
# Mode "shared" means to link against shared libraries (.so, .sl, .dylib, etc)
#
# Set the default LIB_MODE to static
LIB_MODE?=static

58
ifeq ($(MAKECMDGOALS),dbg)
Y
Yueh-Hsuan Chiang 已提交
59
	DEBUG_LEVEL=2
60
endif
61

62 63 64 65 66 67 68 69
ifeq ($(MAKECMDGOALS),clean)
	DEBUG_LEVEL=0
endif

ifeq ($(MAKECMDGOALS),release)
	DEBUG_LEVEL=0
endif

70
ifeq ($(MAKECMDGOALS),shared_lib)
71
	LIB_MODE=shared
Y
Yueh-Hsuan Chiang 已提交
72
	DEBUG_LEVEL=0
I
Igor Canadi 已提交
73
endif
I
Igor Canadi 已提交
74

I
Igor Canadi 已提交
75
ifeq ($(MAKECMDGOALS),install-shared)
76
	LIB_MODE=shared
Y
Yueh-Hsuan Chiang 已提交
77
	DEBUG_LEVEL=0
I
Igor Canadi 已提交
78 79
endif

I
Igor Canadi 已提交
80
ifeq ($(MAKECMDGOALS),static_lib)
Y
Yueh-Hsuan Chiang 已提交
81
	DEBUG_LEVEL=0
82
	LIB_MODE=static
83
endif
I
Igor Canadi 已提交
84

I
Igor Canadi 已提交
85
ifeq ($(MAKECMDGOALS),install-static)
Y
Yueh-Hsuan Chiang 已提交
86
	DEBUG_LEVEL=0
87
	LIB_MODE=static
I
Igor Canadi 已提交
88 89 90
endif

ifeq ($(MAKECMDGOALS),install)
Y
Yueh-Hsuan Chiang 已提交
91
	DEBUG_LEVEL=0
92 93
endif

94

95 96 97
ifneq ($(findstring jtest, $(MAKECMDGOALS)),)
	OBJ_DIR=jl
	LIB_MODE=shared
Y
Yueh-Hsuan Chiang 已提交
98 99
endif

100 101 102 103 104 105 106 107 108 109 110 111
ifneq ($(findstring rocksdbjava, $(MAKECMDGOALS)),)
	LIB_MODE=shared
        ifneq ($(findstring rocksdbjavastatic, $(MAKECMDGOALS)),)
		OBJ_DIR=jls
	        ifneq ($(DEBUG_LEVEL),2)
	            DEBUG_LEVEL=0
                endif
                ifeq ($(MAKECMDGOALS),rocksdbjavastaticpublish)
	            DEBUG_LEVEL=0
                endif
	else
		OBJ_DIR=jl
112
	endif
113 114
endif

115 116
$(info $$DEBUG_LEVEL is ${DEBUG_LEVEL})

Y
Yi Wu 已提交
117 118
# Lite build flag.
LITE ?= 0
119 120 121 122 123 124 125 126
ifeq ($(LITE), 0)
ifneq ($(filter -DROCKSDB_LITE,$(OPT)),)
  # Be backward compatible and support older format where OPT=-DROCKSDB_LITE is
  # specified instead of LITE=1 on the command line.
  LITE=1
endif
else ifeq ($(LITE), 1)
ifeq ($(filter -DROCKSDB_LITE,$(OPT)),)
Y
Yi Wu 已提交
127 128
	OPT += -DROCKSDB_LITE
endif
129
endif
Y
Yi Wu 已提交
130 131 132 133

# Figure out optimize level.
ifneq ($(DEBUG_LEVEL), 2)
ifeq ($(LITE), 0)
134
	OPTIMIZE_LEVEL ?= -O2
Y
Yi Wu 已提交
135
else
136
	OPTIMIZE_LEVEL ?= -Os
Y
Yi Wu 已提交
137 138
endif
endif
139 140 141
# `OPTIMIZE_LEVEL` is empty when the user does not set it and `DEBUG_LEVEL=2`.
# In that case, the compiler default (`-O0` for gcc and clang) will be used.
OPT += $(OPTIMIZE_LEVEL)
Y
Yi Wu 已提交
142

143 144
# compile with -O2 if debug level is not 2
ifneq ($(DEBUG_LEVEL), 2)
Y
Yi Wu 已提交
145
OPT += -fno-omit-frame-pointer
146 147
# Skip for archs that don't support -momit-leaf-frame-pointer
ifeq (,$(shell $(CXX) -fsyntax-only -momit-leaf-frame-pointer -xc /dev/null 2>&1))
148 149 150 151
OPT += -momit-leaf-frame-pointer
endif
endif

152 153 154 155 156 157 158 159 160 161 162 163
ifeq (,$(shell $(CXX) -fsyntax-only -maltivec -xc /dev/null 2>&1))
CXXFLAGS += -DHAS_ALTIVEC
CFLAGS += -DHAS_ALTIVEC
HAS_ALTIVEC=1
endif

ifeq (,$(shell $(CXX) -fsyntax-only -mcpu=power8 -xc /dev/null 2>&1))
CXXFLAGS += -DHAVE_POWER8
CFLAGS +=  -DHAVE_POWER8
HAVE_POWER8=1
endif

164
ifeq (,$(shell $(CXX) -fsyntax-only -march=armv8-a+crc+crypto -xc /dev/null 2>&1))
165 166
CXXFLAGS += -march=armv8-a+crc+crypto
CFLAGS += -march=armv8-a+crc+crypto
167 168 169
ARMCRC_SOURCE=1
endif

170 171 172 173 174 175
# if we're compiling for shared libraries, add the shared flags
ifeq ($(LIB_MODE),shared)
CXXFLAGS += $(PLATFORM_SHARED_CFLAGS) -DROCKSDB_DLL
CFLAGS +=  $(PLATFORM_SHARED_CFLAGS) -DROCKSDB_DLL
endif

176
# if we're compiling for release, compile without debug code (-DNDEBUG)
177
ifeq ($(DEBUG_LEVEL),0)
I
Igor Canadi 已提交
178
OPT += -DNDEBUG
S
Siying Dong 已提交
179 180 181 182 183 184

ifneq ($(USE_RTTI), 1)
	CXXFLAGS += -fno-rtti
else
	CXXFLAGS += -DROCKSDB_USE_RTTI
endif
185
else
S
Siying Dong 已提交
186 187 188 189 190 191
ifneq ($(USE_RTTI), 0)
	CXXFLAGS += -DROCKSDB_USE_RTTI
else
	CXXFLAGS += -fno-rtti
endif

192 193 194 195 196 197
ifdef ASSERT_STATUS_CHECKED
ifeq ($(filter -DROCKSDB_ASSERT_STATUS_CHECKED,$(OPT)),)
	OPT += -DROCKSDB_ASSERT_STATUS_CHECKED
endif
endif

198
$(warning Warning: Compiling in debug mode. Don't use the resulting binary in production)
I
Igor Canadi 已提交
199 200
endif

201 202 203 204 205 206 207 208 209 210 211
# `USE_LTO=1` enables link-time optimizations. Among other things, this enables
# more devirtualization opportunities and inlining across translation units.
# This can save significant overhead introduced by RocksDB's pluggable
# interfaces/internal abstractions, like in the iterator hierarchy. It works
# better when combined with profile-guided optimizations (not currently
# supported natively in Makefile).
ifeq ($(USE_LTO), 1)
	CXXFLAGS += -flto
	LDFLAGS += -flto -fuse-linker-plugin
endif

212
#-----------------------------------------------
213
include src.mk
214

215
AM_DEFAULT_VERBOSITY ?= 0
216 217 218 219 220

AM_V_GEN = $(am__v_GEN_$(V))
am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
am__v_GEN_0 = @echo "  GEN     " $@;
am__v_GEN_1 =
J
Jim Meyering 已提交
221 222 223 224
AM_V_at = $(am__v_at_$(V))
am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
am__v_at_0 = @
am__v_at_1 =
225 226 227 228 229

AM_V_CC = $(am__v_CC_$(V))
am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
am__v_CC_0 = @echo "  CC      " $@;
am__v_CC_1 =
230

231 232
AM_V_CCLD = $(am__v_CCLD_$(V))
am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
233
ifneq ($(SKIP_LINK), 1)
234 235
am__v_CCLD_0 = @echo "  CCLD    " $@;
am__v_CCLD_1 =
236 237 238 239
else
am__v_CCLD_0 = @echo "  !CCLD   " $@; true skip
am__v_CCLD_1 = true skip
endif
J
Jim Meyering 已提交
240 241 242 243
AM_V_AR = $(am__v_AR_$(V))
am__v_AR_ = $(am__v_AR_$(AM_DEFAULT_VERBOSITY))
am__v_AR_0 = @echo "  AR      " $@;
am__v_AR_1 =
244

245 246 247 248
ifdef ROCKSDB_USE_LIBRADOS
LIB_SOURCES += utilities/env_librados.cc
LDFLAGS += -lrados
endif
249

250 251
AM_LINK = $(AM_V_CCLD)$(CXX) -L. $(patsubst lib%.a, -l%, $(patsubst lib%.$(PLATFORM_SHARED_EXT), -l%, $^)) $(EXEC_LDFLAGS) -o $@ $(LDFLAGS) $(COVERAGEFLAGS)
AM_SHARE = $(AM_V_CCLD) $(CXX) $(PLATFORM_SHARED_LDFLAGS)$@ -L. $(patsubst lib%.$(PLATFORM_SHARED_EXT), -l%, $^) $(LDFLAGS) -o $@
252

253 254 255 256 257 258 259 260 261 262 263
# Detect what platform we're building on.
# Export some common variables that might have been passed as Make variables
# instead of environment variables.
dummy := $(shell (export ROCKSDB_ROOT="$(CURDIR)"; \
                  export COMPILE_WITH_ASAN="$(COMPILE_WITH_ASAN)"; \
                  export COMPILE_WITH_TSAN="$(COMPILE_WITH_TSAN)"; \
                  export COMPILE_WITH_UBSAN="$(COMPILE_WITH_UBSAN)"; \
                  export PORTABLE="$(PORTABLE)"; \
                  export ROCKSDB_NO_FBCODE="$(ROCKSDB_NO_FBCODE)"; \
                  export USE_CLANG="$(USE_CLANG)"; \
                  "$(CURDIR)/build_tools/build_detect_platform" "$(CURDIR)/make_config.mk"))
S
Sanjay Ghemawat 已提交
264
# this file is generated by the previous line to set build flags and sources
I
Igor Canadi 已提交
265
include make_config.mk
266

267
export JAVAC_ARGS
268
CLEAN_FILES += make_config.mk rocksdb.pc
J
jorlow@chromium.org 已提交
269

270 271 272 273 274 275
ifeq ($(V), 1)
$(info $(shell uname -a))
$(info $(shell $(CC) --version))
$(info $(shell $(CXX) --version))
endif

276
missing_make_config_paths := $(shell				\
277
	grep "\./\S*\|/\S*" -o $(CURDIR)/make_config.mk | 	\
278 279 280 281 282
	while read path;					\
		do [ -e $$path ] || echo $$path; 		\
	done | sort | uniq)

$(foreach path, $(missing_make_config_paths), \
283
	$(warning Warning: $(path) does not exist))
284

T
Tomas Kolda 已提交
285 286 287
ifeq ($(PLATFORM), OS_AIX)
# no debug info
else ifneq ($(PLATFORM), IOS)
I
Igor Canadi 已提交
288 289 290 291 292 293 294
CFLAGS += -g
CXXFLAGS += -g
else
# no debug info for IOS, that will make our library big
OPT += -DNDEBUG
endif

T
Tomas Kolda 已提交
295 296 297 298 299
ifeq ($(PLATFORM), OS_AIX)
ARFLAGS = -X64 rs
STRIPFLAGS = -X64 -x
endif

D
David Bernard 已提交
300 301 302
ifeq ($(PLATFORM), OS_SOLARIS)
	PLATFORM_CXXFLAGS += -D _GLIBCXX_USE_C99
endif
303
ifneq ($(filter -DROCKSDB_LITE,$(OPT)),)
Y
Yueh-Hsuan Chiang 已提交
304 305 306
	# found
	CFLAGS += -fno-exceptions
	CXXFLAGS += -fno-exceptions
307 308
	# LUA is not supported under ROCKSDB_LITE
	LUA_PATH =
309 310
endif

311 312
ifeq ($(LIB_MODE),shared)
# So that binaries are executable from build location, in addition to install location
P
Peter Dillinger 已提交
313
EXEC_LDFLAGS += -Wl,-rpath -Wl,'$$ORIGIN'
314 315
endif

I
Igor Canadi 已提交
316 317
# ASAN doesn't work well with jemalloc. If we're compiling with ASAN, we should use regular malloc.
ifdef COMPILE_WITH_ASAN
Y
Yueh-Hsuan Chiang 已提交
318 319 320 321
	DISABLE_JEMALLOC=1
	EXEC_LDFLAGS += -fsanitize=address
	PLATFORM_CCFLAGS += -fsanitize=address
	PLATFORM_CXXFLAGS += -fsanitize=address
I
Igor Canadi 已提交
322 323 324 325
endif

# TSAN doesn't work well with jemalloc. If we're compiling with TSAN, we should use regular malloc.
ifdef COMPILE_WITH_TSAN
Y
Yueh-Hsuan Chiang 已提交
326
	DISABLE_JEMALLOC=1
S
Siying Dong 已提交
327
	EXEC_LDFLAGS += -fsanitize=thread
328 329
	PLATFORM_CCFLAGS += -fsanitize=thread -fPIC -DFOLLY_SANITIZE_THREAD
	PLATFORM_CXXFLAGS += -fsanitize=thread -fPIC -DFOLLY_SANITIZE_THREAD
330 331
        # Turn off -pg when enabling TSAN testing, because that induces
        # a link failure.  TODO: find the root cause
D
dx9 已提交
332
	PROFILING_FLAGS =
333 334
	# LUA is not supported under TSAN
	LUA_PATH =
335 336 337
	# Limit keys for crash test under TSAN to avoid error:
	# "ThreadSanitizer: DenseSlabAllocator overflow. Dying."
	CRASH_TEST_EXT_ARGS += --max_key=1000000
I
Igor Canadi 已提交
338 339
endif

T
Tomas Kolda 已提交
340 341 342 343 344
# AIX doesn't work with -pg
ifeq ($(PLATFORM), OS_AIX)
	PROFILING_FLAGS =
endif

345 346 347
# USAN doesn't work well with jemalloc. If we're compiling with USAN, we should use regular malloc.
ifdef COMPILE_WITH_UBSAN
	DISABLE_JEMALLOC=1
S
Siying Dong 已提交
348 349 350 351
	# Suppress alignment warning because murmurhash relies on casting unaligned
	# memory to integer. Fixing it may cause performance regression. 3-way crc32
	# relies on it too, although it can be rewritten to eliminate with minimal
	# performance regression.
352 353 354
	EXEC_LDFLAGS += -fsanitize=undefined -fno-sanitize-recover=all
	PLATFORM_CCFLAGS += -fsanitize=undefined -fno-sanitize-recover=all -DROCKSDB_UBSAN_RUN
	PLATFORM_CXXFLAGS += -fsanitize=undefined -fno-sanitize-recover=all -DROCKSDB_UBSAN_RUN
355 356
endif

357 358 359 360 361
ifdef ROCKSDB_VALGRIND_RUN
	PLATFORM_CCFLAGS += -DROCKSDB_VALGRIND_RUN
	PLATFORM_CXXFLAGS += -DROCKSDB_VALGRIND_RUN
endif

I
Igor Canadi 已提交
362
ifndef DISABLE_JEMALLOC
363
	ifdef JEMALLOC
T
Tamir Duberstein 已提交
364 365
		PLATFORM_CXXFLAGS += -DROCKSDB_JEMALLOC -DJEMALLOC_NO_DEMANGLE
		PLATFORM_CCFLAGS  += -DROCKSDB_JEMALLOC -DJEMALLOC_NO_DEMANGLE
366
	endif
367 368 369 370
	ifdef WITH_JEMALLOC_FLAG
		PLATFORM_LDFLAGS += -ljemalloc
		JAVA_LDFLAGS += -ljemalloc
	endif
Y
Yueh-Hsuan Chiang 已提交
371 372 373
	EXEC_LDFLAGS := $(JEMALLOC_LIB) $(EXEC_LDFLAGS)
	PLATFORM_CXXFLAGS += $(JEMALLOC_INCLUDE)
	PLATFORM_CCFLAGS += $(JEMALLOC_INCLUDE)
I
Igor Canadi 已提交
374 375
endif

376 377 378 379
ifndef USE_FOLLY_DISTRIBUTED_MUTEX
	USE_FOLLY_DISTRIBUTED_MUTEX=0
endif

380 381 382 383 384 385 386
ifndef GTEST_THROW_ON_FAILURE
	export GTEST_THROW_ON_FAILURE=1
endif
ifndef GTEST_HAS_EXCEPTIONS
	export GTEST_HAS_EXCEPTIONS=1
endif

387
GTEST_DIR = third-party/gtest-1.8.1/fused-src
T
Tomas Kolda 已提交
388 389 390 391 392 393 394 395
# AIX: pre-defined system headers are surrounded by an extern "C" block
ifeq ($(PLATFORM), OS_AIX)
	PLATFORM_CCFLAGS += -I$(GTEST_DIR)
	PLATFORM_CXXFLAGS += -I$(GTEST_DIR)
else
	PLATFORM_CCFLAGS += -isystem $(GTEST_DIR)
	PLATFORM_CXXFLAGS += -isystem $(GTEST_DIR)
endif
I
Igor Sugak 已提交
396

397
ifeq ($(USE_FOLLY_DISTRIBUTED_MUTEX),1)
398 399 400 401 402 403 404 405 406 407
	FOLLY_DIR = ./third-party/folly
	# AIX: pre-defined system headers are surrounded by an extern "C" block
	ifeq ($(PLATFORM), OS_AIX)
		PLATFORM_CCFLAGS += -I$(FOLLY_DIR)
		PLATFORM_CXXFLAGS += -I$(FOLLY_DIR)
	else
		PLATFORM_CCFLAGS += -isystem $(FOLLY_DIR)
		PLATFORM_CXXFLAGS += -isystem $(FOLLY_DIR)
	endif
endif
408 409 410 411 412

ifdef TEST_CACHE_LINE_SIZE
  PLATFORM_CCFLAGS += -DTEST_CACHE_LINE_SIZE=$(TEST_CACHE_LINE_SIZE)
  PLATFORM_CXXFLAGS += -DTEST_CACHE_LINE_SIZE=$(TEST_CACHE_LINE_SIZE)
endif
413 414 415 416
ifdef TEST_UINT128_COMPAT
  PLATFORM_CCFLAGS += -DTEST_UINT128_COMPAT=1
  PLATFORM_CXXFLAGS += -DTEST_UINT128_COMPAT=1
endif
417

418 419 420
# This (the first rule) must depend on "all".
default: all

421
WARNING_FLAGS = -W -Wextra -Wall -Wsign-compare -Wshadow \
422
  -Wunused-parameter
423

424 425 426 427
ifeq ($(PLATFORM), OS_OPENBSD)
	WARNING_FLAGS += -Wno-unused-lambda-capture
endif

428
ifndef DISABLE_WARNING_AS_ERROR
Y
Yueh-Hsuan Chiang 已提交
429
	WARNING_FLAGS += -Werror
430 431
endif

432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454

ifdef LUA_PATH

ifndef LUA_INCLUDE
LUA_INCLUDE=$(LUA_PATH)/include
endif

LUA_INCLUDE_FILE=$(LUA_INCLUDE)/lualib.h

ifeq ("$(wildcard $(LUA_INCLUDE_FILE))", "")
# LUA_INCLUDE_FILE does not exist
$(error Cannot find lualib.h under $(LUA_INCLUDE).  Try to specify both LUA_PATH and LUA_INCLUDE manually)
endif
LUA_FLAGS = -I$(LUA_INCLUDE) -DLUA -DLUA_COMPAT_ALL
CFLAGS += $(LUA_FLAGS)
CXXFLAGS += $(LUA_FLAGS)

ifndef LUA_LIB
LUA_LIB = $(LUA_PATH)/lib/liblua.a
endif
ifeq ("$(wildcard $(LUA_LIB))", "") # LUA_LIB does not exist
$(error $(LUA_LIB) does not exist.  Try to specify both LUA_PATH and LUA_LIB manually)
endif
455
EXEC_LDFLAGS += $(LUA_LIB)
456 457 458

endif

459 460 461
ifeq ($(NO_THREEWAY_CRC32C), 1)
	CXXFLAGS += -DNO_THREEWAY_CRC32C
endif
462

I
Igor Canadi 已提交
463
CFLAGS += $(WARNING_FLAGS) -I. -I./include $(PLATFORM_CCFLAGS) $(OPT)
I
Islam AbdelRahman 已提交
464
CXXFLAGS += $(WARNING_FLAGS) -I. -I./include $(PLATFORM_CXXFLAGS) $(OPT) -Woverloaded-virtual -Wnon-virtual-dtor -Wno-missing-field-initializers
465

S
Sanjay Ghemawat 已提交
466
LDFLAGS += $(PLATFORM_LDFLAGS)
J
jorlow@chromium.org 已提交
467

468 469 470
# If NO_UPDATE_BUILD_VERSION is set we don't update util/build_version.cc, but
# the file needs to already exist or else the build will fail
ifndef NO_UPDATE_BUILD_VERSION
471
date := $(shell date +%F)
I
Igor Canadi 已提交
472
ifdef FORCE_GIT_SHA
Y
Yueh-Hsuan Chiang 已提交
473
	git_sha := $(FORCE_GIT_SHA)
I
Igor Canadi 已提交
474
else
Y
Yueh-Hsuan Chiang 已提交
475
	git_sha := $(shell git rev-parse HEAD 2>/dev/null)
I
Igor Canadi 已提交
476
endif
477
gen_build_version = sed -e s/@@GIT_SHA@@/$(git_sha)/ -e s/@@GIT_DATE_TIME@@/$(date)/ util/build_version.cc.in
478 479 480 481 482 483

# Record the version of the source that we are compiling.
# We keep a record of the git revision in this file.  It is then built
# as a regular source file as part of the compilation process.
# One can run "strings executable_filename | grep _build_" to find
# the version of the source that we used to build the executable file.
484 485
FORCE:
util/build_version.cc: FORCE
Y
Yueh-Hsuan Chiang 已提交
486 487 488 489 490
	$(AM_V_GEN)rm -f $@-t
	$(AM_V_at)$(gen_build_version) > $@-t
	$(AM_V_at)if test -f $@; then					\
	  cmp -s $@-t $@ && rm -f $@-t || mv -f $@-t $@;		\
	else mv -f $@-t $@; fi
491
endif
492

493 494
OBJ_DIR?=.
LIB_OBJECTS = $(patsubst %.cc, $(OBJ_DIR)/%.o, $(LIB_SOURCES))
495
ifeq ($(HAVE_POWER8),1)
496 497
LIB_OBJECTS += $(patsubst %.c, $(OBJ_DIR)/%.o, $(LIB_SOURCES_C))
LIB_OBJECTS += $(patsubst %.S, $(OBJ_DIR)/%.o, $(LIB_SOURCES_ASM))
498 499
endif

500
ifeq ($(USE_FOLLY_DISTRIBUTED_MUTEX),1)
501
  LIB_OBJECTS += $(patsubst %.cpp, $(OBJ_DIR)/%.o, $(FOLLY_SOURCES))
502
endif
J
jorlow@chromium.org 已提交
503

504 505 506
GTEST = $(OBJ_DIR)/$(GTEST_DIR)/gtest/gtest-all.o
TESTUTIL = $(OBJ_DIR)/test_util/testutil.o
TESTHARNESS = $(OBJ_DIR)/test_util/testharness.o $(TESTUTIL) $(GTEST)
507
VALGRIND_ERROR = 2
508
VALGRIND_VER := $(join $(VALGRIND_VER),valgrind)
509

510
VALGRIND_OPTS = --error-exitcode=$(VALGRIND_ERROR) --leak-check=full
511

512 513 514 515 516
TEST_OBJECTS = $(patsubst %.cc, $(OBJ_DIR)/%.o, $(TEST_LIB_SOURCES) $(MOCK_LIB_SOURCES)) $(GTEST)
BENCH_OBJECTS = $(patsubst %.cc, $(OBJ_DIR)/%.o, $(BENCH_LIB_SOURCES))
TOOL_OBJECTS = $(patsubst %.cc, $(OBJ_DIR)/%.o, $(TOOL_LIB_SOURCES))
ANALYZE_OBJECTS = $(patsubst %.cc, $(OBJ_DIR)/%.o, $(ANALYZER_LIB_SOURCES))
STRESS_OBJECTS =  $(patsubst %.cc, $(OBJ_DIR)/%.o, $(STRESS_LIB_SOURCES))
517

518 519 520
ALL_SOURCES  = $(LIB_SOURCES) $(TEST_LIB_SOURCES) $(MOCK_LIB_SOURCES) $(GTEST_DIR)/gtest/gtest-all.cc
ALL_SOURCES += $(TOOL_LIB_SOURCES) $(BENCH_LIB_SOURCES) $(ANALYZER_LIB_SOURCES) $(STRESS_LIB_SOURCES)
ALL_SOURCES += $(TEST_MAIN_SOURCES) $(TOOL_MAIN_SOURCES) $(BENCH_MAIN_SOURCES)
521

522 523 524 525 526 527 528
TESTS = $(patsubst %.cc, %, $(notdir $(TEST_MAIN_SOURCES)))
TESTS += $(patsubst %.c, %, $(notdir $(TEST_MAIN_SOURCES_C)))

ifeq ($(USE_FOLLY_DISTRIBUTED_MUTEX),1)
	TESTS += folly_synchronization_distributed_mutex_test
	ALL_SOURCES += third-party/folly/folly/synchronization/test/DistributedMutexTest.cc
endif
529

Y
Yi Wu 已提交
530 531
PARALLEL_TEST = \
	backupable_db_test \
532
	db_bloom_filter_test \
Y
Yi Wu 已提交
533 534
	db_compaction_filter_test \
	db_compaction_test \
535
	db_merge_operator_test \
536
	db_sst_test \
Y
Yi Wu 已提交
537
	db_test \
538
	db_test2 \
Y
Yi Wu 已提交
539
	db_universal_compaction_test \
540
	db_wal_test \
541
	column_family_test \
542
	external_sst_file_test \
543
	import_column_family_test \
Y
Yi Wu 已提交
544
	fault_injection_test \
545
	file_reader_writer_test \
Y
Yi Wu 已提交
546 547
	inlineskiplist_test \
	manual_compaction_test \
548 549
	persistent_cache_test \
	table_test \
550
	transaction_test \
551
	transaction_lock_mgr_test \
552
	write_prepared_transaction_test \
553
	write_unprepared_transaction_test \
Y
Yi Wu 已提交
554

555 556 557 558 559
ifeq ($(USE_FOLLY_DISTRIBUTED_MUTEX),1)
	TESTS += folly_synchronization_distributed_mutex_test
	PARALLEL_TEST += folly_synchronization_distributed_mutex_test
endif

560 561 562 563
# options_settable_test doesn't pass with UBSAN as we use hack in the test
ifdef COMPILE_WITH_UBSAN
        TESTS := $(shell echo $(TESTS) | sed 's/\boptions_settable_test\b//g')
endif
564
ifdef ASSERT_STATUS_CHECKED
565 566
# This is a new check for which we will add support incrementally. This
# list can be removed once support is fully added.
567
	TESTS_PASSING_ASC = \
568 569
		arena_test \
		autovector_test \
570 571
		cache_test \
		lru_cache_test \
572
		blob_file_addition_test \
573
		blob_file_builder_test \
574 575 576 577 578 579 580 581 582 583
		blob_file_garbage_test \
		bloom_test \
		cassandra_format_test \
		cassandra_row_merge_test \
		cassandra_serialize_test \
		cleanable_test \
		coding_test \
		crc32c_test \
		dbformat_test \
		defer_test \
584
		filename_test \
585
		dynamic_bloom_test \
586 587 588
		env_basic_test \
		env_test \
		env_logger_test \
589 590 591 592 593 594 595 596 597 598 599 600 601
		event_logger_test \
		file_indexer_test \
		hash_table_test \
		hash_test \
		heap_test \
		histogram_test \
		inlineskiplist_test \
		io_posix_test \
		iostats_context_test \
		memkind_kmem_allocator_test \
		merger_test \
		mock_env_test \
		object_registry_test \
602
		options_settable_test \
603 604 605 606 607 608 609
		options_test \
		random_test \
		range_del_aggregator_test \
		range_tombstone_fragmenter_test \
		repeatable_thread_test \
		skiplist_test \
		slice_test \
610
		sst_dump_test \
611 612
		statistics_test \
		thread_local_test \
613
		env_timed_test \
614
		filelock_test \
615 616 617
		timer_queue_test \
		timer_test \
		util_merge_operators_test \
618 619 620 621
		block_cache_trace_analyzer_test \
		block_cache_tracer_test \
		cache_simulator_test \
		sim_cache_test \
622 623 624 625
		version_edit_test \
		work_queue_test \
		write_controller_test \

626 627 628 629
ifeq ($(USE_FOLLY_DISTRIBUTED_MUTEX),1)
TESTS_PASSING_ASC += folly_synchronization_distributed_mutex_test
endif

630
	# Enable building all unit tests, but use check_some to run only tests
631
	# known to pass ASC (ASSERT_STATUS_CHECKED)
632 633 634 635 636 637 638
	SUBSET := $(TESTS_PASSING_ASC)
	# Alternate: only build unit tests known to pass ASC, and run them
	# with make check
	#TESTS := $(filter $(TESTS_PASSING_ASC),$(TESTS))
	#PARALLEL_TEST := $(filter $(TESTS_PASSING_ASC),$(PARALLEL_TEST))
else
	SUBSET := $(TESTS)
639
endif
640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671
# Not necessarily well thought out or up-to-date, but matches old list
TESTS_PLATFORM_DEPENDENT := \
	db_basic_test \
	db_with_timestamp_basic_test \
	db_encryption_test \
	db_test2 \
	external_sst_file_basic_test \
	auto_roll_logger_test \
	bloom_test \
	dynamic_bloom_test \
	c_test \
	checkpoint_test \
	crc32c_test \
	coding_test \
	inlineskiplist_test \
	env_basic_test \
	env_test \
	env_logger_test \
	io_posix_test \
	hash_test \
	random_test \
	thread_local_test \
	work_queue_test \
	rate_limiter_test \
	perf_context_test \
	iostats_context_test \
	db_wal_test \

# Sort SUBSET for filtering, except db_test is special (expensive) so
# is placed first (out-of-order)
SUBSET := $(filter db_test, $(SUBSET)) $(sort $(filter-out db_test, $(SUBSET)))

I
Islam AbdelRahman 已提交
672 673 674 675 676 677 678
ifdef ROCKSDBTESTS_START
        SUBSET := $(shell echo $(SUBSET) | sed 's/^.*$(ROCKSDBTESTS_START)/$(ROCKSDBTESTS_START)/')
endif

ifdef ROCKSDBTESTS_END
        SUBSET := $(shell echo $(SUBSET) | sed 's/$(ROCKSDBTESTS_END).*//')
endif
679

680 681 682 683 684 685
ifeq ($(ROCKSDBTESTS_PLATFORM_DEPENDENT), only)
        SUBSET := $(filter $(TESTS_PLATFORM_DEPENDENT), $(SUBSET))
else ifeq ($(ROCKSDBTESTS_PLATFORM_DEPENDENT), exclude)
        SUBSET := $(filter-out $(TESTS_PLATFORM_DEPENDENT), $(SUBSET))
endif

686 687
# bench_tool_analyer main is in bench_tool_analyzer_tool, or this would be simpler...
TOOLS = $(patsubst %.cc, %, $(notdir $(patsubst %_tool.cc, %.cc, $(TOOLS_MAIN_SOURCES))))
J
jorlow@chromium.org 已提交
688

689 690 691
TEST_LIBS = \
	librocksdb_env_basic_test.a

S
sdong 已提交
692
# TODO: add back forward_iterator_bench, after making it build in all environemnts.
693
BENCHMARKS = $(patsubst %.cc, %, $(notdir $(BENCH_MAIN_SOURCES)))
J
jorlow@chromium.org 已提交
694

695
# if user didn't config LIBNAME, set the default
696
ifeq ($(LIBNAME),)
697
  LIBNAME=librocksdb
698
# we should only run rocksdb in production with DEBUG_LEVEL 0
699 700
ifneq ($(DEBUG_LEVEL),0)
  LIBDEBUG=_debug
701
endif
702
endif
703 704 705 706 707 708 709 710 711 712
STATIC_LIBRARY = ${LIBNAME}$(LIBDEBUG).a
STATIC_TEST_LIBRARY =  ${LIBNAME}_test$(LIBDEBUG).a
STATIC_TOOLS_LIBRARY = ${LIBNAME}_tools$(LIBDEBUG).a
STATIC_STRESS_LIBRARY = ${LIBNAME}_stress$(LIBDEBUG).a

ALL_STATIC_LIBS = $(STATIC_LIBRARY) $(STATIC_TEST_LIBRARY) $(STATIC_TOOLS_LIBRARY) $(STATIC_STRESS_LIBRARY)

SHARED_TEST_LIBRARY =  ${LIBNAME}_test$(LIBDEBUG).$(PLATFORM_SHARED_EXT)
SHARED_TOOLS_LIBRARY = ${LIBNAME}_tools$(LIBDEBUG).$(PLATFORM_SHARED_EXT)
SHARED_STRESS_LIBRARY = ${LIBNAME}_stress$(LIBDEBUG).$(PLATFORM_SHARED_EXT)
713

714 715 716 717 718 719 720 721 722 723 724 725 726 727
ALL_SHARED_LIBS = $(SHARED1) $(SHARED2) $(SHARED3) $(SHARED4) $(SHARED_TEST_LIBRARY) $(SHARED_TOOLS_LIBRARY) $(SHARED_STRESS_LIBRARY)

ifeq ($(LIB_MODE),shared)
LIBRARY=$(SHARED1)
TEST_LIBRARY=$(SHARED_TEST_LIBRARY)
TOOLS_LIBRARY=$(SHARED_TOOLS_LIBRARY)
STRESS_LIBRARY=$(SHARED_STRESS_LIBRARY)
CLOUD_LIBRARY=$(SHARED_CLOUD_LIBRARY)
else
LIBRARY=$(STATIC_LIBRARY)
TEST_LIBRARY=$(STATIC_TEST_LIBRARY)
TOOLS_LIBRARY=$(STATIC_TOOLS_LIBRARY)
STRESS_LIBRARY=$(STATIC_STRESS_LIBRARY)
endif
728

729 730 731
ROCKSDB_MAJOR = $(shell egrep "ROCKSDB_MAJOR.[0-9]" include/rocksdb/version.h | cut -d ' ' -f 3)
ROCKSDB_MINOR = $(shell egrep "ROCKSDB_MINOR.[0-9]" include/rocksdb/version.h | cut -d ' ' -f 3)
ROCKSDB_PATCH = $(shell egrep "ROCKSDB_PATCH.[0-9]" include/rocksdb/version.h | cut -d ' ' -f 3)
732

733 734
default: all

735 736 737
#-----------------------------------------------
# Create platform independent shared libraries.
#-----------------------------------------------
738
ifneq ($(PLATFORM_SHARED_EXT),)
H
heyongqiang 已提交
739 740

ifneq ($(PLATFORM_SHARED_VERSIONED),true)
741
SHARED1 = ${LIBNAME}$(LIBDEBUG).$(PLATFORM_SHARED_EXT)
H
heyongqiang 已提交
742 743
SHARED2 = $(SHARED1)
SHARED3 = $(SHARED1)
744
SHARED4 = $(SHARED1)
H
heyongqiang 已提交
745 746
SHARED = $(SHARED1)
else
747 748
SHARED_MAJOR = $(ROCKSDB_MAJOR)
SHARED_MINOR = $(ROCKSDB_MINOR)
749
SHARED_PATCH = $(ROCKSDB_PATCH)
750
SHARED1 = ${LIBNAME}.$(PLATFORM_SHARED_EXT)
751
ifeq ($(PLATFORM), OS_MACOSX)
752
SHARED_OSX = $(LIBNAME)$(LIBDEBUG).$(SHARED_MAJOR)
753 754 755 756
SHARED2 = $(SHARED_OSX).$(PLATFORM_SHARED_EXT)
SHARED3 = $(SHARED_OSX).$(SHARED_MINOR).$(PLATFORM_SHARED_EXT)
SHARED4 = $(SHARED_OSX).$(SHARED_MINOR).$(SHARED_PATCH).$(PLATFORM_SHARED_EXT)
else
757 758
SHARED2 = $(SHARED1).$(SHARED_MAJOR)
SHARED3 = $(SHARED1).$(SHARED_MAJOR).$(SHARED_MINOR)
759
SHARED4 = $(SHARED1).$(SHARED_MAJOR).$(SHARED_MINOR).$(SHARED_PATCH)
760
endif # MACOSX
761
SHARED = $(SHARED1) $(SHARED2) $(SHARED3) $(SHARED4)
762
$(SHARED1): $(SHARED4) $(SHARED2)
Y
Yueh-Hsuan Chiang 已提交
763
	ln -fs $(SHARED4) $(SHARED1)
764
$(SHARED2): $(SHARED4) $(SHARED3)
Y
Yueh-Hsuan Chiang 已提交
765
	ln -fs $(SHARED4) $(SHARED2)
766
$(SHARED3): $(SHARED4)
Y
Yueh-Hsuan Chiang 已提交
767
	ln -fs $(SHARED4) $(SHARED3)
H
heyongqiang 已提交
768

769 770
endif   # PLATFORM_SHARED_VERSIONED
$(SHARED4): $(LIB_OBJECTS)
771
	$(AM_V_CCLD) $(CXX) $(PLATFORM_SHARED_LDFLAGS)$(SHARED3) $(LIB_OBJECTS) $(LDFLAGS) -o $@
H
heyongqiang 已提交
772 773
endif  # PLATFORM_SHARED_EXT

774
.PHONY: blackbox_crash_test check clean coverage crash_test ldb_tests package \
775
	release tags tags0 valgrind_check whitebox_crash_test format static_lib shared_lib all \
776
	dbg rocksdbjavastatic rocksdbjava gen-pc install install-static install-shared uninstall \
777
	analyze tools tools_lib \
778
	blackbox_crash_test_with_atomic_flush whitebox_crash_test_with_atomic_flush  \
779 780
	blackbox_crash_test_with_txn whitebox_crash_test_with_txn \
	blackbox_crash_test_with_best_efforts_recovery
781

M
maurice barnum 已提交
782

783
all: $(LIBRARY) $(BENCHMARKS) tools tools_lib test_libs $(TESTS)
784

785 786
all_but_some_tests: $(LIBRARY) $(BENCHMARKS) tools tools_lib test_libs $(SUBSET)

787
static_lib: $(STATIC_LIBRARY)
I
Igor Canadi 已提交
788 789 790

shared_lib: $(SHARED)

791 792
stress_lib: $(STRESS_LIBRARY)

M
maurice barnum 已提交
793 794
tools: $(TOOLS)

795 796
tools_lib: $(TOOLS_LIBRARY)

797 798
test_libs: $(TEST_LIBS)

799 800
benchmarks: $(BENCHMARKS)

M
maurice barnum 已提交
801
dbg: $(LIBRARY) $(BENCHMARKS) tools $(TESTS)
K
Kai Liu 已提交
802

803 804 805
# creates library and programs
release: clean
	LIB_MODE=$(LIB_MODE) DEBUG_LEVEL=0 $(MAKE) $(LIBRARY) tools db_bench
K
Kai Liu 已提交
806

807
coverage: clean
Y
Yueh-Hsuan Chiang 已提交
808 809 810
	COVERAGEFLAGS="-fprofile-arcs -ftest-coverage" LDFLAGS+="-lgcov" $(MAKE) J=1 all check
	cd coverage && ./coverage_test.sh
        # Delete intermediate files
811
	$(FIND) . -type f -regex ".*\.\(\(gcda\)\|\(gcno\)\)" -exec rm -f {} \;
J
jorlow@chromium.org 已提交
812

Y
Yi Wu 已提交
813 814 815 816 817
ifneq (,$(filter check parallel_check,$(MAKECMDGOALS)),)
# Use /dev/shm if it has the sticky bit set (otherwise, /tmp),
# and create a randomly-named rocksdb.XXXX directory therein.
# We'll use that directory in the "make check" rules.
ifeq ($(TMPD),)
T
Tomas Kolda 已提交
818 819
TMPDIR := $(shell echo $${TMPDIR:-/tmp})
TMPD := $(shell f=/dev/shm; test -k $$f || f=$(TMPDIR);     \
Y
Yi Wu 已提交
820 821 822 823 824 825 826 827 828 829 830 831 832 833
  perl -le 'use File::Temp "tempdir";'					\
    -e 'print tempdir("'$$f'/rocksdb.XXXX", CLEANUP => 0)')
endif
endif

# Run all tests in parallel, accumulating per-test logs in t/log-*.
#
# Each t/run-* file is a tiny generated bourne shell script that invokes one of
# sub-tests. Why use a file for this?  Because that makes the invocation of
# parallel below simpler, which in turn makes the parsing of parallel's
# LOG simpler (the latter is for live monitoring as parallel
# tests run).
#
# Test names are extracted by running tests with --gtest_list_tests.
834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851
# This filter removes the "#"-introduced comments, and expands to
# fully-qualified names by changing input like this:
#
#   DBTest.
#     Empty
#     WriteEmptyBatch
#   MultiThreaded/MultiThreadedDBTest.
#     MultiThreaded/0  # GetParam() = 0
#     MultiThreaded/1  # GetParam() = 1
#
# into this:
#
#   DBTest.Empty
#   DBTest.WriteEmptyBatch
#   MultiThreaded/MultiThreadedDBTest.MultiThreaded/0
#   MultiThreaded/MultiThreadedDBTest.MultiThreaded/1
#

Y
Yi Wu 已提交
852 853 854 855 856 857 858 859 860 861 862
parallel_tests = $(patsubst %,parallel_%,$(PARALLEL_TEST))
.PHONY: gen_parallel_tests $(parallel_tests)
$(parallel_tests): $(PARALLEL_TEST)
	$(AM_V_at)TEST_BINARY=$(patsubst parallel_%,%,$@); \
  TEST_NAMES=` \
    ./$$TEST_BINARY --gtest_list_tests \
    | perl -n \
      -e 's/ *\#.*//;' \
      -e '/^(\s*)(\S+)/; !$$1 and do {$$p=$$2; break};'	\
      -e 'print qq! $$p$$2!'`; \
	for TEST_NAME in $$TEST_NAMES; do \
863
		TEST_SCRIPT=t/run-$$TEST_BINARY-$${TEST_NAME//\//-}; \
Y
Yi Wu 已提交
864 865 866 867 868
		echo "  GEN     " $$TEST_SCRIPT; \
    printf '%s\n' \
      '#!/bin/sh' \
      "d=\$(TMPD)$$TEST_SCRIPT" \
      'mkdir -p $$d' \
869
      "TEST_TMPDIR=\$$d $(DRIVER) ./$$TEST_BINARY --gtest_filter=$$TEST_NAME" \
Y
Yi Wu 已提交
870 871 872 873 874 875
		> $$TEST_SCRIPT; \
		chmod a=rx $$TEST_SCRIPT; \
	done

gen_parallel_tests:
	$(AM_V_at)mkdir -p t
876
	$(AM_V_at)$(FIND) t -type f -name 'run-*' -exec rm -f {} \;
Y
Yi Wu 已提交
877
	$(MAKE) $(parallel_tests)
878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895

# Reorder input lines (which are one per test) so that the
# longest-running tests appear first in the output.
# Do this by prefixing each selected name with its duration,
# sort the resulting names, and remove the leading numbers.
# FIXME: the "100" we prepend is a fake time, for now.
# FIXME: squirrel away timings from each run and use them
# (when present) on subsequent runs to order these tests.
#
# Without this reordering, these two tests would happen to start only
# after almost all other tests had completed, thus adding 100 seconds
# to the duration of parallel "make check".  That's the difference
# between 4 minutes (old) and 2m20s (new).
#
# 152.120 PASS t/DBTest.FileCreationRandomFailure
# 107.816 PASS t/DBTest.EncodeDecompressedBlockSizeTest
#
slow_test_regexp = \
Y
Yi Wu 已提交
896
	^.*SnapshotConcurrentAccessTest.*$$|^t/run-table_test-HarnessTest.Randomized$$|^t/run-db_test-.*(?:FileCreationRandomFailure|EncodeDecompressedBlockSizeTest)$$|^.*RecoverFromCorruptedWALWithoutFlush$$
897
prioritize_long_running_tests =						\
Y
Yueh-Hsuan Chiang 已提交
898 899 900
  perl -pe 's,($(slow_test_regexp)),100 $$1,'				\
    | sort -k1,1gr							\
    | sed 's/^[.0-9]* //'
901 902 903 904 905 906

# "make check" uses
# Run with "make J=1 check" to disable parallelism in "make check".
# Run with "make J=200% check" to run two parallel jobs per core.
# The default is to run one job per core (J=100%).
# See "man parallel" for its "-j ..." option.
Y
Yi Wu 已提交
907
J ?= 100%
908

V
Venkatesh Radhakrishnan 已提交
909 910
# Use this regexp to select the subset of tests whose names match.
tests-regexp = .
911
EXCLUDE_TESTS_REGEX ?= "^$"
V
Venkatesh Radhakrishnan 已提交
912

913
ifeq ($(PRINT_PARALLEL_OUTPUTS), 1)
914 915 916 917 918
	parallel_com = '{}'
else
	parallel_com = '{} >& t/log-{/}'
endif

919
.PHONY: check_0
Y
Yi Wu 已提交
920 921
check_0:
	$(AM_V_GEN)export TEST_TMPDIR=$(TMPD); \
Y
Yueh-Hsuan Chiang 已提交
922 923 924
	printf '%s\n' ''						\
	  'To monitor subtest <duration,pass/fail,name>,'		\
	  '  run "make watch-log" in a separate window' '';		\
Y
Yi Wu 已提交
925 926 927
	test -t 1 && eta=--eta || eta=; \
	{ \
		printf './%s\n' $(filter-out $(PARALLEL_TEST),$(TESTS)); \
928
		find t -name 'run-*' -print; \
Y
Yi Wu 已提交
929
	} \
Y
Yueh-Hsuan Chiang 已提交
930 931
	  | $(prioritize_long_running_tests)				\
	  | grep -E '$(tests-regexp)'					\
932
	  | grep -E -v '$(EXCLUDE_TESTS_REGEX)'					\
933 934 935
	  | build_tools/gnu_parallel -j$(J) --plain --joblog=LOG $$eta --gnu  $(parallel_com) ; \
	parallel_retcode=$$? ; \
	awk '{ if ($$7 != 0 || $$8 != 0) { if ($$7 == "Exitval") { h = $$0; } else { if (!f) print h; print; f = 1 } } } END { if(f) exit 1; }' < LOG ; \
936 937
	awk_retcode=$$?; \
	if [ $$parallel_retcode -ne 0 ] || [ $$awk_retcode -ne 0 ] ; then exit 1 ; fi
S
sdong 已提交
938

939
valgrind-exclude-regexp = InlineSkipTest.ConcurrentInsert|TransactionStressTest.DeadlockStress|DBCompactionTest.SuggestCompactRangeNoTwoLevel0Compactions|BackupableDBTest.RateLimiting|DBTest.CloseSpeedup|DBTest.ThreadStatusFlush|DBTest.RateLimitingTest|DBTest.EncodeDecompressedBlockSizeTest|FaultInjectionTest.UninstalledCompaction|HarnessTest.Randomized|ExternalSSTFileTest.CompactDuringAddFileRandom|ExternalSSTFileTest.IngestFileWithGlobalSeqnoRandomized|MySQLStyleTransactionTest.TransactionStressTest
940

S
sdong 已提交
941
.PHONY: valgrind_check_0
Y
Yi Wu 已提交
942
valgrind_check_0:
S
sdong 已提交
943 944 945 946 947 948
	$(AM_V_GEN)export TEST_TMPDIR=$(TMPD);				\
	printf '%s\n' ''						\
	  'To monitor subtest <duration,pass/fail,name>,'		\
	  '  run "make watch-log" in a separate window' '';		\
	test -t 1 && eta=--eta || eta=;					\
	{								\
Y
Yi Wu 已提交
949
	  printf './%s\n' $(filter-out $(PARALLEL_TEST) %skiplist_test options_settable_test, $(TESTS));		\
950
	  find t -name 'run-*' -print; \
S
sdong 已提交
951 952 953
	}								\
	  | $(prioritize_long_running_tests)				\
	  | grep -E '$(tests-regexp)'					\
954
	  | grep -E -v '$(valgrind-exclude-regexp)'					\
955
	  | build_tools/gnu_parallel -j$(J) --plain --joblog=LOG $$eta --gnu \
956 957
	  '(if [[ "{}" == "./"* ]] ; then $(DRIVER) {}; else {}; fi) ' \
	  '>& t/valgrind_log-{/}'
958 959

CLEAN_FILES += t LOG $(TMPD)
960

961 962 963 964 965 966 967 968
# When running parallel "make check", you can monitor its progress
# from another window.
# Run "make watch_LOG" to show the duration,PASS/FAIL,name of parallel
# tests as they are being run.  We sort them so that longer-running ones
# appear at the top of the list and any failing tests remain at the top
# regardless of their duration. As with any use of "watch", hit ^C to
# interrupt.
watch-log:
969
	$(WATCH) --interval=0 'sort -k7,7nr -k4,4gr LOG|$(quoted_perl_command)'
970

971 972 973
dump-log:
	bash -c '$(quoted_perl_command)' < LOG

I
Igor Canadi 已提交
974
# If J != 1 and GNU parallel is installed, run the tests in parallel,
975 976
# via the check_0 rule above.  Otherwise, run them sequentially.
check: all
Y
Yi Wu 已提交
977
	$(MAKE) gen_parallel_tests
Y
Yueh-Hsuan Chiang 已提交
978
	$(AM_V_GEN)if test "$(J)" != 1                                  \
979
	    && (build_tools/gnu_parallel --gnu --help 2>/dev/null) |                    \
Y
Yueh-Hsuan Chiang 已提交
980 981 982 983 984
	        grep -q 'GNU Parallel';                                 \
	then                                                            \
	    $(MAKE) T="$$t" TMPD=$(TMPD) check_0;                       \
	else                                                            \
	    for t in $(TESTS); do                                       \
985
	      echo "===== Running $$t (`date`)"; ./$$t || exit 1; done;          \
Y
Yueh-Hsuan Chiang 已提交
986 987
	fi
	rm -rf $(TMPD)
T
Tomas Kolda 已提交
988
ifneq ($(PLATFORM), OS_AIX)
989
	$(PYTHON) tools/check_all_python.py
I
Islam AbdelRahman 已提交
990
ifeq ($(filter -DROCKSDB_LITE,$(OPT)),)
991
ifndef ASSERT_STATUS_CHECKED # not yet working with these tests
992
	$(PYTHON) tools/ldb_test.py
Y
Yueh-Hsuan Chiang 已提交
993
	sh tools/rocksdb_dump_test.sh
I
Islam AbdelRahman 已提交
994
endif
995
endif
996
endif
997
ifndef SKIP_FORMAT_BUCK_CHECKS
998 999
	$(MAKE) check-format
	$(MAKE) check-buck-targets
1000
endif
1001

S
Siying Dong 已提交
1002 1003
# TODO add ldb_tests
check_some: $(SUBSET)
1004
	for t in $(SUBSET); do echo "===== Running $$t (`date`)"; ./$$t || exit 1; done
1005 1006

.PHONY: ldb_tests
1007
ldb_tests: ldb
1008
	$(PYTHON) tools/ldb_test.py
1009

I
Igor Canadi 已提交
1010
crash_test: whitebox_crash_test blackbox_crash_test
1011

1012 1013
crash_test_with_atomic_flush: whitebox_crash_test_with_atomic_flush blackbox_crash_test_with_atomic_flush

1014 1015
crash_test_with_txn: whitebox_crash_test_with_txn blackbox_crash_test_with_txn

1016 1017
crash_test_with_best_efforts_recovery: blackbox_crash_test_with_best_efforts_recovery

1018
blackbox_crash_test: db_stress
1019 1020
	$(PYTHON) -u tools/db_crashtest.py --simple blackbox $(CRASH_TEST_EXT_ARGS)
	$(PYTHON) -u tools/db_crashtest.py blackbox $(CRASH_TEST_EXT_ARGS)
1021

1022
blackbox_crash_test_with_atomic_flush: db_stress
1023
	$(PYTHON) -u tools/db_crashtest.py --cf_consistency blackbox $(CRASH_TEST_EXT_ARGS)
1024

1025
blackbox_crash_test_with_txn: db_stress
1026
	$(PYTHON) -u tools/db_crashtest.py --txn blackbox $(CRASH_TEST_EXT_ARGS)
1027

1028 1029 1030
blackbox_crash_test_with_best_efforts_recovery: db_stress
	$(PYTHON) -u tools/db_crashtest.py --test_best_efforts_recovery blackbox $(CRASH_TEST_EXT_ARGS)

1031 1032 1033 1034
ifeq ($(CRASH_TEST_KILL_ODD),)
  CRASH_TEST_KILL_ODD=888887
endif

1035
whitebox_crash_test: db_stress
1036
	$(PYTHON) -u tools/db_crashtest.py --simple whitebox --random_kill_odd \
1037
      $(CRASH_TEST_KILL_ODD) $(CRASH_TEST_EXT_ARGS)
1038
	$(PYTHON) -u tools/db_crashtest.py whitebox  --random_kill_odd \
1039
      $(CRASH_TEST_KILL_ODD) $(CRASH_TEST_EXT_ARGS)
1040

1041
whitebox_crash_test_with_atomic_flush: db_stress
1042
	$(PYTHON) -u tools/db_crashtest.py --cf_consistency whitebox  --random_kill_odd \
1043 1044
      $(CRASH_TEST_KILL_ODD) $(CRASH_TEST_EXT_ARGS)

1045
whitebox_crash_test_with_txn: db_stress
1046
	$(PYTHON) -u tools/db_crashtest.py --txn whitebox --random_kill_odd \
1047 1048
      $(CRASH_TEST_KILL_ODD) $(CRASH_TEST_EXT_ARGS)

1049
asan_check: clean
Y
Yueh-Hsuan Chiang 已提交
1050 1051
	COMPILE_WITH_ASAN=1 $(MAKE) check -j32
	$(MAKE) clean
1052

1053
asan_crash_test: clean
Y
Yueh-Hsuan Chiang 已提交
1054 1055
	COMPILE_WITH_ASAN=1 $(MAKE) crash_test
	$(MAKE) clean
I
Igor Canadi 已提交
1056

1057 1058 1059 1060 1061 1062 1063 1064
whitebox_asan_crash_test: clean
	COMPILE_WITH_ASAN=1 $(MAKE) whitebox_crash_test
	$(MAKE) clean

blackbox_asan_crash_test: clean
	COMPILE_WITH_ASAN=1 $(MAKE) blackbox_crash_test
	$(MAKE) clean

1065
asan_crash_test_with_atomic_flush: clean
1066 1067 1068
	COMPILE_WITH_ASAN=1 $(MAKE) crash_test_with_atomic_flush
	$(MAKE) clean

1069
asan_crash_test_with_txn: clean
1070 1071 1072
	COMPILE_WITH_ASAN=1 $(MAKE) crash_test_with_txn
	$(MAKE) clean

1073
asan_crash_test_with_best_efforts_recovery: clean
1074 1075 1076
	COMPILE_WITH_ASAN=1 $(MAKE) crash_test_with_best_efforts_recovery
	$(MAKE) clean

1077
ubsan_check: clean
1078 1079 1080
	COMPILE_WITH_UBSAN=1 $(MAKE) check -j32
	$(MAKE) clean

1081
ubsan_crash_test: clean
1082 1083 1084
	COMPILE_WITH_UBSAN=1 $(MAKE) crash_test
	$(MAKE) clean

1085 1086 1087 1088 1089 1090 1091 1092
whitebox_ubsan_crash_test: clean
	COMPILE_WITH_UBSAN=1 $(MAKE) whitebox_crash_test
	$(MAKE) clean

blackbox_ubsan_crash_test: clean
	COMPILE_WITH_UBSAN=1 $(MAKE) blackbox_crash_test
	$(MAKE) clean

1093
ubsan_crash_test_with_atomic_flush: clean
1094 1095 1096
	COMPILE_WITH_UBSAN=1 $(MAKE) crash_test_with_atomic_flush
	$(MAKE) clean

1097
ubsan_crash_test_with_txn: clean
1098 1099 1100
	COMPILE_WITH_UBSAN=1 $(MAKE) crash_test_with_txn
	$(MAKE) clean

1101
ubsan_crash_test_with_best_efforts_recovery: clean
1102 1103 1104
	COMPILE_WITH_UBSAN=1 $(MAKE) crash_test_with_best_efforts_recovery
	$(MAKE) clean

1105
valgrind_test:
1106
	ROCKSDB_VALGRIND_RUN=1 DISABLE_JEMALLOC=1 $(MAKE) valgrind_check
1107

I
Igor Canadi 已提交
1108
valgrind_check: $(TESTS)
1109
	$(MAKE) DRIVER="$(VALGRIND_VER) $(VALGRIND_OPTS)" gen_parallel_tests
S
sdong 已提交
1110
	$(AM_V_GEN)if test "$(J)" != 1                                  \
1111
	    && (build_tools/gnu_parallel --gnu --help 2>/dev/null) |                    \
S
sdong 已提交
1112 1113
	        grep -q 'GNU Parallel';                                 \
	then                                                            \
Y
Yi Wu 已提交
1114
      $(MAKE) TMPD=$(TMPD)                                        \
S
sdong 已提交
1115 1116 1117 1118 1119 1120 1121 1122 1123 1124
      DRIVER="$(VALGRIND_VER) $(VALGRIND_OPTS)" valgrind_check_0; \
	else                                                            \
		for t in $(filter-out %skiplist_test options_settable_test,$(TESTS)); do \
			$(VALGRIND_VER) $(VALGRIND_OPTS) ./$$t; \
			ret_code=$$?; \
			if [ $$ret_code -ne 0 ]; then \
				exit $$ret_code; \
			fi; \
		done; \
	fi
1125

1126 1127 1128 1129 1130

ifneq ($(PAR_TEST),)
parloop:
	ret_bad=0;							\
	for t in $(PAR_TEST); do		\
1131
		echo "===== Running $$t in parallel $(NUM_PAR) (`date`)";\
1132
		if [ $(db_test) -eq 1 ]; then \
1133
			seq $(J) | v="$$t" build_tools/gnu_parallel --gnu --plain 's=$(TMPD)/rdb-{};  export TEST_TMPDIR=$$s;' \
1134 1135
				'timeout 2m ./db_test --gtest_filter=$$v >> $$s/log-{} 2>1'; \
		else\
1136
			seq $(J) | v="./$$t" build_tools/gnu_parallel --gnu --plain 's=$(TMPD)/rdb-{};' \
1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147
			     'export TEST_TMPDIR=$$s; timeout 10m $$v >> $$s/log-{} 2>1'; \
		fi; \
		ret_code=$$?; \
		if [ $$ret_code -ne 0 ]; then \
			ret_bad=$$ret_code; \
			echo $$t exited with $$ret_code; \
		fi; \
	done; \
	exit $$ret_bad;
endif

Y
Yi Wu 已提交
1148 1149 1150 1151 1152 1153 1154
test_names = \
  ./db_test --gtest_list_tests						\
    | perl -n								\
      -e 's/ *\#.*//;'							\
      -e '/^(\s*)(\S+)/; !$$1 and do {$$p=$$2; break};'			\
      -e 'print qq! $$p$$2!'

1155 1156
parallel_check: $(TESTS)
	$(AM_V_GEN)if test "$(J)" > 1                                  \
1157
	    && (build_tools/gnu_parallel --gnu --help 2>/dev/null) |                    \
1158 1159 1160 1161 1162 1163 1164 1165 1166
	        grep -q 'GNU Parallel';                                 \
	then                                                            \
	    echo Running in parallel $(J);			\
	else                                                            \
	    echo "Need to have GNU Parallel and J > 1"; exit 1;		\
	fi;								\
	ret_bad=0;							\
	echo $(J);\
	echo Test Dir: $(TMPD); \
1167
        seq $(J) | build_tools/gnu_parallel --gnu --plain 's=$(TMPD)/rdb-{}; rm -rf $$s; mkdir $$s'; \
1168
	$(MAKE)  PAR_TEST="$(shell $(test_names))" TMPD=$(TMPD) \
1169 1170 1171 1172
		J=$(J) db_test=1 parloop; \
	$(MAKE) PAR_TEST="$(filter-out db_test, $(TESTS))" \
		TMPD=$(TMPD) J=$(J) db_test=0 parloop;

1173
analyze: clean
1174 1175 1176
	USE_CLANG=1 $(MAKE) analyze_incremental

analyze_incremental:
Y
Yueh-Hsuan Chiang 已提交
1177 1178 1179 1180
	$(CLANG_SCAN_BUILD) --use-analyzer=$(CLANG_ANALYZER) \
		--use-c++=$(CXX) --use-cc=$(CC) --status-bugs \
		-o $(CURDIR)/scan_build_report \
		$(MAKE) dbg
1181

1182 1183
CLEAN_FILES += unity.cc
unity.cc: Makefile
Y
Yueh-Hsuan Chiang 已提交
1184 1185
	rm -f $@ $@-t
	for source_file in $(LIB_SOURCES); do \
E
Evan Shaw 已提交
1186
		echo "#include \"$$source_file\"" >> $@-t; \
Y
Yueh-Hsuan Chiang 已提交
1187 1188 1189
	done
	chmod a=r $@-t
	mv $@-t $@
M
miguelportilla 已提交
1190

1191
unity.a: $(OBJ_DIR)/unity.o
E
Evan Shaw 已提交
1192
	$(AM_V_AR)rm -f $@
1193
	$(AM_V_at)$(AR) $(ARFLAGS) $@ $(OBJ_DIR)/unity.o
E
Evan Shaw 已提交
1194

1195

I
Igor Canadi 已提交
1196
# try compiling db_test with unity
1197
unity_test: $(OBJ_DIR)/db/db_basic_test.o $(OBJ_DIR)/db/db_test_util.o $(TEST_OBJECTS) $(TOOL_OBJECTS) unity.a
I
Igor Canadi 已提交
1198 1199 1200
	$(AM_LINK)
	./unity_test

E
Evan Shaw 已提交
1201 1202
rocksdb.h rocksdb.cc: build_tools/amalgamate.py Makefile $(LIB_SOURCES) unity.cc
	build_tools/amalgamate.py -I. -i./include unity.cc -x include/rocksdb/c.h -H rocksdb.h -o rocksdb.cc
M
miguelportilla 已提交
1203

1204
clean: clean-ext-libraries-all clean-rocks clean-rocksjava
1205

1206
clean-not-downloaded: clean-ext-libraries-bin clean-rocks clean-not-downloaded-rocksjava
1207 1208

clean-rocks:
1209 1210 1211
	echo shared=$(ALL_SHARED_LIBS)
	echo static=$(ALL_STATIC_LIBS)
	rm -f $(BENCHMARKS) $(TOOLS) $(TESTS) $(PARALLEL_TEST) $(ALL_STATIC_LIBS) $(ALL_SHARED_LIBS)
Y
Yueh-Hsuan Chiang 已提交
1212
	rm -rf $(CLEAN_FILES) ios-x86 ios-arm scan_build_report
1213
	$(FIND) . -name "*.[oda]" -exec rm -f {} \;
1214
	$(FIND) . -type f -regex ".*\.\(\(gcda\)\|\(gcno\)\)" -exec rm -f {} \;
1215 1216

clean-rocksjava:
1217
	rm -rf jl jls
1218 1219 1220 1221
	cd java && $(MAKE) clean

clean-not-downloaded-rocksjava:
	cd java && $(MAKE) clean-not-downloaded
1222

1223 1224 1225 1226 1227 1228
clean-ext-libraries-all:
	rm -rf bzip2* snappy* zlib* lz4* zstd*

clean-ext-libraries-bin:
	find . -maxdepth 1 -type d \( -name bzip2\* -or -name snappy\* -or -name zlib\* -or -name lz4\* -or -name zstd\* \) -prune -exec rm -rf {} \;

1229
tags:
1230
	ctags -R .
1231
	cscope -b `$(FIND) . -name '*.cc'` `$(FIND) . -name '*.h'` `$(FIND) . -name '*.c'`
L
Leonidas Galanis 已提交
1232
	ctags -e -R -o etags *
1233

1234 1235 1236 1237 1238 1239 1240
tags0:
	ctags -R .
	cscope -b `$(FIND) . -name '*.cc' -and ! -name '*_test.cc'` \
		  `$(FIND) . -name '*.c' -and ! -name '*_test.c'` \
		  `$(FIND) . -name '*.h' -and ! -name '*_test.h'`
	ctags -e -R -o etags *

1241
format:
Y
Yueh-Hsuan Chiang 已提交
1242
	build_tools/format-diff.sh
1243

1244 1245 1246 1247 1248 1249
check-format:
	build_tools/format-diff.sh -c

check-buck-targets:
	buckifier/check_buck_targets.sh

1250
package:
Y
Yueh-Hsuan Chiang 已提交
1251
	bash build_tools/make_package.sh $(SHARED_MAJOR).$(SHARED_MINOR)
1252

1253 1254 1255
# ---------------------------------------------------------------------------
# 	Unit tests and tools
# ---------------------------------------------------------------------------
1256 1257 1258
$(STATIC_LIBRARY): $(LIB_OBJECTS)
	$(AM_V_AR)rm -f $@ $(SHARED1) $(SHARED2) $(SHARED3) $(SHARED4)
	$(AM_V_at)$(AR) $(ARFLAGS) $@ $(LIB_OBJECTS)
J
jorlow@chromium.org 已提交
1259

1260 1261
$(STATIC_TEST_LIBRARY): $(TEST_OBJECTS)
	$(AM_V_AR)rm -f $@ $(SHARED_TEST_LIBRARY)
1262 1263
	$(AM_V_at)$(AR) $(ARFLAGS) $@ $^

M
mrambacher 已提交
1264
$(STATIC_TOOLS_LIBRARY): $(BENCH_OBJECTS) $(TOOL_OBJECTS)
1265
	$(AM_V_AR)rm -f $@ $(SHARED_TOOLS_LIBRARY)
1266 1267
	$(AM_V_at)$(AR) $(ARFLAGS) $@ $^

M
mrambacher 已提交
1268
$(STATIC_STRESS_LIBRARY): $(ANALYZE_OBJECTS) $(STRESS_OBJECTS)
1269 1270 1271 1272 1273 1274 1275
	$(AM_V_AR)rm -f $@ $(SHARED_STRESS_LIBRARY)
	$(AM_V_at)$(AR) $(ARFLAGS) $@ $^

$(SHARED_TEST_LIBRARY): $(TEST_OBJECTS) $(SHARED1)
	$(AM_V_AR)rm -f $@ $(STATIC_TEST_LIBRARY)
	$(AM_SHARE)

M
mrambacher 已提交
1276
$(SHARED_TOOLS_LIBRARY): $(TOOL_OBJECTS) $(SHARED1)
1277 1278 1279
	$(AM_V_AR)rm -f $@ $(STATIC_TOOLS_LIBRARY)
	$(AM_SHARE)

M
mrambacher 已提交
1280
$(SHARED_STRESS_LIBRARY): $(ANALYZE_OBJECTS) $(STRESS_OBJECTS) $(SHARED_TOOLS_LIBRARY) $(SHARED1)
1281 1282 1283 1284
	$(AM_V_AR)rm -f $@ $(STATIC_STRESS_LIBRARY)
	$(AM_SHARE)

librocksdb_env_basic_test.a: $(OBJ_DIR)/env/env_basic_test.o $(LIB_OBJECTS) $(TESTHARNESS)
1285 1286 1287
	$(AM_V_AR)rm -f $@
	$(AM_V_at)$(AR) $(ARFLAGS) $@ $^

1288
db_bench: $(OBJ_DIR)/tools/db_bench.o $(BENCH_OBJECTS) $(TESTUTIL) $(LIBRARY)
Y
Yueh-Hsuan Chiang 已提交
1289
	$(AM_LINK)
J
jorlow@chromium.org 已提交
1290

1291
trace_analyzer: $(OBJ_DIR)/tools/trace_analyzer.o $(ANALYZE_OBJECTS) $(TOOLS_LIBRARY) $(LIBRARY)
1292 1293
	$(AM_LINK)

1294
block_cache_trace_analyzer: $(OBJ_DIR)/tools/block_cache_analyzer/block_cache_trace_analyzer_tool.o $(ANALYZE_OBJECTS) $(TOOLS_LIBRARY) $(LIBRARY)
1295 1296
	$(AM_LINK)

1297
ifeq ($(USE_FOLLY_DISTRIBUTED_MUTEX),1)
1298
folly_synchronization_distributed_mutex_test: $(OBJ_DIR)/third-party/folly/folly/synchronization/test/DistributedMutexTest.o $(TEST_LIBRARY) $(LIBRARY)
1299 1300 1301
	$(AM_LINK)
endif

1302
cache_bench: $(OBJ_DIR)/cache/cache_bench.o $(LIBRARY)
Y
Yueh-Hsuan Chiang 已提交
1303
	$(AM_LINK)
J
jorlow@chromium.org 已提交
1304

1305
persistent_cache_bench: $(OBJ_DIR)/utilities/persistent_cache/persistent_cache_bench.o $(LIBRARY)
1306 1307
	$(AM_LINK)

M
mrambacher 已提交
1308
memtablerep_bench: $(OBJ_DIR)/memtable/memtablerep_bench.o $(LIBRARY)
Y
Yueh-Hsuan Chiang 已提交
1309
	$(AM_LINK)
A
Ameya Gupte 已提交
1310

1311
filter_bench: $(OBJ_DIR)/util/filter_bench.o $(LIBRARY)
1312 1313
	$(AM_LINK)

M
mrambacher 已提交
1314
db_stress: $(OBJ_DIR)/db_stress_tool/db_stress.o $(STRESS_LIBRARY) $(TOOLS_LIBRARY) $(LIBRARY)
Y
Yueh-Hsuan Chiang 已提交
1315
	$(AM_LINK)
P
Peter Dillinger 已提交
1316

1317
write_stress: $(OBJ_DIR)/tools/write_stress.o $(LIBRARY)
I
Igor Canadi 已提交
1318 1319
	$(AM_LINK)

1320
db_sanity_test: $(OBJ_DIR)/tools/db_sanity_test.o $(LIBRARY)
Y
Yueh-Hsuan Chiang 已提交
1321
	$(AM_LINK)
1322

M
mrambacher 已提交
1323
db_repl_stress: $(OBJ_DIR)/tools/db_repl_stress.o $(LIBRARY)
Y
Yueh-Hsuan Chiang 已提交
1324
	$(AM_LINK)
1325

1326
arena_test: $(OBJ_DIR)/memory/arena_test.o $(TEST_LIBRARY) $(LIBRARY)
Y
Yueh-Hsuan Chiang 已提交
1327
	$(AM_LINK)
1328

1329
memkind_kmem_allocator_test: memory/memkind_kmem_allocator_test.o $(TEST_LIBRARY) $(LIBRARY)
1330
	$(AM_LINK)
J
jorlow@chromium.org 已提交
1331

1332
autovector_test: $(OBJ_DIR)/util/autovector_test.o $(TEST_LIBRARY) $(LIBRARY)
Y
Yueh-Hsuan Chiang 已提交
1333
	$(AM_LINK)
K
kailiu 已提交
1334

1335
column_family_test: $(OBJ_DIR)/db/column_family_test.o $(TEST_LIBRARY) $(LIBRARY)
Y
Yueh-Hsuan Chiang 已提交
1336
	$(AM_LINK)
1337

1338
table_properties_collector_test: $(OBJ_DIR)/db/table_properties_collector_test.o $(TEST_LIBRARY) $(LIBRARY)
Y
Yueh-Hsuan Chiang 已提交
1339
	$(AM_LINK)
1340

1341
bloom_test: $(OBJ_DIR)/util/bloom_test.o $(TEST_LIBRARY) $(LIBRARY)
Y
Yueh-Hsuan Chiang 已提交
1342
	$(AM_LINK)
S
Sanjay Ghemawat 已提交
1343

1344
dynamic_bloom_test: $(OBJ_DIR)/util/dynamic_bloom_test.o $(TEST_LIBRARY) $(LIBRARY)
Y
Yueh-Hsuan Chiang 已提交
1345
	$(AM_LINK)
1346

1347
c_test: $(OBJ_DIR)/db/c_test.o $(TEST_LIBRARY) $(LIBRARY)
Y
Yueh-Hsuan Chiang 已提交
1348
	$(AM_LINK)
1349

1350
cache_test: $(OBJ_DIR)/cache/cache_test.o $(TEST_LIBRARY) $(LIBRARY)
Y
Yueh-Hsuan Chiang 已提交
1351
	$(AM_LINK)
J
jorlow@chromium.org 已提交
1352

1353
coding_test: $(OBJ_DIR)/util/coding_test.o $(TEST_LIBRARY) $(LIBRARY)
Y
Yueh-Hsuan Chiang 已提交
1354
	$(AM_LINK)
J
jorlow@chromium.org 已提交
1355

1356
hash_test: $(OBJ_DIR)/util/hash_test.o $(TEST_LIBRARY) $(LIBRARY)
1357 1358
	$(AM_LINK)

1359
random_test: $(OBJ_DIR)/util/random_test.o  $(TEST_LIBRARY) $(LIBRARY)
1360 1361
	$(AM_LINK)

1362
option_change_migration_test: $(OBJ_DIR)/utilities/option_change_migration/option_change_migration_test.o $(TEST_LIBRARY) $(LIBRARY)
1363 1364
	$(AM_LINK)

1365
stringappend_test: $(OBJ_DIR)/utilities/merge_operators/string_append/stringappend_test.o $(TEST_LIBRARY) $(LIBRARY)
Y
Yueh-Hsuan Chiang 已提交
1366
	$(AM_LINK)
1367

1368
cassandra_format_test: $(OBJ_DIR)/utilities/cassandra/cassandra_format_test.o $(OBJ_DIR)/utilities/cassandra/test_utils.o $(TEST_LIBRARY) $(LIBRARY)
1369 1370
	$(AM_LINK)

1371
cassandra_functional_test: $(OBJ_DIR)/utilities/cassandra/cassandra_functional_test.o $(OBJ_DIR)/utilities/cassandra/test_utils.o $(TEST_LIBRARY) $(LIBRARY)
1372 1373
	$(AM_LINK)

1374
cassandra_row_merge_test: $(OBJ_DIR)/utilities/cassandra/cassandra_row_merge_test.o $(OBJ_DIR)/utilities/cassandra/test_utils.o $(TEST_LIBRARY) $(LIBRARY)
1375 1376
	$(AM_LINK)

1377
cassandra_serialize_test: $(OBJ_DIR)/utilities/cassandra/cassandra_serialize_test.o $(TEST_LIBRARY) $(LIBRARY)
1378 1379
	$(AM_LINK)

1380
hash_table_test: $(OBJ_DIR)/utilities/persistent_cache/hash_table_test.o $(TEST_LIBRARY) $(LIBRARY)
1381 1382
	$(AM_LINK)

1383
histogram_test: $(OBJ_DIR)/monitoring/histogram_test.o $(TEST_LIBRARY) $(LIBRARY)
Y
Yueh-Hsuan Chiang 已提交
1384
	$(AM_LINK)
A
Abhishek Kona 已提交
1385

1386
thread_local_test: $(OBJ_DIR)/util/thread_local_test.o $(TEST_LIBRARY) $(LIBRARY)
Y
Yueh-Hsuan Chiang 已提交
1387
	$(AM_LINK)
L
Lei Jin 已提交
1388

1389
work_queue_test: $(OBJ_DIR)/util/work_queue_test.o $(TEST_LIBRARY) $(LIBRARY)
1390 1391
	$(AM_LINK)

1392
corruption_test: $(OBJ_DIR)/db/corruption_test.o $(TEST_LIBRARY) $(LIBRARY)
Y
Yueh-Hsuan Chiang 已提交
1393
	$(AM_LINK)
J
jorlow@chromium.org 已提交
1394

1395
crc32c_test: $(OBJ_DIR)/util/crc32c_test.o $(TEST_LIBRARY) $(LIBRARY)
Y
Yueh-Hsuan Chiang 已提交
1396
	$(AM_LINK)
J
jorlow@chromium.org 已提交
1397

1398
slice_test: $(OBJ_DIR)/util/slice_test.o $(TEST_LIBRARY) $(LIBRARY)
1399 1400
	$(AM_LINK)

1401
slice_transform_test: $(OBJ_DIR)/util/slice_transform_test.o $(TEST_LIBRARY) $(LIBRARY)
Y
Yueh-Hsuan Chiang 已提交
1402
	$(AM_LINK)
1403

1404
db_basic_test: $(OBJ_DIR)/db/db_basic_test.o $(TEST_LIBRARY) $(LIBRARY)
E
Ewout Prangsma 已提交
1405 1406
	$(AM_LINK)

1407
db_with_timestamp_basic_test: $(OBJ_DIR)/db/db_with_timestamp_basic_test.o $(TEST_LIBRARY) $(LIBRARY)
1408 1409
	$(AM_LINK)

1410
db_with_timestamp_compaction_test: db/db_with_timestamp_compaction_test.o $(TEST_LIBRARY) $(LIBRARY)
1411 1412
	$(AM_LINK)

1413
db_encryption_test: $(OBJ_DIR)/db/db_encryption_test.o $(TEST_LIBRARY) $(LIBRARY)
1414 1415
	$(AM_LINK)

1416
db_test: $(OBJ_DIR)/db/db_test.o $(TEST_LIBRARY) $(LIBRARY)
Y
Yueh-Hsuan Chiang 已提交
1417
	$(AM_LINK)
J
jorlow@chromium.org 已提交
1418

1419
db_test2: $(OBJ_DIR)/db/db_test2.o $(TEST_LIBRARY) $(LIBRARY)
1420 1421
	$(AM_LINK)

1422
db_logical_block_size_cache_test: $(OBJ_DIR)/db/db_logical_block_size_cache_test.o $(TEST_LIBRARY) $(LIBRARY)
1423 1424
	$(AM_LINK)

1425
db_blob_index_test: $(OBJ_DIR)/db/blob/db_blob_index_test.o $(TEST_LIBRARY) $(LIBRARY)
Y
Yi Wu 已提交
1426 1427
	$(AM_LINK)

1428
db_block_cache_test: $(OBJ_DIR)/db/db_block_cache_test.o $(TEST_LIBRARY) $(LIBRARY)
1429 1430
	$(AM_LINK)

1431
db_bloom_filter_test: $(OBJ_DIR)/db/db_bloom_filter_test.o $(TEST_LIBRARY) $(LIBRARY)
Y
Yi Wu 已提交
1432 1433
	$(AM_LINK)

1434
db_log_iter_test: $(OBJ_DIR)/db/db_log_iter_test.o $(TEST_LIBRARY) $(LIBRARY)
1435
	$(AM_LINK)
1436

1437
db_compaction_filter_test: $(OBJ_DIR)/db/db_compaction_filter_test.o $(TEST_LIBRARY) $(LIBRARY)
1438 1439
	$(AM_LINK)

1440
db_compaction_test: $(OBJ_DIR)/db/db_compaction_test.o $(TEST_LIBRARY) $(LIBRARY)
1441 1442
	$(AM_LINK)

1443
db_dynamic_level_test: $(OBJ_DIR)/db/db_dynamic_level_test.o $(TEST_LIBRARY) $(LIBRARY)
1444 1445
	$(AM_LINK)

1446
db_flush_test: $(OBJ_DIR)/db/db_flush_test.o $(TEST_LIBRARY) $(LIBRARY)
1447 1448
	$(AM_LINK)

1449
db_inplace_update_test: $(OBJ_DIR)/db/db_inplace_update_test.o $(TEST_LIBRARY) $(LIBRARY)
1450 1451
	$(AM_LINK)

1452
db_iterator_test: $(OBJ_DIR)/db/db_iterator_test.o $(TEST_LIBRARY) $(LIBRARY)
Y
Yi Wu 已提交
1453 1454
	$(AM_LINK)

1455
db_memtable_test: $(OBJ_DIR)/db/db_memtable_test.o $(TEST_LIBRARY) $(LIBRARY)
1456 1457
	$(AM_LINK)

1458
db_merge_operator_test: $(OBJ_DIR)/db/db_merge_operator_test.o $(TEST_LIBRARY) $(LIBRARY)
1459 1460
	$(AM_LINK)

1461
db_merge_operand_test: $(OBJ_DIR)/db/db_merge_operand_test.o $(TEST_LIBRARY) $(LIBRARY)
1462
	$(AM_LINK)
1463

1464
db_options_test: $(OBJ_DIR)/db/db_options_test.o $(TEST_LIBRARY) $(LIBRARY)
1465 1466
	$(AM_LINK)

1467
db_range_del_test: $(OBJ_DIR)/db/db_range_del_test.o $(TEST_LIBRARY) $(LIBRARY)
1468 1469
	$(AM_LINK)

1470
db_sst_test: $(OBJ_DIR)/db/db_sst_test.o $(TEST_LIBRARY) $(LIBRARY)
Y
Yi Wu 已提交
1471 1472
	$(AM_LINK)

1473
db_statistics_test: $(OBJ_DIR)/db/db_statistics_test.o $(TEST_LIBRARY) $(LIBRARY)
1474 1475
	$(AM_LINK)

1476
db_write_test: $(OBJ_DIR)/db/db_write_test.o $(TEST_LIBRARY) $(LIBRARY)
Y
Yi Wu 已提交
1477 1478
	$(AM_LINK)

1479
error_handler_fs_test: $(OBJ_DIR)/db/error_handler_fs_test.o $(TEST_LIBRARY) $(LIBRARY)
1480 1481
	$(AM_LINK)

1482
external_sst_file_basic_test: $(OBJ_DIR)/db/external_sst_file_basic_test.o $(TEST_LIBRARY) $(LIBRARY)
S
Siying Dong 已提交
1483 1484
	$(AM_LINK)

1485
external_sst_file_test: $(OBJ_DIR)/db/external_sst_file_test.o $(TEST_LIBRARY) $(LIBRARY)
1486 1487
	$(AM_LINK)

1488
import_column_family_test: $(OBJ_DIR)/db/import_column_family_test.o $(TEST_LIBRARY) $(LIBRARY)
1489 1490
	$(AM_LINK)

1491
db_tailing_iter_test: $(OBJ_DIR)/db/db_tailing_iter_test.o $(TEST_LIBRARY) $(LIBRARY)
1492 1493
	$(AM_LINK)

1494
db_iter_test: $(OBJ_DIR)/db/db_iter_test.o $(TEST_LIBRARY) $(LIBRARY)
1495
	$(AM_LINK)
S
Stanislau Hlebik 已提交
1496

1497
db_iter_stress_test: $(OBJ_DIR)/db/db_iter_stress_test.o $(TEST_LIBRARY) $(LIBRARY)
1498 1499
	$(AM_LINK)

1500
db_universal_compaction_test: $(OBJ_DIR)/db/db_universal_compaction_test.o $(TEST_LIBRARY) $(LIBRARY)
1501 1502
	$(AM_LINK)

1503
db_wal_test: $(OBJ_DIR)/db/db_wal_test.o $(TEST_LIBRARY) $(LIBRARY)
S
sdong 已提交
1504 1505
	$(AM_LINK)

1506
db_io_failure_test: $(OBJ_DIR)/db/db_io_failure_test.o $(TEST_LIBRARY) $(LIBRARY)
O
omegaga 已提交
1507 1508
	$(AM_LINK)

1509
db_properties_test: $(OBJ_DIR)/db/db_properties_test.o $(TEST_LIBRARY) $(LIBRARY)
1510 1511
	$(AM_LINK)

1512
db_table_properties_test: $(OBJ_DIR)/db/db_table_properties_test.o $(TEST_LIBRARY) $(LIBRARY)
1513 1514
	$(AM_LINK)

1515
log_write_bench: $(OBJ_DIR)/util/log_write_bench.o $(TEST_LIBRARY) $(LIBRARY)
D
dx9 已提交
1516
	$(AM_LINK) $(PROFILING_FLAGS)
1517

1518
plain_table_db_test: $(OBJ_DIR)/db/plain_table_db_test.o $(TEST_LIBRARY) $(LIBRARY)
1519
	$(AM_LINK)
S
Siying Dong 已提交
1520

1521
comparator_db_test: $(OBJ_DIR)/db/comparator_db_test.o $(TEST_LIBRARY) $(LIBRARY)
1522
	$(AM_LINK)
1523

1524
table_reader_bench: $(OBJ_DIR)/table/table_reader_bench.o $(TEST_LIBRARY) $(LIBRARY)
D
dx9 已提交
1525
	$(AM_LINK) $(PROFILING_FLAGS)
1526

1527 1528
perf_context_test: $(OBJ_DIR)/db/perf_context_test.o $(TEST_LIBRARY) $(LIBRARY)
	$(AM_LINK)
1529

1530 1531
prefix_test: $(OBJ_DIR)/db/prefix_test.o $(TEST_LIBRARY) $(LIBRARY)
	$(AM_LINK)
H
Haobo Xu 已提交
1532

1533
backupable_db_test: $(OBJ_DIR)/utilities/backupable/backupable_db_test.o $(TEST_LIBRARY) $(LIBRARY)
1534
	$(AM_LINK)
I
Igor Canadi 已提交
1535

1536
checkpoint_test: $(OBJ_DIR)/utilities/checkpoint/checkpoint_test.o $(TEST_LIBRARY) $(LIBRARY)
1537 1538
	$(AM_LINK)

1539
cache_simulator_test: $(OBJ_DIR)/utilities/simulator_cache/cache_simulator_test.o $(TEST_LIBRARY) $(LIBRARY)
1540 1541
	$(AM_LINK)

1542
sim_cache_test: $(OBJ_DIR)/utilities/simulator_cache/sim_cache_test.o $(TEST_LIBRARY) $(LIBRARY)
1543 1544
	$(AM_LINK)

1545
env_mirror_test: $(OBJ_DIR)/utilities/env_mirror_test.o $(TEST_LIBRARY) $(LIBRARY)
S
Sage Weil 已提交
1546 1547
	$(AM_LINK)

1548
env_timed_test: $(OBJ_DIR)/utilities/env_timed_test.o $(TEST_LIBRARY) $(LIBRARY)
A
Andrew Kryczka 已提交
1549 1550
	$(AM_LINK)

1551
ifdef ROCKSDB_USE_LIBRADOS
1552 1553
env_librados_test: $(OBJ_DIR)/utilities/env_librados_test.o $(TEST_LIBRARY) $(LIBRARY)
	$(AM_LINK)
1554 1555
endif

1556
object_registry_test: $(OBJ_DIR)/utilities/object_registry_test.o $(TEST_LIBRARY) $(LIBRARY)
1557 1558
	$(AM_LINK)

1559
ttl_test: $(OBJ_DIR)/utilities/ttl/ttl_test.o $(TEST_LIBRARY) $(LIBRARY)
1560
	$(AM_LINK)
1561

1562
write_batch_with_index_test: $(OBJ_DIR)/utilities/write_batch_with_index/write_batch_with_index_test.o $(TEST_LIBRARY) $(LIBRARY)
1563
	$(AM_LINK)
1564

1565
flush_job_test: $(OBJ_DIR)/db/flush_job_test.o $(TEST_LIBRARY) $(LIBRARY)
1566
	$(AM_LINK)
A
Andres Noetzli 已提交
1567

1568
compaction_iterator_test: $(OBJ_DIR)/db/compaction/compaction_iterator_test.o $(TEST_LIBRARY) $(LIBRARY)
A
Andres Noetzli 已提交
1569
	$(AM_LINK)
I
Igor Canadi 已提交
1570

1571
compaction_job_test: $(OBJ_DIR)/db/compaction/compaction_job_test.o $(TEST_LIBRARY) $(LIBRARY)
1572
	$(AM_LINK)
I
Igor Canadi 已提交
1573

1574
compaction_job_stats_test: $(OBJ_DIR)/db/compaction/compaction_job_stats_test.o $(TEST_LIBRARY) $(LIBRARY)
1575 1576
	$(AM_LINK)

1577
compact_on_deletion_collector_test: $(OBJ_DIR)/utilities/table_properties_collectors/compact_on_deletion_collector_test.o $(TEST_LIBRARY) $(LIBRARY)
1578 1579
	$(AM_LINK)

1580
wal_manager_test: $(OBJ_DIR)/db/wal_manager_test.o $(TEST_LIBRARY) $(LIBRARY)
1581
	$(AM_LINK)
I
Igor Canadi 已提交
1582

1583 1584 1585
wal_edit_test: $(OBJ_DIR)/db/wal_edit_test.o $(TEST_LIBRARY) $(LIBRARY)
	$(AM_LINK)

1586
dbformat_test: $(OBJ_DIR)/db/dbformat_test.o $(TEST_LIBRARY) $(LIBRARY)
1587
	$(AM_LINK)
J
jorlow@chromium.org 已提交
1588

1589
env_basic_test: $(OBJ_DIR)/env/env_basic_test.o $(TEST_LIBRARY) $(LIBRARY)
1590 1591
	$(AM_LINK)

1592
env_test: $(OBJ_DIR)/env/env_test.o $(TEST_LIBRARY) $(LIBRARY)
1593
	$(AM_LINK)
J
jorlow@chromium.org 已提交
1594

1595
io_posix_test: $(OBJ_DIR)/env/io_posix_test.o $(TEST_LIBRARY) $(LIBRARY)
1596 1597
	$(AM_LINK)

1598
fault_injection_test: $(OBJ_DIR)/db/fault_injection_test.o $(TEST_LIBRARY) $(LIBRARY)
1599
	$(AM_LINK)
1600

1601
rate_limiter_test: $(OBJ_DIR)/util/rate_limiter_test.o $(TEST_LIBRARY) $(LIBRARY)
1602
	$(AM_LINK)
L
Lei Jin 已提交
1603

1604
delete_scheduler_test: $(OBJ_DIR)/file/delete_scheduler_test.o $(TEST_LIBRARY) $(LIBRARY)
I
Islam AbdelRahman 已提交
1605 1606
	$(AM_LINK)

1607
filename_test: $(OBJ_DIR)/db/filename_test.o $(TEST_LIBRARY) $(LIBRARY)
1608
	$(AM_LINK)
J
jorlow@chromium.org 已提交
1609

1610
random_access_file_reader_test: $(OBJ_DIR)/file/random_access_file_reader_test.o $(TEST_LIBRARY) $(LIBRARY)
1611 1612
	$(AM_LINK)

1613
file_reader_writer_test: $(OBJ_DIR)/util/file_reader_writer_test.o $(TEST_LIBRARY) $(LIBRARY)
1614 1615
	$(AM_LINK)

1616
block_based_filter_block_test: $(OBJ_DIR)/table/block_based/block_based_filter_block_test.o $(TEST_LIBRARY) $(LIBRARY)
1617
	$(AM_LINK)
1618

1619
block_based_table_reader_test: table/block_based/block_based_table_reader_test.o $(TEST_LIBRARY) $(LIBRARY)
1620 1621
	$(AM_LINK)

1622
full_filter_block_test: $(OBJ_DIR)/table/block_based/full_filter_block_test.o $(TEST_LIBRARY) $(LIBRARY)
1623
	$(AM_LINK)
S
Sanjay Ghemawat 已提交
1624

1625
partitioned_filter_block_test: $(OBJ_DIR)/table/block_based/partitioned_filter_block_test.o $(TEST_LIBRARY) $(LIBRARY)
M
Maysam Yabandeh 已提交
1626 1627
	$(AM_LINK)

1628
log_test: $(OBJ_DIR)/db/log_test.o $(TEST_LIBRARY) $(LIBRARY)
M
Maysam Yabandeh 已提交
1629 1630
	$(AM_LINK)

1631
cleanable_test: $(OBJ_DIR)/table/cleanable_test.o $(TEST_LIBRARY) $(LIBRARY)
1632
	$(AM_LINK)
J
jorlow@chromium.org 已提交
1633

1634
table_test: $(OBJ_DIR)/table/table_test.o $(TEST_LIBRARY) $(LIBRARY)
1635
	$(AM_LINK)
J
jorlow@chromium.org 已提交
1636

1637
block_fetcher_test: table/block_fetcher_test.o $(TEST_LIBRARY) $(LIBRARY)
1638 1639
	$(AM_LINK)

1640
block_test: $(OBJ_DIR)/table/block_based/block_test.o $(TEST_LIBRARY) $(LIBRARY)
1641
	$(AM_LINK)
D
Dhruba Borthakur 已提交
1642

1643
data_block_hash_index_test: $(OBJ_DIR)/table/block_based/data_block_hash_index_test.o $(TEST_LIBRARY) $(LIBRARY)
1644 1645
	$(AM_LINK)

1646
inlineskiplist_test: $(OBJ_DIR)/memtable/inlineskiplist_test.o $(TEST_LIBRARY) $(LIBRARY)
N
Nathan Bronson 已提交
1647 1648
	$(AM_LINK)

1649
skiplist_test: $(OBJ_DIR)/memtable/skiplist_test.o $(TEST_LIBRARY) $(LIBRARY)
1650
	$(AM_LINK)
J
jorlow@chromium.org 已提交
1651

1652
write_buffer_manager_test: $(OBJ_DIR)/memtable/write_buffer_manager_test.o $(TEST_LIBRARY) $(LIBRARY)
1653 1654
	$(AM_LINK)

1655
version_edit_test: $(OBJ_DIR)/db/version_edit_test.o $(TEST_LIBRARY) $(LIBRARY)
1656
	$(AM_LINK)
J
jorlow@chromium.org 已提交
1657

1658
version_set_test: $(OBJ_DIR)/db/version_set_test.o $(TEST_LIBRARY) $(LIBRARY)
1659
	$(AM_LINK)
1660

1661
compaction_picker_test: $(OBJ_DIR)/db/compaction/compaction_picker_test.o $(TEST_LIBRARY) $(LIBRARY)
1662
	$(AM_LINK)
S
sdong 已提交
1663

1664
version_builder_test: $(OBJ_DIR)/db/version_builder_test.o $(TEST_LIBRARY) $(LIBRARY)
1665
	$(AM_LINK)
S
sdong 已提交
1666

1667
file_indexer_test: $(OBJ_DIR)/db/file_indexer_test.o $(TEST_LIBRARY) $(LIBRARY)
1668
	$(AM_LINK)
1669

1670
reduce_levels_test: $(OBJ_DIR)/tools/reduce_levels_test.o $(TOOLS_LIBRARY) $(TEST_LIBRARY) $(LIBRARY)
1671
	$(AM_LINK)
1672

1673
write_batch_test: $(OBJ_DIR)/db/write_batch_test.o $(TEST_LIBRARY) $(LIBRARY)
1674
	$(AM_LINK)
1675

1676
write_controller_test: $(OBJ_DIR)/db/write_controller_test.o $(TEST_LIBRARY) $(LIBRARY)
1677
	$(AM_LINK)
1678

1679
merge_helper_test: $(OBJ_DIR)/db/merge_helper_test.o $(TEST_LIBRARY) $(LIBRARY)
1680 1681
	$(AM_LINK)

1682
memory_test: $(OBJ_DIR)/utilities/memory/memory_test.o $(TEST_LIBRARY) $(LIBRARY)
1683 1684
	$(AM_LINK)

1685
merge_test: $(OBJ_DIR)/db/merge_test.o $(TEST_LIBRARY) $(LIBRARY)
1686
	$(AM_LINK)
J
jorlow@chromium.org 已提交
1687

1688
merger_test: $(OBJ_DIR)/table/merger_test.o $(TEST_LIBRARY) $(LIBRARY)
1689
	$(AM_LINK)
I
Igor Canadi 已提交
1690

1691
util_merge_operators_test: $(OBJ_DIR)/utilities/util_merge_operators_test.o $(TEST_LIBRARY) $(LIBRARY)
1692 1693
	$(AM_LINK)

1694
options_file_test: $(OBJ_DIR)/db/options_file_test.o $(TEST_LIBRARY) $(LIBRARY)
1695 1696
	$(AM_LINK)

1697
deletefile_test: $(OBJ_DIR)/db/deletefile_test.o $(TEST_LIBRARY) $(LIBRARY)
1698
	$(AM_LINK)
1699

1700
obsolete_files_test: $(OBJ_DIR)/db/obsolete_files_test.o $(TEST_LIBRARY) $(LIBRARY)
1701 1702
	$(AM_LINK)

1703
rocksdb_dump: $(OBJ_DIR)/tools/dump/rocksdb_dump.o $(LIBRARY)
1704 1705
	$(AM_LINK)

1706
rocksdb_undump: $(OBJ_DIR)/tools/dump/rocksdb_undump.o $(LIBRARY)
1707 1708
	$(AM_LINK)

1709
cuckoo_table_builder_test: $(OBJ_DIR)/table/cuckoo/cuckoo_table_builder_test.o $(TEST_LIBRARY) $(LIBRARY)
1710
	$(AM_LINK)
1711

1712
cuckoo_table_reader_test: $(OBJ_DIR)/table/cuckoo/cuckoo_table_reader_test.o $(TEST_LIBRARY) $(LIBRARY)
1713
	$(AM_LINK)
1714

1715
cuckoo_table_db_test: $(OBJ_DIR)/db/cuckoo_table_db_test.o $(TEST_LIBRARY) $(LIBRARY)
1716
	$(AM_LINK)
1717

1718
listener_test: $(OBJ_DIR)/db/listener_test.o $(TEST_LIBRARY) $(LIBRARY)
1719
	$(AM_LINK)
1720

1721
thread_list_test: $(OBJ_DIR)/util/thread_list_test.o $(TEST_LIBRARY) $(LIBRARY)
1722
	$(AM_LINK)
Y
Yueh-Hsuan Chiang 已提交
1723

1724
compact_files_test: $(OBJ_DIR)/db/compact_files_test.o $(TEST_LIBRARY) $(LIBRARY)
1725 1726
	$(AM_LINK)

1727
options_test: $(OBJ_DIR)/options/options_test.o $(TEST_LIBRARY) $(LIBRARY)
1728 1729
	$(AM_LINK)

1730
options_settable_test: $(OBJ_DIR)/options/options_settable_test.o $(TEST_LIBRARY) $(LIBRARY)
1731
	$(AM_LINK)
1732

1733
options_util_test: $(OBJ_DIR)/utilities/options/options_util_test.o $(TEST_LIBRARY) $(LIBRARY)
1734 1735
	$(AM_LINK)

1736
db_bench_tool_test: $(OBJ_DIR)/tools/db_bench_tool_test.o $(BENCH_OBJECTS) $(TEST_LIBRARY) $(LIBRARY)
1737 1738
	$(AM_LINK)

1739
trace_analyzer_test: $(OBJ_DIR)/tools/trace_analyzer_test.o $(ANALYZE_OBJECTS) $(TOOLS_LIBRARY) $(TEST_LIBRARY) $(LIBRARY)
Z
Zhichao Cao 已提交
1740 1741
	$(AM_LINK)

1742
event_logger_test: $(OBJ_DIR)/logging/event_logger_test.o $(TEST_LIBRARY) $(LIBRARY)
I
Igor Canadi 已提交
1743 1744
	$(AM_LINK)

1745
timer_queue_test: $(OBJ_DIR)/util/timer_queue_test.o $(TEST_LIBRARY) $(LIBRARY)
A
Anirban Rahut 已提交
1746 1747
	$(AM_LINK)

1748
sst_dump_test: $(OBJ_DIR)/tools/sst_dump_test.o $(TOOLS_LIBRARY) $(TEST_LIBRARY) $(LIBRARY)
1749
	$(AM_LINK)
1750

1751
optimistic_transaction_test: $(OBJ_DIR)/utilities/transactions/optimistic_transaction_test.o  $(TEST_LIBRARY) $(LIBRARY)
A
agiardullo 已提交
1752 1753
	$(AM_LINK)

1754
mock_env_test : $(OBJ_DIR)/env/mock_env_test.o $(TEST_LIBRARY) $(LIBRARY)
1755
	$(AM_LINK)
1756

1757
manual_compaction_test: $(OBJ_DIR)/db/manual_compaction_test.o $(TEST_LIBRARY) $(LIBRARY)
1758
	$(AM_LINK)
1759

1760
filelock_test: $(OBJ_DIR)/util/filelock_test.o $(TEST_LIBRARY) $(LIBRARY)
1761
	$(AM_LINK)
K
Kai Liu 已提交
1762

1763
auto_roll_logger_test: $(OBJ_DIR)/logging/auto_roll_logger_test.o $(TEST_LIBRARY) $(LIBRARY)
1764
	$(AM_LINK)
1765

1766
env_logger_test: $(OBJ_DIR)/logging/env_logger_test.o $(TEST_LIBRARY) $(LIBRARY)
1767 1768
	$(AM_LINK)

1769
memtable_list_test: $(OBJ_DIR)/db/memtable_list_test.o $(TEST_LIBRARY) $(LIBRARY)
A
agiardullo 已提交
1770 1771
	$(AM_LINK)

1772
write_callback_test: $(OBJ_DIR)/db/write_callback_test.o $(TEST_LIBRARY) $(LIBRARY)
A
agiardullo 已提交
1773 1774
	$(AM_LINK)

1775
heap_test: $(OBJ_DIR)/util/heap_test.o $(GTEST)
1776 1777
	$(AM_LINK)

1778
transaction_lock_mgr_test: utilities/transactions/transaction_lock_mgr_test.o $(TEST_LIBRARY) $(LIBRARY)
1779 1780
	$(AM_LINK)

1781
transaction_test: $(OBJ_DIR)/utilities/transactions/transaction_test.o $(TEST_LIBRARY) $(LIBRARY)
A
agiardullo 已提交
1782 1783
	$(AM_LINK)

1784
write_prepared_transaction_test: $(OBJ_DIR)/utilities/transactions/write_prepared_transaction_test.o $(TEST_LIBRARY) $(LIBRARY)
1785 1786
	$(AM_LINK)

1787
write_unprepared_transaction_test: $(OBJ_DIR)/utilities/transactions/write_unprepared_transaction_test.o $(TEST_LIBRARY) $(LIBRARY)
1788 1789
	$(AM_LINK)

1790
sst_dump: $(OBJ_DIR)/tools/sst_dump.o $(TOOLS_LIBRARY) $(LIBRARY)
1791
	$(AM_LINK)
1792

1793
blob_dump: $(OBJ_DIR)/tools/blob_dump.o $(TOOLS_LIBRARY) $(LIBRARY)
Y
Yi Wu 已提交
1794 1795
	$(AM_LINK)

1796
repair_test: $(OBJ_DIR)/db/repair_test.o $(TEST_LIBRARY) $(LIBRARY)
A
Andrew Kryczka 已提交
1797 1798
	$(AM_LINK)

1799
ldb_cmd_test: $(OBJ_DIR)/tools/ldb_cmd_test.o $(TOOLS_LIBRARY) $(TEST_LIBRARY) $(LIBRARY)
1800 1801
	$(AM_LINK)

1802
ldb: $(OBJ_DIR)/tools/ldb.o $(TOOLS_LIBRARY) $(LIBRARY)
1803
	$(AM_LINK)
1804

1805
iostats_context_test: $(OBJ_DIR)/monitoring/iostats_context_test.o $(TEST_LIBRARY) $(LIBRARY)
1806 1807
	$(AM_V_CCLD)$(CXX) $^ $(EXEC_LDFLAGS) -o $@ $(LDFLAGS)

1808
persistent_cache_test: $(OBJ_DIR)/utilities/persistent_cache/persistent_cache_test.o $(TEST_LIBRARY) $(LIBRARY)
1809 1810
	$(AM_LINK)

1811
statistics_test: $(OBJ_DIR)/monitoring/statistics_test.o $(TEST_LIBRARY) $(LIBRARY)
1812 1813
	$(AM_LINK)

1814
stats_history_test: $(OBJ_DIR)/monitoring/stats_history_test.o $(TEST_LIBRARY) $(LIBRARY)
1815 1816
	$(AM_LINK)

1817
lru_cache_test: $(OBJ_DIR)/cache/lru_cache_test.o $(TEST_LIBRARY) $(LIBRARY)
Y
Yi Wu 已提交
1818 1819
	$(AM_LINK)

1820
range_del_aggregator_test: $(OBJ_DIR)/db/range_del_aggregator_test.o $(TEST_LIBRARY) $(LIBRARY)
A
Andrew Kryczka 已提交
1821 1822
	$(AM_LINK)

1823
range_del_aggregator_bench: $(OBJ_DIR)/db/range_del_aggregator_bench.o $(LIBRARY)
1824 1825
	$(AM_LINK)

1826
blob_db_test: $(OBJ_DIR)/utilities/blob_db/blob_db_test.o $(TEST_LIBRARY) $(LIBRARY)
Y
Yi Wu 已提交
1827 1828
	$(AM_LINK)

1829
repeatable_thread_test: $(OBJ_DIR)/util/repeatable_thread_test.o $(TEST_LIBRARY) $(LIBRARY)
1830 1831
	$(AM_LINK)

1832
range_tombstone_fragmenter_test: $(OBJ_DIR)/db/range_tombstone_fragmenter_test.o $(TEST_LIBRARY) $(LIBRARY)
1833 1834
	$(AM_LINK)

1835
sst_file_reader_test: $(OBJ_DIR)/table/sst_file_reader_test.o $(TEST_LIBRARY) $(LIBRARY)
1836 1837
	$(AM_LINK)

1838
db_secondary_test: $(OBJ_DIR)/db/db_impl/db_secondary_test.o $(TEST_LIBRARY) $(LIBRARY)
1839 1840
	$(AM_LINK)

1841
block_cache_tracer_test: $(OBJ_DIR)/trace_replay/block_cache_tracer_test.o $(TEST_LIBRARY) $(LIBRARY)
H
haoyuhuang 已提交
1842 1843
	$(AM_LINK)

1844
block_cache_trace_analyzer_test: $(OBJ_DIR)/tools/block_cache_analyzer/block_cache_trace_analyzer_test.o $(OBJ_DIR)/tools/block_cache_analyzer/block_cache_trace_analyzer.o $(TEST_LIBRARY) $(LIBRARY)
1845 1846
	$(AM_LINK)

1847
defer_test: $(OBJ_DIR)/util/defer_test.o $(TEST_LIBRARY) $(LIBRARY)
C
Cheng Chang 已提交
1848 1849
	$(AM_LINK)

1850
blob_file_addition_test: $(OBJ_DIR)/db/blob/blob_file_addition_test.o $(TEST_LIBRARY) $(LIBRARY)
1851 1852
	$(AM_LINK)

1853 1854 1855
blob_file_builder_test: $(OBJ_DIR)/db/blob/blob_file_builder_test.o $(TEST_LIBRARY) $(LIBRARY)
	$(AM_LINK)

1856
blob_file_garbage_test: $(OBJ_DIR)/db/blob/blob_file_garbage_test.o $(TEST_LIBRARY) $(LIBRARY)
1857 1858
	$(AM_LINK)

1859
timer_test: $(OBJ_DIR)/util/timer_test.o $(TEST_LIBRARY) $(LIBRARY)
1860 1861
	$(AM_LINK)

1862 1863 1864
stats_dump_scheduler_test: $(OBJ_DIR)/monitoring/stats_dump_scheduler_test.o $(TEST_LIBRARY) $(LIBRARY)
	$(AM_LINK)

1865
testutil_test: $(OBJ_DIR)/test_util/testutil_test.o $(TEST_LIBRARY) $(LIBRARY)
1866
	$(AM_LINK)
1867 1868

io_tracer_test: $(OBJ_DIR)/trace_replay/io_tracer_test.o $(OBJ_DIR)/trace_replay/io_tracer.o $(TEST_LIBRARY) $(LIBRARY)
1869
	$(AM_LINK)
1870

1871 1872 1873
prefetch_test: $(OBJ_DIR)/file/prefetch_test.o $(TEST_LIBRARY) $(LIBRARY)
	$(AM_LINK)

I
Igor Canadi 已提交
1874 1875
#-------------------------------------------------
# make install related stuff
1876 1877 1878
PREFIX ?= /usr/local
LIBDIR ?= $(PREFIX)/lib
INSTALL_LIBDIR = $(DESTDIR)$(LIBDIR)
I
Igor Canadi 已提交
1879 1880

uninstall:
1881 1882 1883 1884 1885 1886 1887
	rm -rf $(DESTDIR)$(PREFIX)/include/rocksdb \
	  $(INSTALL_LIBDIR)/$(LIBRARY) \
	  $(INSTALL_LIBDIR)/$(SHARED4) \
	  $(INSTALL_LIBDIR)/$(SHARED3) \
	  $(INSTALL_LIBDIR)/$(SHARED2) \
	  $(INSTALL_LIBDIR)/$(SHARED1) \
	  $(INSTALL_LIBDIR)/pkgconfig/rocksdb.pc
I
Igor Canadi 已提交
1888

1889
install-headers: gen-pc
1890 1891
	install -d $(INSTALL_LIBDIR)
	install -d $(INSTALL_LIBDIR)/pkgconfig
1892
	for header_dir in `$(FIND) "include/rocksdb" -type d`; do \
1893
		install -d $(DESTDIR)/$(PREFIX)/$$header_dir; \
I
Igor Canadi 已提交
1894
	done
1895
	for header in `$(FIND) "include/rocksdb" -type f -name *.h`; do \
1896
		install -C -m 644 $$header $(DESTDIR)/$(PREFIX)/$$header; \
I
Igor Canadi 已提交
1897
	done
1898
	install -C -m 644 rocksdb.pc $(INSTALL_LIBDIR)/pkgconfig/rocksdb.pc
I
Igor Canadi 已提交
1899 1900

install-static: install-headers $(LIBRARY)
1901 1902
	install -d $(INSTALL_LIBDIR)
	install -C -m 755 $(LIBRARY) $(INSTALL_LIBDIR)
I
Igor Canadi 已提交
1903 1904

install-shared: install-headers $(SHARED4)
1905 1906 1907 1908 1909
	install -d $(INSTALL_LIBDIR)
	install -C -m 755 $(SHARED4) $(INSTALL_LIBDIR)
	ln -fs $(SHARED4) $(INSTALL_LIBDIR)/$(SHARED3)
	ln -fs $(SHARED4) $(INSTALL_LIBDIR)/$(SHARED2)
	ln -fs $(SHARED4) $(INSTALL_LIBDIR)/$(SHARED1)
I
Igor Canadi 已提交
1910 1911 1912

# install static by default + install shared if it exists
install: install-static
I
Igor Canadi 已提交
1913
	[ -e $(SHARED4) ] && $(MAKE) install-shared || :
I
Igor Canadi 已提交
1914

1915 1916
# Generate the pkg-config file
gen-pc:
1917
	-echo 'prefix=$(PREFIX)' > rocksdb.pc
1918 1919
	-echo 'exec_prefix=$${prefix}' >> rocksdb.pc
	-echo 'includedir=$${prefix}/include' >> rocksdb.pc
1920
	-echo 'libdir=$(LIBDIR)' >> rocksdb.pc
1921 1922 1923 1924 1925 1926 1927 1928
	-echo '' >> rocksdb.pc
	-echo 'Name: rocksdb' >> rocksdb.pc
	-echo 'Description: An embeddable persistent key-value store for fast storage' >> rocksdb.pc
	-echo Version: $(shell ./build_tools/version.sh full) >> rocksdb.pc
	-echo 'Libs: -L$${libdir} $(EXEC_LDFLAGS) -lrocksdb' >> rocksdb.pc
	-echo 'Libs.private: $(PLATFORM_LDFLAGS)' >> rocksdb.pc
	-echo 'Cflags: -I$${includedir} $(PLATFORM_CXXFLAGS)' >> rocksdb.pc

I
Igor Canadi 已提交
1929 1930 1931
#-------------------------------------------------


1932 1933 1934 1935
# ---------------------------------------------------------------------------
# Jni stuff
# ---------------------------------------------------------------------------

1936
JAVA_INCLUDE = -I$(JAVA_HOME)/include/ -I$(JAVA_HOME)/include/linux
D
David Bernard 已提交
1937 1938
ifeq ($(PLATFORM), OS_SOLARIS)
	ARCH := $(shell isainfo -b)
1939
else ifeq ($(PLATFORM), OS_OPENBSD)
1940
	ifneq (,$(filter amd64 ppc64 ppc64le arm64 aarch64 sparc64, $(MACHINE)))
1941 1942 1943 1944
		ARCH := 64
	else
		ARCH := 32
	endif
D
David Bernard 已提交
1945 1946 1947
else
	ARCH := $(shell getconf LONG_BIT)
endif
1948

1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959
ifeq ($(shell ldd /usr/bin/env 2>/dev/null | grep -q musl; echo $$?),0)
        JNI_LIBC = musl
# GNU LibC (or glibc) is so pervasive we can assume it is the default
# else
#        JNI_LIBC = glibc
endif

ifneq ($(origin JNI_LIBC), undefined)
  JNI_LIBC_POSTFIX = -$(JNI_LIBC)
endif

1960
ifneq (,$(filter ppc% arm64 aarch64 sparc64, $(MACHINE)))
1961
	ROCKSDBJNILIB = librocksdbjni-linux-$(MACHINE)$(JNI_LIBC_POSTFIX).so
1962
else
1963
	ROCKSDBJNILIB = librocksdbjni-linux$(ARCH)$(JNI_LIBC_POSTFIX).so
1964
endif
1965 1966 1967 1968 1969
ROCKSDB_JAVA_VERSION ?= $(ROCKSDB_MAJOR).$(ROCKSDB_MINOR).$(ROCKSDB_PATCH)
ROCKSDB_JAR = rocksdbjni-$(ROCKSDB_JAVA_VERSION)-linux$(ARCH)$(JNI_LIBC_POSTFIX).jar
ROCKSDB_JAR_ALL = rocksdbjni-$(ROCKSDB_JAVA_VERSION).jar
ROCKSDB_JAVADOCS_JAR = rocksdbjni-$(ROCKSDB_JAVA_VERSION)-javadoc.jar
ROCKSDB_SOURCES_JAR = rocksdbjni-$(ROCKSDB_JAVA_VERSION)-sources.jar
1970 1971
SHA256_CMD = sha256sum

T
Tomas Kolda 已提交
1972 1973 1974
ZLIB_VER ?= 1.2.11
ZLIB_SHA256 ?= c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1
ZLIB_DOWNLOAD_BASE ?= http://zlib.net
1975 1976 1977
BZIP2_VER ?= 1.0.8
BZIP2_SHA256 ?= ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269
BZIP2_DOWNLOAD_BASE ?= https://sourceware.org/pub/bzip2
1978 1979
SNAPPY_VER ?= 1.1.8
SNAPPY_SHA256 ?= 16b677f07832a612b0836178db7f374e414f94657c138e6993cbfc5dcc58651f
1980
SNAPPY_DOWNLOAD_BASE ?= https://github.com/google/snappy/archive
1981 1982
LZ4_VER ?= 1.9.2
LZ4_SHA256 ?= 658ba6191fa44c92280d4aa2c271b0f4fbc0e34d249578dd05e50e76d0e5efcc
T
Tomas Kolda 已提交
1983
LZ4_DOWNLOAD_BASE ?= https://github.com/lz4/lz4/archive
1984 1985
ZSTD_VER ?= 1.4.4
ZSTD_SHA256 ?= a364f5162c7d1a455cc915e8e3cf5f4bd8b75d09bc0f53965b0c9ca1383c52c8
1986
ZSTD_DOWNLOAD_BASE ?= https://github.com/facebook/zstd/archive
P
Pengchao Wang 已提交
1987
CURL_SSL_OPTS ?= --tlsv1
1988 1989

ifeq ($(PLATFORM), OS_MACOSX)
D
David Bernard 已提交
1990
	ROCKSDBJNILIB = librocksdbjni-osx.jnilib
1991
	ROCKSDB_JAR = rocksdbjni-$(ROCKSDB_JAVA_VERSION)-osx.jar
1992
	SHA256_CMD = openssl sha256 -r
1993 1994 1995 1996 1997
ifneq ("$(wildcard $(JAVA_HOME)/include/darwin)","")
	JAVA_INCLUDE = -I$(JAVA_HOME)/include -I $(JAVA_HOME)/include/darwin
else
	JAVA_INCLUDE = -I/System/Library/Frameworks/JavaVM.framework/Headers/
endif
1998
endif
1999
ifeq ($(PLATFORM), OS_FREEBSD)
2000
	JAVA_INCLUDE = -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/freebsd
2001
	ROCKSDBJNILIB = librocksdbjni-freebsd$(ARCH).so
2002
	ROCKSDB_JAR = rocksdbjni-$(ROCKSDB_JAVA_VERSION)-freebsd$(ARCH).jar
2003
endif
D
David Bernard 已提交
2004 2005 2006 2007
ifeq ($(PLATFORM), OS_SOLARIS)
	ROCKSDBJNILIB = librocksdbjni-solaris$(ARCH).so
	ROCKSDB_JAR = rocksdbjni-$(ROCKSDB_MAJOR).$(ROCKSDB_MINOR).$(ROCKSDB_PATCH)-solaris$(ARCH).jar
	JAVA_INCLUDE = -I$(JAVA_HOME)/include/ -I$(JAVA_HOME)/include/solaris
2008
	SHA256_CMD = digest -a sha256
D
David Bernard 已提交
2009
endif
T
Tomas Kolda 已提交
2010 2011 2012 2013 2014 2015
ifeq ($(PLATFORM), OS_AIX)
	JAVA_INCLUDE = -I$(JAVA_HOME)/include/ -I$(JAVA_HOME)/include/aix
	ROCKSDBJNILIB = librocksdbjni-aix.so
	EXTRACT_SOURCES = gunzip < TAR_GZ | tar xvf -
	SNAPPY_MAKE_TARGET = libsnappy.la
endif
2016 2017 2018
ifeq ($(PLATFORM), OS_OPENBSD)
        JAVA_INCLUDE = -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/openbsd
	ROCKSDBJNILIB = librocksdbjni-openbsd$(ARCH).so
2019
        ROCKSDB_JAR = rocksdbjni-$(ROCKSDB_JAVA_VERSION)-openbsd$(ARCH).jar
2020
endif
2021

N
Naveen 已提交
2022
libz.a:
2023
	-rm -rf zlib-$(ZLIB_VER)
2024
ifeq (,$(wildcard ./zlib-$(ZLIB_VER).tar.gz))
2025
	curl --fail --output zlib-$(ZLIB_VER).tar.gz --location ${ZLIB_DOWNLOAD_BASE}/zlib-$(ZLIB_VER).tar.gz
2026
endif
2027 2028 2029 2030 2031 2032
	ZLIB_SHA256_ACTUAL=`$(SHA256_CMD) zlib-$(ZLIB_VER).tar.gz | cut -d ' ' -f 1`; \
	if [ "$(ZLIB_SHA256)" != "$$ZLIB_SHA256_ACTUAL" ]; then \
		echo zlib-$(ZLIB_VER).tar.gz checksum mismatch, expected=\"$(ZLIB_SHA256)\" actual=\"$$ZLIB_SHA256_ACTUAL\"; \
		exit 1; \
	fi
	tar xvzf zlib-$(ZLIB_VER).tar.gz
2033
	cd zlib-$(ZLIB_VER) && CFLAGS='-fPIC ${EXTRA_CFLAGS}' LDFLAGS='${EXTRA_LDFLAGS}' ./configure --static && $(MAKE)
2034
	cp zlib-$(ZLIB_VER)/libz.a .
N
Naveen 已提交
2035 2036

libbz2.a:
2037
	-rm -rf bzip2-$(BZIP2_VER)
2038
ifeq (,$(wildcard ./bzip2-$(BZIP2_VER).tar.gz))
2039
	curl --fail --output bzip2-$(BZIP2_VER).tar.gz --location ${CURL_SSL_OPTS} ${BZIP2_DOWNLOAD_BASE}/bzip2-$(BZIP2_VER).tar.gz
2040
endif
2041 2042 2043 2044 2045 2046
	BZIP2_SHA256_ACTUAL=`$(SHA256_CMD) bzip2-$(BZIP2_VER).tar.gz | cut -d ' ' -f 1`; \
	if [ "$(BZIP2_SHA256)" != "$$BZIP2_SHA256_ACTUAL" ]; then \
		echo bzip2-$(BZIP2_VER).tar.gz checksum mismatch, expected=\"$(BZIP2_SHA256)\" actual=\"$$BZIP2_SHA256_ACTUAL\"; \
		exit 1; \
	fi
	tar xvzf bzip2-$(BZIP2_VER).tar.gz
2047
	cd bzip2-$(BZIP2_VER) && $(MAKE) CFLAGS='-fPIC -O2 -g -D_FILE_OFFSET_BITS=64 ${EXTRA_CFLAGS}' AR='ar ${EXTRA_ARFLAGS}'
2048
	cp bzip2-$(BZIP2_VER)/libbz2.a .
N
Naveen 已提交
2049

N
Naveen 已提交
2050
libsnappy.a:
2051
	-rm -rf snappy-$(SNAPPY_VER)
2052
ifeq (,$(wildcard ./snappy-$(SNAPPY_VER).tar.gz))
2053
	curl --fail --output snappy-$(SNAPPY_VER).tar.gz --location ${CURL_SSL_OPTS} ${SNAPPY_DOWNLOAD_BASE}/$(SNAPPY_VER).tar.gz
2054
endif
2055 2056 2057 2058 2059
	SNAPPY_SHA256_ACTUAL=`$(SHA256_CMD) snappy-$(SNAPPY_VER).tar.gz | cut -d ' ' -f 1`; \
	if [ "$(SNAPPY_SHA256)" != "$$SNAPPY_SHA256_ACTUAL" ]; then \
		echo snappy-$(SNAPPY_VER).tar.gz checksum mismatch, expected=\"$(SNAPPY_SHA256)\" actual=\"$$SNAPPY_SHA256_ACTUAL\"; \
		exit 1; \
	fi
2060
	tar xvzf snappy-$(SNAPPY_VER).tar.gz
2061
	mkdir snappy-$(SNAPPY_VER)/build
2062
	cd snappy-$(SNAPPY_VER)/build && CFLAGS='${EXTRA_CFLAGS}' CXXFLAGS='${EXTRA_CXXFLAGS}' LDFLAGS='${EXTRA_LDFLAGS}' cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON .. && $(MAKE) ${SNAPPY_MAKE_TARGET}
2063
	cp snappy-$(SNAPPY_VER)/build/libsnappy.a .
2064

2065
liblz4.a:
2066
	-rm -rf lz4-$(LZ4_VER)
2067
ifeq (,$(wildcard ./lz4-$(LZ4_VER).tar.gz))
2068
	curl --fail --output lz4-$(LZ4_VER).tar.gz --location ${CURL_SSL_OPTS} ${LZ4_DOWNLOAD_BASE}/v$(LZ4_VER).tar.gz
2069
endif
2070 2071 2072 2073 2074 2075
	LZ4_SHA256_ACTUAL=`$(SHA256_CMD) lz4-$(LZ4_VER).tar.gz | cut -d ' ' -f 1`; \
	if [ "$(LZ4_SHA256)" != "$$LZ4_SHA256_ACTUAL" ]; then \
		echo lz4-$(LZ4_VER).tar.gz checksum mismatch, expected=\"$(LZ4_SHA256)\" actual=\"$$LZ4_SHA256_ACTUAL\"; \
		exit 1; \
	fi
	tar xvzf lz4-$(LZ4_VER).tar.gz
2076
	cd lz4-$(LZ4_VER)/lib && $(MAKE) CFLAGS='-fPIC -O2 ${EXTRA_CFLAGS}' all
2077
	cp lz4-$(LZ4_VER)/lib/liblz4.a .
N
Naveen 已提交
2078

2079 2080
libzstd.a:
	-rm -rf zstd-$(ZSTD_VER)
2081
ifeq (,$(wildcard ./zstd-$(ZSTD_VER).tar.gz))
2082
	curl --fail --output zstd-$(ZSTD_VER).tar.gz --location ${CURL_SSL_OPTS} ${ZSTD_DOWNLOAD_BASE}/v$(ZSTD_VER).tar.gz
2083
endif
2084 2085 2086 2087 2088 2089
	ZSTD_SHA256_ACTUAL=`$(SHA256_CMD) zstd-$(ZSTD_VER).tar.gz | cut -d ' ' -f 1`; \
	if [ "$(ZSTD_SHA256)" != "$$ZSTD_SHA256_ACTUAL" ]; then \
		echo zstd-$(ZSTD_VER).tar.gz checksum mismatch, expected=\"$(ZSTD_SHA256)\" actual=\"$$ZSTD_SHA256_ACTUAL\"; \
		exit 1; \
	fi
	tar xvzf zstd-$(ZSTD_VER).tar.gz
2090
	cd zstd-$(ZSTD_VER)/lib && DESTDIR=. PREFIX= $(MAKE) CFLAGS='-fPIC -O2 ${EXTRA_CFLAGS}' install
2091 2092
	cp zstd-$(ZSTD_VER)/lib/libzstd.a .

2093
# A version of each $(LIB_OBJECTS) compiled with -fPIC and a fixed set of static compression libraries
2094
ifneq ($(ROCKSDB_JAVA_NO_COMPRESSION), 1)
2095
JAVA_COMPRESSIONS = libz.a libbz2.a libsnappy.a liblz4.a libzstd.a
2096 2097
endif

2098
JAVA_STATIC_FLAGS = -DZLIB -DBZIP2 -DSNAPPY -DLZ4 -DZSTD
2099
JAVA_STATIC_INCLUDES = -I./zlib-$(ZLIB_VER) -I./bzip2-$(BZIP2_VER) -I./snappy-$(SNAPPY_VER) -I./lz4-$(LZ4_VER)/lib -I./zstd-$(ZSTD_VER)/lib/include
2100 2101 2102
ifneq ($(findstring rocksdbjavastatic, $(MAKECMDGOALS)),)
CXXFLAGS += $(JAVA_STATIC_FLAGS) $(JAVA_STATIC_INCLUDES)
CFLAGS +=  $(JAVA_STATIC_FLAGS) $(JAVA_STATIC_INCLUDES)
A
Andrew Kryczka 已提交
2103
endif
2104
rocksdbjavastatic: $(LIB_OBJECTS) $(JAVA_COMPRESSIONS)
F
fyrz 已提交
2105
	cd java;$(MAKE) javalib;
2106
	rm -f ./java/target/$(ROCKSDBJNILIB)
2107 2108
	$(CXX) $(CXXFLAGS) -I./java/. $(JAVA_INCLUDE) -shared -fPIC \
	  -o ./java/target/$(ROCKSDBJNILIB) $(JNI_NATIVE_SOURCES) \
2109
	  $(LIB_OBJECTS) $(COVERAGEFLAGS) \
2110
	  $(JAVA_COMPRESSIONS) $(JAVA_STATIC_LDFLAGS)
2111 2112 2113
	cd java/target;if [ "$(DEBUG_LEVEL)" == "0" ]; then \
		strip $(STRIPFLAGS) $(ROCKSDBJNILIB); \
	fi
2114 2115 2116 2117 2118
	cd java;jar -cf target/$(ROCKSDB_JAR) HISTORY*.md
	cd java/target;jar -uf $(ROCKSDB_JAR) $(ROCKSDBJNILIB)
	cd java/target/classes;jar -uf ../$(ROCKSDB_JAR) org/rocksdb/*.class org/rocksdb/util/*.class
	cd java/target/apidocs;jar -cf ../$(ROCKSDB_JAVADOCS_JAR) *
	cd java/src/main/java;jar -cf ../../../target/$(ROCKSDB_SOURCES_JAR) org
2119 2120 2121
	openssl sha1 java/target/$(ROCKSDB_JAR) | sed 's/.*= \([0-9a-f]*\)/\1/' > java/target/$(ROCKSDB_JAR).sha1
	openssl sha1 java/target/$(ROCKSDB_JAVADOCS_JAR) | sed 's/.*= \([0-9a-f]*\)/\1/' > java/target/$(ROCKSDB_JAVADOCS_JAR).sha1
	openssl sha1 java/target/$(ROCKSDB_SOURCES_JAR) | sed 's/.*= \([0-9a-f]*\)/\1/' > java/target/$(ROCKSDB_SOURCES_JAR).sha1
N
Naveen 已提交
2122

2123
rocksdbjavastaticrelease: rocksdbjavastatic
2124
	cd java/crossbuild && (vagrant destroy -f || true) && vagrant up linux32 && vagrant halt linux32 && vagrant up linux64 && vagrant halt linux64 && vagrant up linux64-musl && vagrant halt linux64-musl
2125
	cd java;jar -cf target/$(ROCKSDB_JAR_ALL) HISTORY*.md
2126
	cd java/target;jar -uf $(ROCKSDB_JAR_ALL) librocksdbjni-*.so librocksdbjni-*.jnilib
2127
	cd java/target/classes;jar -uf ../$(ROCKSDB_JAR_ALL) org/rocksdb/*.class org/rocksdb/util/*.class
2128
	openssl sha1 java/target/$(ROCKSDB_JAR_ALL) | sed 's/.*= \([0-9a-f]*\)/\1/' > java/target/$(ROCKSDB_JAR_ALL).sha1
2129

2130
rocksdbjavastaticreleasedocker: rocksdbjavastatic rocksdbjavastaticdockerx86 rocksdbjavastaticdockerx86_64 rocksdbjavastaticdockerx86musl rocksdbjavastaticdockerx86_64musl
2131 2132 2133
	cd java;jar -cf target/$(ROCKSDB_JAR_ALL) HISTORY*.md
	cd java/target;jar -uf $(ROCKSDB_JAR_ALL) librocksdbjni-*.so librocksdbjni-*.jnilib
	cd java/target/classes;jar -uf ../$(ROCKSDB_JAR_ALL) org/rocksdb/*.class org/rocksdb/util/*.class
2134
	openssl sha1 java/target/$(ROCKSDB_JAR_ALL) | sed 's/.*= \([0-9a-f]*\)/\1/' > java/target/$(ROCKSDB_JAR_ALL).sha1
2135 2136 2137

rocksdbjavastaticdockerx86:
	mkdir -p java/target
2138
	docker run --rm --name rocksdb_linux_x86-be --attach stdin --attach stdout --attach stderr --volume $(HOME)/.m2:/root/.m2:ro --volume `pwd`:/rocksdb-host:ro --volume /rocksdb-local-build --volume `pwd`/java/target:/rocksdb-java-target --env DEBUG_LEVEL=$(DEBUG_LEVEL) evolvedbinary/rocksjava:centos6_x86-be /rocksdb-host/java/crossbuild/docker-build-linux-centos.sh
2139 2140 2141

rocksdbjavastaticdockerx86_64:
	mkdir -p java/target
2142
	docker run --rm --name rocksdb_linux_x64-be --attach stdin --attach stdout --attach stderr --volume $(HOME)/.m2:/root/.m2:ro --volume `pwd`:/rocksdb-host:ro --volume /rocksdb-local-build --volume `pwd`/java/target:/rocksdb-java-target --env DEBUG_LEVEL=$(DEBUG_LEVEL) evolvedbinary/rocksjava:centos6_x64-be /rocksdb-host/java/crossbuild/docker-build-linux-centos.sh
2143

2144 2145
rocksdbjavastaticdockerppc64le:
	mkdir -p java/target
2146
	docker run --rm --name rocksdb_linux_ppc64le-be --attach stdin --attach stdout --attach stderr --volume $(HOME)/.m2:/root/.m2:ro --volume `pwd`:/rocksdb-host:ro --volume /rocksdb-local-build --volume `pwd`/java/target:/rocksdb-java-target --env DEBUG_LEVEL=$(DEBUG_LEVEL) evolvedbinary/rocksjava:centos7_ppc64le-be /rocksdb-host/java/crossbuild/docker-build-linux-centos.sh
2147

2148 2149
rocksdbjavastaticdockerarm64v8:
	mkdir -p java/target
2150
	docker run --rm --name rocksdb_linux_arm64v8-be --attach stdin --attach stdout --attach stderr --volume $(HOME)/.m2:/root/.m2:ro --volume `pwd`:/rocksdb-host:ro --volume /rocksdb-local-build --volume `pwd`/java/target:/rocksdb-java-target --env DEBUG_LEVEL=$(DEBUG_LEVEL) evolvedbinary/rocksjava:centos7_arm64v8-be /rocksdb-host/java/crossbuild/docker-build-linux-centos.sh
2151

2152 2153
rocksdbjavastaticdockerx86musl:
	mkdir -p java/target
2154
	docker run --rm --name rocksdb_linux_x86-musl-be --attach stdin --attach stdout --attach stderr --volume $(HOME)/.m2:/root/.m2:ro --volume `pwd`:/rocksdb-host:ro --volume /rocksdb-local-build --volume `pwd`/java/target:/rocksdb-java-target --env DEBUG_LEVEL=$(DEBUG_LEVEL) evolvedbinary/rocksjava:alpine3_x86-be /rocksdb-host/java/crossbuild/docker-build-linux-centos.sh
2155 2156 2157

rocksdbjavastaticdockerx86_64musl:
	mkdir -p java/target
2158
	docker run --rm --name rocksdb_linux_x64-musl-be --attach stdin --attach stdout --attach stderr --volume $(HOME)/.m2:/root/.m2:ro --volume `pwd`:/rocksdb-host:ro --volume /rocksdb-local-build --volume `pwd`/java/target:/rocksdb-java-target --env DEBUG_LEVEL=$(DEBUG_LEVEL) evolvedbinary/rocksjava:alpine3_x64-be /rocksdb-host/java/crossbuild/docker-build-linux-centos.sh
2159 2160 2161

rocksdbjavastaticdockerppc64lemusl:
	mkdir -p java/target
2162
	docker run --rm --name rocksdb_linux_ppc64le-musl-be --attach stdin --attach stdout --attach stderr --volume $(HOME)/.m2:/root/.m2:ro --volume `pwd`:/rocksdb-host:ro --volume /rocksdb-local-build --volume `pwd`/java/target:/rocksdb-java-target --env DEBUG_LEVEL=$(DEBUG_LEVEL) evolvedbinary/rocksjava:alpine3_ppc64le-be /rocksdb-host/java/crossbuild/docker-build-linux-centos.sh
2163 2164 2165

rocksdbjavastaticdockerarm64v8musl:
	mkdir -p java/target
2166
	docker run --rm --name rocksdb_linux_arm64v8-musl-be --attach stdin --attach stdout --attach stderr --volume $(HOME)/.m2:/root/.m2:ro --volume `pwd`:/rocksdb-host:ro --volume /rocksdb-local-build --volume `pwd`/java/target:/rocksdb-java-target --env DEBUG_LEVEL=$(DEBUG_LEVEL) evolvedbinary/rocksjava:alpine3_arm64v8-be /rocksdb-host/java/crossbuild/docker-build-linux-centos.sh
2167

2168 2169
rocksdbjavastaticpublish: rocksdbjavastaticrelease rocksdbjavastaticpublishcentral

2170 2171
rocksdbjavastaticpublishdocker: rocksdbjavastaticreleasedocker rocksdbjavastaticpublishcentral

2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184
rocksdbjavastaticpublishcentral: rocksdbjavageneratepom
	mvn gpg:sign-and-deploy-file -Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2/ -DrepositoryId=sonatype-nexus-staging -DpomFile=java/pom.xml -Dfile=java/target/rocksdbjni-$(ROCKSDB_JAVA_VERSION)-javadoc.jar -Dclassifier=javadoc
	mvn gpg:sign-and-deploy-file -Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2/ -DrepositoryId=sonatype-nexus-staging -DpomFile=java/pom.xml -Dfile=java/target/rocksdbjni-$(ROCKSDB_JAVA_VERSION)-sources.jar -Dclassifier=sources
	mvn gpg:sign-and-deploy-file -Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2/ -DrepositoryId=sonatype-nexus-staging -DpomFile=java/pom.xml -Dfile=java/target/rocksdbjni-$(ROCKSDB_JAVA_VERSION)-linux64.jar -Dclassifier=linux64
	mvn gpg:sign-and-deploy-file -Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2/ -DrepositoryId=sonatype-nexus-staging -DpomFile=java/pom.xml -Dfile=java/target/rocksdbjni-$(ROCKSDB_JAVA_VERSION)-linux32.jar -Dclassifier=linux32
	mvn gpg:sign-and-deploy-file -Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2/ -DrepositoryId=sonatype-nexus-staging -DpomFile=java/pom.xml -Dfile=java/target/rocksdbjni-$(ROCKSDB_JAVA_VERSION)-linux64-musl.jar -Dclassifier=linux64-musl
	mvn gpg:sign-and-deploy-file -Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2/ -DrepositoryId=sonatype-nexus-staging -DpomFile=java/pom.xml -Dfile=java/target/rocksdbjni-$(ROCKSDB_JAVA_VERSION)-linux32-musl.jar -Dclassifier=linux32-musl
	mvn gpg:sign-and-deploy-file -Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2/ -DrepositoryId=sonatype-nexus-staging -DpomFile=java/pom.xml -Dfile=java/target/rocksdbjni-$(ROCKSDB_JAVA_VERSION)-osx.jar -Dclassifier=osx
	mvn gpg:sign-and-deploy-file -Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2/ -DrepositoryId=sonatype-nexus-staging -DpomFile=java/pom.xml -Dfile=java/target/rocksdbjni-$(ROCKSDB_JAVA_VERSION)-win64.jar -Dclassifier=win64
	mvn gpg:sign-and-deploy-file -Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2/ -DrepositoryId=sonatype-nexus-staging -DpomFile=java/pom.xml -Dfile=java/target/rocksdbjni-$(ROCKSDB_JAVA_VERSION).jar

rocksdbjavageneratepom:
	cd java;cat pom.xml.template | sed 's/\$${ROCKSDB_JAVA_VERSION}/$(ROCKSDB_JAVA_VERSION)/' > pom.xml
2185

2186
# A version of each $(LIBOBJECTS) compiled with -fPIC
2187

2188 2189
jl/%.o: %.cc
	$(AM_V_CC)mkdir -p $(@D) && $(CXX) $(CXXFLAGS) -fPIC -c $< -o $@ $(COVERAGEFLAGS)
2190

2191
rocksdbjava: $(LIB_OBJECTS)
2192 2193
	$(AM_V_GEN)cd java;$(MAKE) javalib;
	$(AM_V_at)rm -f ./java/target/$(ROCKSDBJNILIB)
2194
	$(AM_V_at)$(CXX) $(CXXFLAGS) -I./java/. $(JAVA_INCLUDE) -shared -fPIC -o ./java/target/$(ROCKSDBJNILIB) $(JNI_NATIVE_SOURCES) $(LIB_OBJECTS) $(JAVA_LDFLAGS) $(COVERAGEFLAGS)
2195 2196 2197
	$(AM_V_at)cd java;jar -cf target/$(ROCKSDB_JAR) HISTORY*.md
	$(AM_V_at)cd java/target;jar -uf $(ROCKSDB_JAR) $(ROCKSDBJNILIB)
	$(AM_V_at)cd java/target/classes;jar -uf ../$(ROCKSDB_JAR) org/rocksdb/*.class org/rocksdb/util/*.class
2198
	$(AM_V_at)openssl sha1 java/target/$(ROCKSDB_JAR) | sed 's/.*= \([0-9a-f]*\)/\1/' > java/target/$(ROCKSDB_JAR).sha1
2199 2200 2201 2202

jclean:
	cd java;$(MAKE) clean;

2203 2204 2205 2206 2207 2208
jtest_compile: rocksdbjava
	cd java;$(MAKE) java_test

jtest_run:
	cd java;$(MAKE) run_test

2209
jtest: rocksdbjava
2210
	cd java;$(MAKE) sample;$(MAKE) test;
2211
	$(PYTHON) tools/check_all_python.py # TODO peterd: find a better place for this check in CI targets
2212

2213 2214 2215
jdb_bench:
	cd java;$(MAKE) db_bench;

2216 2217
commit_prereq: build_tools/rocksdb-lego-determinator \
               build_tools/precommit_checker.py
2218
	J=$(J) build_tools/precommit_checker.py unit unit_481 clang_unit release release_481 clang_release tsan asan ubsan lite unit_non_shm
2219
	$(MAKE) clean && $(MAKE) jclean && $(MAKE) rocksdbjava;
2220

2221 2222 2223
# ---------------------------------------------------------------------------
#  	Platform-specific compilation
# ---------------------------------------------------------------------------
J
Jim Paton 已提交
2224

2225 2226 2227
ifeq ($(PLATFORM), IOS)
# For iOS, create universal object files to be used on both the simulator and
# a device.
2228 2229
XCODEROOT=$(shell xcode-select -print-path)
PLATFORMSROOT=$(XCODEROOT)/Platforms
H
heyongqiang 已提交
2230 2231
SIMULATORROOT=$(PLATFORMSROOT)/iPhoneSimulator.platform/Developer
DEVICEROOT=$(PLATFORMSROOT)/iPhoneOS.platform/Developer
I
Igor Canadi 已提交
2232
IOSVERSION=$(shell defaults read $(PLATFORMSROOT)/iPhoneOS.platform/version CFBundleShortVersionString)
2233

2234 2235
.cc.o:
	mkdir -p ios-x86/$(dir $@)
I
Igor Canadi 已提交
2236
	$(CXX) $(CXXFLAGS) -isysroot $(SIMULATORROOT)/SDKs/iPhoneSimulator$(IOSVERSION).sdk -arch i686 -arch x86_64 -c $< -o ios-x86/$@
2237
	mkdir -p ios-arm/$(dir $@)
I
Igor Canadi 已提交
2238
	xcrun -sdk iphoneos $(CXX) $(CXXFLAGS) -isysroot $(DEVICEROOT)/SDKs/iPhoneOS$(IOSVERSION).sdk -arch armv6 -arch armv7 -arch armv7s -arch arm64 -c $< -o ios-arm/$@
2239
	lipo ios-x86/$@ ios-arm/$@ -create -output $@
2240 2241 2242

.c.o:
	mkdir -p ios-x86/$(dir $@)
I
Igor Canadi 已提交
2243
	$(CC) $(CFLAGS) -isysroot $(SIMULATORROOT)/SDKs/iPhoneSimulator$(IOSVERSION).sdk -arch i686 -arch x86_64 -c $< -o ios-x86/$@
2244
	mkdir -p ios-arm/$(dir $@)
I
Igor Canadi 已提交
2245
	xcrun -sdk iphoneos $(CC) $(CFLAGS) -isysroot $(DEVICEROOT)/SDKs/iPhoneOS$(IOSVERSION).sdk -arch armv6 -arch armv7 -arch armv7s -arch arm64 -c $< -o ios-arm/$@
2246 2247
	lipo ios-x86/$@ ios-arm/$@ -create -output $@

2248
else
2249
ifeq ($(HAVE_POWER8),1)
2250
$(OBJ_DIR)/util/crc32c_ppc.o: util/crc32c_ppc.c
2251 2252
	$(AM_V_CC)$(CC) $(CFLAGS) -c $< -o $@

2253
$(OBJ_DIR)/util/crc32c_ppc_asm.o: util/crc32c_ppc_asm.S
2254 2255
	$(AM_V_CC)$(CC) $(CFLAGS) -c $< -o $@
endif
2256 2257
$(OBJ_DIR)/%.o: %.cc
	$(AM_V_CC)mkdir -p $(@D) && $(CXX) $(CXXFLAGS) -c $< -o $@ $(COVERAGEFLAGS)
2258

2259 2260
$(OBJ_DIR)/%.o: %.cpp
	$(AM_V_CC)mkdir -p $(@D) && $(CXX) $(CXXFLAGS) -c $< -o $@ $(COVERAGEFLAGS)
2261

2262
$(OBJ_DIR)/%.o: %.c
2263
	$(AM_V_CC)$(CC) $(CFLAGS) -c $< -o $@
2264
endif
2265

2266 2267 2268 2269
# ---------------------------------------------------------------------------
#  	Source files dependencies detection
# ---------------------------------------------------------------------------

2270 2271
DEPFILES = $(patsubst %.cc, $(OBJ_DIR)/%.cc.d, $(ALL_SOURCES))
DEPFILES+ = $(patsubst %.c, $(OBJ_DIR)/%.c.d, $(LIB_SOURCES_C) $(TEST_MAIN_SOURCES_C))
2272
ifeq ($(USE_FOLLY_DISTRIBUTED_MUTEX),1)
2273
  DEPFILES +=$(patsubst %.cpp, $(OBJ_DIR)/%.cpp.d, $(FOLLY_SOURCES))
2274
endif
2275

2276 2277 2278 2279 2280
# Add proper dependency support so changing a .h file forces a .cc file to
# rebuild.

# The .d file indicates .cc file's dependencies on .h files. We generate such
# dependency by g++'s -MM option, whose output is a make dependency rule.
2281 2282 2283 2284
$(OBJ_DIR)/%.cc.d: %.cc
	@mkdir -p $(@D) && $(CXX) $(CXXFLAGS) $(PLATFORM_SHARED_CFLAGS) \
	  -MM -MT'$@' -MT'$(<:.cc=.o)' -MT'$(<:%.cc=$(OBJ_DIR)/%.o)' \
          "$<" -o '$@'
2285

2286 2287 2288 2289
$(OBJ_DIR)/%.cpp.d: %.cpp
	@mkdir -p $(@D) && $(CXX) $(CXXFLAGS) $(PLATFORM_SHARED_CFLAGS) \
	  -MM -MT'$@' -MT'$(<:.cpp=.o)' -MT'$(<:%.cpp=$(OBJ_DIR)/%.o)' \
          "$<" -o '$@'
2290

2291
ifeq ($(HAVE_POWER8),1)
2292 2293
DEPFILES_C = $(patsubst %.c, $(OBJ_DIR)/%.c.d, $(LIB_SOURCES_C))
DEPFILES_ASM = $(patsubst %.S, $(OBJ_DIR)/%.S.d, $(LIB_SOURCES_ASM))
2294

2295
$(OBJ_DIR)/%.c.d: %.c
2296 2297 2298
	@$(CXX) $(CXXFLAGS) $(PLATFORM_SHARED_CFLAGS) \
	  -MM -MT'$@' -MT'$(<:.c=.o)' "$<" -o '$@'

2299
$(OBJ_DIR)/%.S.d: %.S
2300 2301 2302 2303 2304 2305 2306 2307
	@$(CXX) $(CXXFLAGS) $(PLATFORM_SHARED_CFLAGS) \
	  -MM -MT'$@' -MT'$(<:.S=.o)' "$<" -o '$@'

$(DEPFILES_C): %.c.d

$(DEPFILES_ASM): %.S.d
depend: $(DEPFILES) $(DEPFILES_C) $(DEPFILES_ASM)
else
2308
depend: $(DEPFILES)
2309
endif
2310

2311 2312 2313 2314
# if the make goal is either "clean" or "format", we shouldn't
# try to import the *.d files.
# TODO(kailiu) The unfamiliarity of Make's conditions leads to the ugly
# working solution.
2315
ifneq ($(MAKECMDGOALS),clean)
2316
ifneq ($(MAKECMDGOALS),format)
2317 2318
ifneq ($(MAKECMDGOALS),jclean)
ifneq ($(MAKECMDGOALS),jtest)
2319
ifneq ($(MAKECMDGOALS),package)
2320
ifneq ($(MAKECMDGOALS),analyze)
2321 2322
-include $(DEPFILES)
endif
2323
endif
2324 2325
endif
endif
2326
endif
2327
endif