-
Notifications
You must be signed in to change notification settings - Fork 1
/
Makefile
125 lines (99 loc) · 3.4 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
# **************************************************************************** #
# General Make configuration
# This suppresses make's command echoing. This suppression produces a cleaner output.
# If you need to see the full commands being issued by make, comment this out.
MAKEFLAGS += -s
# **************************************************************************** #
# Development Targets
# run the application
run: venv
$(VENV_PYTHON) src/main.py
# build the application's docker image locally
image:
docker build . -t psylink
# **************************************************************************** #
# stack commands
STACK_NAME := psylink
# create the application's network
network:
docker network create --driver=overlay --attachable psylink
# deploy the application's docker stack
deploy:
docker stack deploy -c stack.yml $(STACK_NAME)
# delete the application's docker stack
undeploy:
docker stack rm $(STACK_NAME)
# delete then deploy the stack
redeploy: undeploy deploy
# check the status of the stack
ps:
docker stack ps $(STACK_NAME) --no-trunc
# **************************************************************************** #
# python venv settings
VENV_NAME := .venv
REQUIREMENTS := requirements.txt
VENV_DIR := $(VENV_NAME)
ifeq ($(OS),Windows_NT)
VENV := $(VENV_DIR)/Scripts
PYTHON := python
else
VENV := $(VENV_DIR)/bin
PYTHON := python3
endif
VENV_CANARY_DIR := $(VENV_DIR)/canary
VENV_CANARY_FILE := $(VENV_CANARY_DIR)/$(REQUIREMENTS)
VENV_TMP_DIR := $(VENV_DIR)/tmp
VENV_TMP_FREEZE := $(VENV_TMP_DIR)/freeze.txt
VENV_PYTHON := $(VENV)/$(PYTHON)
VENV_PYINSTALLER := $(VENV)/pyinstaller
RM := rm -rf
CP := cp
# Add this as a requirement to any make target that relies on the venv
.PHONY: venv
venv: $(VENV_DIR) $(VENV_CANARY_FILE)
# Create the venv if it doesn't exist
$(VENV_DIR):
$(PYTHON) -m venv $(VENV_DIR)
# Update the venv if the canary is out of date
$(VENV_CANARY_FILE): $(REQUIREMENTS)
$(VENV_PYTHON) -m pip install --upgrade pip
$(VENV_PYTHON) -m pip install -r $(REQUIREMENTS)
-$(RM) $(VENV_CANARY_DIR)
-mkdir $(VENV_CANARY_DIR)
-$(CP) $(REQUIREMENTS) $(VENV_CANARY_FILE)
# forcibly update the canary file
canary: $(VENV_CANARY_DIR)
-$(RM) $(VENV_CANARY_DIR)
-mkdir $(VENV_CANARY_DIR)
$(CP) $(REQUIREMENTS) $(VENV_CANARY_FILE)
# update requirements.txt to match the state of the venv
freeze_reqs: venv
$(VENV_PYTHON) -m pip freeze > $(REQUIREMENTS)
# try to update the venv - expirimental feature, don't rely on it
update_venv: venv
$(VENV_PYTHON) -m pip install --upgrade pip
$(VENV_PYTHON) -m pip install --upgrade -r $(REQUIREMENTS)
-$(RM) $(VENV_CANARY_DIR)
-mkdir $(VENV_CANARY_DIR)
-$(CP) $(REQUIREMENTS) $(VENV_CANARY_FILE)
# remove all packages from the venv
clean_venv:
$(RM) $(VENV_CANARY_DIR)
mkdir $(VENV_TMP_DIR)
$(VENV_PYTHON) -m pip freeze > $(VENV_TMP_FREEZE)
$(VENV_PYTHON) -m pip uninstall -y -r $(VENV_TMP_FREEZE)
$(RM) $(VENV_TMP_DIR)
# clean the venv and rebuild it
reset_venv: clean_venv update_venv
# **************************************************************************** #
# expirimental, probably not reliable
# If the first argument is "pip"...
ifeq (pip,$(firstword $(MAKECMDGOALS)))
# use the rest as arguments for "pip"
RUN_ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
# ...and turn them into do-nothing targets
$(eval $(RUN_ARGS):;@:)
endif
# forward pip commands to the venv
pip: venv
$(VENV_PYTHON) -m pip $(RUN_ARGS)