SHELL=bash
CFLAGS=-std=gnu99 -static -s -Wall -Werror -O3

TEST_PACKAGE_DEPS := build-essential python python-pip procps python-dev python-setuptools

DOCKER_RUN_TEST := docker run -v $(PWD):/mnt:ro

# test installation using Debian packages
DOCKER_DEB_TEST := sh -euxc ' \
	apt-get update \
	&& apt-get install -y --no-install-recommends $(TEST_PACKAGE_DEPS) \
	&& dpkg -i /mnt/dist/*.deb \
	&& tmp=$$(mktemp -d) \
	&& cp -r /mnt/* "$$tmp" \
	&& cd "$$tmp" \
	&& pip install --upgrade pip \
	&& hash -r \
	&& pip --version \
	&& pip install --upgrade setuptools distribute \
	&& pip install -r requirements-dev.txt \
	&& py.test tests/ \
	&& exec dumb-init /mnt/tests/test-zombies \
'

# test installation using `pip install`
DOCKER_PYTHON_TEST := sh -uexc ' \
	apt-get update \
	&& apt-get install -y --no-install-recommends $(TEST_PACKAGE_DEPS) \
	&& tmp=$$(mktemp -d) \
	&& cp -r /mnt/* "$$tmp" \
	&& cd "$$tmp" \
	&& python setup.py clean \
	&& python setup.py sdist \
	&& pip install --upgrade pip \
	&& hash -r \
	&& pip install --upgrade setuptools distribute \
	&& pip install -vv dist/*.tar.gz \
	&& pip install -r requirements-dev.txt \
	&& py.test tests/ \
	&& exec dumb-init /mnt/tests/test-zombies \
'

# test several Python versions using tox
DOCKER_TOX_TEST := sh -uexc ' \
	apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0x5BB92C09DB82666C \
	&& echo "deb http://ppa.launchpad.net/fkrull/deadsnakes/ubuntu xenial main" >> /etc/apt/sources.list \
	&& apt-get update \
	&& apt-get install -y --no-install-recommends python2.6-dev python2.7-dev python3.4-dev python3.5-dev git $(TEST_PACKAGE_DEPS) \
	&& echo "We cannot use the Ubuntu versions of tox or virtualenv:" \
	&& echo "https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=754248" \
	&& pip install tox virtualenv \
	&& hash -r \
	&& tmp=$$(mktemp -du) \
	&& cp -r /mnt "$$tmp" \
	&& cd "$$tmp" \
	&& tox \
'
.PHONY: build
build: VERSION.h
	$(CC) $(CFLAGS) -o dumb-init dumb-init.c

VERSION.h: VERSION
	echo '// THIS FILE IS AUTOMATICALLY GENERATED' > VERSION.h
	echo '// Run `make VERSION.h` to update it after modifying VERSION.' >> VERSION.h
	xxd -i VERSION >> VERSION.h

.PHONY: clean
clean: clean-tox
	rm -rf dumb-init dist/ *.deb

.PHONY: clean-tox
clean-tox:
	rm -rf .tox

.PHONY: release
release: sdist builddeb-docker
	$(eval VERSION := $(shell cat VERSION))
	# extract the built binary from the Debian package
	dpkg-deb --fsys-tarfile dist/dumb-init_$(VERSION)_amd64.deb | \
		tar -C dist --strip=3 -xvf - ./usr/bin/dumb-init
	mv dist/dumb-init dist/dumb-init_$(VERSION)_amd64
	cd dist && \
		sha256sum --binary dumb-init_$(VERSION)_amd64.deb dumb-init_$(VERSION)_amd64 \
		> sha256sums

.PHONY: sdist
sdist: VERSION.h
	python setup.py sdist

.PHONY: builddeb
builddeb:
	debuild --set-envvar=CC=musl-gcc -us -uc -b
	mkdir -p dist
	mv ../dumb-init_*.deb dist/

.PHONY: builddeb-docker
builddeb-docker: docker-image
	mkdir -p dist
	docker run -v $(PWD):/mnt dumb-init-build

.PHONY: docker-image
docker-image:
	docker build -t dumb-init-build .

.PHONY: test
test:
	tox

.PHONY: install-hooks
install-hooks:
	tox -e pre-commit -- install -f --install-hooks

ITEST_TARGETS = itest_lucid itest_precise itest_trusty itest_xenial itest_wheezy itest_jessie itest_stretch

.PHONY: itest $(ITEST_TARGETS)
itest: $(ITEST_TARGETS)

itest_lucid: _itest-ubuntu-lucid
itest_precise: _itest-ubuntu-precise
itest_trusty: _itest-ubuntu-trusty
itest_xenial: _itest-ubuntu-xenial
itest_wheezy: _itest-debian-wheezy
itest_jessie: _itest-debian-jessie
itest_stretch: _itest-debian-stretch

itest_tox:
	$(DOCKER_RUN_TEST) ubuntu:xenial $(DOCKER_TOX_TEST)

_itest-%: _itest_deb-% _itest_python-%
	@true

_itest_python-%:
	$(DOCKER_RUN_TEST) $(shell sed 's/-/:/' <<< "$*") $(DOCKER_PYTHON_TEST)

_itest_deb-%: builddeb-docker
	$(DOCKER_RUN_TEST) $(shell sed 's/-/:/' <<< "$*") $(DOCKER_DEB_TEST)
