.PHONY: all build release install install-debug test test-cmd run clean fmt lint check help
CARGO := cargo
CARGO_FLAGS ?=
RELEASE_DIR := target/release
DEBUG_DIR := target/debug
BIN_NAME := git-alias
ifdef OS
ifeq ($(OS),Windows_NT)
EXEEXT := .exe
endif
endif
BIN := $(RELEASE_DIR)/$(BIN_NAME)$(EXEEXT)
DEBUG_BIN := $(DEBUG_DIR)/$(BIN_NAME)$(EXEEXT)
HOME_DIR := $(shell echo $$HOME)
INSTALL_DIR := $(HOME_DIR)/.local/bin
SHELL_NAME := $(notdir $(SHELL))
all: release
build:
$(CARGO) build $(CARGO_FLAGS)
release:
$(CARGO) build --release $(CARGO_FLAGS)
run: build
$(DEBUG_BIN) stat
install: release
@mkdir -p $(INSTALL_DIR)
cp $(BIN) $(INSTALL_DIR)/g$(EXEEXT)
@echo "Installed: $(INSTALL_DIR)/g$(EXEEXT)"
$(BIN) install
install-debug: build
@mkdir -p $(INSTALL_DIR)
cp $(DEBUG_BIN) $(INSTALL_DIR)/g$(EXEEXT)
@echo "Installed (debug): $(INSTALL_DIR)/g$(EXEEXT)"
$(DEBUG_BIN) install
uninstall:
@echo "Removing installed binaries from $(INSTALL_DIR) ..."
@rm -f $(INSTALL_DIR)/g$(EXEEXT)
@$(CARGO) run --quiet -- install 2>/dev/null || true
@echo "Done. Note: this leaves shell wrappers; run 'rm -f $(INSTALL_DIR)/g*' manually if needed."
test:
$(CARGO) test $(CARGO_FLAGS)
test-cmd: release
@echo "==> g stat"
$(BIN) stat
@echo
@echo "==> g stat --month"
$(BIN) stat --month
@echo
@echo "==> g stat --help"
$(BIN) stat --help
@echo
@echo "==> g stat --today --week (should error)"
$(BIN) stat --today --week || true
fmt:
$(CARGO) fmt
lint:
$(CARGO) clippy --all-targets --all-features -- -D warnings
check:
$(CARGO) check $(CARGO_FLAGS)
completions: release
$(BIN) completions $(SHELL_NAME)
clean:
$(CARGO) clean
@rm -f Cargo.lock.orig
package: release
@mkdir -p dist
cp $(BIN) dist/git-alias-$(shell $(BIN) --version | awk '{print $$2}')-$(shell uname -s | tr '[:upper:]' '[:lower:]')-$(shell uname -m)$(EXEEXT)
@echo "Packaged: dist/"
help:
@echo "Available targets:"
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-15s\033[0m %s\n", $$1, $$2}'
.DEFAULT_GOAL := help