-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
133 lines (107 loc) · 3.33 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
# **************************************************************************** #
# 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
# **************************************************************************** #
# load the project variables
ifneq (,$(wildcard src/app_info.py))
include src/app_info.py
# remove extra quotes
AppName := $(patsubst "%",%,$(AppName))
AppVersion := $(patsubst "%",%,$(AppVersion))
AppPublisher := $(patsubst "%",%,$(AppPublisher))
AppExeName := $(patsubst "%",%,$(AppExeName))
AppIconName := $(patsubst "%",%,$(AppIconName))
AppId := $(patsubst "%",%,$(AppId))
# export them for InnoSetup
export
endif
# **************************************************************************** #
# Development Targets
# run the application
run: venv
$(VENV_PYTHON) src/main.py
# run the application in pdb
debug: venv
$(VENV_PYTHON) -m pdb src/main.py
# run the test suite
test: venv
$(VENV_PYTHON) -m pytest
# **************************************************************************** #
# Build Targets
# build a one folder bundle
bundle: venv
$(VENV_PYINSTALLER) -y bundle.spec
# run the bundled executable
run_bundle:
ifeq ($(OS),Windows_NT)
dist/$(AppName)/$(AppName).exe
else
dist/$(AppName)/$(AppName)
endif
# **************************************************************************** #
# Release Targets
# wrap the bundle into a zip file
zip:
echo > dist/$(AppName)/.portable
$(PYTHON) -m zipfile -c dist/$(AppName)-$(AppVersion)-portable.zip dist/$(AppName)/
ifeq ($(OS),Windows_NT)
del dist\$(AppName)\.portable
else
-@ $(RM) dist/$(AppName)/.portable
endif
# build an installer with InnoSetup
installer:
iscc "installer.iss"
# remove the various build outputs
clean:
-@ $(RM) build
-@ $(RM) dist
# **************************************************************************** #
# python venv settings
VENV_NAME := .venv
ifeq ($(OS),Windows_NT)
VENV_DIR := $(VENV_NAME)
VENV := $(VENV_DIR)\Scripts
PYTHON := python
VENV_PYTHON := $(VENV)\$(PYTHON)
VENV_PYINSTALLER := $(VENV)\pyinstaller
RM := rd /s /q
else
VENV_DIR := $(VENV_NAME)
VENV := $(VENV_DIR)/bin
PYTHON := python3
VENV_PYTHON := $(VENV)/$(PYTHON)
VENV_PYINSTALLER := $(VENV)/pyinstaller
RM := rm -rf
endif
# Add this as a requirement to any make target that relies on the venv
.PHONY: venv
venv: $(VENV_DIR)
# Create the venv if it doesn't exist
$(VENV_DIR):
$(PYTHON) -m venv $(VENV_DIR)
$(VENV_PYTHON) -m pip install --upgrade pip
$(VENV_PYTHON) -m pip install -r requirements.txt
# 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)
# update requirements.txt to match the state of the venv
freeze_reqs: venv
$(VENV_PYTHON) -m pip freeze > requirements.txt
# try to update the venv - expirimental feature, don't rely on it
update_venv: venv
$(VENV_PYTHON) -m pip install --upgrade -r requirements.txt
# deletes the venv
clean_venv:
$(RM) $(VENV_DIR)
# deletes the venv and rebuilds it
reset_venv: clean_venv venv