# GOTOOLCHAIN=local pins us to the vendored deps/go tree. Without it, a go.mod # `go` directive newer than deps/go re-execs into a downloaded toolchain module, # and those ship only 7 of the 15 GOROOT tools (no covdata) -- which makes # `test` below fail on the two packages that have no test files. deps-go builds # the missing tools in, so the vendored tree is self-sufficient. Keep the version # here in step with the `go` directive in go.mod. GO_VERSION := 1.25.5 GO := $(shell pwd)/deps/go/go/bin/go export GOTOOLCHAIN := local GOFLAGS := CGO_LDFLAGS := -L$(shell pwd)/deps/lib -Wl,-rpath,$(shell pwd)/deps/lib CGO_CFLAGS := -I$(shell pwd)/deps/include -I$(shell pwd)/deps/whisper.cpp/ggml/include WHISPER_MODEL := $(shell pwd)/models/stt/ggml-small.bin PIPER_BIN := $(shell pwd)/deps/piper/piper PIPER_MODEL := $(shell pwd)/models/tts/ru_RU-irina-medium.onnx PIPER_ESPEAK := $(shell pwd)/deps/piper/espeak-ng-data .PHONY: all build build-stt build-tts build-daemon build-client build-waked build-web build-poll build-caldav clean test run-stt run-tts run-web download-embedder deps-go eval-router all: build build: build-stt build-tts build-daemon build-client build-waked build-web build-poll build-caldav build-stt: CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" LD_LIBRARY_PATH="$(shell pwd)/deps/lib" \ $(GO) build $(GOFLAGS) -o mavsttd ./cmd/mavsttd/ build-tts: CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" LD_LIBRARY_PATH="$(shell pwd)/deps/lib" \ $(GO) build $(GOFLAGS) -o mavttsd ./cmd/mavttsd/ build-daemon: CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" LD_LIBRARY_PATH="$(shell pwd)/deps/lib" \ $(GO) build $(GOFLAGS) -o mavend ./cmd/mavend/ build-client: CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" LD_LIBRARY_PATH="$(shell pwd)/deps/lib" \ $(GO) build $(GOFLAGS) -o mavenclient ./cmd/mavenclient/ build-waked: $(GO) build $(GOFLAGS) -o mavwaked ./cmd/mavwaked/ build-web: $(GO) build $(GOFLAGS) -o mavweb ./cmd/mavweb/ build-poll: $(GO) build $(GOFLAGS) -o mavpoll ./cmd/mavpoll/ build-caldav: $(GO) build $(GOFLAGS) -o mavcaldav ./cmd/mavcaldav/ run-web: build-web ./mavweb -addr :9200 -voice 127.0.0.1:9100 # Install the vendored Go toolchain from scratch. Go 1.24+ release tarballs no # longer ship covdata/pprof/test2json/nm/objdump/trace prebuilt -- `go tool X` # builds them on demand, but `go test -coverprofile` calls covdata through # base.Tool(), which only stats pkg/tool and exits. So build them in once here. GO_TARBALL := go$(GO_VERSION).linux-amd64.tar.gz GO_SHA256 := 9e9b755d63b36acf30c12a9a3fc379243714c1c6d3dd72861da637f336ebb35b deps-go: @mkdir -p deps/go cd deps/go && curl -fLO 'https://go.dev/dl/$(GO_TARBALL)' cd deps/go && echo '$(GO_SHA256) $(GO_TARBALL)' | sha256sum -c - cd deps/go && rm -rf go && tar xzf $(GO_TARBALL) && rm $(GO_TARBALL) cd deps/go/go/src && for t in covdata pprof test2json nm objdump trace addr2line buildid; do \ GOROOT="$(shell pwd)/deps/go/go" $(GO) build -o "$(shell pwd)/deps/go/go/pkg/tool/linux_amd64/$$t" "cmd/$$t" || exit 1; \ done $(GO) version test: CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" LD_LIBRARY_PATH="$(shell pwd)/deps/lib" \ $(GO) test -race -coverprofile=coverage.out ./internal/... ./cmd/... # eval-router — score the held-out RU routing fixture (internal/router/eval). # Verbose so the report tables land in the terminal. MAVEN_ONNX_LIB points the # prod-representative baseline at the vendored runtime; override it or set it # empty to run only the deterministic hash ratchet. This is the measurement # Vikunja #319 compares before #320 flips the route decider. MAVEN_ONNX_LIB ?= $(shell pwd)/deps/onnxruntime-linux-x64-1.26.0/lib/libonnxruntime.so eval-router: MAVEN_ONNX_LIB="$(MAVEN_ONNX_LIB)" $(GO) test -v -count=1 ./internal/router/eval/ run-stt: build-stt LD_LIBRARY_PATH="$(shell pwd)/deps/lib" \ ./mavsttd -socket /tmp/maven/stt.sock -model $(WHISPER_MODEL) run-tts: build-tts LD_LIBRARY_PATH="$(shell pwd)/deps/piper" \ ./mavttsd -socket /tmp/maven/tts.sock \ -piper $(PIPER_BIN) -model $(PIPER_MODEL) -espeak_data $(PIPER_ESPEAK) deps: deps-whisper deps-piper deps-whisper: cd deps/whisper.cpp && cmake -B build -DCMAKE_BUILD_TYPE=Release \ -DWHISPER_BUILD_TESTS=OFF -DWHISPER_BUILD_SERVER=OFF && \ cmake --build build --config Release -j$$(nproc) cp deps/whisper.cpp/build/bin/libwhisper.so* deps/lib/ cp deps/whisper.cpp/build/bin/libggml*.so* deps/lib/ cp deps/whisper.cpp/build/bin/libparakeet.so* deps/lib/ deps-piper: mkdir -p deps/ curl -sL "https://github.com/rhasspy/piper/releases/download/2023.11.14-2/piper_linux_x86_64.tar.gz" \ -o /tmp/piper.tar.gz tar -xzf /tmp/piper.tar.gz -C deps/ EMBEDDER_DIR := $(shell pwd)/models/embedder EMBEDDER_MODEL_URL := https://huggingface.co/Xenova/paraphrase-multilingual-MiniLM-L12-v2/resolve/main/onnx/model_quantized.onnx EMBEDDER_TOKENIZER_URL := https://huggingface.co/Xenova/paraphrase-multilingual-MiniLM-L12-v2/resolve/main/tokenizer.json download-embedder: mkdir -p $(EMBEDDER_DIR) curl -sL "$(EMBEDDER_MODEL_URL)" -o "$(EMBEDDER_DIR)/model_quantized.onnx" curl -sL "$(EMBEDDER_TOKENIZER_URL)" -o "$(EMBEDDER_DIR)/tokenizer.json" @echo "" @echo "embedder model downloaded to $(EMBEDDER_DIR)/" @echo "To use it, add to mavend.json:" @echo ' "voice": {' @echo ' ...' @echo ' "embedder": {' @echo ' "model_path": "$(EMBEDDER_DIR)/model_quantized.onnx",' @echo ' "tokenizer_path": "$(EMBEDDER_DIR)/tokenizer.json",' @echo ' "lib_path": "/path/to/libonnxruntime.so"' @echo ' }' @echo ' }' @echo "" @echo "Install libonnxruntime.so from: https://github.com/microsoft/onnxruntime/releases" @echo "e.g. on x86_64 Linux:" @echo ' curl -sL "https://github.com/microsoft/onnxruntime/releases/download/v1.15.1/onnxruntime-linux-x64-1.15.1.tgz" | tar xz' @echo ' sudo cp onnxruntime-linux-x64-1.15.1/lib/libonnxruntime.so* /usr/local/lib/' clean: rm -f mavend mavenclient mavsttd mavttsd mavweb mavpoll mavcaldav mavwaked