110 lines
3.7 KiB
Makefile
Executable File
110 lines
3.7 KiB
Makefile
Executable File
# drivestage — top-level Makefile
|
|
#
|
|
# Common developer entry points: build, test, lint, dist, install.
|
|
# Run `make help` for a summary.
|
|
#
|
|
# Author: Jeremy Anderson <info@dcos.net> — https://dcos.net
|
|
# License: MIT
|
|
|
|
VERSION := 0.4.0
|
|
PROJECT := drivestage
|
|
TARBALL := $(PROJECT)-$(VERSION).tar.gz
|
|
SHA256 := $(TARBALL).sha256
|
|
|
|
# Paths
|
|
GUI_DIR := gui
|
|
SCRIPT_DIR := scripts
|
|
ENGINE_SRC := $(SCRIPT_DIR)/blkstage.sh
|
|
ENGINE_ASSET := $(GUI_DIR)/assets/blkstage.sh
|
|
# Tarball staging directory. Deliberately named `dist-staging` (not `dist/` or
|
|
# `release/`) so it doesn't collide with the phony targets `dist` and
|
|
# `release` — Make would otherwise see a circular dependency between the
|
|
# phony target and the directory of the same name.
|
|
DIST_DIR := dist-staging
|
|
|
|
# Install destinations (override with make PREFIX=/opt/drivestage install)
|
|
PREFIX ?= /usr/local
|
|
BINDIR ?= $(PREFIX)/bin
|
|
LIBDIR ?= $(PREFIX)/lib/$(PROJECT)
|
|
|
|
# Tooling
|
|
CARGO ?= cargo
|
|
SHELLCHECK ?= shellcheck
|
|
|
|
# Default to the first target (informational).
|
|
.DEFAULT_GOAL := all
|
|
|
|
# Phony targets — none of these produce a file with the same name.
|
|
.PHONY: all gui test check fmt clippy dist release clean install \
|
|
sync-assets help
|
|
|
|
##@ Help
|
|
|
|
help: ## Show this help.
|
|
@awk 'BEGIN {FS = ":.*##"; printf "Usage: make [target]\n\nTargets:\n"} \
|
|
/^[a-zA-Z_-]+:.*##/ { printf " %-14s %s\n", $$1, $$2 }' $(MAKEFILE_LIST)
|
|
|
|
##@ Build
|
|
|
|
all: gui ## Build everything (currently just the GUI).
|
|
|
|
gui: ## Build the Rust GUI in release mode.
|
|
$(CARGO) build --release --manifest-path $(GUI_DIR)/Cargo.toml
|
|
|
|
##@ Testing
|
|
|
|
test: ## Run bash distro-detection tests + cargo test.
|
|
bash $(SCRIPT_DIR)/test_distro_detection.sh
|
|
$(CARGO) test --manifest-path $(GUI_DIR)/Cargo.toml
|
|
|
|
##@ Lint & format
|
|
|
|
check: ## cargo check + shellcheck.
|
|
$(CARGO) check --manifest-path $(GUI_DIR)/Cargo.toml
|
|
$(SHELLCHECK) -x $(ENGINE_SRC)
|
|
|
|
fmt: ## Format Rust code (writes).
|
|
$(CARGO) fmt --manifest-path $(GUI_DIR)/Cargo.toml
|
|
|
|
clippy: ## Run clippy with -D warnings.
|
|
$(CARGO) clippy --manifest-path $(GUI_DIR)/Cargo.toml --all-targets -- -D warnings
|
|
|
|
##@ Packaging
|
|
|
|
dist: $(DIST_DIR)/$(TARBALL) $(DIST_DIR)/$(SHA256) ## Build release tarball + sha256.
|
|
|
|
release: dist ## Alias for `dist` (cut a release artifact).
|
|
@echo "Release artifact ready in $(DIST_DIR)/"
|
|
|
|
$(DIST_DIR)/:
|
|
mkdir -p $(DIST_DIR)
|
|
|
|
$(DIST_DIR)/$(TARBALL): $(ENGINE_SRC) $(GUI_DIR)/Cargo.toml $(GUI_DIR)/Cargo.lock | $(DIST_DIR)/
|
|
@# Stage a clean export of the source tree (excluding build artefacts).
|
|
git archive --format=tar.gz --prefix=$(PROJECT)-$(VERSION)/ HEAD -o $(DIST_DIR)/$(TARBALL)
|
|
@echo "Created $(DIST_DIR)/$(TARBALL)"
|
|
|
|
$(DIST_DIR)/$(SHA256): $(DIST_DIR)/$(TARBALL) | $(DIST_DIR)/
|
|
cd $(DIST_DIR) && sha256sum $(TARBALL) > $(SHA256)
|
|
@echo "Wrote $(DIST_DIR)/$(SHA256)"
|
|
|
|
##@ Install
|
|
|
|
install: gui sync-assets ## Install the engine script + GUI binary to PREFIX.
|
|
install -d $(DESTDIR)$(BINDIR)
|
|
install -d $(DESTDIR)$(LIBDIR)
|
|
install -m 0755 $(GUI_DIR)/target/release/drivestage-gui $(DESTDIR)$(BINDIR)/drivestage-gui
|
|
install -m 0755 $(ENGINE_SRC) $(DESTDIR)$(BINDIR)/drivestage
|
|
install -m 0644 $(ENGINE_SRC) $(DESTDIR)$(LIBDIR)/blkstage.sh
|
|
@echo "Installed drivestage + drivestage-gui to $(DESTDIR)$(PREFIX)"
|
|
|
|
##@ Repo hygiene
|
|
|
|
sync-assets: ## Copy scripts/blkstage.sh → gui/assets/blkstage.sh.
|
|
install -m 0644 $(ENGINE_SRC) $(ENGINE_ASSET)
|
|
@echo "Synced $(ENGINE_SRC) → $(ENGINE_ASSET)"
|
|
|
|
clean: ## Remove cargo build artefacts.
|
|
$(CARGO) clean --manifest-path $(GUI_DIR)/Cargo.toml
|
|
rm -rf $(DIST_DIR)
|