# Copyright Erlware, LLC. All Rights Reserved.
#
# This file is provided to you under the BSD License; you may not use
# this file except in compliance with the License.  You may obtain a
# copy of the License.

ERLFLAGS= -pa $(CURDIR)/.eunit -pa $(CURDIR)/ebin -pa $(CURDIR)/deps/*/ebin

DEPS_PLT=$(CURDIR)/.deps_plt

# =============================================================================
# Verify that the programs we need to run are installed on this system
# =============================================================================
ERL = $(shell which erl)

ifeq ($(ERL),)
$(error "Erlang not available on this system")
endif

REBAR=$(shell which rebar3)

ifeq ($(REBAR),)
$(error "Rebar not available on this system")
endif

.PHONY: all compile doc clean test dialyzer typer shell distclean pdf \
	get-deps escript clean-common-test-data rebuild

all: compile dialyzer test

# =============================================================================
# Rules to build the system
# =============================================================================

get-deps:
	$(REBAR) get-deps
	$(REBAR) compile

compile:
	$(REBAR) compile

doc docs:
	$(REBAR) ex_doc

eunit: compile clean-common-test-data
	$(REBAR) eunit

ct: compile clean-common-test-data
	$(REBAR) ct

test: compile eunit

cover:
	rebar3 cover --verbose

$(DEPS_PLT):
	@echo Building local plt at $(DEPS_PLT)
	@echo
	dialyzer --output_plt $(DEPS_PLT) --build_plt \
    --apps erts kernel stdlib compiler crypto syntax_tools parsetools

dialyzer: $(DEPS_PLT)
	$(REBAR) $@

typer:
	typer --plt $(DEPS_PLT) -I include -r ./src

shell: get-deps compile
# You often want *rebuilt* rebar tests to be available to the
# shell you have to call eunit (to get the tests
# rebuilt). However, eunit runs the tests, which probably
# fails (that's probably why You want them in the shell). This
# runs eunit but tells make to ignore the result.
	- @$(REBAR) eunit
	@$(ERL) $(ERLFLAGS)

pdf:
	pandoc README.md -o README.pdf

clean-common-test-data:
# We have to do this because of the unique way we generate test
# data. Without this rebar eunit gets very confused
	@rm -rf $(CURDIR)/test/*_SUITE_data

clean: clean-common-test-data
	- rm -rf $(CURDIR)/test/*.beam
	- rm -rf $(CURDIR)/{.eunit,_build,logs}
	- rm -fr TEST-*
	$(REBAR) clean

distclean: clean
	- rm -rf $(DEPS_PLT)
	- rm -rvf $(CURDIR)/deps/*

rebuild: distclean get-deps compile dialyzer test
