Newer
Older
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
.PHONY: env mamba mamba-check tests build install docs motd
export PROJECT_NAME = $(shell awk -F' = ' '/^name = / {print $$2}' pyproject.toml | tr -d '"')
export PROJECT_VERSION = $(shell awk -F' = ' '/^version = / {print $$2}' pyproject.toml | tr -d '"')
export PROJECT_DESCRIPTION = $(shell awk -F' = ' '/^description = / {print $$2}' pyproject.toml | tr -d '"')
export ENVNAME ?= $(shell echo $(PROJECT_NAME) | tr ' ' '-' | tr '[:upper:]' '[:lower:]')
export ENVFILE ?= environment.yml
export ENVACTIVATE = . $$(conda info --base)/etc/profile.d/conda.sh ; conda activate ; conda activate $(ENVNAME)
export MODULE ?= $(shell echo $(PROJECT_NAME) | tr ' ' '-' | tr '[:upper:]' '[:lower:]' | tr '-' '_')
export MODULEPATH ?= ./src
export LINT ?= $(MODULEPATH) tests
export PYTHONPYCACHEPREFIX ?= var/cache
export MOTD_FILE ?= share/motd
usage: motd
@echo "[Usage] make [all|...|env|build|tests|install|docs|pages|lint|format|clean]"
motd:
ifneq ($(MOTD),0)
@if [[ -s "$(MOTD_FILE)" && ! -z "$$(which envsubst)" ]]; then echo "$$(env | envsubst < $(MOTD_FILE))"; fi
endif
all: motd env tests docs build install
# Create a Conda environment from environment.yml
env: motd
@$(MAKE) .virtualenv
.virtualenv: $(ENVFILE)
@$(MAKE) mamba-check
@if mamba env list | grep -q $(ENVNAME); then \
echo "Updating existing environment \`$(ENVNAME)\`"; \
mamba env update -n $(ENVNAME) -f $(ENVFILE); \
else \
echo "Creating new environment \`$(ENVNAME)\`"; \
mamba env create -n $(ENVNAME) -f $(ENVFILE); \
fi
@ENVPATH=$$(conda info --envs | grep -E "^$(ENVNAME)" | awk '{print $$NF}'); \
ln -sf $$ENVPATH/lib/libgsl.dylib $$ENVPATH/lib/libgsl.25.dylib
@touch .virtualenv
# Install Mamba using Conda
mamba: motd
@echo "Installing Mamba..."
@. $$HOME/.bashrc && conda install mamba -n base -c conda-forge --yes
@echo "Mamba installation complete."
mamba-check:
@command -v mamba >/dev/null 2>&1 || { echo "Error: mamba is not installed. Please install mamba to use this command."; exit 1; }
# Run tests
tests: motd
@MOTD=0 $(MAKE) -s env
@$(ENVACTIVATE); python -m unittest discover
# Build the project documentation
pages: docs
@cd var/build/public/docs; ln -sf $$(git describe --tags 2> /dev/null || git rev-parse --short HEAD) latest
@cp var/build/index.html var/build/public/docs/
@find var/build/public/docs -mindepth 1 -maxdepth 1 -type d | rev | cut -d'/' -f 1 | rev | sort > var/build/public/docs/metadata.txt
@rsync -a --delete ./var/build/public/ var/www 2> /dev/null || true
@if [ -f "public/latest/index.html" ]; then open public/latest/index.html; fi
docs: motd
@MOTD=0 $(MAKE) -s env
@mkdir -p var/build/public/docs var/www/docs && ln -sf var/www/docs ./public
@$(ENVACTIVATE); cd var/build; if [ ! -f "Makefile" ]; then cmake ../../share/doxygen; fi
@$(ENVACTIVATE); doxygen -u var/build/Doxyfile && doxygen var/build/Doxyfile;
# Python related commands
build: motd
@MOTD=0 $(MAKE) -s env
@mkdir -p var/cache/modules && ln -sf ./var/cache/modules/ ./lib
@$(ENVACTIVATE); SITEPACKAGE="var/cache/modules/python-$$(python --version | awk '{print $$2}' | cut -d '.' -f 1,2)/site-packages"; \
python -m build --outdir ./$$SITEPACKAGE ; \
[ $$? -eq 0 ] && echo "Distributed package is now available in \`./$$SITEPACKAGE\`" || exit1
install: motd
@MOTD=0 $(MAKE) -s env
@$(ENVACTIVATE); SITEPACKAGE="lib/python-$$(python --version | awk '{print $$2}' | cut -d '.' -f 1,2)/site-packages";\
pip install $$SITEPACKAGE/$(MODULE)-$(PROJECT_VERSION).tar.gz; \
echo "Enable this environment using \`conda activate $(ENVNAME)\`"
lint: motd
@MOTD=0 $(MAKE) -s env
@$(ENVACTIVATE); flake8 $(LINT)
format: motd
@MOTD=0 $(MAKE) -s env
@$(ENVACTIVATE); read -p "Make sure to commit your code first; Do you want to modify your code using black? (yes/no): " response; \
if [ "$$response" = "yes" ]; then \
black $(LINT)
else \
echo "Exiting..."; \
exit 1; \
fi
# Docker commands
image:
@docker build -t $(ENVNAME) .
@docker run -it --rm $(ENVNAME) /bin/bash
container:
@CONTAINER_NAME=$$(basename $(PWD)-client) \
docker compose up client -d
@CONTAINER_ID=$$(docker ps -aqf name=^$$(basename ${PWD})-client$$) && \
if [ -n "$$CONTAINER_ID" ]; then docker exec -it $$CONTAINER_ID /bin/bash; else echo "No container found"; fi
@CONTAINER_NAME=$$(basename $(PWD)-client) \
docker compose down client
# Clean up build artifacts
clean: motd
@echo "Cleaning temporary files"
@$(RM) -rf var/cache/* var/log/* var/build var/www var/cache/*
@$(RM) -rf lib public
distclean: clean
@echo "Removing environment \`$(ENVNAME)\`"
@$(RM) -rf .virtualenv
@mamba env remove -n $(ENVNAME)