Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions addons/example/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,13 @@ ARG PY_BUILD_IMAGE=ghcr.io/selkies-project/selkies/py-build:main
ARG WEB_IMAGE=ghcr.io/selkies-project/selkies/gst-web:main
ARG JS_BASE_IMAGE=ghcr.io/selkies-project/selkies/js-interposer
ARG JS_BASE_IMAGE_RELEASE=main
ARG LIBUDEV_IMAGE=ghcr.io/selkies-project/selkies/fake-udev
ARG LIBUDEV_IMAGE_RELEASE=main
FROM ${GSTREAMER_BASE_IMAGE}:${GSTREAMER_BASE_IMAGE_RELEASE}-${DISTRIB_IMAGE}${DISTRIB_RELEASE} AS selkies
FROM ${PY_BUILD_IMAGE} AS selkies-build
FROM ${WEB_IMAGE} AS selkies-web
FROM ${JS_BASE_IMAGE}:${JS_BASE_IMAGE_RELEASE}-${DISTRIB_IMAGE}${DISTRIB_RELEASE} AS selkies-js-interposer
FROM ${LIBUDEV_IMAGE}:${LIBUDEV_IMAGE_RELEASE}-${DISTRIB_IMAGE}${DISTRIB_RELEASE} AS selkies-fake-udev
FROM ${DISTRIB_IMAGE}:${DISTRIB_RELEASE}
ARG DISTRIB_IMAGE
ARG DISTRIB_RELEASE
Expand Down Expand Up @@ -213,6 +216,7 @@ Pin-Priority: -1" > /etc/apt/preferences.d/firefox-nosnap && \
# Example packages
git \
tmux \
stterm \
nano \
vim \
wget \
Expand Down Expand Up @@ -255,6 +259,13 @@ COPY --chown=1000:1000 --from=selkies-js-interposer /opt/*.deb /opt/selkies-js-i
RUN apt-get update && apt-get install --no-install-recommends -y /opt/selkies-js-interposer.deb && rm -f /opt/selkies-js-interposer.deb && \
apt-get clean && rm -rf /var/lib/apt/lists/* /var/cache/debconf/* /var/log/* /tmp/* /var/tmp/*

# Install fake udev library, required for js interposer to work
ARG LIBUDEV_PACKAGE=libudev
ARG LIBUDEV_PKG_VERSION=0.0.0
COPY --chown=1000:1000 --from=selkies-fake-udev /opt/${LIBUDEV_PACKAGE}_${LIBUDEV_PKG_VERSION}.deb /opt/libudev-fake.deb
RUN apt-get update && apt-get install --no-install-recommends -y /opt/libudev-fake.deb && rm -f /opt/libudev-fake.deb && \
apt-get clean && rm -rf /var/lib/apt/lists/* /var/cache/debconf/* /var/log/* /tmp/* /var/tmp/*

RUN echo "**** libva hack ****" && \
mkdir /tmp/libva && \
curl -o \
Expand Down
24 changes: 20 additions & 4 deletions addons/example/entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,28 @@ set -e
until [ -d "${XDG_RUNTIME_DIR}" ]; do sleep 0.5; done

# Configure joystick interposer
export SELKIES_INTERPOSER='/usr/$LIB/selkies_joystick_interposer.so'
export LD_PRELOAD="${SELKIES_INTERPOSER}${LD_PRELOAD:+:${LD_PRELOAD}}"
export LIB_PREFIX="/usr/\$LIB"
export SELKIES_INTERPOSER="${LIB_PREFIX}/selkies_joystick_interposer.so"
export LIBUDEV_PACKAGE="${LIBUDEV_PACKAGE:-libudev}"
export LIBUDEV_PKG_VERSION="${LIBUDEV_PKG_VERSION:-0.0.0}"
export FAKE_UDEV_LIB="${LIB_PREFIX}/${LIBUDEV_PACKAGE}.so.${LIBUDEV_PKG_VERSION}-fake"
export LD_PRELOAD="${SELKIES_INTERPOSER}:${FAKE_UDEV_LIB}${LD_PRELOAD:+:${LD_PRELOAD}}"
export SDL_JOYSTICK_DEVICE=/dev/input/js0
mkdir -pm1777 /dev/input || sudo-root mkdir -pm1777 /dev/input || echo 'Failed to create joystick interposer directory'
touch /dev/input/js0 /dev/input/js1 /dev/input/js2 /dev/input/js3 || sudo-root touch /dev/input/js0 /dev/input/js1 /dev/input/js2 /dev/input/js3 || echo 'Failed to create joystick interposer devices'
chmod 777 /dev/input/js* || sudo-root chmod 777 /dev/input/js* || echo 'Failed to change permission for joystick interposer devices'

if [ -d /dev/input ]; then
mknod /dev/input/js0 c 13 0 || sudo-root mknod /dev/input/js0 c 13 0 || echo "Failed to create joystick device file 0"
mknod /dev/input/js1 c 13 1 || sudo-root mknod /dev/input/js1 c 13 1 || echo "Failed to create joystick device file 1"
mknod /dev/input/js2 c 13 2 || sudo-root mknod /dev/input/js2 c 13 2 || echo "Failed to create joystick device file 2"
mknod /dev/input/js3 c 13 3 || sudo-root mknod /dev/input/js3 c 13 3 || echo "Failed to create joystick device file 3"
mknod /dev/input/event1000 c 13 1064 || sudo-root mknod /dev/input/event1000 c 13 1064 || echo "Failed to create event device file 1000"
mknod /dev/input/event1001 c 13 1065 || sudo-root mknod /dev/input/event1001 c 13 1065 || echo "Failed to create event device file 1001"
mknod /dev/input/event1002 c 13 1066 || sudo-root mknod /dev/input/event1002 c 13 1066 || echo "Failed to create event device file 1002"
mknod /dev/input/event1003 c 13 1067 || sudo-root mknod /dev/input/event1003 c 13 1067 || echo "Failed to create event device file 1003"
chmod 0666 /dev/input/js* /dev/input/event* || sudo-root chmod 0666 /dev/input/js* /dev/input/event* || echo "Failed to change permission for joystick interposer devices"
else
echo "Skipping Joystick interposer device files creation since /dev/input is unavailable"
fi

# Set default display
export DISPLAY="${DISPLAY:-:20}"
Expand Down
8 changes: 6 additions & 2 deletions addons/example/selkies-entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,12 @@ set -e
until [ -d "${XDG_RUNTIME_DIR}" ]; do sleep 0.5; done

# Configure joystick interposer
export SELKIES_INTERPOSER='/usr/$LIB/selkies_joystick_interposer.so'
export LD_PRELOAD="${SELKIES_INTERPOSER}${LD_PRELOAD:+:${LD_PRELOAD}}"
export LIB_PREFIX="/usr/\$LIB"
export SELKIES_INTERPOSER="${LIB_PREFIX}/selkies_joystick_interposer.so"
export LIBUDEV_PACKAGE="${LIBUDEV_PACKAGE:-libudev}"
export LIBUDEV_PKG_VERSION="${LIBUDEV_PKG_VERSION:-0.0.0}"
export FAKE_UDEV_LIB="${LIB_PREFIX}/${LIBUDEV_PACKAGE}.so.${LIBUDEV_PKG_VERSION}-fake"
export LD_PRELOAD="${SELKIES_INTERPOSER}:${FAKE_UDEV_LIB}${LD_PRELOAD:+:${LD_PRELOAD}}"
export SDL_JOYSTICK_DEVICE=/dev/input/js0

# Set default display
Expand Down
26 changes: 26 additions & 0 deletions addons/fake-udev/Dockerfile.debpkg
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
ARG DISTRIB_IMAGE=ubuntu
ARG DISTRIB_RELEASE=22.04
FROM ${DISTRIB_IMAGE}:${DISTRIB_RELEASE}

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install --no-install-recommends -y \
build-essential \
tar \
gzip && \
if [ "$(dpkg --print-architecture)" = "amd64" ]; then apt-get update && apt-get install --no-install-recommends -y gcc-multilib; fi && \
apt-get clean && rm -rf /var/lib/apt/lists/* /var/cache/debconf/* /var/log/* /tmp/* /var/tmp/*

ARG PKG_NAME="libudev"
ARG PKG_VERSION="0.0.0"
ARG DEBFULLNAME="placeholder"
ARG DEBEMAIL="placeholder@users.noreply.github.com"

WORKDIR /opt/build

COPY . .

RUN ./build.sh && \
tar -czvf /opt/${PKG_NAME}_${PKG_VERSION}.tar.gz libudev*so*

CMD ["/bin/bash"]
38 changes: 35 additions & 3 deletions addons/fake-udev/Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
TARGET_SO = libudev.so.1
TARGET_BASENAME = libudev.so
LIB_VERSION = 1.0.0-fake # Doesn't really matter for LD_PRELOAD
LIB_VERSION ?= 1.0.0-fake
FULL_TARGET = $(TARGET_BASENAME).$(LIB_VERSION)
CC = gcc
CFLAGS = -Wall -Wextra -fPIC -DPIC -O2 -g
Expand All @@ -9,7 +9,20 @@ LDFLAGS += -Wl,--version-script=libudev.sym
LDFLAGS += -Wl,-soname,$(TARGET_SO)
SOURCES = fake-libudev-core.c
OBJECTS = $(SOURCES:.c=.o)

# 32-bit build variables
TARGET_SO_32 = libudev_x86.so.1
TARGET_BASENAME_32 = libudev_x86.so
FULL_TARGET_32 = $(TARGET_BASENAME_32).$(LIB_VERSION)
CFLAGS_32 = $(CFLAGS) -m32
LDFLAGS_32 = -shared -Wl,--version-script=libudev.sym -m32
LDFLAGS_32 += -Wl,-soname,$(TARGET_SO_32)
OBJECTS_32 = $(SOURCES:.c=.x86.o)

all: $(FULL_TARGET) $(TARGET_SO) $(TARGET_BASENAME)

all32: $(FULL_TARGET_32) $(TARGET_SO_32) $(TARGET_BASENAME_32)

$(FULL_TARGET): $(OBJECTS) libudev.h libudev.sym
$(CC) $(LDFLAGS) -o $@ $(OBJECTS)
@echo "Built $@"
Expand All @@ -19,8 +32,27 @@ $(TARGET_SO): $(FULL_TARGET)
$(TARGET_BASENAME): $(TARGET_SO)
@echo "Creating symlink $(TARGET_BASENAME) -> $(TARGET_SO)"
@ln -sf $(TARGET_SO) $(TARGET_BASENAME)

# 32-bit build targets
$(FULL_TARGET_32): $(OBJECTS_32) libudev.h libudev.sym
$(CC) $(LDFLAGS_32) -o $@ $(OBJECTS_32)
@echo "Built $@"

$(TARGET_SO_32): $(FULL_TARGET_32)
@echo "Creating SONAME symlink $(TARGET_SO_32) -> $(FULL_TARGET_32)"
@ln -sf $(FULL_TARGET_32) $(TARGET_SO_32)

$(TARGET_BASENAME_32): $(TARGET_SO_32)
@echo "Creating symlink $(TARGET_BASENAME_32) -> $(TARGET_SO_32)"
@ln -sf $(TARGET_SO_32) $(TARGET_BASENAME_32)

%.o: %.c libudev.h
$(CC) $(CFLAGS) -c -o $@ $<

%.x86.o: %.c libudev.h
$(CC) $(CFLAGS_32) -c -o $@ $<

clean:
rm -f $(OBJECTS) $(FULL_TARGET) $(TARGET_SO) $(TARGET_BASENAME) core.* *.core
.PHONY: all clean
rm -f $(OBJECTS) $(OBJECTS_32) $(FULL_TARGET) $(TARGET_SO) $(TARGET_BASENAME) $(FULL_TARGET_32) $(TARGET_SO_32) $(TARGET_BASENAME_32) core.* *.core

.PHONY: all all32 clean
36 changes: 36 additions & 0 deletions addons/fake-udev/build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#!/bin/bash

set -e

# Create output directory
PKG_DIR="/opt/${PKG_NAME?missing env}_${PKG_VERSION?missing env}"
mkdir -p "${PKG_DIR}/DEBIAN"
# Handles normalising i.*86 values for native arch, if any
LIB_DIR="${PKG_DIR}/usr/lib/$(gcc -print-multiarch | sed -e 's/i.*86/i386/')"
mkdir -p "${LIB_DIR}"
export LIB_VERSION="${PKG_VERSION}-fake"
make
cp -f libudev.so.${PKG_VERSION}-fake "${LIB_DIR}/libudev.so.${PKG_VERSION}-fake"

if [ "$(dpkg --print-architecture)" = "amd64" ]; then
LIB_DIR="${PKG_DIR}/usr/lib/$(gcc -m32 -print-multiarch | sed -e 's/i.*86/i386/')"
mkdir -p "${LIB_DIR}"
make all32
cp -f libudev_x86.so.${PKG_VERSION}-fake "${LIB_DIR}/libudev.so.${PKG_VERSION}-fake"
fi

PKG_SIZE="$(du -s "${PKG_DIR}/usr" | awk '{print $1}' | xargs)"

cat - > ${PKG_DIR}/DEBIAN/control <<EOF
Package: ${PKG_NAME?missing env}
Version: ${PKG_VERSION}
Section: custom
Priority: optional
Architecture: $(dpkg --print-architecture)
Essential: no
Installed-Size: ${PKG_SIZE?missing env}
Maintainer: ${DEBFULLNAME?missing env} <${DEBEMAIL?missing env}>
Description: Fake udev shared library for Selkies project. A dependency for Selkies joystick device interposer.
EOF

dpkg-deb --build ${PKG_DIR}
Loading