#!/bin/bash # # ============================================================================ # Projekt.....: rs2322tcp # Datei.......: build.sh # # Copyright (C) 2026 Dieter Lang # # SPDX-License-Identifier: GPL-3.0-or-later # # Beschreibung: # Erstellt die Linux- und Windows-Builds des Projektes. # # Die Versionsinformationen werden aus Git ermittelt und beim Build # über den Go-Linker in die Binärdateien eingebettet. # # Gebaut werden: # - Linux amd64: Client und Server # - Linux arm64: Server # - Windows amd64: Client # ============================================================================ # set -e PROJECT=$(basename "$(pwd)") BUILDDIR="build" MODULE=$(go list -m) ############################################################################## # Farben ############################################################################## RED="\033[1;31m" GREEN="\033[1;32m" BLUE="\033[1;34m" YELLOW="\033[1;33m" RESET="\033[0m" ############################################################################## # Zeitmessung ############################################################################## START=$(date +%s) ############################################################################## # Projektinformationen ############################################################################## VERSION=$(git describe --tags --always 2>/dev/null || echo "dev") BUILD=$(git rev-list --count HEAD 2>/dev/null || echo "0") BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") COMMIT=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown") GO_VERSION=$(go version | awk '{print $3}') HOST=$(hostname) DATE=$(date "+%Y-%m-%dT%H:%M:%S") ############################################################################## echo echo -e "${BLUE}" echo "============================================================" echo " ${PROJECT} Build Script" echo "============================================================" echo -e "${RESET}" printf "%-12s %s\n" "Projekt:" "$PROJECT" printf "%-12s %s\n" "Version:" "$VERSION" printf "%-12s %s\n" "Build:" "$BUILD" printf "%-12s %s\n" "Branch:" "$BRANCH" printf "%-12s %s\n" "Commit:" "$COMMIT" printf "%-12s %s\n" "Go:" "$GO_VERSION" printf "%-12s %s\n" "Host:" "$HOST" printf "%-12s %s\n" "Datum:" "$DATE" echo ############################################################################## # Formatieren ############################################################################## echo -e "${YELLOW}Formatiere Quellcode ...${RESET}" gofmt -w . ############################################################################## # Tests ############################################################################## echo -e "${YELLOW}Starte Tests ...${RESET}" go test ./... ############################################################################## # Module bereinigen ############################################################################## echo -e "${YELLOW}Bereinige Module ...${RESET}" go mod tidy ############################################################################## # Build-Verzeichnis ############################################################################## echo -e "${YELLOW}Erzeuge Build-Verzeichnis ...${RESET}" rm -rf "${BUILDDIR}" mkdir -p "${BUILDDIR}" ############################################################################## # Linker-Optionen ############################################################################## LDFLAGS="-s -w \ -X '${MODULE}/internal/version.Version=${VERSION}' \ -X '${MODULE}/internal/version.Build=${BUILD}' \ -X '${MODULE}/internal/version.Commit=${COMMIT}' \ -X '${MODULE}/internal/version.Date=${DATE}'" ############################################################################## # Buildfunktion ############################################################################## build_target() { GOOS=$1 GOARCH=$2 TARGET=$3 PROGRAM=$4 OUTPUT=$5 echo echo -e "${BLUE}Baue ${PROGRAM} für ${TARGET}${RESET}" mkdir -p "${BUILDDIR}/${TARGET}" GOOS="${GOOS}" \ GOARCH="${GOARCH}" \ CGO_ENABLED=0 \ go build \ -trimpath \ -ldflags="${LDFLAGS}" \ -o "${BUILDDIR}/${TARGET}/${OUTPUT}" \ "./cmd/${PROGRAM}" ( cd "${BUILDDIR}/${TARGET}" sha256sum "${OUTPUT}" > "${OUTPUT}.sha256" ) SIZE=$(stat -c%s "${BUILDDIR}/${TARGET}/${OUTPUT}") SIZE_MB=$(awk "BEGIN {printf \"%.2f\", ${SIZE}/1024/1024}") echo -e "${GREEN}OK${RESET}" echo "Größe : ${SIZE_MB} MB" } ############################################################################## # Linux amd64 ############################################################################## build_target linux amd64 linux-amd64 \ rs2322tcp-client rs2322tcp-client build_target linux amd64 linux-amd64 \ rs2322tcp-server rs2322tcp-server ############################################################################## # Linux arm64 ############################################################################## build_target linux arm64 linux-arm64 \ rs2322tcp-server rs2322tcp-server ############################################################################## # Windows amd64 ############################################################################## build_target windows amd64 windows-amd64 \ rs2322tcp-client rs2322tcp-client.exe ############################################################################## # Abschluss ############################################################################## END=$(date +%s) RUNTIME=$((END-START)) TARGETS=4 FILES=$(find "${BUILDDIR}" -type f | wc -l) echo echo -e "${BLUE}" echo "============================================================" echo "Zusammenfassung" echo "============================================================" echo -e "${RESET}" printf "%-12s %s\n" "Targets:" "$TARGETS" printf "%-12s %s\n" "Dateien:" "$FILES" printf "%-12s %s\n" "Builddauer:" "${RUNTIME} Sekunden" echo echo -e "${BLUE}" echo "============================================================" echo "Erzeugte Build-Dateien" echo "============================================================" echo -e "${RESET}" find "${BUILDDIR}" -type f | sort echo echo -e "${GREEN}" echo "============================================================" echo "Alle Builds erfolgreich abgeschlossen." echo "============================================================" echo -e "${RESET}"