-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
164 lines (128 loc) · 5.26 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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
###################################################################################################
#
# - For a production build that will run on this host, use `cargo build --release`.
# - To run a local API server and a UI development server, use `make serve-local-release` elsewhere,
# update the Vite configuration file with your host IP, and run `make vite`.
# - To make a production bundle of the web site and API server meant for a VCS running OpenSUSE,
# use `make bundle` to build in container using `docker` and `compose`.
#
# See README.md for more information, configuration, and options.
#
###################################################################################################
.PHONY: vite serve-local serve-local-release
.PHONY: build bundle deploy
.PHONY: up down node_modules npm-update
.PHONY: clean-web clean-node clean-all-web clean-volumes clean-all
PACKAGE_NAME ?= converter
RANDOM_DBF ?= data/RANDOM.DBF
export RUST_LOG ?= info,axum=debug,$(PACKAGE_NAME)=debug
export RUST_LOG_STYLE ?= always
CARGO_RUN_ARGS ?=
CONTAINER_DIR = dtarget
WEB_DIR = web
BUNDLE_FILE = bundle.tar
DEBUG_BUILD_DIR = $(CONTAINER_DIR)/debug
RELEASE_BUILD_DIR = $(CONTAINER_DIR)/release
API_SERVER_PATH = $(RELEASE_BUILD_DIR)/$(PACKAGE_NAME)
WEB_APP_DIR = $(WEB_DIR)/converter-app
NODE_MODULES_DIR ?= $(WEB_APP_DIR)/node_modules
WEB_DIST_DIR = $(WEB_APP_DIR)/dist
DATAFILES := $(wildcard data/*.txt)
UID := $(shell id -u)
GID := $(shell id -g)
COMPOSE_FILES ?= docker-compose.yaml
COMPOSE_ARGS ?=
# Command definition used to run `docker compose`.
COMPOSE = SERVICE_UID=$(UID) SERVICE_GID=$(GID) \
docker compose $(COMPOSE_ARGS) $(addprefix -f ,$(COMPOSE_FILES))
# Command definition to run Vite commands in a container.
VITE = $(COMPOSE) run --service-ports --rm vite
API_SERVER_SRCS = $(shell find src/ -path '*.rs' -type f -print) \
Cargo.toml Cargo.lock
WEB_SRC = $(shell find $(WEB_DIR)/ \
-path $(WEB_DIST_DIR) -prune \
-o -path $(NODE_MODULES_DIR) -prune \
-o -type f -print)
# `make data/RANDOM.DBF` generates a personnel database of random data.
# `make serve-local` and `make serve-local-release` run the API server
# using that random data, creating it if needed.
$(RANDOM_DBF): $(API_SERVER_SRCS) $(wildcard data/*.txt)
cargo run $(CARGO_RUN_ARGS) gen_db $@
serve-local-release: CARGO_RUN_ARGS += --release
serve-local-release serve-local: $(RANDOM_DBF)
cargo run $(CARGO_RUN_ARGS) serve $(RANDOM_DBF) 8080
# Build a release version of the application in a container,
# using the same glibc as on the production server.
build: $(API_SERVER_PATH) $(WEB_DIST_DIR)
$(API_SERVER_PATH): $(API_SERVER_SRCS) Dockerfile docker-compose.yaml | $(RELEASE_BUILD_DIR) $(DEBUG_BUILD_DIR)
$(COMPOSE) run --rm api-server cargo build --release
# Create a tar file meant to be copied to the production server.
bundle: $(BUNDLE_FILE)
$(BUNDLE_FILE): $(WEB_DIST_DIR) $(API_SERVER_PATH) $(wildcard data/*.txt)
tar -cf $@ \
--verbose --show-transformed-names \
--transform 's,^$(WEB_DIST_DIR)/,web/,' \
--transform 's,^$(API_SERVER_PATH),new,' \
$(WEB_DIST_DIR) \
$(API_SERVER_PATH) \
$(wildcard data/*.txt)
# Copy the production bundle to the production server and run a deploy script.
deploy: $(BUNDLE_FILE)
scp $(BUNDLE_FILE) igra:bundle.tar
ssh igra deploy.sh
# Windows versions of the above, using `cross` and `zip`.
.PHONY: build-win32 build-win64 bundle-win32 bundle-win64
WIN64_TARGET = target/x86_64-pc-windows-gnu/release/converter.exe
WIN32_TARGET = target/i686-pc-windows-gnu/release/converter.exe
WIN64_BUNDLE ?= bundle-win64.zip
WIN32_BUNDLE ?= bundle-win32.zip
define zip-win-bundle =
rm -r bundle/windows/
mkdir -p bundle/windows/data/
cp -r $(WEB_DIST_DIR) bundle/windows/web
cp $(wordlist 2,$(words $(DATAFILES)),$(DATAFILES)) bundle/windows/data/
cp $< bundle/windows/converter.exe
cd bundle/windows && zip -r $@ *
mv bundle/windows/$@ $@
endef
build-win64: $(WIN64_TARGET)
build-win32: $(WIN32_TARGET)
target/%/release/converter.exe: $(API_SERVER_SRCS)
cross build --target $* --release
bundle-win64: $(WIN64_BUNDLE)
bundle-win32: $(WIN32_BUNDLE)
$(WIN64_BUNDLE): $(WIN64_TARGET) $(WEB_DIST_DIR)
$(zip-win-bundle)
$(WIN32_BUNDLE): $(WIN32_TARGET) $(WEB_DIST_DIR)
$(zip-win-bundle)
# Ensure the to-be-mounted directories exist before running the container.
$(RELEASE_BUILD_DIR) $(DEBUG_BUILD_DIR):
mkdir -p $@
# Run `docker compose up` (or `down`) with extra args/override files.
up: | $(RELEASE_BUILD_DIR) $(DEBUG_BUILD_DIR)
$(COMPOSE) up
down:
$(COMPOSE) down
# Generate web assets from Vue source using the `vite` service.
$(WEB_DIST_DIR): $(WEB_SRC) | $(RELEASE_BUILD_DIR) $(DEBUG_BUILD_DIR)
$(COMPOSE) run --rm vite npm run build-only
# Run the local webserver in a container: `make vite`.
# The server configuration needs to point to the host running the Rust server.
vite: | $(NODE_MODULES_DIR)
$(VITE) npm run dev
# Install dependencies using `make node_modules` without setting `module`
# Install a new npm package using `module="some-module" make node_modules`
module ?=
node_modules: $(NODE_MODULES_DIR)
$(NODE_MODULES_DIR):
$(VITE) npm install $(module)
npm-update:
$(VITE) npm update --save
clean-web:
rm -rf $(WEB_DIST_DIR)
clean-node:
rm -rf $(NODE_MODULES)
clean-all-web: clean-web clean-node
clean-volumes:
$(COMPOSE) down -v
clean-all: clean-all-web clean-volumes