rs2322tcp/scripts/build.sh
2026-08-09 18:50:25 +02:00

215 lines
6.4 KiB
Bash
Executable file

#!/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}"