130 lines
4.5 KiB
Bash
Executable File
130 lines
4.5 KiB
Bash
Executable File
#!/bin/sh
|
|
# Build a .deb package for gKeyMapper.
|
|
# Usage: scripts/make-deb.sh [version] [arch]
|
|
set -e
|
|
|
|
VERSION="${1:-0.1.0}"
|
|
ARCH="${2:-$(dpkg --print-architecture 2>/dev/null || echo amd64)}"
|
|
PACKAGE="gkeymapper"
|
|
STAGING="build/deb"
|
|
DEB_NAME="${PACKAGE}_${VERSION}_${ARCH}.deb"
|
|
|
|
# Build everything first.
|
|
make all translations
|
|
|
|
rm -rf "$STAGING"
|
|
mkdir -p "$STAGING/DEBIAN"
|
|
|
|
# Stage files with Debian layout (PREFIX=/usr).
|
|
make install DESTDIR="$STAGING" PREFIX=/usr
|
|
|
|
# Calculate installed size (in KB) for the control file.
|
|
INSTALLED_SIZE=$(du -sk "$STAGING" | cut -f1)
|
|
|
|
# Control file.
|
|
cat > "$STAGING/DEBIAN/control" <<EOF
|
|
Package: $PACKAGE
|
|
Version: $VERSION
|
|
Section: utils
|
|
Installed-Size: $INSTALLED_SIZE
|
|
Priority: optional
|
|
Architecture: $ARCH
|
|
Depends: libc6, libgtk-4-1, libusb-1.0-0, libxkbcommon0, libglib2.0-0, systemd, udev
|
|
Maintainer: gKeyMapper <gkeymapper@rager.dev>
|
|
Description: Remap G1-G9 keys of the Logitech G910
|
|
A GTK4 GUI plus a background daemon for remapping the G1-G9 keys
|
|
of a Logitech G910 keyboard to keys or commands.
|
|
EOF
|
|
|
|
# postinst: reload udev/systemd and enable the user daemon.
|
|
cat > "$STAGING/DEBIAN/postinst" <<'EOF'
|
|
#!/bin/sh
|
|
set -e
|
|
case "$1" in
|
|
configure)
|
|
if command -v udevadm >/dev/null 2>&1; then
|
|
udevadm control --reload-rules 2>/dev/null || true
|
|
udevadm trigger --subsystem-match=usb 2>/dev/null || true
|
|
udevadm trigger --subsystem-match=input 2>/dev/null || true
|
|
fi
|
|
|
|
# Helper: run a command as a given user with the D-Bus session bus
|
|
# available. "systemctl --user" needs DBUS_SESSION_BUS_ADDRESS, which
|
|
# is not set in a plain "su -" login shell.
|
|
run_as_user() {
|
|
_user="$1"; shift
|
|
_uid=$(id -u "$_user" 2>/dev/null) || return 1
|
|
_bus="unix:path=/run/user/$_uid/bus"
|
|
runuser -u "$_user" -- env DBUS_SESSION_BUS_ADDRESS="$_bus" "$@" 2>&1
|
|
}
|
|
|
|
_target_user=""
|
|
if [ -n "$SUDO_USER" ]; then
|
|
_target_user="$SUDO_USER"
|
|
fi
|
|
|
|
if [ -n "$_target_user" ]; then
|
|
echo "gkeymapper: enabling daemon for user $_target_user ..."
|
|
if run_as_user "$_target_user" systemctl --user daemon-reload; then
|
|
echo " daemon-reload: OK"
|
|
else
|
|
echo " daemon-reload: FAILED (is the user session running?)"
|
|
fi
|
|
if run_as_user "$_target_user" systemctl --user enable --now gkeymapper-daemon; then
|
|
echo " enable --now gkeymapper-daemon: OK"
|
|
else
|
|
echo " enable --now gkeymapper-daemon: FAILED"
|
|
echo " -> run manually: systemctl --user enable --now gkeymapper-daemon"
|
|
fi
|
|
else
|
|
echo "gkeymapper: no installing user detected (SUDO_USER empty)."
|
|
echo " Enable the daemon manually with:"
|
|
echo " systemctl --user daemon-reload"
|
|
echo " systemctl --user enable --now gkeymapper-daemon"
|
|
for _user in $(loginctl list-users --no-legend 2>/dev/null | awk '{print $2}'); do
|
|
_uid=$(id -u "$_user" 2>/dev/null) || continue
|
|
echo " trying user $_user ..."
|
|
run_as_user "$_user" systemctl --user daemon-reload >/dev/null 2>&1 || true
|
|
run_as_user "$_user" systemctl --user enable --now gkeymapper-daemon >/dev/null 2>&1 || true
|
|
done
|
|
fi
|
|
;;
|
|
esac
|
|
exit 0
|
|
EOF
|
|
|
|
chmod 755 "$STAGING/DEBIAN/postinst"
|
|
|
|
# postrm: disable the user daemon on removal.
|
|
cat > "$STAGING/DEBIAN/postrm" <<'EOF'
|
|
#!/bin/sh
|
|
set -e
|
|
case "$1" in
|
|
remove|purge)
|
|
if [ -n "$SUDO_USER" ]; then
|
|
su - "$SUDO_USER" -c "systemctl --user disable --now gkeymapper-daemon" >/dev/null 2>&1 || true
|
|
su - "$SUDO_USER" -c "systemctl --user daemon-reload" >/dev/null 2>&1 || true
|
|
fi
|
|
;;
|
|
esac
|
|
exit 0
|
|
EOF
|
|
chmod 755 "$STAGING/DEBIAN/postrm"
|
|
|
|
# Fix ownership (files must be owned by root in a .deb).
|
|
# Strip debug symbols from binaries.
|
|
strip "$STAGING/usr/bin/gkeymapper" "$STAGING/usr/bin/gkeymapper-daemon" 2>/dev/null || true
|
|
|
|
# Remove generated cache files (they are regenerated on the target).
|
|
rm -f "$STAGING/usr/share/applications/mimeinfo.cache"
|
|
rm -f "$STAGING/usr/share/icons/hicolor/icon-theme.cache"
|
|
# Fix file permissions.
|
|
chmod 644 "$STAGING"/usr/share/applications/* 2>/dev/null || true
|
|
chmod 755 "$STAGING"/usr/bin/* 2>/dev/null || true
|
|
|
|
# Build the .deb.
|
|
dpkg-deb --root-owner-group --build "$STAGING" "$DEB_NAME"
|
|
|
|
echo ""
|
|
echo "Built: $DEB_NAME"
|