# Copyright 2025 The go-yaml Project Contributors # SPDX-License-Identifier: Apache-2.0 # Auto-install https://github.com/makeplus/makes at specific commit: MAKES := .cache/makes MAKES-LOCAL := .cache/local MAKES-COMMIT ?= 4e48a743c3652b88adc4a257398d895a801e6d11 $(shell [ -d $(MAKES) ] || ( \ git clone -q https://github.com/makeplus/makes $(MAKES) && \ git -C $(MAKES) reset -q --hard $(MAKES-COMMIT))) ifneq ($(shell git -C $(MAKES) rev-parse HEAD), \ $(shell git -C $(MAKES) rev-parse $(MAKES-COMMIT))) $(error $(MAKES) is not at the correct commit: $(MAKES-COMMIT). \ Remove $(MAKES) and try again.) endif include $(MAKES)/init.mk include $(MAKES)/shellcheck.mk # Auto-install go unless GO_YAML_PATH is set: ifdef GO_YAML_PATH override export PATH := $(GO_YAML_PATH):$(PATH) else GO-VERSION ?= 1.25.5 endif GO-VERSION-NEEDED := $(GO-VERSION) # yaml-test-suite info: YTS-URL ?= https://github.com/yaml/yaml-test-suite YTS-TAG ?= data-2022-01-17 YTS-DIR := yts/testdata/$(YTS-TAG) CLI-BINARY := go-yaml # Pager for viewing documentation: PAGER ?= less -FRX # Setup and include go.mk and shell.mk: # We need to limit `find` to avoid dirs like `.cache/` and any git worktrees, # as this makes `make` operations very slow: REPO-DIRS := $(shell find * -maxdepth 0 -type d \ ! -exec test -f {}/.git \; -print) GO-FILES := $(shell find $(REPO-DIRS) -name '*.go') ifndef GO-VERSION-NEEDED GO-NO-DEP-GO := true endif include $(MAKES)/go.mk # Set this from the `make` command to override: GOLANGCI-LINT-VERSION ?= v2.8.0 GOLANGCI-LINT-INSTALLER := \ https://github.com/golangci/golangci-lint/raw/main/install.sh GOLANGCI-LINT := $(LOCAL-BIN)/golangci-lint GOLANGCI-LINT-VERSIONED := $(GOLANGCI-LINT)-$(GOLANGCI-LINT-VERSION) SHELL-DEPS += $(GOLANGCI-LINT-VERSIONED) ifdef GO-VERSION-NEEDED GO-DEPS += $(GO) else SHELL-DEPS := $(filter-out $(GO),$(SHELL-DEPS)) endif SHELL-NAME := makes go-yaml include $(MAKES)/clean.mk include $(MAKES)/shell.mk MAKES-CLEAN := $(CLI-BINARY) $(GOLANGCI-LINT) MAKES-REALCLEAN := $(dir $(YTS-DIR)) SHELL-SCRIPTS = \ util/common.bash \ $(shell grep -rl '^.!/usr/bin/env bash' util | \ grep -v '\.sw') COVER-TESTS := \ . \ ./cmd/... \ ./internal/... \ # v=1 for verbose MAKE := $(MAKE) --no-print-directory v ?= cover ?= fuzz ?= time ?= 60s opts ?= TEST-OPTS := \ $(if $v, -v)\ $(if $(cover), --cover)\ $(if $(fuzz), --fuzz=FuzzEncodeFromJSON --fuzztime=$(time))\ $(if $(opts), $(opts))\ # Test rules: test: test-main test-internal test-cmd test-yts-all test-shell @echo 'ALL TESTS PASS' check: $(MAKE) fmt $(MAKE) tidy $(MAKE) lint $(MAKE) test test-main: $(GO-DEPS) go test .$(TEST-OPTS) @echo 'ALL MAIN FILES PASS' test-cmd: $(GO-DEPS) go test ./cmd/...$(TEST-OPTS) @echo 'ALL CMD FILES PASS' test-internal: $(GO-DEPS) go test ./internal/...$(TEST-OPTS) @echo 'ALL INTERNAL FILES PASS' test-cover: $(GO-DEPS) go test . $(COVER-TESTS) -vet=off --cover$(TEST-OPTS) test-yts: $(GO-DEPS) $(YTS-DIR) go test ./yts$(TEST-OPTS) test-yts-all: $(GO-DEPS) $(YTS-DIR) @echo 'Testing yaml-test-suite' util/yaml-test-suite all test-yts-fail: $(GO-DEPS) $(YTS-DIR) @echo 'Testing yaml-test-suite failures' util/yaml-test-suite fail test-shell: $(SHELLCHECK) shellcheck $(SHELL-SCRIPTS) @echo 'ALL SHELL FILES PASS' test-count: $(GO-DEPS) util/test-count yts-dir: $(YTS-DIR) get-test-data: $(YTS-DIR) # Install golangci-lint for GitHub Actions: golangci-lint-install: $(GOLANGCI-LINT) fmt: $(GOLANGCI-LINT-VERSIONED) $< fmt ./... lint: $(GOLANGCI-LINT-VERSIONED) $< run ./... tidy: $(GO-DEPS) go mod tidy cli: $(CLI-BINARY) $(CLI-BINARY): $(GO) go build -o $@ ./cmd/$@ run-examples: $(GO) @for dir in example/*/; do \ (set -x; go run "$${dir}main.go") || \ { echo "$$dir failed"; break; }; \ done # CLI documentation (go doc) - view in terminal: doc: $(GO-DEPS) @go doc -all . | $(PAGER) # HTTP documentation server - opens browser: doc-http: $(GO-DEPS) go doc -http -all # Setup rules: $(YTS-DIR): git clone -q $(YTS-URL) $@ git -C $@ checkout -q $(YTS-TAG) # Downloads golangci-lint binary and moves to versioned path # (.cache/local/bin/golangci-lint-). $(GOLANGCI-LINT-VERSIONED): $(GO-DEPS) curl -sSfL $(GOLANGCI-LINT-INSTALLER) | \ bash -s -- -b $(LOCAL-BIN) $(GOLANGCI-LINT-VERSION) mv $(GOLANGCI-LINT) $@ # Moves golangci-lint- to golangci-lint for CI requirement $(GOLANGCI-LINT): $(GOLANGCI-LINT-VERSIONED) cp $< $@