-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathMakefile
More file actions
299 lines (258 loc) · 11.3 KB
/
Makefile
File metadata and controls
299 lines (258 loc) · 11.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
# Makefile for ffdash VP9 Encoder
# Supports both Ubuntu (Linux) and macOS
# Project metadata
PROJECT_NAME := ffdash
VERSION := $(shell grep '^version' Cargo.toml | head -1 | cut -d'"' -f2)
TARGET_DIR := target
RELEASE_DIR := $(TARGET_DIR)/release
DEBUG_DIR := $(TARGET_DIR)/debug
# Installation paths
PREFIX ?= /usr/local
BINDIR := $(PREFIX)/bin
# Detect OS
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Linux)
OS := linux
PKG_MANAGER := apt
INSTALL_CMD := sudo apt-get install -y
FFMPEG_PKG := ffmpeg
else ifeq ($(UNAME_S),Darwin)
OS := macos
PKG_MANAGER := brew
INSTALL_CMD := brew install
FFMPEG_PKG := ffmpeg
else
$(error Unsupported operating system: $(UNAME_S))
endif
# Rust toolchain
CARGO := cargo
RUSTC := rustc
# Build flags
CARGO_BUILD_FLAGS :=
CARGO_RELEASE_FLAGS := --release
# Git configuration (set to 1 to use system git for private repos)
USE_GIT_CLI ?= 0
ifeq ($(USE_GIT_CLI),1)
export CARGO_NET_GIT_FETCH_WITH_CLI := true
endif
# Colors for output
COLOR_RESET := \033[0m
COLOR_BOLD := \033[1m
COLOR_GREEN := \033[32m
COLOR_YELLOW := \033[33m
COLOR_BLUE := \033[34m
.PHONY: all build release debug install uninstall clean test check fmt clippy help deps install-rust install-ffmpeg docker-build docker-build-dev docker-run docker-dev-shell docker-push check-ui validate-profiles remote-smoke remote-test
# Default target
all: release
# Help target
help:
@echo "$(COLOR_BOLD)ffdash VP9 Encoder - Build System$(COLOR_RESET)"
@echo ""
@echo "$(COLOR_BOLD)Platform:$(COLOR_RESET) $(OS) ($(UNAME_S))"
@echo "$(COLOR_BOLD)Version:$(COLOR_RESET) $(VERSION)"
@echo ""
@echo "$(COLOR_BOLD)Available targets:$(COLOR_RESET)"
@echo " $(COLOR_GREEN)make build$(COLOR_RESET) - Build debug version"
@echo " $(COLOR_GREEN)make release$(COLOR_RESET) - Build release version (optimized)"
@echo " $(COLOR_GREEN)make debug$(COLOR_RESET) - Build debug version (alias)"
@echo " $(COLOR_GREEN)make install$(COLOR_RESET) - Install to $(BINDIR)"
@echo " $(COLOR_GREEN)make uninstall$(COLOR_RESET) - Uninstall from $(BINDIR)"
@echo " $(COLOR_GREEN)make clean$(COLOR_RESET) - Remove build artifacts"
@echo " $(COLOR_GREEN)make test$(COLOR_RESET) - Run tests"
@echo " $(COLOR_GREEN)make check$(COLOR_RESET) - Check code without building"
@echo " $(COLOR_GREEN)make check-ui$(COLOR_RESET) - Check UI interaction coverage"
@echo " $(COLOR_GREEN)make fmt$(COLOR_RESET) - Format code with rustfmt"
@echo " $(COLOR_GREEN)make clippy$(COLOR_RESET) - Lint code with clippy"
@echo " $(COLOR_GREEN)make deps$(COLOR_RESET) - Install all dependencies"
@echo " $(COLOR_GREEN)make install-rust$(COLOR_RESET) - Install Rust toolchain"
@echo " $(COLOR_GREEN)make install-ffmpeg$(COLOR_RESET) - Install FFmpeg"
@echo " $(COLOR_GREEN)make docker-build$(COLOR_RESET) - Build runtime Docker image (ffmpeg + ffdash)"
@echo " $(COLOR_GREEN)make docker-build-dev$(COLOR_RESET) - Build dev Docker image (toolchain inside)"
@echo " $(COLOR_GREEN)make docker-run$(COLOR_RESET) - Run runtime Docker container"
@echo " $(COLOR_GREEN)make docker-dev-shell$(COLOR_RESET) - Shell into dev container via docker compose"
@echo " $(COLOR_GREEN)make help$(COLOR_RESET) - Show this help message"
@echo " $(COLOR_GREEN)make validate-profiles$(COLOR_RESET) - Validate profiles before remote deployment"
@echo " $(COLOR_GREEN)make remote-smoke$(COLOR_RESET) - Run smoke test on remote hardware host"
@echo " $(COLOR_GREEN)make remote-test$(COLOR_RESET) - Deploy + test with real clips on remote host"
@echo ""
@echo "$(COLOR_BOLD)Examples:$(COLOR_RESET)"
@echo " make deps # Install all dependencies"
@echo " make release # Build optimized binary"
@echo " sudo make install # Install to system"
@echo " make release USE_GIT_CLI=1 # Build using system git (for private repos)"
@echo " make validate-profiles PROFILES=av1-qsv,av1-vaapi # Validate profiles"
@echo " make remote-smoke HOST=hw-container # Test on hardware container"
@echo " make remote-test HOST=hw-container CLIPS=clip1.mp4 # Test with real clip"
@echo ""
@echo "$(COLOR_BOLD)Private Git Dependencies:$(COLOR_RESET)"
@echo " If you have private git dependencies, use:"
@echo " $(COLOR_YELLOW)USE_GIT_CLI=1 make release$(COLOR_RESET)"
@echo ""
# Build targets
build: debug
debug:
@echo "$(COLOR_BLUE)Building $(PROJECT_NAME) (debug)...$(COLOR_RESET)"
$(CARGO) build $(CARGO_BUILD_FLAGS)
@echo "$(COLOR_GREEN)✓ Debug build complete: $(DEBUG_DIR)/$(PROJECT_NAME)$(COLOR_RESET)"
release:
@echo "$(COLOR_BLUE)Building $(PROJECT_NAME) (release)...$(COLOR_RESET)"
$(CARGO) build $(CARGO_RELEASE_FLAGS)
@echo "$(COLOR_GREEN)✓ Release build complete: $(RELEASE_DIR)/$(PROJECT_NAME)$(COLOR_RESET)"
# Install targets
install:
@if [ ! -f "$(RELEASE_DIR)/$(PROJECT_NAME)" ]; then \
if command -v cargo >/dev/null 2>&1; then \
echo "$(COLOR_BLUE)Binary not found, building first...$(COLOR_RESET)"; \
$(MAKE) release; \
else \
echo "$(COLOR_RED)Error: $(RELEASE_DIR)/$(PROJECT_NAME) not found$(COLOR_RESET)"; \
echo "$(COLOR_YELLOW)Run 'make release' first (without sudo), then 'sudo make install'$(COLOR_RESET)"; \
exit 1; \
fi \
fi
@echo "$(COLOR_BLUE)Installing $(PROJECT_NAME) to $(BINDIR)...$(COLOR_RESET)"
@mkdir -p $(BINDIR)
install -m 755 $(RELEASE_DIR)/$(PROJECT_NAME) $(BINDIR)/$(PROJECT_NAME)
@echo "$(COLOR_GREEN)✓ Installed to $(BINDIR)/$(PROJECT_NAME)$(COLOR_RESET)"
@echo ""
@echo "$(COLOR_BOLD)Installation complete!$(COLOR_RESET)"
@echo "Run '$(PROJECT_NAME) --help' to get started."
uninstall:
@echo "$(COLOR_BLUE)Uninstalling $(PROJECT_NAME)...$(COLOR_RESET)"
rm -f $(BINDIR)/$(PROJECT_NAME)
@echo "$(COLOR_GREEN)✓ Uninstalled$(COLOR_RESET)"
# Clean targets
clean:
@echo "$(COLOR_BLUE)Cleaning build artifacts...$(COLOR_RESET)"
$(CARGO) clean
@echo "$(COLOR_GREEN)✓ Clean complete$(COLOR_RESET)"
# Test targets
test:
@echo "$(COLOR_BLUE)Running tests...$(COLOR_RESET)"
$(CARGO) test
check:
@echo "$(COLOR_BLUE)Checking code...$(COLOR_RESET)"
$(CARGO) check
check-ui:
@echo "$(COLOR_BLUE)Checking UI interaction coverage...$(COLOR_RESET)"
@./scripts/check-ui-logic.sh
# Code quality targets
fmt:
@echo "$(COLOR_BLUE)Formatting code...$(COLOR_RESET)"
$(CARGO) fmt
@echo "$(COLOR_GREEN)✓ Code formatted$(COLOR_RESET)"
clippy:
@echo "$(COLOR_BLUE)Running clippy...$(COLOR_RESET)"
$(CARGO) clippy -- -D warnings
# Dependency installation
deps: install-rust install-ffmpeg
@echo "$(COLOR_GREEN)✓ All dependencies installed$(COLOR_RESET)"
install-rust:
@echo "$(COLOR_BLUE)Checking Rust installation...$(COLOR_RESET)"
@if command -v $(CARGO) >/dev/null 2>&1; then \
echo "$(COLOR_GREEN)✓ Rust already installed ($(shell $(RUSTC) --version))$(COLOR_RESET)"; \
else \
echo "$(COLOR_YELLOW)Installing Rust toolchain...$(COLOR_RESET)"; \
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y; \
echo "$(COLOR_GREEN)✓ Rust installed$(COLOR_RESET)"; \
echo "$(COLOR_YELLOW)Please run: source $$HOME/.cargo/env$(COLOR_RESET)"; \
fi
install-ffmpeg:
@echo "$(COLOR_BLUE)Checking FFmpeg installation...$(COLOR_RESET)"
@if command -v ffmpeg >/dev/null 2>&1; then \
echo "$(COLOR_GREEN)✓ FFmpeg already installed ($(shell ffmpeg -version | head -1))$(COLOR_RESET)"; \
else \
echo "$(COLOR_YELLOW)Installing FFmpeg...$(COLOR_RESET)"; \
if [ "$(OS)" = "linux" ]; then \
sudo apt-get update && $(INSTALL_CMD) $(FFMPEG_PKG); \
else \
$(INSTALL_CMD) $(FFMPEG_PKG); \
fi; \
echo "$(COLOR_GREEN)✓ FFmpeg installed$(COLOR_RESET)"; \
fi
# Version info
version:
@echo "$(PROJECT_NAME) version $(VERSION)"
@echo "OS: $(OS)"
@echo "Rust: $(shell $(RUSTC) --version 2>/dev/null || echo 'not installed')"
@echo "FFmpeg: $(shell ffmpeg -version 2>/dev/null | head -1 || echo 'not installed')"
# Development helpers
dev: debug
@echo "$(COLOR_BLUE)Running in development mode...$(COLOR_RESET)"
$(DEBUG_DIR)/$(PROJECT_NAME)
watch:
@echo "$(COLOR_BLUE)Watching for changes...$(COLOR_RESET)"
$(CARGO) watch -x build
# Benchmark target
bench:
@echo "$(COLOR_BLUE)Running benchmarks...$(COLOR_RESET)"
$(CARGO) bench
# Documentation
docs:
@echo "$(COLOR_BLUE)Building documentation...$(COLOR_RESET)"
$(CARGO) doc --no-deps --open
# Update dependencies
update:
@echo "$(COLOR_BLUE)Updating dependencies...$(COLOR_RESET)"
$(CARGO) update
@echo "$(COLOR_GREEN)✓ Dependencies updated$(COLOR_RESET)"
# Docker targets
DOCKER_IMAGE_NAME := ffdash
DOCKER_TAG := latest
DOCKER_IMAGE_NAME := ffdash
DOCKER_RUNTIME_TAG := latest
DOCKER_DEV_TAG := dev
DOCKER_FILE := docker/Dockerfile
docker-build: docker-build-runtime
docker-build-runtime:
@echo "$(COLOR_BLUE)Building Docker runtime image...$(COLOR_RESET)"
$(MAKE) release
docker build -f $(DOCKER_FILE) --target runtime -t $(DOCKER_IMAGE_NAME):$(DOCKER_RUNTIME_TAG) .
@echo "$(COLOR_GREEN)✓ Docker runtime image built: $(DOCKER_IMAGE_NAME):$(DOCKER_RUNTIME_TAG)$(COLOR_RESET)"
docker-build-dev:
@echo "$(COLOR_BLUE)Building Docker dev image...$(COLOR_RESET)"
docker build -f $(DOCKER_FILE) --target dev -t $(DOCKER_IMAGE_NAME):$(DOCKER_DEV_TAG) .
@echo "$(COLOR_GREEN)✓ Docker dev image built: $(DOCKER_IMAGE_NAME):$(DOCKER_DEV_TAG)$(COLOR_RESET)"
docker-run:
@echo "$(COLOR_BLUE)Running Docker runtime container...$(COLOR_RESET)"
docker run -it --rm \
--device /dev/dri:/dev/dri \
-v /path/to/videos:/video \
$(DOCKER_IMAGE_NAME):$(DOCKER_RUNTIME_TAG)
docker-dev-shell:
@echo "$(COLOR_BLUE)Starting Docker dev shell (docker compose)...$(COLOR_RESET)"
docker compose -f docker/docker-compose.dev.yml run --rm ffdash-dev
docker-push:
@echo "$(COLOR_BLUE)Pushing Docker image to registry...$(COLOR_RESET)"
@echo "$(COLOR_YELLOW)Note: GitHub Actions handles this automatically$(COLOR_RESET)"
@echo "For manual push, tag and push to your registry:"
@echo " docker tag $(DOCKER_IMAGE_NAME):$(DOCKER_RUNTIME_TAG) ghcr.io/YOUR_USERNAME/$(DOCKER_IMAGE_NAME):$(DOCKER_RUNTIME_TAG)"
@echo " docker push ghcr.io/YOUR_USERNAME/$(DOCKER_IMAGE_NAME):$(DOCKER_RUNTIME_TAG)"
@echo " docker tag $(DOCKER_IMAGE_NAME):$(DOCKER_DEV_TAG) ghcr.io/YOUR_USERNAME/$(DOCKER_IMAGE_NAME):$(DOCKER_DEV_TAG)"
@echo " docker push ghcr.io/YOUR_USERNAME/$(DOCKER_IMAGE_NAME):$(DOCKER_DEV_TAG)"
# Remote testing targets
validate-profiles:
@if [ -z "$(PROFILES)" ]; then \
echo "$(COLOR_YELLOW)Usage: make validate-profiles PROFILES=profile1,profile2$(COLOR_RESET)"; \
exit 1; \
fi
@echo "$(COLOR_BLUE)Validating profiles: $(PROFILES)...$(COLOR_RESET)"
$(CARGO) run --bin ffdash --release --features dev-tools -- validate-profile $$(echo $(PROFILES) | tr ',' ' ')
remote-smoke:
@if [ -z "$(HOST)" ]; then \
echo "$(COLOR_YELLOW)Usage: make remote-smoke HOST=<hostname> [FORMAT=json|pretty]$(COLOR_RESET)"; \
exit 1; \
fi
@echo "$(COLOR_BLUE)Running remote smoke test on host: $(HOST)...$(COLOR_RESET)"
./scripts/remote-smoke.sh --host $(HOST) --format $(or $(FORMAT),json)
remote-test:
@if [ -z "$(HOST)" ]; then \
echo "$(COLOR_YELLOW)Usage: make remote-test HOST=<hostname> [CLIPS=clip1.mp4,clip2.mkv]$(COLOR_RESET)"; \
exit 1; \
fi
@echo "$(COLOR_BLUE)Running remote test on host: $(HOST)...$(COLOR_RESET)"
@if [ -n "$(CLIPS)" ]; then \
CLIPS=$(CLIPS) ./scripts/remote-smoke.sh --host $(HOST) --format pretty; \
else \
./scripts/remote-smoke.sh --host $(HOST) --format pretty; \
fi