timetracker/.tasks/done/TT-016-makefile.md
2026-08-03 21:51:48 +02:00

106 lines
3.7 KiB
Markdown

# TT-016 — Makefile erstellen
**Type:** Story
**Priority:** High
**Labels:** makefile, tooling, build
**Depends on:** TT-014 (Go-Binary), TT-015 (Retention-Script)
**Blocks:** TT-017 (Integration-Test)
---
## Summary
Erstelle das zentrale `Makefile` mit allen Build-, Test- und Deploy-Targets
für das Timetrack Flutter-Projekt.
## Variablen
```makefile
FLUTTER := $(HOME)/flutter/3.41.7/bin/flutter
JAVA_HOME ?= $(HOME)/java/17.0.13+11
ANDROID_HOME ?= $(HOME)/Android/sdk
ADB := $(ANDROID_HOME)/platform-tools/adb
BUILD_VERSION ?= 0.1.0
BUILD_NUMBER ?= 1
PORT ?= 8888
APK_NAME := timetrack-$(BUILD_VERSION)+$(BUILD_NUMBER).apk
APK_DIR := build/apk
APK_LATEST := $(APK_DIR)/timetrack.apk
SERVE_BIN := scripts/serve/serve
```
## Targets
### Dev-Targets
| Target | Befehl | Beschreibung |
|--------|--------|-------------|
| `help` | — | Alle Targets mit Beschreibung ausgeben |
| `install` | `flutter pub get` | Dependencies installieren |
| `generate` | `flutter pub run build_runner build --delete-conflicting-outputs` | Code-Generierung |
| `test` | `flutter test` | Alle Tests ausführen |
| `test_coverage` | `flutter test --coverage` + genhtml | Tests mit Coverage-Report |
| `analyze` | `flutter analyze` | Statische Analyse |
| `format` | `dart format lib/ test/` | Code formatieren |
| `clean` | `flutter clean` + `rm -rf coverage/` | Build-Artefakte löschen |
### Build-Targets
| Target | Beschreibung |
|--------|-------------|
| `build_serve` | Go-Binary `scripts/serve/serve` kompilieren |
| `build_android` | APK (release) + SHA256 + Symlink + Retention |
| `build_aab` | App Bundle für Play Store |
| `build_linux` | Linux Desktop-App |
| `build_web` | Web-App (debug) |
| `build_all` | APK + Linux + Web nacheinander |
### Deploy-Targets
| Target | Beschreibung |
|--------|-------------|
| `install_android` | APK via ADB auf verbundenes Gerät installieren |
| `deploy_android` | `build_android` + `install_android` |
| `serve_apk` | Go-Server starten (kompiliert Binary falls nötig) |
### Info-Targets
| Target | Beschreibung |
|--------|-------------|
| `db_schema` | Drift-Schema-Version und Tabellennamen anzeigen |
## build_android — Detail-Logik
```makefile
build_android:
# 1. JAVA_HOME und ANDROID_HOME prüfen
# 2. flutter build apk --release --build-name --build-number
# 3. mkdir -p $(APK_DIR)
# 4. cp build/app/outputs/flutter-apk/app-release.apk $(APK_DIR)/$(APK_NAME)
# 5. sha256sum $(APK_DIR)/$(APK_NAME) | tee $(APK_DIR)/$(APK_NAME).sha256
# 6. ln -sf $(APK_NAME) $(APK_LATEST)
# 7. bash scripts/apk_retention.sh --dir $(APK_DIR)
# 8. Ausgabe: Pfad, Größe, SHA256, serve_apk-Hinweis
```
## serve_apk — Dependency auf Binary
```makefile
serve_apk: $(SERVE_BIN) # Auto-kompilieren falls binary fehlt
$(SERVE_BIN) --dir $(APK_DIR) --port $(PORT)
$(SERVE_BIN):
cd scripts/serve && go build -o serve .
```
## Acceptance Criteria
- [ ] `make help` listet alle Targets mit Beschreibung
- [ ] `make install` führt `flutter pub get` aus
- [ ] `make test` führt alle Flutter-Tests aus
- [ ] `make analyze` führt `flutter analyze` aus
- [ ] `make format` formatiert Dart-Code
- [ ] `make clean` löscht Build-Artefakte
- [ ] `make build_serve` kompiliert das Go-Binary
- [ ] `make serve_apk` kompiliert Binary automatisch falls fehlend
- [ ] `make build_linux` prüft `ld.lld` und bricht mit Hinweis ab falls fehlend
- [ ] `make build_web` läuft durch (debug-Build)
- [ ] `make build_all` führt APK + Linux + Web nacheinander aus
- [ ] `make db_schema` zeigt Schema-Version und Tabellen an
- [ ] `BUILD_VERSION=0.2.0 BUILD_NUMBER=5 make build_android` nutzt die übergebenen Werte
## Files to create
- `Makefile`