Aller au contenu

Makefile⚓︎

Auto-documentation⚓︎

🐣 2022-08

Il y a de très nombreuses façon de le faire (voir plus bas). J’apprécie la version Python qui, même si elle est plus verbeuse, a l’avantage d’être compréhensible avec mes connaissances actuelles.

Makefile
.DEFAULT_GOAL := help

.PHONY: install
install: ## Install the dependencies. (1)
    python -m pip install -r requirements.txt
    playwright install


.PHONY: serve
serve: ## Launch a local server to serve the `public` folder. (2)
    @python3 -m http.server 8000 --bind 127.0.0.1 --directory public


.PHONY: test
test: ## Launch all tests. (3)
    @pytest

.PHONY: help
help:
    @python -c "$$PRINT_HELP_PYSCRIPT" < $(MAKEFILE_LIST)

# (4)
define PRINT_HELP_PYSCRIPT # start of Python section
import re, sys

output = []
# Loop through the lines in this file
for line in sys.stdin:
    # if the line has a command and a comment start with
    #   two pound signs, add it to the output
    match = re.match(r'^([a-zA-Z_-]+):.*?## (.*)$$', line)
    if match:
        target, help = match.groups()
        output.append("\033[36m%-10s\033[0m %s" % (target, help))
# Sort the output in alphanumeric order
output.sort()
# Print the help result
print('\n'.join(output))
endef
export PRINT_HELP_PYSCRIPT # End of python section
  1. On documente les commandes directement dans le Makefile
  2. On documente les commandes directement dans le Makefile
  3. On documente les commandes directement dans le Makefile
  4. Le script Python commence ici et il vient de là-bas.

Une fois les commentaires ajoutés au Makefile, ils deviennent accessibles sous forme d’aide lorsqu’on lance la commande make :

$ make

install    Install the dependencies.
serve      Launch a local server to serve the `public` folder.
test       Launch all tests.

Cette astuce vient de Daniel Feldroy. D’autres articles à ce sujet :

Makefile, Python et venv⚓︎

🐣 2022-11

Il n’est pas toujours évident d’activer l’environnement virtuel Python avant le lancement d’une commande make, surtout pour des néophytes et/ou n’évoluant pas dans cet environnement (haha). Bastian Venthur propose une version qui permet de préfixer chaque commande pour éviter d’avoir à activer le venv :

Makefile
# system python interpreter. used only to create virtual environment
PY = python3
VENV = venv
BIN=$(VENV)/bin

# make it work on windows too
ifeq ($(OS), Windows_NT)
    BIN=$(VENV)/Scripts
    PY=python
endif


all: lint test

$(VENV): requirements.txt requirements-dev.txt setup.py
    $(PY) -m venv $(VENV)
    $(BIN)/pip install --upgrade -r requirements.txt
    $(BIN)/pip install --upgrade -r requirements-dev.txt
    $(BIN)/pip install -e .
    touch $(VENV)

.PHONY: test
test: $(VENV)
    $(BIN)/pytest

.PHONY: lint
lint: $(VENV)
    $(BIN)/flake8

.PHONY: release
release: $(VENV)
    $(BIN)/python setup.py sdist bdist_wheel upload

clean:
    rm -rf $(VENV)
    find . -type f -name *.pyc -delete
    find . -type d -name __pycache__ -delete

On s’assure ici avant chaque lancement de commande que l’environnement virtuel Python est créé et à jour. Puis, on préfixe chaque utilisation des binaires du projet par le chemin du virtualenv dans lequel il est contenu.

Voir aussi cet article de Mathieu Leplatre à ce sujet, dont je retiens d’ailleurs l’excellente idée d’afficher un message d’erreur si Python n’est pas trouvé :

Makefile
1
2
3
4
5
6
7
VENV := venv  # (1)!
PY3 := $(shell command -v python3 2> /dev/null)
PYTHON := $(VENV)/bin/python

$(PYTHON):
    @if [ -z $(PY3) ]; then echo "Python 3 could not be found."; exit 2; fi
    $(PY3) -m venv $(VENV)
  1. Il est tout à fait possible d’adapter le chemin où vous avez l’habitude de stocker vos environnements virtuels.

Aller plus loin/différemment⚓︎


Dernière mise à jour: 2022-11-06