final use of c libepics

This commit is contained in:
Martino Ferrari
2026-04-27 12:56:00 +02:00
parent 1bda25454b
commit 47e481a461
3 changed files with 143 additions and 9 deletions
+71 -1
View File
@@ -1,4 +1,4 @@
.PHONY: all frontend backend backend-epics backend-debug test bench race lint clean run
.PHONY: all frontend backend backend-epics backend-debug release release-epics test bench race lint clean run
# --------------------------------------------------------------------------- #
# Sources — adding any file here triggers a frontend or backend rebuild #
@@ -88,6 +88,76 @@ backend-debug: $(FRONTEND_OUT)
@mkdir -p dist
go build -o $(BINARY) ./cmd/uopi
# --------------------------------------------------------------------------- #
# Portable release targets #
# --------------------------------------------------------------------------- #
#
# Two flavours depending on whether EPICS is needed:
#
# make release — pure-Go, CGO_ENABLED=0, 100 % static binary.
# No EPICS; works anywhere without extra libs.
#
# make release-epics — CGO build with EPICS CA.
# Tries to link libca/libCom statically (if .a
# archives are present in $(EPICS_LIBDIR)).
# Falls back to bundled shared libs + $ORIGIN
# rpath when only .so files are available.
# The output directory (dist/release/) contains
# everything needed to run on the target machine.
#
# Cross-compilation (no-EPICS only): override RELEASE_OS / RELEASE_ARCH.
# make release RELEASE_OS=linux RELEASE_ARCH=arm64
RELEASE_OS ?= linux
RELEASE_ARCH ?= amd64
RELEASE_DIR := dist/release
EPICS_LIBDIR := $(EPICS_BASE)/lib/$(EPICS_ARCH)
# Fully static, no CGO — the most portable build possible.
release: $(FRONTEND_OUT)
@mkdir -p $(RELEASE_DIR)
CGO_ENABLED=0 GOOS=$(RELEASE_OS) GOARCH=$(RELEASE_ARCH) \
go build -ldflags="-s -w" -o $(RELEASE_DIR)/uopi ./cmd/uopi
@echo "Built: $(RELEASE_DIR)/uopi (fully static, no EPICS)"
# EPICS release — maximum static linking.
# Strategy A (preferred): if libca.a + libCom.a exist, embed them directly
# → single self-contained binary, no extra files needed.
# Strategy B (fallback): copy the shared libs next to the binary and set an
# $ORIGIN rpath so the OS finds them regardless of installation prefix.
release-epics: $(FRONTEND_OUT)
@if [ -z "$(EPICS_BASE)" ]; then \
echo "ERROR: EPICS_BASE is not set."; \
echo " export EPICS_BASE=/path/to/epics/base"; \
exit 1; \
fi
@mkdir -p $(RELEASE_DIR)
@echo "Building portable EPICS release"
@echo " EPICS_BASE = $(EPICS_BASE)"
@echo " EPICS_ARCH = $(EPICS_ARCH)"
@if [ -f "$(EPICS_LIBDIR)/libca.a" ] && [ -f "$(EPICS_LIBDIR)/libCom.a" ]; then \
echo " Strategy A: static .a archives found — embedding libca + libCom"; \
CGO_ENABLED=1 GOOS=linux GOARCH=$(RELEASE_ARCH) \
CGO_CFLAGS="$(EPICS_CGO_CFLAGS)" \
CGO_LDFLAGS="-Wl,-Bstatic -L$(EPICS_LIBDIR) -lca -lCom -Wl,-Bdynamic -lm -lpthread -lrt -ldl" \
go build -tags epics \
-ldflags="-s -w -linkmode external" \
-o $(RELEASE_DIR)/uopi ./cmd/uopi; \
echo "Built: $(RELEASE_DIR)/uopi (EPICS statically embedded)"; \
else \
echo " Strategy B: no .a archives — bundling shared libs with \$$ORIGIN rpath"; \
CGO_ENABLED=1 GOOS=linux GOARCH=$(RELEASE_ARCH) \
CGO_CFLAGS="$(EPICS_CGO_CFLAGS)" \
CGO_LDFLAGS="-L$(EPICS_LIBDIR) -lca -lCom -Wl,-rpath,\$$ORIGIN" \
go build -tags epics \
-ldflags="-s -w" \
-o $(RELEASE_DIR)/uopi ./cmd/uopi; \
cp $(EPICS_LIBDIR)/libca.so* $(RELEASE_DIR)/; \
cp $(EPICS_LIBDIR)/libCom.so* $(RELEASE_DIR)/; \
echo "Built: $(RELEASE_DIR)/ (deploy the whole directory together)"; \
ls $(RELEASE_DIR)/; \
fi
# --------------------------------------------------------------------------- #
# Dev / CI #
# --------------------------------------------------------------------------- #