Makefile

  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"