# This Makefile has been placed under the public domain

-include build-system/config.mk

# Default target, must be at the top.
# Should be changed with care to not break (Debian) packaging.
all: build

git-archive-all = ./build-system/taler-build-scripts/archive-with-submodules/git_archive_all.py
git_tag=$(shell git describe --tags)
gradle_version=$(shell ./gradlew -q libeufinVersion)

define versions_check =
  if test $(git_tag) != $(gradle_version); \
    then echo WARNING: Project version from Gradle: $(gradle_version) differs from current Git tag: $(git_tag); fi
endef

# Absolute DESTDIR or empty string if DESTDIR unset/empty
abs_destdir=$(abspath $(DESTDIR))

share_dir=$(abs_destdir)$(prefix)/share
man_dir=$(share_dir)/man
bin_dir=$(abs_destdir)$(prefix)/bin
lib_dir=$(abs_destdir)$(prefix)/lib


# While the gradle command sounds like it's installing something,
# it's like a destdir install that only touches the source tree.
.PHONY: build
build:
	./gradlew libeufin-bank:installShadowDist libeufin-nexus:installShadowDist libeufin-ebisync:installShadowDist


.PHONY: dist
dist:
	$(call versions_check)
	mkdir -p build/distributions
	$(git-archive-all) --include ./configure build/distributions/libeufin-$(gradle_version)-sources.tar.gz

.PHONY: deb
deb:
	dpkg-buildpackage -rfakeroot -b -uc -us

.PHONY: install-nobuild-files
install-nobuild-files:
	install -m 644 -D -t $(share_dir)/libeufin/config.d contrib/currencies.conf 
	install -m 644 -D -t $(share_dir)/libeufin/config.d contrib/bank.conf
	install -m 644 -D -t $(share_dir)/libeufin/config.d contrib/nexus.conf
	install -m 644 -D -t $(share_dir)/libeufin/sql database-versioning/versioning.sql 
	install -m 644 -D -t $(share_dir)/libeufin/sql database-versioning/libeufin-bank*.sql
	install -m 644 -D -t $(share_dir)/libeufin/sql database-versioning/libeufin-nexus*.sql
	install -m 644 -D -t $(share_dir)/libeufin/sql database-versioning/libeufin-conversion*.sql
	install -m 644 -D -t $(share_dir)/libeufin-ebisync/config.d libeufin-ebisync/ebisync.conf
	install -m 644 -D -t $(share_dir)/libeufin-ebisync/sql database-versioning/versioning.sql
	install -m 644 -D -t $(share_dir)/libeufin-ebisync/sql database-versioning/libeufin-ebisync*.sql
	install -D -t $(bin_dir) contrib/libeufin-dbconfig
	install -D -t $(bin_dir) contrib/libeufin-ebisync-dbconfig
	install -D -t $(bin_dir) contrib/libeufin-tan-*.sh
	install -d $(share_dir)/libeufin/spa
	cp contrib/wallet-core/bank/* $(share_dir)/libeufin/spa/
	install -d $(share_dir)/libeufin-ebisync/spa
	cp libeufin-ebisync/src/spa/* $(share_dir)/libeufin-ebisync/spa/
	
.PHONY: install
install: build install-nobuild-files
# Install libeufin-bank
	install -D -t $(bin_dir) libeufin-bank/build/install/libeufin-bank-shadow/bin/libeufin-bank
	install -m 644 -D -t $(man_dir)/man1 doc/prebuilt/man/libeufin-bank.1
	install -m 644 -D -t $(man_dir)/man5 doc/prebuilt/man/libeufin-bank.conf.5
	install -m 644 -D -t $(lib_dir) libeufin-bank/build/install/libeufin-bank-shadow/lib/libeufin-bank-all.jar
# Install libeufin-nexus
	install -D -t $(bin_dir) libeufin-nexus/build/install/libeufin-nexus-shadow/bin/libeufin-nexus
	install -m 644 -D -t $(man_dir)/man1 doc/prebuilt/man/libeufin-nexus.1
	install -m 644 -D -t $(man_dir)/man5 doc/prebuilt/man/libeufin-nexus.conf.5
	install -m 644 -D -t $(lib_dir) libeufin-nexus/build/install/libeufin-nexus-shadow/lib/libeufin-nexus-all.jar
# Install libeufin-ebisync
	install -D -t $(bin_dir) libeufin-ebisync/build/install/libeufin-ebisync-shadow/bin/libeufin-ebisync
	install -m 644 -D -t $(lib_dir) libeufin-ebisync/build/install/libeufin-ebisync-shadow/lib/libeufin-ebisync-all.jar

.PHONY: assemble
assemble:
	./gradlew assemble

.PHONY: check
check: install-nobuild-files
	./gradlew check

.PHONY: bank-test
bank-test: install-nobuild-files
	./gradlew :libeufin-bank:test --tests $(test) -i

.PHONY: nexus-test
nexus-test: install-nobuild-files
	./gradlew :libeufin-nexus:test --tests $(test) -i

.PHONY: common-test
common-test: install-nobuild-files
	./gradlew :libeufin-common:test --tests $(test) -i

.PHONY: ebics-test
ebics-test: install-nobuild-files
	./gradlew :libeufin-ebics:test --tests $(test) -i

.PHONY: testbench-test
testbench-test: install-nobuild-files
	./gradlew :testbench:test --tests $(test) -i

.PHONY: ebisync-test
ebisync-test: install-nobuild-files
	./gradlew :libeufin-ebisync:test --tests $(test) -i

.PHONY: nexus-testbench
nexus-testbench: install-nobuild-files
	./gradlew :testbench:install && \
	cd testbench && \
	./build/install/libeufin-testbench-test/bin/libeufin-testbench-test nexus $(platform)

.PHONY: ebisync-testbench
ebisync-testbench: install-nobuild-files
	./gradlew :testbench:install && \
	cd testbench && \
	./build/install/libeufin-testbench-test/bin/libeufin-testbench-test ebisync $(platform)

.PHONY: doc
doc:
	./gradlew :dokkaGeneratePublicationHtml
	echo "Open build/dokka/html/index.html"

.PHONY: ci
ci:
	contrib/ci/run-all-jobs.sh

.PHONY: bank-bench-db
bank-bench-db: install-nobuild-files
	./gradlew cleanTest :libeufin-bank:test --tests Bench.benchDb -i --no-build-cache

.PHONY: nexus-bench-db
nexus-bench-db: install-nobuild-files
	./gradlew cleanTest :libeufin-nexus:test --tests Bench.benchDb -i --no-build-cache

