1
0
treerack/makefile
2026-06-07 17:56:24 +02:00

164 lines
4.9 KiB
Makefile

sources = $(shell find . -name '*.go' \
| grep -v cmd/treerack/docreflect.gen.go \
| grep -v head.gen.go \
| grep -v .build/head.gen.go \
| grep -v headexported.gen.go \
| grep -v .build/headexported.gen.go \
| grep -v internal/self/self.gen.go \
| grep -v .build/self.gen.go)
parsers = $(shell find . -name '*.treerack' | grep -v baz_test[.]treerack)
release_date = $(shell git show -s --format=%cs HEAD)
version = $(release_date)-$(shell git rev-parse --short HEAD)
PREFIX ?= /usr/local
prefix ?= $(PREFIX)
default: build
.build:
mkdir -p .build
.build/head.gen.go: $(sources) .build
go fmt ./...
go run script/createhead.go -- \
char.go \
sequence.go \
choice.go \
idset.go \
results.go \
context.go \
nodehead.go \
syntaxhead.go \
> .build/head.gen.go
go fmt .build/head.gen.go
head.gen.go: .build/head.gen.go
cp .build/head.gen.go .
.build/headexported.gen.go: $(sources) .build
go fmt ./...
go run script/createhead.go --exported -- \
char.go \
sequence.go \
choice.go \
idset.go \
results.go \
context.go \
nodehead.go \
syntaxhead.go \
> .build/headexported.gen.go
go fmt .build/headexported.gen.go
headexported.gen.go: .build/headexported.gen.go
cp .build/headexported.gen.go .
.build/self.gen.go: $(sources) $(parsers) head.gen.go headexported.gen.go .build
# since the generator code depends on the syntax itself, and such influences its own output, we need two
# passes:
go build -o .build/treerack.current ./cmd/treerack
.build/treerack.current generate --export --package-name self < syntax.treerack > .build/self.gen.go
go fmt .build/self.gen.go
# we backup the original and apply the new:
cp internal/self/self.gen.go .build/self.gen.go.backup
cp .build/self.gen.go internal/self
# second pass:
go build -o .build/treerack.interim ./cmd/treerack || mv .build/self.gen.go.backup internal/self/self.gen.go
.build/treerack.interim generate --export --package-name self < syntax.treerack > .build/self.gen.go \
|| mv .build/self.gen.go.backup internal/self/self.gen.go
go fmt .build/self.gen.go || mv .build/self.gen.go.backup internal/self/self.gen.go
mv .build/self.gen.go.backup internal/self/self.gen.go
internal/self/self.gen.go: .build/self.gen.go
cp .build/self.gen.go internal/self
lib: $(sources) head.gen.go headexported.gen.go internal/self/self.gen.go
go build
go build ./internal/self
cmd/treerack/docreflect.gen.go: $(sources) .build
go run script/docreflect.go > .build/docreflect.gen.go
go fmt .build/docreflect.gen.go
mv .build/docreflect.gen.go cmd/treerack
cmd/treerack/readme.md: $(sources) cmd/treerack/docreflect.gen.go
go run script/cmdreadme.go ./cmd/treerack > cmd/treerack/readme.md || \
rm cmd/treerack/readme.md
.build/treerack: $(sources) lib cmd/treerack/docreflect.gen.go .build
go build -o .build/treerack -ldflags "-X main.version=$(version)" ./cmd/treerack
.build/treerack.1: $(sources) cmd/treerack/docreflect.gen.go .build
go run script/man.go $(version) $(release_date) > .build/treerack.1 || \
rm .build/treerack.1
build: lib cmd/treerack/readme.md .build/treerack .build/treerack.1
check-generate: .build/head.gen.go .build/headexported.gen.go .build/self.gen.go
@if ! diff head.gen.go .build/head.gen.go > /dev/null; then \
echo head.gen.go does not match; \
false; \
fi
@if ! diff headexported.gen.go .build/headexported.gen.go > /dev/null; then \
echo headexported.gen.go does not match; \
false; \
fi
@if ! diff internal/self/self.gen.go .build/self.gen.go > /dev/null; then \
echo self.gen.go does not match; \
false; \
fi
check: $(sources) $(parsers) build check-generate
go test
go test ./cmd/treerack
set -e; for p in $(parsers); do .build/treerack check-syntax $$p; done
.coverprofile: $(sources)
go test -coverprofile .coverprofile
cover: .coverprofile
go tool cover -func .coverprofile
showcover: .coverprofile
go tool cover -html .coverprofile
.coverprofile-cmd: $(sources)
go test ./cmd/treerack -coverprofile .coverprofile-cmd
cover-cmd: .coverprofile-cmd
go tool cover -func .coverprofile-cmd
showcover-cmd: .coverprofile-cmd
go tool cover -html .coverprofile-cmd
cpu.out: $(sources) $(parsers)
go test -v -count 1 -run TestMMLFile -cpuprofile cpu.out
cpu: cpu.out
go tool pprof -top cpu.out
mem.out: $(sources) $(parsers)
go test -v -count 1 -run TestMMLFile -memprofile mem.out
mem: mem.out
go tool pprof -top mem.out
fmt: $(sources) $(parsers) head.gen.go headexported.gen.go internal/self/self.gen.go cmd/treerack/docreflect.gen.go
go fmt ./...
go run script/format.go $(parsers)
$(prefix)/bin/treerack: .build/treerack
mkdir -p $(prefix)/bin
cp .build/treerack $(prefix)/bin
$(prefix)/share/man/man1/treerack.1: .build/treerack.1
mkdir -p $(prefix)/share/man/man1
cp .build/treerack.1 $(prefix)/share/man/man1
install: $(prefix)/bin/treerack $(prefix)/share/man/man1/treerack.1
clean:
rm -f cpu.out
rm -f .coverprofile
rm -rf .build
go clean ./...