1BINDIR := $(or $(XDG_BIN_HOME),$(XDG_BIN_DIR),$(HOME)/.local/bin)
2JJ_FIX := jj --config 'fix.tools.rustfmt.command=["rustfmt","--emit","stdout","--edition","2021"]' --config 'fix.tools.rustfmt.patterns=["glob:**/*.rs"]' fix
3VERSION := $(shell git describe --tags --always 2>/dev/null || echo v0.0.0)
4
5TARGETS := \
6 x86_64-unknown-linux-gnu \
7 aarch64-unknown-linux-gnu \
8 x86_64-apple-darwin \
9 aarch64-apple-darwin \
10 x86_64-pc-windows-gnu \
11 x86_64-unknown-freebsd
12
13# UPX 5.x dropped macOS support; Windows and FreeBSD are limited to 32-bit
14# formats. Only Linux targets are packable.
15PACK_TARGETS := \
16 x86_64-unknown-linux-gnu \
17 aarch64-unknown-linux-gnu
18
19.PHONY: all check test fmt clippy verify install clean
20.PHONY: release release-build release-pack release-upload release-all
21
22all: fmt check test
23
24verify:
25 @$(JJ_FIX)
26 @out=$$(cargo check --quiet 2>&1) || { printf '%s\n' "$$out"; exit 1; }; echo '✓ check'
27 @out=$$(cargo clippy --quiet -- -D warnings 2>&1) || { printf '%s\n' "$$out"; exit 1; }; echo '✓ clippy'
28 @out=$$(cargo test --quiet 2>&1) || { printf '%s\n' "$$out"; exit 1; }; echo '✓ tests'
29
30check:
31 @cargo check --quiet
32 @cargo clippy --quiet -- -D warnings
33
34test:
35 @cargo test --quiet
36
37fmt:
38 @$(JJ_FIX)
39
40clippy:
41 @cargo clippy --quiet -- -D warnings
42
43install:
44 cargo build --release --quiet
45 install -Dm755 target/release/td "$(BINDIR)/td"
46
47clean:
48 rm -rf dist
49
50release-build:
51 rm -rf dist
52 mkdir -p dist
53 @for target in $(TARGETS); do \
54 echo "Building $$target..."; \
55 ext=""; case $$target in *windows*) ext=".exe";; esac; \
56 cargo zigbuild --target $$target --release || exit 1; \
57 cp "target/$$target/release/td$$ext" "dist/td-$(VERSION)-$$target$$ext"; \
58 done
59
60release-pack:
61 @for target in $(PACK_TARGETS); do \
62 bin="dist/td-$(VERSION)-$$target"; \
63 if [ -f "$$bin" ]; then \
64 echo "Packing $$target..."; \
65 upx -q "$$bin"; \
66 fi; \
67 done
68
69release-upload:
70 fish -c 'release upload yatd $(VERSION) --latest dist/*'
71
72release-all: release release-build release-pack release-upload
73
74release:
75 @set -e; \
76 BUMP=$$(gum choose "major" "minor" "patch" "prerelease"); \
77 CURRENT=$$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0"); \
78 \
79 IS_CURRENT_PRE=no; \
80 echo "$$CURRENT" | grep -qE '\-[a-zA-Z]+\.[0-9]+$$' && IS_CURRENT_PRE=yes; \
81 \
82 IS_PRE=no; \
83 if [ "$$BUMP" = "prerelease" ]; then \
84 IS_PRE=yes; \
85 else \
86 gum confirm "Create pre-release?" && IS_PRE=yes || true; \
87 fi; \
88 \
89 PRE_SUFFIX=""; \
90 if [ "$$BUMP" = "prerelease" ] && [ "$$IS_CURRENT_PRE" = "yes" ]; then \
91 PRE_SUFFIX=$$(echo "$$CURRENT" | sed -E 's/.*-([a-zA-Z]+)\.[0-9]+$$/\1/'); \
92 elif [ "$$IS_PRE" = "yes" ]; then \
93 PRE_SUFFIX=$$(gum input --placeholder "Pre-release suffix (e.g. beta, rc)"); \
94 fi; \
95 \
96 if [ "$$BUMP" = "prerelease" ] && [ "$$IS_CURRENT_PRE" = "yes" ]; then \
97 BASE_NEXT=$$(echo "$$CURRENT" | sed -E 's/-[a-zA-Z]+\.[0-9]+$$//'); \
98 else \
99 BASE_NEXT=$$(svu $$BUMP); \
100 fi; \
101 \
102 SUFFIX_VER=""; \
103 if [ "$$IS_PRE" = "yes" ] && [ -n "$$PRE_SUFFIX" ]; then \
104 if [ "$$BUMP" = "prerelease" ] && [ "$$IS_CURRENT_PRE" = "yes" ]; then \
105 cur_num=$$(echo "$$CURRENT" | sed -E 's/.*-[a-zA-Z]+\.([0-9]+)$$/\1/'); \
106 SUFFIX_VER=$$((cur_num + 1)); \
107 else \
108 highest=$$(git tag -l "$$BASE_NEXT-$$PRE_SUFFIX.*" \
109 | sed "s/.*-$$PRE_SUFFIX\.//" | sort -n | tail -1); \
110 if [ -n "$$highest" ]; then \
111 SUFFIX_VER=$$((highest + 1)); \
112 else \
113 SUFFIX_VER=0; \
114 fi; \
115 fi; \
116 fi; \
117 \
118 if [ "$$IS_PRE" = "yes" ] && [ -n "$$PRE_SUFFIX" ]; then \
119 NEXT="$$BASE_NEXT-$$PRE_SUFFIX.$$SUFFIX_VER"; \
120 else \
121 NEXT="$$BASE_NEXT"; \
122 fi; \
123 \
124 PARENT=$$(jj log -r '@-' --no-graph -T 'bookmarks' 2>/dev/null); \
125 case "$$PARENT" in \
126 *main*|*dev*) ;; \
127 *) echo "error: parent commit is not on main or dev" >&2; exit 1;; \
128 esac; \
129 if jj diff --summary 2>/dev/null | grep -qE '^[MD] '; then \
130 echo "error: working copy has modified or deleted files" >&2; exit 1; \
131 fi; \
132 \
133 gum confirm "Release $$NEXT?" || exit 1; \
134 CARGO_VER=$$(echo "$$NEXT" | sed 's/^v//'); \
135 sed -i "s/^version = \".*\"/version = \"$$CARGO_VER\"/" Cargo.toml; \
136 jj commit -m "Bump version to $$NEXT"; \
137 jj tag set "$$NEXT" -r @-; \
138 git push soft "$$NEXT"; \
139 jj git push --remote soft -b main; \
140 echo "Tagged and pushed $$NEXT"