forked from NicholasSlattery/sony-head-tracker
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
149 lines (133 loc) · 7 KB
/
Copy pathMakefile
File metadata and controls
149 lines (133 loc) · 7 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
# Linux build for sony-head-tracker.
# The cross-platform CMake build (CMakeLists.txt) is the source of truth used by
# CI and by the macOS/Windows builds; this Makefile is a dependency-free Linux
# convenience that produces build/sony-head-tracker with the same sources as the
# CMake `if(LINUX)` target. See docs/LINUX.md.
#
# make build the CLI
# make test build + run the Linux test suite
# make gui run the GTK GUI against the built CLI
# make install-gui add the GUI to your application menu
# make portable build for redistribution (see PORTABLE below)
# make clean
#
# PORTABLE=1 links libstdc++ and libgcc statically. Distribution packages should
# NOT use it (they want the shared libraries), but a binary shipped to arbitrary
# systems does: std::format pulls in GLIBCXX_3.4.35 and 3.4.36 symbols, and a
# system whose libstdc++ is older then refuses to load the binary at all. The
# most important case is SteamOS 3.8 on the Steam Deck, which caps at
# GLIBCXX_3.4.34 (its glibc 2.41 is new enough, so only the C++ runtime is the
# problem). Three std::format symbols are the entire reason, so this one flag is
# far cheaper than rewriting every std::format call site.
# c++ rather than g++: resolves to g++ on glibc distros and to clang++ where no
# GCC is shipped (Chimera Linux). Needs g++ 13+ or clang 16+ for std::format.
CXX ?= c++
PYTHON ?= python3
# Respect a packager's optimization flags (makepkg/dpkg-buildflags export CXXFLAGS),
# but always append the flags the build cannot go without via `override`.
CXXFLAGS ?= -O2 -Wall -Wextra
override CXXFLAGS += -std=c++20 -Iinclude
override LDFLAGS += -pthread
# 32-bit targets without an 8-byte atomic (ARMv6, e.g. Pi Zero/1) need -latomic.
ATOMIC_LIB := $(shell printf '#include <atomic>\n#include <cstdint>\nstd::atomic<std::uint64_t> a;int main(){return (int)a.fetch_add(1);}\n' \
| $(CXX) -std=c++20 -x c++ - -o /dev/null 2>/dev/null && echo "" || echo "-latomic")
override LDFLAGS += $(ATOMIC_LIB)
# Redistributable build: drop the libstdc++/libgcc version ceiling (see header).
ifeq ($(PORTABLE),1)
override LDFLAGS += -static-libstdc++ -static-libgcc
endif
BUILD := build
BIN := $(BUILD)/sony-head-tracker
GUI_SCRIPT := $(CURDIR)/gui/sony_head_tracker_gui.py
# PREFIX/DESTDIR are for the packaging `install` target (default /usr; AUR and
# distro packages use DESTDIR staging). The dev `install-gui` target always uses
# ~/.local and runs the app straight from this checkout.
PREFIX ?= /usr
DESTDIR ?=
LOCAL := $(HOME)/.local
DATADIR := $(DESTDIR)$(PREFIX)/share/sony-head-tracker
# Portable core (matches the sony_head_tracker_core CMake library).
CORE := \
src/math.cpp \
src/orientation.cpp \
src/protocol.cpp \
src/hid_descriptor.cpp \
src/app_config.cpp \
src/diagnostics.cpp
# Linux platform layer (matches the if(LINUX) CMake block). The POSIX UDP
# transport is shared with macOS.
PLATFORM := \
src/linux/hid_backend_linux.cpp \
src/linux/hid_report_parser.cpp \
src/linux/logger_linux.cpp \
src/linux/platform_compat.cpp \
src/macos/output_udp_posix.cpp
APP_SRC := $(CORE) $(PLATFORM) src/linux/main_linux.cpp
TEST_SRC := src/hid_descriptor.cpp src/linux/hid_report_parser.cpp \
tests/test_main.cpp tests/report_parser_tests.cpp
TEST_BIN := $(BUILD)/linux-tests
all: $(BIN)
# Redistributable CLI (AppImage, release tarball, Steam Deck).
portable:
$(MAKE) clean
$(MAKE) PORTABLE=1
$(BIN): $(APP_SRC) | $(BUILD)
$(CXX) $(CXXFLAGS) $(APP_SRC) -o $@ $(LDFLAGS)
$(TEST_BIN): $(TEST_SRC) | $(BUILD)
$(CXX) $(CXXFLAGS) $(TEST_SRC) -o $@ $(LDFLAGS)
test: $(TEST_BIN)
./$(TEST_BIN)
gui: $(BIN)
$(PYTHON) $(GUI_SCRIPT)
# Dev convenience: add the app to your menu, running straight from this checkout
# (launchers point back here). No root, no udev rule. Use `install` for a real
# system install.
install-gui:
@mkdir -p $(LOCAL)/bin $(LOCAL)/share/applications $(LOCAL)/share/icons/hicolor/scalable/apps
@printf '#!/usr/bin/env bash\nexec $(PYTHON) "%s" "$$@"\n' '$(GUI_SCRIPT)' > $(LOCAL)/bin/sony-head-tracker-gui
@chmod +x $(LOCAL)/bin/sony-head-tracker-gui
@printf '#!/usr/bin/env bash\nexec "%s" "$$@"\n' '$(CURDIR)/scripts/recenter.sh' > $(LOCAL)/bin/sony-head-tracker-recenter
@chmod +x $(LOCAL)/bin/sony-head-tracker-recenter
@cp gui/io.github.sonyheadtracker.desktop $(LOCAL)/share/applications/
@cp gui/io.github.sonyheadtracker.svg $(LOCAL)/share/icons/hicolor/scalable/apps/
@command -v update-desktop-database >/dev/null && update-desktop-database $(LOCAL)/share/applications || true
@echo "Installed 'Sony Head Tracker' to your app menu (runs from this checkout)."
# Self-contained system install for packagers and manual installs:
# sudo make install # to /usr
# make install DESTDIR=pkg PREFIX=/usr # staged (AUR, .deb, .rpm)
install: $(BIN)
mkdir -p $(DESTDIR)$(PREFIX)/bin $(DATADIR)/scripts $(DATADIR)/extras \
$(DESTDIR)$(PREFIX)/lib/udev/rules.d \
$(DESTDIR)$(PREFIX)/share/applications \
$(DESTDIR)$(PREFIX)/share/icons/hicolor/scalable/apps
install -m755 $(BIN) $(DESTDIR)$(PREFIX)/bin/sony-head-tracker
install -m644 gui/sony_head_tracker_gui.py $(DATADIR)/sony_head_tracker_gui.py
install -m755 scripts/recenter.sh $(DATADIR)/scripts/recenter.sh
install -m755 scripts/connect-headset-hid.sh $(DATADIR)/scripts/connect-headset-hid.sh
install -m755 scripts/setup-recenter-shortcut.sh $(DATADIR)/scripts/setup-recenter-shortcut.sh
install -m755 scripts/setup-steam-game.sh $(DATADIR)/scripts/setup-steam-game.sh
install -m755 scripts/install-opentrack.sh $(DATADIR)/scripts/install-opentrack.sh
install -m644 extras/70-sony-head-tracker.rules $(DATADIR)/extras/70-sony-head-tracker.rules
install -m644 extras/70-sony-head-tracker.rules $(DESTDIR)$(PREFIX)/lib/udev/rules.d/70-sony-head-tracker.rules
install -m644 gui/io.github.sonyheadtracker.desktop $(DESTDIR)$(PREFIX)/share/applications/io.github.sonyheadtracker.desktop
install -m644 gui/io.github.sonyheadtracker.svg $(DESTDIR)$(PREFIX)/share/icons/hicolor/scalable/apps/io.github.sonyheadtracker.svg
printf '#!/bin/sh\nexec %s "%s/share/sony-head-tracker/sony_head_tracker_gui.py" "$$@"\n' '$(PYTHON)' '$(PREFIX)' \
> $(DESTDIR)$(PREFIX)/bin/sony-head-tracker-gui
chmod 755 $(DESTDIR)$(PREFIX)/bin/sony-head-tracker-gui
printf '#!/bin/sh\nexec "%s/share/sony-head-tracker/scripts/recenter.sh" "$$@"\n' '$(PREFIX)' \
> $(DESTDIR)$(PREFIX)/bin/sony-head-tracker-recenter
chmod 755 $(DESTDIR)$(PREFIX)/bin/sony-head-tracker-recenter
@echo "Installed to $(DESTDIR)$(PREFIX)."
uninstall:
rm -f $(DESTDIR)$(PREFIX)/bin/sony-head-tracker \
$(DESTDIR)$(PREFIX)/bin/sony-head-tracker-gui \
$(DESTDIR)$(PREFIX)/bin/sony-head-tracker-recenter \
$(DESTDIR)$(PREFIX)/lib/udev/rules.d/70-sony-head-tracker.rules \
$(DESTDIR)$(PREFIX)/share/applications/io.github.sonyheadtracker.desktop \
$(DESTDIR)$(PREFIX)/share/icons/hicolor/scalable/apps/io.github.sonyheadtracker.svg
rm -rf $(DATADIR)
$(BUILD):
mkdir -p $(BUILD)
clean:
rm -rf $(BUILD)
.PHONY: all portable test gui install-gui install uninstall clean