1NATIVE_JAVA_CLASSES = \
2	org.rocksdb.AbstractCompactionFilter\
3	org.rocksdb.AbstractCompactionFilterFactory\
4	org.rocksdb.AbstractComparator\
5	org.rocksdb.AbstractSlice\
6	org.rocksdb.AbstractTableFilter\
7	org.rocksdb.AbstractTraceWriter\
8	org.rocksdb.AbstractTransactionNotifier\
9	org.rocksdb.AbstractWalFilter\
10	org.rocksdb.BackupEngine\
11	org.rocksdb.BackupableDBOptions\
12	org.rocksdb.BlockBasedTableConfig\
13	org.rocksdb.BloomFilter\
14	org.rocksdb.Checkpoint\
15	org.rocksdb.ClockCache\
16	org.rocksdb.CassandraCompactionFilter\
17	org.rocksdb.CassandraValueMergeOperator\
18	org.rocksdb.ColumnFamilyHandle\
19	org.rocksdb.ColumnFamilyOptions\
20	org.rocksdb.CompactionJobInfo\
21	org.rocksdb.CompactionJobStats\
22	org.rocksdb.CompactionOptions\
23	org.rocksdb.CompactionOptionsFIFO\
24	org.rocksdb.CompactionOptionsUniversal\
25	org.rocksdb.CompactRangeOptions\
26	org.rocksdb.ComparatorOptions\
27	org.rocksdb.CompressionOptions\
28	org.rocksdb.DBOptions\
29	org.rocksdb.DirectSlice\
30	org.rocksdb.Env\
31	org.rocksdb.EnvOptions\
32	org.rocksdb.FlushOptions\
33	org.rocksdb.Filter\
34	org.rocksdb.IngestExternalFileOptions\
35	org.rocksdb.HashLinkedListMemTableConfig\
36	org.rocksdb.HashSkipListMemTableConfig\
37	org.rocksdb.HdfsEnv\
38	org.rocksdb.Logger\
39	org.rocksdb.LRUCache\
40	org.rocksdb.MemoryUsageType\
41	org.rocksdb.MemoryUtil\
42	org.rocksdb.MergeOperator\
43	org.rocksdb.NativeComparatorWrapper\
44	org.rocksdb.OptimisticTransactionDB\
45	org.rocksdb.OptimisticTransactionOptions\
46	org.rocksdb.Options\
47	org.rocksdb.OptionsUtil\
48	org.rocksdb.PersistentCache\
49	org.rocksdb.PlainTableConfig\
50	org.rocksdb.RateLimiter\
51	org.rocksdb.ReadOptions\
52	org.rocksdb.RemoveEmptyValueCompactionFilter\
53	org.rocksdb.RestoreOptions\
54	org.rocksdb.RocksCallbackObject\
55	org.rocksdb.RocksDB\
56	org.rocksdb.RocksEnv\
57	org.rocksdb.RocksIterator\
58	org.rocksdb.RocksMemEnv\
59	org.rocksdb.SkipListMemTableConfig\
60	org.rocksdb.Slice\
61	org.rocksdb.SstFileManager\
62	org.rocksdb.SstFileWriter\
63	org.rocksdb.SstFileReader\
64	org.rocksdb.SstFileReaderIterator\
65	org.rocksdb.Statistics\
66	org.rocksdb.ThreadStatus\
67	org.rocksdb.TimedEnv\
68	org.rocksdb.Transaction\
69	org.rocksdb.TransactionDB\
70	org.rocksdb.TransactionDBOptions\
71	org.rocksdb.TransactionOptions\
72	org.rocksdb.TransactionLogIterator\
73	org.rocksdb.TtlDB\
74	org.rocksdb.VectorMemTableConfig\
75	org.rocksdb.Snapshot\
76	org.rocksdb.StringAppendOperator\
77	org.rocksdb.UInt64AddOperator\
78	org.rocksdb.WriteBatch\
79	org.rocksdb.WriteBatch.Handler\
80	org.rocksdb.WriteOptions\
81	org.rocksdb.WriteBatchWithIndex\
82	org.rocksdb.WriteBufferManager\
83	org.rocksdb.WBWIRocksIterator
84
85NATIVE_JAVA_TEST_CLASSES = org.rocksdb.RocksDBExceptionTest\
86    org.rocksdb.NativeComparatorWrapperTest.NativeStringComparatorWrapper\
87    org.rocksdb.WriteBatchTest\
88    org.rocksdb.WriteBatchTestInternalHelper
89
90ROCKSDB_MAJOR = $(shell egrep "ROCKSDB_MAJOR.[0-9]" ../include/rocksdb/version.h | cut -d ' ' -f 3)
91ROCKSDB_MINOR = $(shell egrep "ROCKSDB_MINOR.[0-9]" ../include/rocksdb/version.h | cut -d ' ' -f 3)
92ROCKSDB_PATCH = $(shell egrep "ROCKSDB_PATCH.[0-9]" ../include/rocksdb/version.h | cut -d ' ' -f 3)
93
94NATIVE_INCLUDE = ./include
95ARCH := $(shell getconf LONG_BIT)
96ROCKSDB_JAR = rocksdbjni-$(ROCKSDB_MAJOR).$(ROCKSDB_MINOR).$(ROCKSDB_PATCH)-linux$(ARCH).jar
97ifeq ($(PLATFORM), OS_MACOSX)
98ROCKSDB_JAR = rocksdbjni-$(ROCKSDB_MAJOR).$(ROCKSDB_MINOR).$(ROCKSDB_PATCH)-osx.jar
99endif
100
101JAVA_TESTS = \
102	org.rocksdb.BackupableDBOptionsTest\
103	org.rocksdb.BackupEngineTest\
104	org.rocksdb.BlockBasedTableConfigTest\
105	org.rocksdb.BuiltinComparatorTest\
106	org.rocksdb.util.BytewiseComparatorTest\
107	org.rocksdb.util.BytewiseComparatorIntTest\
108	org.rocksdb.CheckPointTest\
109	org.rocksdb.ClockCacheTest\
110	org.rocksdb.ColumnFamilyOptionsTest\
111	org.rocksdb.ColumnFamilyTest\
112	org.rocksdb.CompactionFilterFactoryTest\
113	org.rocksdb.CompactionJobInfoTest\
114	org.rocksdb.CompactionJobStatsTest\
115	org.rocksdb.CompactionOptionsTest\
116	org.rocksdb.CompactionOptionsFIFOTest\
117	org.rocksdb.CompactionOptionsUniversalTest\
118	org.rocksdb.CompactionPriorityTest\
119	org.rocksdb.CompactionStopStyleTest\
120	org.rocksdb.ComparatorOptionsTest\
121	org.rocksdb.CompressionOptionsTest\
122	org.rocksdb.CompressionTypesTest\
123	org.rocksdb.DBOptionsTest\
124	org.rocksdb.DirectSliceTest\
125	org.rocksdb.util.EnvironmentTest\
126	org.rocksdb.EnvOptionsTest\
127	org.rocksdb.HdfsEnvTest\
128	org.rocksdb.IngestExternalFileOptionsTest\
129	org.rocksdb.util.IntComparatorTest\
130	org.rocksdb.util.JNIComparatorTest\
131	org.rocksdb.FilterTest\
132	org.rocksdb.FlushTest\
133	org.rocksdb.InfoLogLevelTest\
134	org.rocksdb.KeyMayExistTest\
135	org.rocksdb.LoggerTest\
136	org.rocksdb.LRUCacheTest\
137	org.rocksdb.MemoryUtilTest\
138	org.rocksdb.MemTableTest\
139	org.rocksdb.MergeTest\
140	org.rocksdb.MixedOptionsTest\
141	org.rocksdb.MutableColumnFamilyOptionsTest\
142	org.rocksdb.MutableDBOptionsTest\
143	org.rocksdb.NativeComparatorWrapperTest\
144	org.rocksdb.NativeLibraryLoaderTest\
145	org.rocksdb.OptimisticTransactionTest\
146	org.rocksdb.OptimisticTransactionDBTest\
147	org.rocksdb.OptimisticTransactionOptionsTest\
148	org.rocksdb.OptionsUtilTest\
149	org.rocksdb.OptionsTest\
150	org.rocksdb.PlainTableConfigTest\
151	org.rocksdb.RateLimiterTest\
152	org.rocksdb.ReadOnlyTest\
153	org.rocksdb.ReadOptionsTest\
154	org.rocksdb.util.ReverseBytewiseComparatorIntTest\
155	org.rocksdb.RocksDBTest\
156	org.rocksdb.RocksDBExceptionTest\
157	org.rocksdb.DefaultEnvTest\
158	org.rocksdb.RocksIteratorTest\
159	org.rocksdb.RocksMemEnvTest\
160	org.rocksdb.util.SizeUnitTest\
161	org.rocksdb.SliceTest\
162	org.rocksdb.SnapshotTest\
163	org.rocksdb.SstFileManagerTest\
164	org.rocksdb.SstFileWriterTest\
165	org.rocksdb.SstFileReaderTest\
166	org.rocksdb.TableFilterTest\
167	org.rocksdb.TimedEnvTest\
168	org.rocksdb.TransactionTest\
169	org.rocksdb.TransactionDBTest\
170	org.rocksdb.TransactionOptionsTest\
171	org.rocksdb.TransactionDBOptionsTest\
172	org.rocksdb.TransactionLogIteratorTest\
173	org.rocksdb.TtlDBTest\
174	org.rocksdb.StatisticsTest\
175	org.rocksdb.StatisticsCollectorTest\
176	org.rocksdb.WalFilterTest\
177	org.rocksdb.WALRecoveryModeTest\
178	org.rocksdb.WriteBatchHandlerTest\
179	org.rocksdb.WriteBatchTest\
180	org.rocksdb.WriteBatchThreadedTest\
181	org.rocksdb.WriteOptionsTest\
182	org.rocksdb.WriteBatchWithIndexTest
183
184MAIN_SRC = src/main/java
185TEST_SRC = src/test/java
186OUTPUT = target
187MAIN_CLASSES = $(OUTPUT)/classes
188TEST_CLASSES = $(OUTPUT)/test-classes
189JAVADOC = $(OUTPUT)/apidocs
190
191BENCHMARK_MAIN_SRC = benchmark/src/main/java
192BENCHMARK_OUTPUT = benchmark/target
193BENCHMARK_MAIN_CLASSES = $(BENCHMARK_OUTPUT)/classes
194
195SAMPLES_MAIN_SRC = samples/src/main/java
196SAMPLES_OUTPUT = samples/target
197SAMPLES_MAIN_CLASSES = $(SAMPLES_OUTPUT)/classes
198
199JAVA_TEST_LIBDIR = test-libs
200JAVA_JUNIT_JAR = $(JAVA_TEST_LIBDIR)/junit-4.12.jar
201JAVA_HAMCR_JAR = $(JAVA_TEST_LIBDIR)/hamcrest-core-1.3.jar
202JAVA_MOCKITO_JAR = $(JAVA_TEST_LIBDIR)/mockito-all-1.10.19.jar
203JAVA_CGLIB_JAR = $(JAVA_TEST_LIBDIR)/cglib-2.2.2.jar
204JAVA_ASSERTJ_JAR = $(JAVA_TEST_LIBDIR)/assertj-core-1.7.1.jar
205JAVA_TESTCLASSPATH = $(JAVA_JUNIT_JAR):$(JAVA_HAMCR_JAR):$(JAVA_MOCKITO_JAR):$(JAVA_CGLIB_JAR):$(JAVA_ASSERTJ_JAR)
206
207MVN_LOCAL = ~/.m2/repository
208
209# Set the default JAVA_ARGS to "" for DEBUG_LEVEL=0
210JAVA_ARGS ?=
211
212JAVAC_ARGS ?=
213
214# When debugging add -Xcheck:jni to the java args
215ifneq ($(DEBUG_LEVEL),0)
216	JAVA_ARGS += -ea -Xcheck:jni
217	JAVAC_ARGS += -Xlint:deprecation -Xlint:unchecked
218endif
219
220# Using a Facebook AWS account for S3 storage. (maven.org has a history
221# of failing in Travis builds.)
222DEPS_URL?=https://rocksdb-deps.s3-us-west-2.amazonaws.com/jars
223
224clean: clean-not-downloaded clean-downloaded
225
226clean-not-downloaded:
227	$(AM_V_at)rm -rf $(NATIVE_INCLUDE)
228	$(AM_V_at)rm -rf $(OUTPUT)
229	$(AM_V_at)rm -rf $(BENCHMARK_OUTPUT)
230	$(AM_V_at)rm -rf $(SAMPLES_OUTPUT)
231
232clean-downloaded:
233	$(AM_V_at)rm -rf $(JAVA_TEST_LIBDIR)
234
235
236javadocs: java
237	$(AM_V_GEN)mkdir -p $(JAVADOC)
238	$(AM_V_at)javadoc -d $(JAVADOC) -sourcepath $(MAIN_SRC) -subpackages org
239
240javalib: java java_test javadocs
241
242java:
243	$(AM_V_GEN)mkdir -p $(MAIN_CLASSES)
244ifeq ($(shell java -version 2>&1 | grep 1.7.0 > /dev/null; printf $$?), 0)
245	$(AM_V_at)javac $(JAVAC_ARGS) -d $(MAIN_CLASSES)\
246		$(MAIN_SRC)/org/rocksdb/util/*.java\
247		$(MAIN_SRC)/org/rocksdb/*.java
248else
249	$(AM_V_at)javac $(JAVAC_ARGS) -h $(NATIVE_INCLUDE) -d $(MAIN_CLASSES)\
250		$(MAIN_SRC)/org/rocksdb/util/*.java\
251		$(MAIN_SRC)/org/rocksdb/*.java
252endif
253	$(AM_V_at)@cp ../HISTORY.md ./HISTORY-CPP.md
254	$(AM_V_at)@rm -f ./HISTORY-CPP.md
255ifeq ($(shell java -version 2>&1 | grep 1.7.0 > /dev/null; printf $$?), 0)
256	$(AM_V_at)javah -cp $(MAIN_CLASSES) -d $(NATIVE_INCLUDE) -jni $(NATIVE_JAVA_CLASSES)
257endif
258
259sample: java
260	$(AM_V_GEN)mkdir -p $(SAMPLES_MAIN_CLASSES)
261	$(AM_V_at)javac $(JAVAC_ARGS) -cp $(MAIN_CLASSES) -d $(SAMPLES_MAIN_CLASSES) $(SAMPLES_MAIN_SRC)/RocksDBSample.java
262	$(AM_V_at)@rm -rf /tmp/rocksdbjni
263	$(AM_V_at)@rm -rf /tmp/rocksdbjni_not_found
264	java $(JAVA_ARGS) -Djava.library.path=target -cp $(MAIN_CLASSES):$(SAMPLES_MAIN_CLASSES) RocksDBSample /tmp/rocksdbjni
265	$(AM_V_at)@rm -rf /tmp/rocksdbjni
266	$(AM_V_at)@rm -rf /tmp/rocksdbjni_not_found
267
268column_family_sample: java
269	$(AM_V_GEN)mkdir -p $(SAMPLES_MAIN_CLASSES)
270	$(AM_V_at)javac $(JAVAC_ARGS) -cp $(MAIN_CLASSES) -d $(SAMPLES_MAIN_CLASSES) $(SAMPLES_MAIN_SRC)/RocksDBColumnFamilySample.java
271	$(AM_V_at)@rm -rf /tmp/rocksdbjni
272	java $(JAVA_ARGS) -Djava.library.path=target -cp $(MAIN_CLASSES):$(SAMPLES_MAIN_CLASSES) RocksDBColumnFamilySample /tmp/rocksdbjni
273	$(AM_V_at)@rm -rf /tmp/rocksdbjni
274
275transaction_sample: java
276	$(AM_V_GEN)mkdir -p $(SAMPLES_MAIN_CLASSES)
277	$(AM_V_at)javac -cp $(MAIN_CLASSES) -d $(SAMPLES_MAIN_CLASSES) $(SAMPLES_MAIN_SRC)/TransactionSample.java
278	$(AM_V_at)@rm -rf /tmp/rocksdbjni
279	java -ea -Xcheck:jni -Djava.library.path=target -cp $(MAIN_CLASSES):$(SAMPLES_MAIN_CLASSES) TransactionSample /tmp/rocksdbjni
280	$(AM_V_at)@rm -rf /tmp/rocksdbjni
281
282optimistic_transaction_sample: java
283	$(AM_V_GEN)mkdir -p $(SAMPLES_MAIN_CLASSES)
284	$(AM_V_at)javac -cp $(MAIN_CLASSES) -d $(SAMPLES_MAIN_CLASSES) $(SAMPLES_MAIN_SRC)/OptimisticTransactionSample.java
285	$(AM_V_at)@rm -rf /tmp/rocksdbjni
286	java -ea -Xcheck:jni -Djava.library.path=target -cp $(MAIN_CLASSES):$(SAMPLES_MAIN_CLASSES) OptimisticTransactionSample /tmp/rocksdbjni
287	$(AM_V_at)@rm -rf /tmp/rocksdbjni
288
289resolve_test_deps:
290	test -d "$(JAVA_TEST_LIBDIR)" || mkdir -p "$(JAVA_TEST_LIBDIR)"
291	test -s "$(JAVA_JUNIT_JAR)" || cp $(MVN_LOCAL)/junit/junit/4.12/junit-4.12.jar $(JAVA_TEST_LIBDIR) || curl --fail --insecure --output $(JAVA_JUNIT_JAR) --location $(DEPS_URL)/junit-4.12.jar
292	test -s "$(JAVA_HAMCR_JAR)" || cp $(MVN_LOCAL)/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar $(JAVA_TEST_LIBDIR) || curl --fail --insecure --output $(JAVA_HAMCR_JAR) --location $(DEPS_URL)/hamcrest-core-1.3.jar
293	test -s "$(JAVA_MOCKITO_JAR)" || cp $(MVN_LOCAL)/org/mockito/mockito-all/1.10.19/mockito-all-1.10.19.jar $(JAVA_TEST_LIBDIR) || curl --fail --insecure --output "$(JAVA_MOCKITO_JAR)" --location $(DEPS_URL)/mockito-all-1.10.19.jar
294	test -s "$(JAVA_CGLIB_JAR)" || cp $(MVN_LOCAL)/cglib/cglib/2.2.2/cglib-2.2.2.jar $(JAVA_TEST_LIBDIR) || curl --fail --insecure --output "$(JAVA_CGLIB_JAR)" --location $(DEPS_URL)/cglib-2.2.2.jar
295	test -s "$(JAVA_ASSERTJ_JAR)" || cp $(MVN_LOCAL)/org/assertj/assertj-core/1.7.1/assertj-core-1.7.1.jar $(JAVA_TEST_LIBDIR) || curl --fail --insecure --output "$(JAVA_ASSERTJ_JAR)" --location $(DEPS_URL)/assertj-core-1.7.1.jar
296
297java_test: java resolve_test_deps
298	$(AM_V_GEN)mkdir -p $(TEST_CLASSES)
299ifeq ($(shell java -version 2>&1|grep 1.7.0 >/dev/null; printf $$?),0)
300	$(AM_V_at)javac $(JAVAC_ARGS) -cp $(MAIN_CLASSES):$(JAVA_TESTCLASSPATH) -d $(TEST_CLASSES)\
301		$(TEST_SRC)/org/rocksdb/test/*.java\
302		$(TEST_SRC)/org/rocksdb/util/*.java\
303		$(TEST_SRC)/org/rocksdb/*.java
304	$(AM_V_at)javah -cp $(MAIN_CLASSES):$(TEST_CLASSES) -d $(NATIVE_INCLUDE) -jni $(NATIVE_JAVA_TEST_CLASSES)
305else
306	$(AM_V_at)javac $(JAVAC_ARGS) -cp $(MAIN_CLASSES):$(JAVA_TESTCLASSPATH) -h $(NATIVE_INCLUDE) -d $(TEST_CLASSES)\
307		$(TEST_SRC)/org/rocksdb/test/*.java\
308		$(TEST_SRC)/org/rocksdb/util/*.java\
309		$(TEST_SRC)/org/rocksdb/*.java
310endif
311
312test: java java_test run_test
313
314run_test:
315	java $(JAVA_ARGS) -Djava.library.path=target -cp "$(MAIN_CLASSES):$(TEST_CLASSES):$(JAVA_TESTCLASSPATH):target/*" org.rocksdb.test.RocksJunitRunner $(JAVA_TESTS)
316
317db_bench: java
318	$(AM_V_GEN)mkdir -p $(BENCHMARK_MAIN_CLASSES)
319	$(AM_V_at)javac $(JAVAC_ARGS) -cp $(MAIN_CLASSES) -d $(BENCHMARK_MAIN_CLASSES) $(BENCHMARK_MAIN_SRC)/org/rocksdb/benchmark/*.java
320