-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathMakefile
More file actions
255 lines (210 loc) · 7.97 KB
/
Copy pathMakefile
File metadata and controls
255 lines (210 loc) · 7.97 KB
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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
# -------------------------------------------------------------------
# Configuration
# -------------------------------------------------------------------
CONTAINER_ENGINE ?= $(shell command -v podman 2>/dev/null || command -v docker 2>/dev/null)
NIGHTLY ?= nightly-2026-03-28
V ?=
# Crates verified by publish-dry-run, in dependency order.
# Replace with the real crate list when scaffolding a project.
PUBLISH_CRATES := experimental-probe
# Tools verified by check-prereqs before their consuming targets run.
LINT_CMDS := cargo cargo-machete
LINT_EXTRA_CMDS := typos taplo shellcheck actionlint
AUDIT_CMDS := cargo-audit cargo-deny
KIND_CLUSTER_NAME ?= praxis-dev
PROJECT_IMAGE ?= ghcr.io/praxis-proxy/experimental:dev
KUBECTL ?= kubectl --context kind-$(KIND_CLUSTER_NAME)
ifneq ($(V),)
_NOCAPTURE := -- --nocapture
endif
.PHONY: all build release check clean \
test mutants lint lint-extra fmt doc audit semver publish-dry-run \
coverage coverage-check \
check-prereqs check-prereqs-extra check-prereqs-audit check-prereqs-nightly \
require-container-engine \
images container kind-up kind-down \
dev-env dev-push dev-integration \
setup-hooks \
help
# -------------------------------------------------------------------
# All
# -------------------------------------------------------------------
all: build fmt lint lint-extra test audit
# -------------------------------------------------------------------
# Build
# -------------------------------------------------------------------
build:
cargo build --workspace
release:
cargo build --workspace --release
check:
cargo check --workspace
clean:
cargo clean
# -------------------------------------------------------------------
# Test
# -------------------------------------------------------------------
test:
cargo test --workspace $(_NOCAPTURE)
mutants:
cargo mutants --workspace
# -------------------------------------------------------------------
# Prerequisites
# -------------------------------------------------------------------
check-prereqs:
@for cmd in $(LINT_CMDS); do \
command -v "$$cmd" >/dev/null 2>&1 || { \
echo "\"$$cmd\" is not installed — install it before running make (see docs/development.md)" >&2; \
exit 1; \
}; \
done
check-prereqs-extra:
@for cmd in $(LINT_EXTRA_CMDS); do \
command -v "$$cmd" >/dev/null 2>&1 || { \
echo "\"$$cmd\" is not installed — install it before running make (see docs/development.md)" >&2; \
exit 1; \
}; \
done
check-prereqs-audit:
@for cmd in $(AUDIT_CMDS); do \
command -v "$$cmd" >/dev/null 2>&1 || { \
echo "\"$$cmd\" is not installed — install it before running make (see docs/development.md)" >&2; \
exit 1; \
}; \
done
check-prereqs-nightly:
@cargo +$(NIGHTLY) fmt --version >/dev/null 2>&1 || { \
echo "nightly rustfmt is not installed — run \"rustup toolchain install $(NIGHTLY) --component rustfmt\" (see docs/development.md)" >&2; \
exit 1; \
}
# -------------------------------------------------------------------
# Quality
# -------------------------------------------------------------------
lint: check-prereqs check-prereqs-nightly
cargo clippy --workspace --all-targets -- -D warnings
cargo +$(NIGHTLY) fmt --all -- --check
cargo machete
lint-extra: check-prereqs-extra
typos
taplo fmt --check
shellcheck hack/*.sh .hooks/pre-commit
actionlint
fmt: check-prereqs-nightly
cargo +$(NIGHTLY) fmt --all
doc:
RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps --document-private-items
audit: check-prereqs-audit
cargo audit
cargo deny check
coverage:
cargo llvm-cov --workspace --html --output-dir target/coverage \
--ignore-filename-regex 'src/main\.rs' \
--fail-under-lines 90 \
--fail-under-regions 80
coverage-check:
cargo llvm-cov --workspace \
--ignore-filename-regex 'src/main\.rs' \
--fail-under-lines 90 \
--fail-under-regions 80
semver:
cargo semver-checks
# Full packaging verification for every release crate. The final step
# builds the packaged sources exactly as `cargo publish` would; switch it
# to `cargo publish -p <crate> --dry-run` once crates are publishable.
publish-dry-run:
@for crate in $(PUBLISH_CRATES); do \
printf "packaging %-25s " "$$crate"; \
cargo package -p "$$crate" --list > /dev/null 2>&1 \
&& echo "ok" \
|| { echo "FAILED"; exit 1; }; \
done
cargo package -p $(firstword $(PUBLISH_CRATES))
# -------------------------------------------------------------------
# Container
# -------------------------------------------------------------------
require-container-engine:
ifndef CONTAINER_ENGINE
$(error No container engine found. Install podman or docker)
endif
container: | require-container-engine
$(CONTAINER_ENGINE) build -t $(PROJECT_IMAGE) -f Containerfile .
images: | require-container-engine
$(CONTAINER_ENGINE) build -t $(PROJECT_IMAGE) -f Containerfile .
# -------------------------------------------------------------------
# KIND
# -------------------------------------------------------------------
kind-up: images
KIND_CLUSTER_NAME=$(KIND_CLUSTER_NAME) \
bash hack/setup-kind.sh
kind-down:
KIND_CLUSTER_NAME=$(KIND_CLUSTER_NAME) \
bash hack/teardown-kind.sh
# -------------------------------------------------------------------
# Iterative Development
# -------------------------------------------------------------------
dev-env: images
KIND_CLUSTER_NAME=$(KIND_CLUSTER_NAME) \
bash hack/setup-kind.sh
dev-push: | require-container-engine
$(CONTAINER_ENGINE) build -t $(PROJECT_IMAGE) -f Containerfile .
kind load docker-image $(PROJECT_IMAGE) --name $(KIND_CLUSTER_NAME)
dev-integration:
@kind get kubeconfig --name $(KIND_CLUSTER_NAME) > /tmp/kind-$(KIND_CLUSTER_NAME).kubeconfig
KUBECONFIG=/tmp/kind-$(KIND_CLUSTER_NAME).kubeconfig \
cargo test --features integration -- --ignored $(if $(V),--nocapture,)
# -------------------------------------------------------------------
# Dev Setup
# -------------------------------------------------------------------
setup-hooks:
@ln -sf ../../.hooks/pre-commit .git/hooks/pre-commit
@echo "Git hooks installed"
# -------------------------------------------------------------------
# Help
# -------------------------------------------------------------------
help:
@echo "Variables:"
@echo " V=1 show test output (--nocapture)"
@echo " NIGHTLY nightly toolchain name for rustfmt"
@echo " CONTAINER_ENGINE container runtime (auto-detected)"
@echo " KIND_CLUSTER_NAME KIND cluster name"
@echo " PROJECT_IMAGE container image tag"
@echo ""
@echo "Top-level:"
@echo " all build + lint + lint-extra + test + audit"
@echo ""
@echo "Build:"
@echo " build cargo build --workspace"
@echo " release cargo build --workspace --release"
@echo " check cargo check --workspace"
@echo " clean cargo clean"
@echo ""
@echo "Test:"
@echo " test run all tests"
@echo " mutants mutation testing (cargo-mutants)"
@echo ""
@echo "Quality:"
@echo " lint clippy + rustfmt check + machete"
@echo " lint-extra typos + taplo + shellcheck + actionlint"
@echo " fmt format with nightly rustfmt"
@echo " doc build docs with warnings denied"
@echo " audit cargo audit + cargo deny"
@echo " semver cargo semver-checks"
@echo " publish-dry-run package + verify release crates"
@echo " coverage HTML coverage report"
@echo " coverage-check fail if lines < 90%% or regions < 80%%"
@echo ""
@echo "Container:"
@echo " container build container image"
@echo " images build container image"
@echo ""
@echo "KIND:"
@echo " kind-up create cluster + deploy"
@echo " kind-down delete cluster"
@echo ""
@echo "Dev Setup:"
@echo " setup-hooks install git pre-commit hook"
@echo ""
@echo "Development:"
@echo " dev-env create/reuse persistent cluster"
@echo " dev-push build + load + rollout"
@echo " dev-integration run integration tests"