add unified makefile for multi-course builds

- dev servers on ports 1311 (index), 1312, 1313
- build/deploy targets for both courses
- qr code generation via nix-shell
- image optimization support
This commit is contained in:
2025-12-30 11:30:24 +01:00
parent 1db4033e47
commit 385bd43be1

217
Makefile Normal file
View File

@@ -0,0 +1,217 @@
# HdM Slides - Unified Makefile
# Supports multiple courses: 223015b (Dateiformate) and 223015c (Internettechnik)
.PHONY: help dev dev-b dev-c build build-b build-c pdf html clean install deploy qr optimize-images
# Course configuration
COURSES = 223015b 223015c
COURSE_DIR = courses
# Course-specific settings
223015b_NAME = Dateiformate, Schnittstellen, Speichermedien
223015b_PORT = 1312
223015b_TERMINS = 2025-12-19-termin-0-intro 2025-12-19-termin-1-grundlagen-text-audio 2026-01-09-termin-2-bild-audio-video 2026-01-23-termin-3-speichermedien-schnittstellen 2026-01-30-termin-4-distribution-apis-zukunft 2026-xx-xx-termin-5-vertiefung-offene-fragen
223015b_DEPLOY_PATH = /home/tengo/html/hdm/223015b
223015c_NAME = Internettechnologien
223015c_PORT = 1313
223015c_TERMINS = 2025-12-20-termin-1-geschichte-grundlagen-html 2026-01-10-termin-2-netzwerke-protokolle-css 2026-01-24-termin-3-interaktivitaet-javascript
223015c_DEPLOY_PATH = /home/tengo/html/hdm/223015c
DEPLOY_HOST = tengo@tuttle.uberspace.de
# Default target
help:
@echo "HdM Slides - Unified Build System"
@echo ""
@echo "Courses:"
@echo " 223015b - Dateiformate, Schnittstellen, Speichermedien"
@echo " 223015c - Internettechnologien"
@echo ""
@echo "Development:"
@echo " make dev - Both servers + index (ports 1311, 1312, 1313)"
@echo " make dev-b - Dev server for 223015b (port 1312)"
@echo " make dev-c - Dev server for 223015c (port 1313)"
@echo ""
@echo "Build:"
@echo " make build - Build all courses"
@echo " make build-b - Build 223015b only"
@echo " make build-c - Build 223015c only"
@echo " make pdf - Export all to PDF"
@echo " make html - Export all to HTML"
@echo ""
@echo "Tools:"
@echo " make qr URL=... - Generate QR code for URL"
@echo " make optimize-images COURSE=223015b - Resize images"
@echo ""
@echo "Deploy:"
@echo " make deploy - Deploy all courses"
@echo " make deploy-b - Deploy 223015b only"
@echo " make deploy-c - Deploy 223015c only"
@echo ""
@echo "Other:"
@echo " make clean - Remove generated files"
@echo " make install - Install dependencies"
# Ensure build directories exist
build/.exists:
@mkdir -p build/223015b build/223015c
@touch $@
# Development servers
dev: dev-index
@echo "Starting all dev servers..."
@echo ""
@echo " Index: http://localhost:1311"
@echo " 223015b: http://localhost:1312"
@echo " 223015c: http://localhost:1313"
@echo ""
@echo "Press Ctrl+C to stop all servers"
@trap 'kill 0' INT; \
PORT=1312 npx @marp-team/marp-cli --server $(COURSE_DIR)/223015b/slides/ & \
PORT=1313 npx @marp-team/marp-cli --server $(COURSE_DIR)/223015c/slides/ & \
python3 -m http.server 1311 --directory .dev-index & \
wait
dev-index:
@mkdir -p .dev-index
@echo '<!DOCTYPE html><html lang="de"><head><meta charset="UTF-8"><title>HdM Slides</title><style>*{box-sizing:border-box}body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;max-width:600px;margin:0 auto;padding:2rem;background:#1a1a2e;color:#eee}h1{color:#fff}a{display:block;background:#16213e;border-radius:8px;padding:1.5rem;margin:1rem 0;text-decoration:none;color:#fff;transition:all .2s}a:hover{background:#1f4068;transform:translateX(5px)}a small{color:#4ecca3;display:block;margin-top:.5rem}</style></head><body><h1>HdM Slides</h1><p style="color:#888">Development Server</p><a href="http://localhost:1312">223015b - Dateiformate<small>Port 1312</small></a><a href="http://localhost:1313">223015c - Internettechnik<small>Port 1313</small></a></body></html>' > .dev-index/index.html
dev-b:
@echo "Starting 223015b dev server on port 1312..."
@echo "Open: http://localhost:1312"
PORT=1312 npx @marp-team/marp-cli --server $(COURSE_DIR)/223015b/slides/
dev-c:
@echo "Starting 223015c dev server on port 1313..."
@echo "Open: http://localhost:1313"
PORT=1313 npx @marp-team/marp-cli --server $(COURSE_DIR)/223015c/slides/
# Build functions
define build_course
@echo "Building $(1)..."
@mkdir -p build/$(1)
@cp -r $(COURSE_DIR)/$(1)/slides/assets build/$(1)/ 2>/dev/null || true
@cp -r $(COURSE_DIR)/$(1)/slides/materials build/$(1)/ 2>/dev/null || true
@for f in $($(1)_TERMINS); do \
if [ -f "$(COURSE_DIR)/$(1)/slides/$$f.md" ]; then \
echo " Building $$f..."; \
npx @marp-team/marp-cli $(COURSE_DIR)/$(1)/slides/$$f.md -o build/$(1)/$$f.html; \
npx @marp-team/marp-cli $(COURSE_DIR)/$(1)/slides/$$f.md --pdf --allow-local-files -o build/$(1)/$$f.pdf; \
fi \
done
@./scripts/generate-index.sh $(1) build/$(1)
endef
build-b: build/.exists
$(call build_course,223015b)
build-c: build/.exists
$(call build_course,223015c)
build: build-b build-c
@echo "All courses built!"
# HTML only builds
define html_course
@echo "Building HTML for $(1)..."
@mkdir -p build/$(1)
@cp -r $(COURSE_DIR)/$(1)/slides/assets build/$(1)/ 2>/dev/null || true
@cp -r $(COURSE_DIR)/$(1)/slides/materials build/$(1)/ 2>/dev/null || true
@for f in $($(1)_TERMINS); do \
if [ -f "$(COURSE_DIR)/$(1)/slides/$$f.md" ]; then \
echo " $$f.html"; \
npx @marp-team/marp-cli $(COURSE_DIR)/$(1)/slides/$$f.md -o build/$(1)/$$f.html; \
fi \
done
@./scripts/generate-index.sh $(1) build/$(1)
endef
html-b: build/.exists
$(call html_course,223015b)
html-c: build/.exists
$(call html_course,223015c)
html: html-b html-c
# PDF only builds
define pdf_course
@echo "Building PDFs for $(1)..."
@mkdir -p build/$(1)
@for f in $($(1)_TERMINS); do \
if [ -f "$(COURSE_DIR)/$(1)/slides/$$f.md" ]; then \
echo " $$f.pdf"; \
npx @marp-team/marp-cli $(COURSE_DIR)/$(1)/slides/$$f.md --pdf --allow-local-files -o build/$(1)/$$f.pdf; \
fi \
done
endef
pdf-b: build/.exists
$(call pdf_course,223015b)
pdf-c: build/.exists
$(call pdf_course,223015c)
pdf: pdf-b pdf-c
# QR Code generation (uses nix-shell)
qr:
ifndef URL
@echo "Usage: make qr URL=https://example.com"
@echo " make qr URL=https://example.com OUTPUT=my-qr.png"
else
@nix-shell -p qrencode --run 'qrencode -o $(or $(OUTPUT),qr-code.png) -s 10 "$(URL)"'
@echo "Generated: $(or $(OUTPUT),qr-code.png)"
endif
# QR code for a slide deck URL
qr-slides:
ifndef COURSE
@echo "Usage: make qr-slides COURSE=223015b"
else
@nix-shell -p qrencode --run 'qrencode -o build/$(COURSE)/qr-$(COURSE).png -s 10 "https://librete.ch/hdm/$(COURSE)/"'
@echo "Generated: build/$(COURSE)/qr-$(COURSE).png"
endif
# Optimize images
optimize-images:
ifndef COURSE
@echo "Usage: make optimize-images COURSE=223015b"
else
@echo "Optimizing images for $(COURSE)..."
@mkdir -p $(COURSE_DIR)/$(COURSE)/slides/assets-original
@nix-shell -p imagemagick --run 'for img in $(COURSE_DIR)/$(COURSE)/slides/assets/*.png $(COURSE_DIR)/$(COURSE)/slides/assets/*.jpg 2>/dev/null; do \
[ -f "$$img" ] && cp "$$img" $(COURSE_DIR)/$(COURSE)/slides/assets-original/ && \
magick "$$img" -resize "1920x>" -quality 85 "$$img" && echo " Optimized: $$(basename $$img)"; \
done || true'
@echo "Done! Originals in assets-original/"
endif
# Deploy
define deploy_course
@echo "Deploying $(1)..."
scp build/$(1)/*.html $(DEPLOY_HOST):$($(1)_DEPLOY_PATH)/
scp -r build/$(1)/assets/ $(DEPLOY_HOST):$($(1)_DEPLOY_PATH)/
scp -r build/$(1)/materials/ $(DEPLOY_HOST):$($(1)_DEPLOY_PATH)/ 2>/dev/null || true
@echo "$(1) deployed!"
endef
deploy-b: build-b
$(call deploy_course,223015b)
deploy-c: build-c
$(call deploy_course,223015c)
deploy: deploy-b deploy-c
@echo "All courses deployed!"
# Clean
clean:
@echo "Cleaning generated files..."
rm -rf build/ .dev-index/ *.pdf *.html qr-code.png
# Install dependencies
install:
@echo "Installing dependencies..."
npm install