-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
103 lines (89 loc) · 3.67 KB
/
Copy pathMakefile
File metadata and controls
103 lines (89 loc) · 3.67 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
SHELL := /bin/sh
CARGO ?= cargo
SUDO ?= sudo
INSTALL ?= install
SYSTEMCTL ?= systemctl
MODPROBE ?= modprobe
UDEVADM ?= udevadm
CHGRP ?= chgrp
CHMOD ?= chmod
BINDIR ?= /usr/local/bin
SYSTEMD_UNIT_DIR ?= /etc/systemd/system
MODPROBE_DIR ?= /etc/modprobe.d
MODULES_LOAD_DIR ?= /etc/modules-load.d
CONFIG_DIR ?= /etc/camera-fixd
DOCDIR ?= /usr/local/share/doc/camera-fixd
UDEV_RULES_DIR ?= /etc/udev/rules.d
SERVICE_NAME ?= camera-fixd
SERVICE_USER ?= camera-fixd
SERVICE_GROUP ?= camera-fixd
BIN_FILE := $(BINDIR)/camera-fixd
UNIT_FILE := $(SYSTEMD_UNIT_DIR)/$(SERVICE_NAME).service
MODPROBE_FILE := $(MODPROBE_DIR)/$(SERVICE_NAME).conf
MODULES_LOAD_FILE := $(MODULES_LOAD_DIR)/$(SERVICE_NAME).conf
CONFIG_FILE := $(CONFIG_DIR)/config.toml
UDEV_RULE_FILE := $(UDEV_RULES_DIR)/70-camera-fixd-v4l2loopback.rules
.DEFAULT_GOAL := help
.PHONY: help build dev list test lint check install uninstall
help:
@printf '%s\n' \
'Targets:' \
' make build Build the release binary with the lock file.' \
' make dev Run the supervisor from the current terminal.' \
' make list Diagnose V4L2 matching without changing devices.' \
' make test Run hardware-independent tests.' \
' make lint Run rustfmt and clippy checks.' \
' make check Run lint and tests.' \
' make install Install and start the systemd service.' \
' make uninstall Stop and remove installed program files.'
build:
$(CARGO) build --release --locked
dev: build
RUST_LOG=camera_fixd=debug ./target/release/camera-fixd run
list:
$(CARGO) run --quiet --locked -- list
test:
$(CARGO) test --all-targets --locked
lint:
$(CARGO) fmt --all -- --check
$(CARGO) clippy --all-targets --all-features --locked -- -D warnings
check: lint test
install: build
@command -v v4l2loopback-ctl >/dev/null || { \
printf '%s\n' 'v4l2loopback-ctl is required; install the v4l2loopback utilities package.' >&2; \
exit 1; \
}
@if ! getent group "$(SERVICE_GROUP)" >/dev/null; then \
$(SUDO) groupadd --system "$(SERVICE_GROUP)"; \
fi
@if ! id -u "$(SERVICE_USER)" >/dev/null 2>&1; then \
$(SUDO) useradd --system --no-create-home --gid "$(SERVICE_GROUP)" \
--shell /usr/sbin/nologin "$(SERVICE_USER)"; \
fi
$(SUDO) $(INSTALL) -Dm755 target/release/camera-fixd "$(BIN_FILE)"
$(SUDO) $(INSTALL) -Dm644 README.md "$(DOCDIR)/README.md"
$(SUDO) $(INSTALL) -Dm644 ARCHITECTURE.md "$(DOCDIR)/ARCHITECTURE.md"
$(SUDO) $(INSTALL) -Dm644 systemd/camera-fixd.service "$(UNIT_FILE)"
$(SUDO) $(INSTALL) -Dm644 systemd/v4l2loopback.conf "$(MODPROBE_FILE)"
$(SUDO) $(INSTALL) -Dm644 systemd/v4l2loopback.modules-load.conf "$(MODULES_LOAD_FILE)"
$(SUDO) $(INSTALL) -Dm644 systemd/70-camera-fixd-v4l2loopback.rules "$(UDEV_RULE_FILE)"
$(SUDO) $(UDEVADM) control --reload-rules
@if ! $(SUDO) test -e "$(CONFIG_FILE)"; then \
$(SUDO) $(INSTALL) -Dm640 -g "$(SERVICE_GROUP)" config.example.toml "$(CONFIG_FILE)"; \
fi
$(SUDO) $(MODPROBE) v4l2loopback
@if $(SUDO) test -e /dev/v4l2loopback; then \
$(SUDO) $(CHGRP) "$(SERVICE_GROUP)" /dev/v4l2loopback; \
$(SUDO) $(CHMOD) 0660 /dev/v4l2loopback; \
fi
$(SUDO) $(SYSTEMCTL) daemon-reload
$(SUDO) $(SYSTEMCTL) enable --now "$(SERVICE_NAME).service"
uninstall:
@$(SUDO) $(SYSTEMCTL) disable --now "$(SERVICE_NAME).service" >/dev/null 2>&1 || true
$(SUDO) rm -f "$(UNIT_FILE)" "$(BIN_FILE)" "$(MODPROBE_FILE)" "$(MODULES_LOAD_FILE)" \
"$(UDEV_RULE_FILE)" \
"$(DOCDIR)/README.md" "$(DOCDIR)/ARCHITECTURE.md"
$(SUDO) $(UDEVADM) control --reload-rules
$(SUDO) $(SYSTEMCTL) daemon-reload
@$(SUDO) $(SYSTEMCTL) reset-failed "$(SERVICE_NAME).service" >/dev/null 2>&1 || true
@printf '%s\n' "Preserved $(CONFIG_FILE), the $(SERVICE_USER) account, and the $(SERVICE_GROUP) group."