-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathMakefile
209 lines (165 loc) · 6.79 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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
# Autodocumented Makefile
# see: https://marmelab.com/blog/2016/02/29/auto-documented-makefile.html
#
# Dependencies : python3 venv internal module
# Recall: .PHONY defines special targets not associated with files
#
# Some Makefile global variables can be set in make command line:
# PANDORA_VENV: Change directory of installed venv (default local "venv" dir)
#
############### GLOBAL VARIABLES ######################
.DEFAULT_GOAL := help
# Set shell to BASH
SHELL := /bin/bash
# Set Virtualenv directory name
# Example: PANDORA_VENV="other-venv/" make install
ifndef PANDORA_VENV
PANDORA_VENV = "venv"
endif
# Check CMAKE variable before venv creation (only for install target)
CHECK_CMAKE = $(shell command -v cmake 2> /dev/null)
# Check Docker variable (only for docker target)
CHECK_DOCKER = $(shell docker -v)
# Check python3 globally
PYTHON=$(shell command -v python3)
ifeq (, $(PYTHON))
$(error "PYTHON=$(PYTHON) not found in $(PATH)")
endif
# Check Python version supported globally
PYTHON_VERSION_MIN = 3.8
PYTHON_VERSION_CUR=$(shell $(PYTHON) -c 'import sys; print("%d.%d"% sys.version_info[0:2])')
PYTHON_VERSION_OK=$(shell $(PYTHON) -c 'import sys; cur_ver = sys.version_info[0:2]; min_ver = tuple(map(int, "$(PYTHON_VERSION_MIN)".split("."))); print(int(cur_ver >= min_ver))')
ifeq ($(PYTHON_VERSION_OK), 0)
$(error "Requires python version >= $(PYTHON_VERSION_MIN). Current version is $(PYTHON_VERSION_CUR)")
endif
################ MAKE targets by sections ######################
.PHONY: help
help: ## this help
@echo " PANDORA MAKE HELP"
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'| sort
## Install section
.PHONY: check
check: ## check if cmake is installed
@[ "${CHECK_CMAKE}" ] || ( echo ">> cmake not found"; exit 1 )
.PHONY: venv
venv: check ## create virtualenv in PANDORA_VENV directory if not exists
@test -d ${PANDORA_VENV} || python3 -m venv ${PANDORA_VENV}
@${PANDORA_VENV}/bin/python -m pip install --upgrade pip setuptools wheel # no check to upgrade each time
@touch ${PANDORA_VENV}/bin/activate
.PHONY: install
install: venv ## install pandora (pip editable mode) without plugins
@test -f ${PANDORA_VENV}/bin/pandora || ${PANDORA_VENV}/bin/pip install -e .[dev,docs,notebook]
@test -f .git/hooks/pre-commit || echo " Install pre-commit hook"
@test -f .git/hooks/pre-commit || ${PANDORA_VENV}/bin/pre-commit install
@echo "PANDORA installed in dev mode in virtualenv ${PANDORA_VENV}"
@echo "PANDORA venv usage : source ${PANDORA_VENV}/bin/activate; pandora -h"
## Test section
.PHONY: test
test: install ## run all tests (except notebooks) + coverage (source venv before)
@${PANDORA_VENV}/bin/pytest -m "not notebook_tests" --junitxml=pytest-report.xml --cov-config=.coveragerc --cov-report xml --cov
.PHONY: test-notebook
test-notebook: install ## run notebook tests only
@${PANDORA_VENV}/bin/pytest -m "notebook_pandora"
## Code quality, linting section
### Format with black
.PHONY: format
format: install format/black ## run black formatting (depends install)
.PHONY: format/black
format/black: install ## run black formatting (depends install) (source venv before)
@echo "+ $@"
@${PANDORA_VENV}/bin/black pandora tests ./*.py notebooks/snippets/*.py
### Check code quality and linting : black, mypy, pylint
.PHONY: lint
lint: install lint/black lint/mypy lint/pylint ## check code quality and linting (source venv before)
.PHONY: lint/black
lint/black: ## check global style with black
@echo "+ $@"
@${PANDORA_VENV}/bin/black --check pandora tests ./*.py notebooks/snippets/*.py
.PHONY: lint/mypy
lint/mypy: ## check linting with mypy
@echo "+ $@"
@${PANDORA_VENV}/bin/mypy pandora tests
.PHONY: lint/pylint
lint/pylint: ## check linting with pylint
@echo "+ $@"
@set -o pipefail; ${PANDORA_VENV}/bin/pylint pandora tests --rcfile=.pylintrc --output-format=parseable --msg-template="{path}:{line}: [{msg_id}({symbol}), {obj}] {msg}" # | tee pylint-report.txt # pipefail to propagate pylint exit code in bash
## Documentation section
.PHONY: docs
docs: install ## build sphinx documentation (source venv before)
@${PANDORA_VENV}/bin/sphinx-build -M clean docs/source/ docs/build
@${PANDORA_VENV}/bin/sphinx-build -M html docs/source/ docs/build -W --keep-going
## Notebook section
.PHONY: notebook
notebook: install ## install Jupyter notebook kernel with venv and pandora install (source venv before)
@echo "Install Jupyter Kernel in virtualenv dir"
@${PANDORA_VENV}/bin/python -m ipykernel install --sys-prefix --name=pandora-dev --display-name=pandora-dev
@echo "Use jupyter kernelspec list to know where is the kernel"
@echo " --> After PANDORA virtualenv activation, please use following command to launch local jupyter notebook to open PANDORA Notebooks:"
@echo "jupyter notebook"
## Docker section
.PHONY: docker
docker: ## Check and build docker image (cnes/pandora)
@@[ "${CHECK_DOCKER}" ] || ( echo ">> docker not found"; exit 1 )
@echo "Check Dockerfiles with hadolint"
@docker pull hadolint/hadolint
@docker run --rm -i hadolint/hadolint < Dockerfile
@echo "Build Docker main image PANDORA "
@docker build -t cnes/pandora:dev . -f Dockerfile
## Clean section
.PHONY: clean-notebook-output ## Clean Jupyter notebooks outputs
clean-notebook-output:
@echo "Clean Jupyter notebooks"
jupyter nbconvert --ClearOutputPreprocessor.enabled=True --inplace notebooks/*.ipynb notebooks/advanced_examples/*.ipynb
.PHONY: clean
clean: clean-venv clean-build clean-precommit clean-pyc clean-test clean-doc clean-notebook clean-mypy ## remove all build, test, coverage and Python artifacts
.PHONY: clean-venv
clean-venv:
@echo "+ $@"
@rm -rf ${PANDORA_VENV}
.PHONY: clean-build
clean-build:
@echo "+ $@"
@rm -fr build/
@rm -fr .eggs/
@find . -name '*.egg-info' -exec rm -fr {} +
@find . -name '*.egg' -exec rm -f {} +
.PHONY: clean-precommit
clean-precommit:
@rm -f .git/hooks/pre-commit
@rm -f .git/hooks/pre-push
.PHONY: clean-pyc
clean-pyc:
@echo "+ $@"
@find . -type f -name "*.py[co]" -exec rm -fr {} +
@find . -type d -name "__pycache__" -exec rm -fr {} +
@find . -name '*~' -exec rm -fr {} +
.PHONY: clean-test
clean-test:
@echo "+ $@"
@rm -fr .tox/
@rm -f .coverage
@rm -rf .coverage.*
@rm -rf coverage.xml
@rm -fr htmlcov/
@rm -fr .pytest_cache
@rm -f pytest-report.xml
@rm -f pylint-report.txt
@rm -f debug.log
.PHONY: clean-doc
clean-doc:
@echo "+ $@"
@rm -rf docs/build/
@rm -rf docs/source/api_reference/
.PHONY: clean-notebook
clean-notebook:
@echo "+ $@"
@find . -type d -name ".ipynb_checkpoints" -exec rm -fr {} +
.PHONY: clean-mypy
clean-mypy:
@echo "+ $@"
@rm -rf .mypy_cache/
.PHONY: clean-docker
clean-docker: ## clean docker image
@@[ "${CHECK_DOCKER}" ] || ( echo ">> docker not found"; exit 1 )
@echo "Clean Docker image cnes/pandora dev"
@docker image rm cnes/pandora:dev