-
Notifications
You must be signed in to change notification settings - Fork 45
/
Makefile
156 lines (130 loc) Β· 5.1 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
PYTHON ?= python
DOCKER_IMAGE ?= pystack
DOCKER_SRC_DIR ?= /src
# Doc generation variables
UPSTREAM_GIT_REMOTE ?= origin
DOCSBUILDDIR := docs/_build
HTMLDIR := $(DOCSBUILDDIR)/html
PIP_INSTALL=$(PYTHON) -m pip install
# Use this to inject arbitrary commands before the make targets (e.g. docker)
ENV :=
.PHONY: build
build: ## (default) Build package extensions in-place
$(PYTHON) setup.py build_ext --inplace
.PHONY: dist
dist: ## Generate Python distribution files
$(PYTHON) -m pep517.build .
.PHONY: install-sdist
install-sdist: dist ## Install from source distribution
$(ENV) $(PIP_INSTALL) $(wildcard dist/*.tar.gz)
.PHONY: test-install
test-install: ## Install with test dependencies
$(ENV) CYTHON_TEST_MACROS=1 $(PIP_INSTALL) -e . -r requirements-test.txt
.PHONY: docker-build
docker-build: ## Build the Docker image
docker build -t $(DOCKER_IMAGE) .
.PHONY: docker-rm
docker-rm: ## Remove the Docker image
docker kill pystack || true
docker rmi $(DOCKER_IMAGE)
.PHONY: docker-shell
docker-shell: docker-build ## Run a shell in the Docker image
## If container exists, run bash in it
@if docker ps -a | grep -q pystack; then \
docker start pystack && docker exec -it pystack /bin/bash; \
fi
## Run the container
@docker run -it --name pystack --rm \
--privileged \
--rm \
-v $(PWD):$(DOCKER_SRC_DIR) \
-w $(DOCKER_SRC_DIR) \
$(DOCKER_IMAGE) \
/bin/bash
.PHONY: check
check: ## Run the test suite
$(PYTHON) -m pytest -vvv --log-cli-level=info -s --color=yes $(PYTEST_ARGS) tests
.PHONY: pycoverage
pycoverage: ## Run the test suite, with Python code coverage
$(PYTHON) -m pytest -vvv --log-cli-level=info -s --color=yes \
--cov=pystack --cov=tests --cov-config=pyproject.toml --cov-report=term \
--cov-append $(PYTEST_ARGS) tests --cov-fail-under=92
$(PYTHON) -m coverage lcov -i -o pycoverage.lcov
genhtml *coverage.lcov --branch-coverage --output-directory pystack-coverage
.PHONY: valgrind
valgrind: ## Run valgrind, with the correct configuration
PYTHONMALLOC=malloc valgrind --suppressions=./valgrind.supp --leak-check=full --show-leak-kinds=definite \
--error-exitcode=1 $(PYTHON) -m pytest tests/integration/test_smoke.py -v
.PHONY: ccoverage
ccoverage: ## Run the test suite, with C++ code coverage
$(MAKE) clean
CFLAGS="$(CFLAGS) -O0 -pg --coverage" $(MAKE) build
$(MAKE) check
gcov -i build/*/src/pystack/_pystack -i -d
lcov --capture --directory . --output-file cppcoverage.lcov
lcov --extract cppcoverage.lcov '*/src/pystack/_pystack/*' --output-file cppcoverage.lcov
genhtml *coverage.lcov --branch-coverage --output-directory pystack-coverage
.PHONY: format
format: ## Autoformat all files
$(PYTHON) -m pre_commit run --all-files
.PHONY: lint
lint: ## Lint all files
$(PYTHON) -m pre_commit run --all-files
$(PYTHON) -m mypy src/pystack --strict --ignore-missing-imports
$(PYTHON) -m mypy tests --ignore-missing-imports
.PHONY: docs
docs: ## Generate documentation
$(MAKE) -C docs clean
$(MAKE) -C docs html
.PHONY: docs-live
docs-live: ## Serve documentation on localhost:8000, with live-reload
$(MAKE) -C docs clean
$(MAKE) -C docs livehtml
.PHONY: gh-pages
gh-pages: ## Publish documentation on GitHub Pages
$(eval GIT_REMOTE := $(shell git remote get-url $(UPSTREAM_GIT_REMOTE)))
$(eval COMMIT_HASH := $(shell git rev-parse HEAD))
touch $(HTMLDIR)/.nojekyll
@echo -n "Documentation ready, push to $(GIT_REMOTE)? [Y/n] " && read ans && [ $${ans:-Y} == Y ]
git init $(HTMLDIR)
GIT_DIR=$(HTMLDIR)/.git GIT_WORK_TREE=$(HTMLDIR) git add -A
GIT_DIR=$(HTMLDIR)/.git git commit -m "Documentation for commit $(COMMIT_HASH)"
GIT_DIR=$(HTMLDIR)/.git git push $(GIT_REMOTE) HEAD:gh-pages --force
rm -rf $(HTMLDIR)/.git
.PHONY: clean
clean: ## Clean any built/generated artifacts
find . | grep -E '(\.o|\.gcda|\.gcno|\.gcov\.json\.gz)' | xargs rm -rf
find . | grep -E '(__pycache__|\.pyc|\.pyo)' | xargs rm -rf
rm -rf build
rm -f src/pystack/_pystack.*.so
rm -f {cpp,py}coverage.lcov
rm -rf pystack-coverage
.PHONY: check_release_env
check_release_env:
ifndef RELEASE
$(error RELEASE is undefined. Please set it to either ["major", "minor", "patch"])
endif
.PHONY: bump_version
bump_version: check_release_env
bump2version $(RELEASE)
$(eval NEW_VERSION := $(shell bump2version \
--allow-dirty \
--dry-run \
--list $(RELEASE) \
| tail -1 \
| sed s,"^.*=",,))
git commit --amend --no-edit
.PHONY: gen_news
gen_news: check_release_env
$(eval CURRENT_VERSION := $(shell bump2version \
--allow-dirty \
--dry-run \
--list $(RELEASE) \
| grep current_version \
| sed s,"^.*=",,))
$(PYEXEC) towncrier build --version $(CURRENT_VERSION) --name pystack
.PHONY: release
release: check_release_env bump_version gen_news ## Prepare release
.PHONY: help
help: ## Print this message
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'