Rework build system

Replace the dpkg-buildpackage / debhelper rig with the same pattern
used in vpp-maglev and govpp-snmp-agentx: a Makefile that
cross-compiles CGO-free static binaries for amd64 and arm64, plus a
debian/build-deb.sh that stages the .deb directly with dpkg-deb. The
two arch packages drop into build/ and run on any glibc/musl Linux of
the matching arch.

VERSION is parsed once from debian/changelog and injected at link
time via -ldflags "-X 'main.Version=...' -X 'main.Commit=...' -X
'main.Date=...'", so 's3-genindex -version' is the source of truth
for which build is running. The Version constant in main.go becomes
a var to make this work; the old sync-version make target is gone.

Removes the now-unused debian/{control,rules,install,compat} files
and the matching debhelper artifact entries from .gitignore. build/
is added to .gitignore.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-06 20:11:55 +02:00
parent 12e91032a1
commit 312e9245f8
9 changed files with 102 additions and 150 deletions
+1 -10
View File
@@ -1,15 +1,6 @@
/s3-genindex /s3-genindex
build/
# Generated index files # Generated index files
**/index.html **/index.html
coverage.* coverage.*
# Debian packaging artifacts
debian/.debhelper/
debian/.gocache/
debian/go/
debian/s3-genindex/
debian/files
debian/*.substvars
debian/debhelper-build-stamp
debian/*.debhelper
+45 -94
View File
@@ -1,108 +1,59 @@
.PHONY: build clean wipe test help sync-version pkg-deb PROG := s3-genindex
MODULE := git.ipng.ch/ipng/s3-genindex
NATIVE_ARCH := $(shell go env GOARCH)
VERSION := ${shell head -1 debian/changelog | sed -n 's/.*(\([^)]*\)).*/\1/p'}
COMMIT_HASH := $(shell git rev-parse --short HEAD 2>/dev/null || echo unknown)
DATE := $(shell date -u +%Y-%m-%dT%H:%M:%SZ)
LDFLAGS := -s -w \
-X 'main.Version=$(VERSION)' \
-X 'main.Commit=$(COMMIT_HASH)' \
-X 'main.Date=$(DATE)'
# Default target # CGO_ENABLED=0 yields a fully static binary so the same .deb runs on
all: build # any glibc/musl Linux of the matching arch. The AWS SDK and the rest
# of this codebase are pure Go, so this has no behavioural impact
# beyond switching net/dns to the pure-Go resolver.
export CGO_ENABLED := 0
# Build the binary .PHONY: help all build build-amd64 build-arm64 test pkg-deb fmt vet lint check clean
build:
@echo "Building s3-genindex..."
go build -o s3-genindex ./cmd/s3-genindex
@echo "Build complete: s3-genindex"
# Run tests help: ## Show this help
test: @printf "Usage: make <target>\n\nTargets:\n"
@echo "Running tests..." @awk -F ':.*## ' '/^[A-Za-z][A-Za-z0-9_-]*:.*## / {printf " %-16s %s\n", $$1, $$2}' $(MAKEFILE_LIST)
go test -v ./...
@echo "Tests complete"
# Run tests with coverage all: build ## Alias for build (native arch)
test-coverage:
@echo "Running tests with coverage..."
go test -v -coverprofile=coverage.out ./...
go tool cover -html=coverage.out -o coverage.html
@echo "Coverage report generated: coverage.html"
# Clean build artifacts build: ## Build the binary for the host architecture
clean: mkdir -p build/$(NATIVE_ARCH)
@echo "Cleaning build artifacts..." go build -ldflags "$(LDFLAGS)" -o build/$(NATIVE_ARCH)/$(PROG) ./cmd/$(PROG)
rm -f s3-genindex
rm -f coverage.out coverage.html
rm -rf debian/s3-genindex debian/files debian/*.substvars debian/debhelper-build-stamp
[ -d debian/go ] && chmod -R +w debian/go || true
rm -rf debian/.gocache debian/go
find . -name index.html -delete
@echo "Clean complete"
# Wipe everything including test caches build-amd64: ## Cross-build the binary for linux/amd64
wipe: clean mkdir -p build/amd64
@echo "Wiping test cache and module cache..." GOOS=linux GOARCH=amd64 go build -ldflags "$(LDFLAGS)" -o build/amd64/$(PROG) ./cmd/$(PROG)
go clean -testcache
go clean -modcache
@echo "Wipe complete"
# Install binary to $GOPATH/bin or $GOBIN build-arm64: ## Cross-build the binary for linux/arm64
install: mkdir -p build/arm64
@echo "Installing s3-genindex..." GOOS=linux GOARCH=arm64 go build -ldflags "$(LDFLAGS)" -o build/arm64/$(PROG) ./cmd/$(PROG)
go install ./cmd/s3-genindex
@echo "Install complete"
# Format code test: ## Run all Go unit tests
fmt: go test ./...
@echo "Formatting code..."
pkg-deb: build-amd64 build-arm64 ## Build .deb packages for amd64 and arm64
debian/build-deb.sh $(PROG) amd64 $(VERSION)
debian/build-deb.sh $(PROG) arm64 $(VERSION)
fmt: ## go fmt everything
go fmt ./... go fmt ./...
@echo "Format complete"
# Vet code for issues vet: ## go vet everything
vet:
@echo "Vetting code..."
go vet ./... go vet ./...
@echo "Vet complete"
# Lint code (requires golangci-lint) lint: ## golangci-lint, if installed
lint: @if command -v golangci-lint >/dev/null 2>&1; then golangci-lint run; else echo "golangci-lint not installed, skipping"; fi
@echo "Linting code..."
@if command -v golangci-lint >/dev/null 2>&1; then \
golangci-lint run; \
else \
echo "golangci-lint not found, skipping lint"; \
fi
# Run all checks check: fmt vet lint test ## Format, vet, lint, and test
check: fmt vet lint test
@echo "All checks passed"
# Run benchmarks clean: ## Remove build artifacts
bench: rm -rf build/
@echo "Running benchmarks..." rm -f $(PROG) coverage.out coverage.html
go test -bench=. ./... find . -name index.html -delete
# Sync version from debian/changelog to source code
sync-version:
@echo "Syncing version..."
@version=$$(head -1 debian/changelog | sed -n 's/.*(\([^)]*\)).*/\1/p'); \
sed -i "s/const Version = .*/const Version = \"$$version\"/" cmd/s3-genindex/main.go; \
echo "Updated version to $$version"
# Build Debian package
pkg-deb: sync-version
@echo "Building Debian package..."
DEB_BUILD_OPTIONS=noautodbgsym fakeroot dpkg-buildpackage -us -uc -b
@echo "Debian package build complete"
# Show help
help:
@echo "Available targets:"
@echo " build - Build the s3-genindex binary"
@echo " test - Run all tests"
@echo " test-coverage - Run tests with coverage report"
@echo " clean - Remove build artifacts"
@echo " wipe - Clean everything including caches"
@echo " install - Install binary to GOPATH/bin"
@echo " fmt - Format code"
@echo " vet - Vet code for issues"
@echo " lint - Lint code (requires golangci-lint)"
@echo " check - Run fmt, vet, lint, and test"
@echo " bench - Run benchmarks"
@echo " sync-version - Sync version from debian/changelog to source"
@echo " pkg-deb - Build Debian package"
@echo " help - Show this help message"
+2 -2
View File
@@ -20,8 +20,8 @@ import (
"git.ipng.ch/ipng/s3-genindex/internal/indexgen" "git.ipng.ch/ipng/s3-genindex/internal/indexgen"
) )
// Version is the application version (sync'd from debian/changelog) // Version is set at link time via -ldflags "-X main.Version=...".
const Version = "1.0.0-1" var Version = "dev"
// S3Config holds S3 connection configuration // S3Config holds S3 connection configuration
type S3Config struct { type S3Config struct {
Vendored Executable
+37
View File
@@ -0,0 +1,37 @@
#!/bin/bash
# SPDX-License-Identifier: Apache-2.0
# Build one s3-genindex .deb for one architecture.
# Usage: build-deb.sh <package> <amd64|arm64> <version>
#
# The version is also baked into the binary at link time (see Makefile
# LDFLAGS), so `s3-genindex -version` is the source of truth for "which
# build". The .deb itself only carries the release version.
set -euo pipefail
PACKAGE="${1:?usage: build-deb.sh <package> <amd64|arm64> <version>}"
ARCH="${2:?usage: build-deb.sh <package> <amd64|arm64> <version>}"
VERSION="${3:?usage: build-deb.sh <package> <amd64|arm64> <version>}"
REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
PKG="${PACKAGE}_${VERSION}_${ARCH}"
STAGING="$(mktemp -d)"
trap 'rm -rf "$STAGING"' EXIT
echo "Building ${PKG}.deb"
install -d "$STAGING/DEBIAN"
install -d "$STAGING/usr/bin"
install -d "$STAGING/usr/share/man/man1"
# s3-genindex is a CLI tool, so /usr/bin (on every login PATH) is the
# right place; no /usr/sbin, no systemd unit, no /etc conffile.
install -m 755 "$REPO_ROOT/build/${ARCH}/${PACKAGE}" "$STAGING/usr/bin/${PACKAGE}"
gzip -9 -c "$REPO_ROOT/docs/${PACKAGE}.1" > "$STAGING/usr/share/man/man1/${PACKAGE}.1.gz"
sed "s/@VERSION@/${VERSION}/;s/@ARCH@/${ARCH}/" \
"$REPO_ROOT/debian/${PACKAGE}.control.in" > "$STAGING/DEBIAN/control"
mkdir -p "$REPO_ROOT/build"
OUT="$REPO_ROOT/build/${PKG}.deb"
dpkg-deb --build --root-owner-group "$STAGING" "$OUT"
echo "Built: $OUT"
-1
View File
@@ -1 +0,0 @@
10
-21
View File
@@ -1,21 +0,0 @@
Source: s3-genindex
Section: utils
Priority: optional
Maintainer: Pim van Pelt <pim@ipng.ch>
Build-Depends: debhelper (>= 10), golang-go
Standards-Version: 4.1.2
Homepage: https://git.ipng.ch/ipng/s3-genindex
Package: s3-genindex
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: HTML directory index generator for local and S3 storage
Generate HTML directory indexes with file type icons and responsive design
for local directories and S3-compatible storage. This is particularly useful
for S3 buckets that are publicly readable.
.
Features include local directory indexing with recursive traversal,
S3-compatible storage support (MinIO, AWS S3, etc.), hierarchical directory
structure for S3 buckets, responsive HTML design with file type icons,
dry run mode for testing, flexible filtering with glob patterns and regex
exclusion, and hidden file control.
-2
View File
@@ -1,2 +0,0 @@
s3-genindex usr/bin
docs/s3-genindex.1 usr/share/man/man1
-20
View File
@@ -1,20 +0,0 @@
#!/usr/bin/make -f
export GO111MODULE=on
export GOPROXY=direct
export GOSUMDB=off
export GOCACHE=$(CURDIR)/debian/.gocache
export GOPATH=$(CURDIR)/debian/go
%:
dh $@
override_dh_auto_build:
go build -o s3-genindex ./cmd/s3-genindex
override_dh_auto_test:
go test ./...
override_dh_auto_install:
mkdir -p debian/s3-genindex/usr/bin
cp s3-genindex debian/s3-genindex/usr/bin/
+17
View File
@@ -0,0 +1,17 @@
Package: s3-genindex
Version: @VERSION@
Architecture: @ARCH@
Maintainer: Pim van Pelt <pim@ipng.ch>
Section: utils
Priority: optional
Homepage: https://git.ipng.ch/ipng/s3-genindex
Description: HTML directory index generator for local and S3 storage
Generate HTML directory indexes with file type icons and responsive
design for local directories and S3-compatible storage. Particularly
useful for S3 buckets that are publicly readable.
.
Features include local directory indexing with recursive traversal,
S3-compatible storage support (MinIO, AWS S3, etc.), hierarchical
directory structure for S3 buckets, responsive HTML design with file
type icons, dry run mode for testing, flexible filtering with glob
patterns and regex exclusion, and hidden file control.