Repository navigation
Expand file tree
/
Copy pathMakefile
More file actions
184 lines (155 loc) · 8.2 KB
/
Copy pathMakefile
File metadata and controls
184 lines (155 loc) · 8.2 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
SHELL := /usr/bin/env sh
ROOT := $(CURDIR)
CRATES_DIR := $(ROOT)/crates
ADDON_DIR := $(ROOT)/addon
DIST_DIR := $(ROOT)/dist
MANIFEST_DIR:= $(ROOT)/manifests
RELEASE_DIR := $(CRATES_DIR)/target/release
DAEMON_BIN := $(RELEASE_DIR)/webhid-daemon
NM_BIN := $(RELEASE_DIR)/webhid-native-messaging
PREFIX ?= /usr/local
USER_PREFIX ?= $(HOME)/.local
WEBHID_GROUP?= webhid
NM_MANIFEST := $(MANIFEST_DIR)/webhid.forwarder_nm_host.json
NM_NAME := webhid.forwarder_nm_host.json
DAEMON_NM_MANIFEST:= $(MANIFEST_DIR)/webhid.daemon_nm_host.json
DAEMON_NM_NAME := webhid.daemon_nm_host.json
SYSTEM_NM_DIR ?= /usr/lib/mozilla/native-messaging-hosts
SYSTEMD_DIR ?= /etc/systemd/system
UDEV_DIR ?= /etc/udev/rules.d
USER_NM_DIR ?= $(HOME)/.mozilla/native-messaging-hosts
USER_SYSTEMD_DIR ?= $(HOME)/.config/systemd/user
.PHONY: all build \
install install-system install-user install-udev-rule \
install-e2e-udev-rule \
install-webhid-group \
install-daemon-nm-host-system install-daemon-nm-host-user \
uninstall uninstall-system uninstall-user \
clean test help
all: build
## ---- Build ----
## `build-addon`, `package`, `windows-msi`, and `bump*` moved to package.json
## (npm run build:addon / build / build:msi / release*): they were pure
## npx/node/powershell wrappers with no Make-specific value.
build:
@echo "==> Building Rust crates (release)…"
npm run build:rs
## ---- Install ----
## System-wide: requires root, binaries+NM manifest shared for all users
## User-only: no root needed, installs into $HOME
install: install-system
install-system: build
@echo "==> Installing binaries to $(PREFIX)/bin/"
install -Dm755 "$(DAEMON_BIN)" "$(DESTDIR)$(PREFIX)/bin/webhid-daemon"
install -Dm755 "$(NM_BIN)" "$(DESTDIR)$(PREFIX)/bin/webhid-native-messaging"
@echo "==> Installing native-messaging manifest to $(SYSTEM_NM_DIR)"
sed 's|{{NM_BIN}}|$(PREFIX)/bin/webhid-native-messaging|g' \
"$(NM_MANIFEST)" | install -Dm644 /dev/stdin "$(DESTDIR)$(SYSTEM_NM_DIR)/$(NM_NAME)"
@echo "==> Installing daemon-as-NM-host manifest to $(SYSTEM_NM_DIR)"
sed 's|{{DAEMON_BIN}}|$(PREFIX)/bin/webhid-daemon|g' \
"$(DAEMON_NM_MANIFEST)" | install -Dm644 /dev/stdin "$(DESTDIR)$(SYSTEM_NM_DIR)/$(DAEMON_NM_NAME)"
@echo "==> Installing systemd service"
sed 's|{{DAEMON_BIN}}|$(PREFIX)/bin/webhid-daemon|g' \
"$(MANIFEST_DIR)/webhid-daemon.service" | install -Dm644 /dev/stdin "$(DESTDIR)$(SYSTEMD_DIR)/webhid-daemon.service"
@if [ -z "$(DESTDIR)" ]; then $(MAKE) install-webhid-group; else \
echo "==> DESTDIR set (packaging build) — skipping group creation;" \
"package should create '$(WEBHID_GROUP)' via post-install scriptlet"; fi
@echo "Run: systemctl daemon-reload && systemctl enable --now webhid-daemon.service"
@echo "Done. Load the addon in Firefox (about:debugging → Load Temporary Add-on)."
install-webhid-group:
@echo "==> Ensuring '$(WEBHID_GROUP)' group exists"
@getent group $(WEBHID_GROUP) >/dev/null || groupadd --system $(WEBHID_GROUP)
@if [ -n "$$SUDO_USER" ]; then \
echo "==> Adding $$SUDO_USER to '$(WEBHID_GROUP)' group"; \
usermod -aG $(WEBHID_GROUP) "$$SUDO_USER"; \
echo " (log out/in, or 'newgrp $(WEBHID_GROUP)', for this to take effect)"; \
else \
echo "==> Run 'sudo usermod -aG $(WEBHID_GROUP) \$$USER' to grant your user access"; \
fi
install-user: build
@echo "==> Installing binaries to $(USER_PREFIX)/bin/"
install -Dm755 "$(DAEMON_BIN)" "$(USER_PREFIX)/bin/webhid-daemon"
install -Dm755 "$(NM_BIN)" "$(USER_PREFIX)/bin/webhid-native-messaging"
@echo "==> Installing native-messaging manifest to $(USER_NM_DIR)"
@mkdir -p "$(USER_NM_DIR)"
sed 's|{{NM_BIN}}|$(USER_PREFIX)/bin/webhid-native-messaging|g' \
"$(NM_MANIFEST)" > "$(USER_NM_DIR)/$(NM_NAME)"
chmod 644 "$(USER_NM_DIR)/$(NM_NAME)"
@echo "==> Installing daemon-as-NM-host manifest to $(USER_NM_DIR)"
sed 's|{{DAEMON_BIN}}|$(USER_PREFIX)/bin/webhid-daemon|g' \
"$(DAEMON_NM_MANIFEST)" > "$(USER_NM_DIR)/$(DAEMON_NM_NAME)"
chmod 644 "$(USER_NM_DIR)/$(DAEMON_NM_NAME)"
@echo "==> Installing systemd user service to $(USER_SYSTEMD_DIR)"
@mkdir -p "$(USER_SYSTEMD_DIR)"
sed 's|{{DAEMON_BIN}}|$(USER_PREFIX)/bin/webhid-daemon|g' \
"$(MANIFEST_DIR)/webhid-daemon.user.service" > "$(USER_SYSTEMD_DIR)/webhid-daemon.service"
chmod 644 "$(USER_SYSTEMD_DIR)/webhid-daemon.service"
@echo "Run: systemctl --user daemon-reload && systemctl --user enable --now webhid-daemon.service"
@echo "Done. Load the addon in Firefox (about:debugging → Load Temporary Add-on)."
install-udev-rule:
@echo "==> Installing udev rule to $(UDEV_DIR)/"
install -Dm644 "$(MANIFEST_DIR)/72-webhid.rules" "$(DESTDIR)$(UDEV_DIR)/72-webhid.rules"
udevadm control --reload-rules && udevadm trigger
@echo "Done."
install-e2e-udev-rule: install-webhid-group
@echo "==> Installing e2e udev rule to $(UDEV_DIR)/"
install -Dm644 "$(MANIFEST_DIR)/72-webhid-e2e.rules" "$(DESTDIR)$(UDEV_DIR)/72-webhid-e2e.rules"
modprobe uhid 2>/dev/null || true
udevadm control --reload-rules && udevadm trigger
@echo "Done. Users in the '$(WEBHID_GROUP)' group can now run tests/conformance without root."
## ---- Daemon-as-NM-host mode ----
## Installs only the daemon binary + its own NM manifest. The daemon speaks
## the native-messaging protocol directly on stdin/stdout (no separate
## forwarder, no Unix socket). Requires the udev rule for hidraw access.
## Use this when you want the addon's "Daemon as NM host" toggle to work.
install-daemon-nm-host-system: build
@echo "==> Installing daemon binary to $(PREFIX)/bin/"
install -Dm755 "$(DAEMON_BIN)" "$(DESTDIR)$(PREFIX)/bin/webhid-daemon"
@echo "==> Installing daemon-as-NM-host manifest to $(SYSTEM_NM_DIR)"
sed 's|{{DAEMON_BIN}}|$(PREFIX)/bin/webhid-daemon|g' \
"$(DAEMON_NM_MANIFEST)" | install -Dm644 /dev/stdin "$(DESTDIR)$(SYSTEM_NM_DIR)/$(DAEMON_NM_NAME)"
@echo "Enable 'Daemon as NM host' in the addon settings to use this mode."
@echo "Make sure the udev rule is installed: sudo make install-udev-rule"
@echo "Stop any root daemon if running: sudo systemctl disable --now webhid-daemon"
install-daemon-nm-host-user: build
@echo "==> Installing daemon binary to $(USER_PREFIX)/bin/"
install -Dm755 "$(DAEMON_BIN)" "$(USER_PREFIX)/bin/webhid-daemon"
@echo "==> Installing daemon-as-NM-host manifest to $(USER_NM_DIR)"
@mkdir -p "$(USER_NM_DIR)"
sed 's|{{DAEMON_BIN}}|$(USER_PREFIX)/bin/webhid-daemon|g' \
"$(DAEMON_NM_MANIFEST)" > "$(USER_NM_DIR)/$(DAEMON_NM_NAME)"
chmod 644 "$(USER_NM_DIR)/$(DAEMON_NM_NAME)"
@echo "Enable 'Daemon as NM host' in the addon settings to use this mode."
@echo "Make sure the udev rule is installed: sudo make install-udev-rule"
@echo "Stop any root daemon if running: sudo systemctl disable --now webhid-daemon"
uninstall: uninstall-system
uninstall-system:
rm -f "$(DESTDIR)$(PREFIX)/bin/webhid-daemon"
rm -f "$(DESTDIR)$(PREFIX)/bin/webhid-native-messaging"
rm -f "$(DESTDIR)$(SYSTEM_NM_DIR)/$(NM_NAME)"
rm -f "$(DESTDIR)$(SYSTEM_NM_DIR)/$(DAEMON_NM_NAME)"
rm -f "$(DESTDIR)$(SYSTEMD_DIR)/webhid-daemon.service"
uninstall-user:
rm -f "$(USER_PREFIX)/bin/webhid-daemon"
rm -f "$(USER_PREFIX)/bin/webhid-native-messaging"
rm -f "$(USER_NM_DIR)/$(NM_NAME)"
rm -f "$(USER_NM_DIR)/$(DAEMON_NM_NAME)"
rm -f "$(USER_SYSTEMD_DIR)/webhid-daemon.service"
## ---- Misc ----
test:
npm run test:rs
clean:
npm run clean
help:
@echo "Targets:"
@echo " build - cargo build --release (daemon + nm host)"
@echo " (npm run build / build:addon / build:msi / release* - see package.json)"
@echo " install-system - install binaries + NM manifest + systemd service (needs root)"
@echo " install-webhid-group - create 'webhid' group + add current user (needs root)"
@echo " install-user - install binaries + NM manifest + systemd user service (no root)"
@echo " install-udev-rule - install udev rule for hidraw access (needs root)"
@echo " install-e2e-udev-rule - install e2e udev rule (uhid + hidraw VID 16C0) + webhid group (needs root)"
@echo " install-daemon-nm-host-system - install daemon + daemon-as-NM-host manifest (needs root)"
@echo " install-daemon-nm-host-user - same, user-local (no root)"
@echo " uninstall-system / uninstall-user"
@echo " clean - remove build artifacts"