# Copyright 2013 Canonical Ltd.  This software is licensed under the
# GNU Affero General Public License version 3 (see the file LICENSE).

PYTHON := python

define virtualenv
virtualenv --python=$(PYTHON) --quiet
endef

define apt-get
sudo DEBIAN_FRONTEND=noninteractive \
    apt-get --assume-yes --no-install-recommends
endef

# ---

all: build lint doc

build: bin/maas-test

dist: bin/python setup.py
	bin/python setup.py --quiet egg_info -r sdist

test: setup.py bin/tox tox.ini
	@bin/tox

clean:
	$(RM) -r bin build dist include lib local TAGS tags
	find . -name '*.py[co]' -print0 | xargs -r0 $(RM) -r
	find . -name '__pycache__' -print0 | xargs -r0 $(RM) -r
	find . -name '*.egg' -print0 | xargs -r0 $(RM) -r
	find . -name '*.egg-info' -print0 | xargs -r0 $(RM) -r
	find . -name '*~' -print0 | xargs -r0 $(RM)
	$(RM) -r .tox .deps

lint: bin/flake8
	@bin/flake8 maastest

install-dependencies: packages.txt
	@xargs --verbose --no-run-if-empty $(apt-get) install < packages.txt

update-requirements: requirements.txt.new
	mv $< requirements.txt

# Generate manpage in man/
man: $(patsubst docs/man/%.rst,man/%,$(wildcard docs/man/*.rst))

man/%: bin/rst2man.py docs/man/%.rst
	bin/rst2man.py docs/man/$*.rst $@

# Generate documentation.
doc: man

# ---

bin/maas-test: bin/python setup.py
	bin/python setup.py --quiet develop

# Generated executables.
define executables
  bin/flake8
  bin/pyflakes
  bin/pep8
  bin/rst2man.py
  bin/tox
endef

$(strip $(executables)): bin/python requirements.txt
	bin/python -m pip install --quiet --ignore-installed -r requirements.txt

bin/python:
	$(virtualenv) --system-site-packages $(PWD)

requirements.txt.new: requirements.txt
	$(virtualenv) --no-site-packages .deps
	.deps/bin/python -m pip install --quiet \
	    --ignore-installed -r requirements.txt
	.deps/bin/python -m pip freeze --local | \
	    egrep -v ^virtualenv= > $@
	@$(RM) -r .deps
	@diff -u $< $@ || true

# ---

define phony
  all
  build
  clean
  dist
  doc
  install-dependencies
  lint
  man
  test
  update-requirements
endef

.PHONY: $(strip $(phony))
