# Build rocksdb library for SWI-Prolog

# TODO: rocksdb	/Makefile has a lot of undefined variables
# MAKEFLAGS=--warn-undefined-variables

# For development, specify the following:
# ADDED_CPP_FLAGS= -Wsign-compare -Wshadow -Wunused-parameter -Woverloaded-virtual -Wnon-virtual-dtor -Wno-invalid-offsetof -Wconversion -Warith-conversion -Wsign-conversion -Wfloat-conversion -Wno-unused-parameter -Wno-missing-field-initializers

# For debugging:
#  -O0 -gdwarf-2 -g3 -fsanitize=address -fno-omit-frame-pointer

# To build/test:
#   cd $SRC/rocksdb
#   swipl pack install .
# and thereafter:
#   (cd $SRC/rocksdb && source buildenv.sh && make && make check)

# The following variables should be set by Make, but in case they're
# not, get the values that swipl sets (also in buildenv.sh)
CC ?= $(SWIPL_CC)
CXX ?= $(SWIPL_CXX)

# The following should be set by buildenv.sh:
SWIPL ?= swipl

CPPFLAGS=-Wall $(ADDED_CPPFLAGS) -std=c++17 -O2 -gdwarf-2 -g3 $(SWIPL_CFLAGS) $(SWIPL_MODULE_LDFLAGS) -Irocksdb/include
LIBROCKSDB=rocksdb/librocksdb.a
ROCKSENV=ROCKSDB_DISABLE_JEMALLOC=1 ROCKSDB_DISABLE_TCMALLOC=1
# DEBUG_LEVEL=0 implies -O2 without assertions and debug code
ROCKSCFLAGS=CXX=$(CXX) EXTRA_CXXFLAGS="-fPIC -Wall -O2 -gdwarf-2 -g3" EXTRA_CFLAGS="-fPIC -Wall -O2 -gdwarf-2 -g3" USE_RTTI=1 DEBUG_LEVEL=0
PLPATHS=-p library=prolog -p foreign="$(SWIPL_MODULE_DIR)"
SUBMODULE_UPDATE ?= git submodule update --init rocksdb

# sets PLATFORM_LDFLAGS
-include rocksdb/make_config.mk

all:	plugin

.PHONY: FORCE all clean install check distclean realclean shared_object plugin

rocksdb/INSTALL.md: FORCE
	$(SUBMODULE_UPDATE)

# Run the build for librocksdb in parallel, using # processors as
# limit, if using GNU make
JOBS=$(shell $(MAKE) --version 2>/dev/null | grep GNU >/dev/null && J=$$(nproc 2>/dev/null) && echo -j$$J)
$(LIBROCKSDB): rocksdb/INSTALL.md FORCE
	$(ROCKSENV) $(MAKE) $(JOBS) -C rocksdb static_lib $(ROCKSCFLAGS)

plugin:	$(LIBROCKSDB)
	$(MAKE) shared_object

shared_object: $(SWIPL_MODULE_DIR)/rocksdb4pl.$(SWIPL_MODULE_EXT)

$(SWIPL_MODULE_DIR)/rocksdb4pl.$(SWIPL_MODULE_EXT): cpp/rocksdb4pl.cpp $(LIBROCKSDB) Makefile
	mkdir -p $(SWIPL_MODULE_DIR)
	$(CXX) --version
	$(CXX) $(CPPFLAGS) -shared -o $@ cpp/rocksdb4pl.cpp $(LIBROCKSDB) $(PLATFORM_LDFLAGS) $(SWIPL_MODULE_LIB)

install::

check::
	@# TODO: determine which tests to run
	@# $(ROCKSENV) $(MAKE) $(JOBS) -C rocksdb tests

check::
	$(SWIPL) $(PLPATHS) -g test_rocksdb -t halt test/test_rocksdb.pl

distclean: clean
	$(RM) $(SWIPL_MODULE_DIR)/rocksdb4pl.$(SWIPL_MODULE_EXT)

clean:
	$(RM) *~

realclean: distclean
	git -C rocksdb clean -xfd