# Warp — build, test and lint. # # Everything Go lives in ./server; the frontend packages (apps/*) get their # own targets as they are created. SHELL := /bin/sh GO ?= go BIN_DIR := bin BINARY := warp SERVER_DIR := server COMPLEMENT_IMAGE ?= complement-warp VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo 0.0.0-dev) COMMIT ?= $(shell git rev-parse --short HEAD 2>/dev/null || echo unknown) DATE ?= $(shell date -u +%Y-%m-%dT%H:%M:%SZ) PKG := github.com/dariuszjaniak/warp/server/internal/buildinfo LDFLAGS := -X $(PKG).Version=$(VERSION) -X $(PKG).Commit=$(COMMIT) -X $(PKG).BuildDate=$(DATE) # Windows builds need the .exe suffix for `make run` to work from MSYS. ifeq ($(OS),Windows_NT) EXE := .exe else EXE := endif .DEFAULT_GOAL := build .PHONY: help help: ## List the targets @grep -hE '^[a-zA-Z_-]+:.*?## ' $(MAKEFILE_LIST) | \ awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-16s\033[0m %s\n", $$1, $$2}' .PHONY: build build: ## Build the warp binary into bin/ cd $(SERVER_DIR) && $(GO) build -ldflags "$(LDFLAGS)" -o ../$(BIN_DIR)/$(BINARY)$(EXE) ./cmd/warp .PHONY: run run: build ## Build and run the server ./$(BIN_DIR)/$(BINARY)$(EXE) serve .PHONY: test test: ## Run the unit tests (sqlite only) cd $(SERVER_DIR) && $(GO) test ./... .PHONY: test-race test-race: ## Run the tests with the race detector (needs cgo) cd $(SERVER_DIR) && CGO_ENABLED=1 $(GO) test -race ./... .PHONY: test-postgres test-postgres: ## Run the storage tests against PostgreSQL too @test -n "$(WARP_TEST_POSTGRES_DSN)" || \ { echo "set WARP_TEST_POSTGRES_DSN, e.g. postgres://warp:warp@localhost/warp_test?sslmode=disable"; exit 1; } cd $(SERVER_DIR) && WARP_TEST_POSTGRES_DSN="$(WARP_TEST_POSTGRES_DSN)" $(GO) test ./internal/storage/... .PHONY: cover cover: ## Run the tests and write coverage.out / coverage.html cd $(SERVER_DIR) && $(GO) test -coverprofile=../coverage.out -covermode=count ./... $(GO) tool cover -html=coverage.out -o coverage.html @echo "wrote coverage.html" .PHONY: fmt fmt: ## Format the Go code cd $(SERVER_DIR) && $(GO) fmt ./... .PHONY: vet vet: ## Run go vet cd $(SERVER_DIR) && $(GO) vet ./... .PHONY: lint lint: ## Run golangci-lint cd $(SERVER_DIR) && golangci-lint run .PHONY: tidy tidy: ## Tidy the Go module files cd $(SERVER_DIR) && $(GO) mod tidy .PHONY: check check: vet test ## What CI runs on every push (minus the linter) .PHONY: generate-keys generate-keys: build ## Create the ed25519 signing key ./$(BIN_DIR)/$(BINARY)$(EXE) generate-keys .PHONY: migrate migrate: build ## Apply pending database migrations ./$(BIN_DIR)/$(BINARY)$(EXE) migrate .PHONY: create-account create-account: build ## Create an account: make create-account ACCOUNT=alice ARGS=--admin @test -n "$(ACCOUNT)" || { echo "set ACCOUNT, e.g. make create-account ACCOUNT=alice ARGS=--admin"; exit 1; } ./$(BIN_DIR)/$(BINARY)$(EXE) create-account --username "$(ACCOUNT)" $(ARGS) .PHONY: complement-image complement-image: ## Build the Complement homeserver image docker build -t $(COMPLEMENT_IMAGE) -f $(SERVER_DIR)/test/complement/Dockerfile . .PHONY: complement complement: ## Run the Complement subset for the phases that are done bash $(SERVER_DIR)/test/complement/run.sh .PHONY: docker docker: ## Build the container image docker build -t warp:$(VERSION) . .PHONY: clean clean: ## Remove build output rm -rf $(BIN_DIR) coverage.out coverage.html