.PHONY: all frontend backend backend-epics backend-debug test bench race lint clean run # --------------------------------------------------------------------------- # # Sources — adding any file here triggers a frontend or backend rebuild # # --------------------------------------------------------------------------- # FRONTEND_SRCS := $(shell find web/src -name '*.tsx' -o -name '*.ts' -o -name '*.css') \ $(wildcard web/vendor/*.mjs web/vendor/*.js web/vendor/*.css) \ tools/buildfrontend/main.go GO_SRCS := $(shell find cmd internal -name '*.go') web/embed.go go.mod go.sum # --------------------------------------------------------------------------- # # Outputs # # --------------------------------------------------------------------------- # FRONTEND_OUT := web/dist/main.js BINARY := dist/uopi # --------------------------------------------------------------------------- # # Top-level targets # # --------------------------------------------------------------------------- # all: $(BINARY) frontend: $(FRONTEND_OUT) backend: $(BINARY) # --------------------------------------------------------------------------- # # Build rules # # --------------------------------------------------------------------------- # # Bundle TypeScript/TSX → web/dist/ using esbuild (pure Go, no npm) $(FRONTEND_OUT): $(FRONTEND_SRCS) @mkdir -p web/dist go run ./tools/buildfrontend/main.go # Compile the self-contained binary (embeds web/dist at build time) $(BINARY): $(GO_SRCS) $(FRONTEND_OUT) @mkdir -p dist go build -ldflags="-s -w" -o $(BINARY) ./cmd/uopi # Build with EPICS Channel Access support. # # Auto-detection: if EPICS_BASE is set in the environment, CGO flags are # derived automatically. Override any variable on the command line: # # make backend-epics EPICS_BASE=/path/to/epics/base EPICS_ARCH=linux-x86_64 # # If EPICS_BASE is not set, set it to the directory that contains # include/cadef.h and lib//libca.so. EPICS_BASE ?= $(EPICS_BASE) # Detect host arch from EPICS startup script if not provided. EPICS_ARCH ?= $(shell \ if [ -x "$(EPICS_BASE)/startup/EpicsHostArch" ]; then \ "$(EPICS_BASE)/startup/EpicsHostArch"; \ elif [ -x "$(EPICS_BASE)/lib" ]; then \ ls "$(EPICS_BASE)/lib" | grep linux | head -1; \ else \ echo "linux-x86_64"; \ fi) EPICS_CGO_CFLAGS ?= -I$(EPICS_BASE)/include -I$(EPICS_BASE)/include/os/Linux -I$(EPICS_BASE)/include/compiler/gcc EPICS_CGO_LDFLAGS ?= -L$(EPICS_BASE)/lib/$(EPICS_ARCH) -lca -lCom -Wl,-rpath,$(EPICS_BASE)/lib/$(EPICS_ARCH) backend-epics: $(FRONTEND_OUT) @if [ -z "$(EPICS_BASE)" ]; then \ echo "ERROR: EPICS_BASE is not set."; \ echo " export EPICS_BASE=/path/to/epics/base"; \ echo " then re-run: make backend-epics"; \ exit 1; \ fi @echo "Building with EPICS support" @echo " EPICS_BASE = $(EPICS_BASE)" @echo " EPICS_ARCH = $(EPICS_ARCH)" @mkdir -p dist CGO_ENABLED=1 \ CGO_CFLAGS="$(EPICS_CGO_CFLAGS)" \ CGO_LDFLAGS="$(EPICS_CGO_LDFLAGS)" \ go build -tags epics -ldflags="-s -w" -o $(BINARY) ./cmd/uopi @echo "Built: $(BINARY) (EPICS CA enabled)" # Unstripped binary for debugging backend-debug: $(FRONTEND_OUT) @mkdir -p dist go build -o $(BINARY) ./cmd/uopi # --------------------------------------------------------------------------- # # Dev / CI # # --------------------------------------------------------------------------- # test: go test ./... # Run tests with the race detector enabled. race: go test -race ./... # Run all benchmarks and print memory allocations. bench: go test -bench=. -benchmem -benchtime=3s ./internal/... lint: go vet ./... run: $(BINARY) $(BINARY) clean: rm -rf dist/ web/dist/