Last active
December 19, 2020 16:57
-
-
Save bdatko/a490f7fb93268bd9bd55db9f0a2a784a to your computer and use it in GitHub Desktop.
conda gnu make
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
SHELL=/bin/bash | |
.DEFAULT_GOAL:=help | |
env_name:=name_of_conda_env | |
conda:=conda | |
fixtures:=tests/fixtures/ | |
pytestflags:= | |
conda_root:=/Path/to/conda | |
conda_activate:=$(conda_root)/bin/activate | |
activate_env:=source $(conda_activate) $(env_name) | |
.PHONY: all | |
## Make the project | |
all: .cenv | |
## Create the conda environment from the `environment.yml` you have to activate afterwards | |
.cenv: environment.yml | |
$(conda) env create --quiet --force --file environment.yml; \ | |
touch .cenv | |
@echo to activate: conda activate $(env_name) | |
## Example target | |
dummy.txt: script.py data.csv | |
$(activate_env) && python $< $@ | |
.PHONY: test | |
## Run pytest. Flags example: `make test pytestflags:="--cov --cov-report term-missing"` | |
test: $(fixtures) | |
$(activate_env) && pytest $(pytestflags) | |
.PHONY: clean | |
## Clean the project | |
clean: | |
@echo cleaning project | |
.PHONY: realclean | |
## Remove unused conda packages then remove the environment | |
realclean: | |
$(conda) clean -a | |
$(conda) env remove --name $(env_name) | |
rm -f .cenv | |
# Adopted from https://gist.github.com/klmr/575726c7e05d8780505a | |
# Inspired by <http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html> | |
# sed script explained: | |
# /^##/: | |
# * save line in hold space | |
# * purge line | |
# * Loop: | |
# * append newline + line to hold space | |
# * go to next line | |
# * if line starts with doc comment, strip comment character off and loop | |
# * remove target prerequisites | |
# * append hold space (+ newline) to line | |
# * replace newline plus comments by `---` | |
# * print line | |
# Separate expressions are necessary because labels cannot be delimited by | |
# semicolon; see <http://stackoverflow.com/a/11799865/1968> | |
.PHONY: show-help | |
show-help: | |
@echo "$$(tput bold)Available rules:$$(tput sgr0)" | |
@echo | |
@sed -n -e "/^## / { \ | |
h; \ | |
s/.*//; \ | |
:doc" \ | |
-e "H; \ | |
n; \ | |
s/^## //; \ | |
t doc" \ | |
-e "s/:.*//; \ | |
G; \ | |
s/\\n## /---/; \ | |
s/\\n/ /g; \ | |
p; \ | |
}" ${MAKEFILE_LIST} \ | |
| LC_ALL='C' sort --ignore-case \ | |
| awk -F '---' \ | |
-v ncol=$$(tput cols) \ | |
-v indent=19 \ | |
-v col_on="$$(tput setaf 6)" \ | |
-v col_off="$$(tput sgr0)" \ | |
'{ \ | |
printf "%s%*s%s ", col_on, -indent, $$1, col_off; \ | |
n = split($$2, words, " "); \ | |
line_length = ncol - indent; \ | |
for (i = 1; i <= n; i++) { \ | |
line_length -= length(words[i]) + 1; \ | |
if (line_length <= 0) { \ | |
line_length = ncol - indent - length(words[i]) - 1; \ | |
printf "\n%*s ", -indent, " "; \ | |
} \ | |
printf "%s ", words[i]; \ | |
} \ | |
printf "\n"; \ | |
}' \ | |
| more $(shell test $(shell uname) == Darwin && echo '--no-init --raw-control-chars') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment