Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

added debian 12 dockerfiles and deb packages #163

Closed
wants to merge 1 commit into from
Closed
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
130 changes: 130 additions & 0 deletions addons/gstreamer/Dockerfile.debian
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.

ARG DISTRIB_RELEASE=12
FROM debian:${DISTRIB_RELEASE}

ARG DEBIAN_FRONTEND=noninteractive
# Install essential dependencies
RUN apt-get update && apt-get install --no-install-recommends -y \
apt-utils \
build-essential \
ca-certificates \
curl \
git \
gzip \
pkg-config \
tar \
xz-utils && \
apt-get clean && rm -rf /var/lib/apt/lists/* /var/cache/debconf/* /var/log/* /tmp/* /var/tmp/*

# Install build dependencies
RUN apt-get update && apt-get install --no-install-recommends -y \
autopoint \
autoconf \
automake \
autotools-dev \
binutils \
bison \
flex \
gettext \
khronos-api \
libtool-bin \
nasm \
valgrind \
yasm \
libaa1-dev \
libbz2-dev \
libgcrypt20-dev \
libgmp-dev \
libgsl-dev \
libcairo2-dev \
libpango1.0-dev \
libgdk-pixbuf2.0-dev \
libsoup2.4-dev \
libsoup-gnome2.4-dev \
libgirepository1.0-dev \
glib-networking \
libglib2.0-dev \
libjson-glib-dev \
libgudev-1.0-dev \
libasound2-dev \
libjack-jackd2-dev \
#libjpeg-turbo8-dev \
libogg-dev \
libopenjp2-7-dev \
libopus-dev \
libpulse-dev \
libssl-dev \
libvdpau-dev \
libvorbis-dev \
libva-dev \
libvpx-dev \
libwebp-dev \
libx264-dev \
libx265-dev \
libdrm-dev \
libegl-dev \
libgl-dev \
libopengl-dev \
libgles-dev \
libglvnd-dev \
libglx-dev \
wayland-protocols \
libwayland-dev \
libwayland-egl-backend-dev \
libx11-xcb-dev \
libxcb-dri3-dev \
libxkbcommon-dev \
libxdamage-dev \
libxfixes-dev \
libxv-dev \
libxtst-dev \
libxext-dev && \
apt-get update && apt-get install --no-install-recommends -y libopenh264-dev libde265-dev svt-av1 libsvtav1enc-dev libsvtav1dec-dev aom-tools libaom-dev && \
apt-get clean && rm -rf /var/lib/apt/lists/* /var/cache/debconf/* /var/log/* /tmp/* /var/tmp/*

# Install GST-Python dependencies, Meson, and Ninja
ARG PIP_BREAK_SYSTEM_PACKAGES=1
RUN apt-get update && apt-get install --no-install-recommends -y \
python3-pip \
python3-dev \
python-gi-dev && \
pip3 install --no-cache-dir cmake meson ninja gitlint tomli && \
apt-get clean && rm -rf /var/lib/apt/lists/* /var/cache/debconf/* /var/log/* /tmp/* /var/tmp/*

# GStreamer monorepo build with prefix for standalone install
WORKDIR /src
ARG GSTREAMER_VERSION=1.24.5
RUN export GSTREAMER_EXTRA_ARGS="-Dgst-plugins-bad:libde265=enabled -Dgst-plugins-bad:aom=enabled ${GSTREAMER_EXTRA_ARGS}" && \
export GSTREAMER_EXTRA_ARGS="-Dgst-plugins-bad:svtav1=enabled ${GSTREAMER_EXTRA_ARGS}" && \
curl --proto '=https' --tlsv1.2 -fsSL "https://sh.rustup.rs" | sh -s -- -y && \
. "$HOME/.cargo/env" && \
cargo install cargo-c && \
git clone --single-branch --depth 1 --branch "${GSTREAMER_VERSION}" "https://gitlab.freedesktop.org/gstreamer/gstreamer.git" && cd gstreamer && \
mkdir -p /opt/gstreamer && \
meson setup --prefix /opt/gstreamer -Dbuildtype=release -Dpython=enabled -Dintrospection=enabled -Dorc=enabled -Dwebrtc=enabled -Dgst-plugins-bad:webrtcdsp=enabled -Drtsp_server=enabled -Dtls=enabled -Dlibnice=enabled -Dtools=enabled -Dgpl=enabled -Dbase=enabled -Dgood=enabled -Dbad=enabled -Dugly=enabled -Drs=enabled -Dlibav=enabled -Dgst-plugins-base:alsa=enabled -Dgst-plugins-base:gl=enabled -Dgst-plugins-base:videoconvertscale=enabled -Dgst-plugins-base:opus=enabled -Dgst-plugins-good:pulse=enabled -Dgst-plugins-good:jack=enabled -Dgst-plugins-good:ximagesrc=enabled -Dgst-plugins-good:ximagesrc-xshm=enabled -Dgst-plugins-good:ximagesrc-xfixes=enabled -Dgst-plugins-good:ximagesrc-xdamage=enabled -Dgst-plugins-good:ximagesrc-navigation=enabled -Dgst-plugins-bad:qsv=enabled -Dgst-plugins-bad:va=enabled -Dgst-plugins-bad:nvcodec=enabled -Dgst-plugins-good:v4l2=enabled -Dgst-plugins-bad:v4l2codecs=enabled -Dgst-plugins-good:vpx=enabled -Dgst-plugins-bad:openh264=enabled -Dgst-plugins-ugly:x264=enabled -Dgst-plugins-bad:x265=enabled -Dgst-plugins-rs:webrtc=enabled -Dgst-plugins-rs:rtp=enabled -Dgst-plugins-rs:rav1e=enabled -Ddoc=disabled -Ddevtools=disabled -Dexamples=disabled -Dgst-examples=disabled -Dnls=disabled -Dtests=disabled ${GSTREAMER_EXTRA_ARGS} builddir && \
ninja -C builddir && \
meson install -C builddir && \
rm -rf builddir && rustup self uninstall -y

# Extract NVRTC dependency, https://developer.download.nvidia.com/compute/cuda/redist/cuda_nvrtc/LICENSE.txt
RUN NVRTC_VERSION="11.4.152" && \
NVRTC_ARCH="$(dpkg --print-architecture | sed -e 's/arm64/sbsa/' -e 's/ppc64el/ppc64le/' -e 's/i.*86/x86/' -e 's/amd64/x86_64/' -e 's/unknown/x86_64/')" && \
cd /tmp && curl -fsSL "https://developer.download.nvidia.com/compute/cuda/redist/cuda_nvrtc/linux-${NVRTC_ARCH}/cuda_nvrtc-linux-${NVRTC_ARCH}-${NVRTC_VERSION}-archive.tar.xz" | tar -xJf - -C /tmp && mv -f cuda_nvrtc* cuda_nvrtc && cd cuda_nvrtc/lib && chmod 755 libnvrtc* && mv -f libnvrtc* /opt/gstreamer/lib/$(dpkg --print-architecture | sed -e 's/arm64/aarch64-linux-gnu/' -e 's/armhf/arm-linux-gnueabihf/' -e 's/riscv64/riscv64-linux-gnu/' -e 's/ppc64el/powerpc64le-linux-gnu/' -e 's/s390x/s390x-linux-gnu/' -e 's/i.*86/i386-linux-gnu/' -e 's/amd64/x86_64-linux-gnu/' -e 's/unknown/x86_64-linux-gnu/')/ && cd /tmp && rm -rf /tmp/cuda_nvrtc

# Generate environment file
RUN MULTI_ARCH="$(gcc -print-multiarch | sed -e 's/i.*86/i386/')" && \
echo "#!/bin/bash\n\
export GSTREAMER_PATH=\"\${GSTREAMER_PATH:-\$(cd \$(dirname \${BASH_SOURCE[0]:-\${(%):-%x}}) && pwd)}\"\n\
export PATH=\"\${GSTREAMER_PATH}/bin\${PATH:+:\${PATH}}\"\n\
export LD_LIBRARY_PATH=\"\${GSTREAMER_PATH}/lib/${MULTI_ARCH}\${LD_LIBRARY_PATH:+:\${LD_LIBRARY_PATH}}\"\n\
export GST_PLUGIN_PATH=\"\${GSTREAMER_PATH}/lib/${MULTI_ARCH}/gstreamer-1.0\${GST_PLUGIN_PATH:+:\${GST_PLUGIN_PATH}}\"\n\
export GST_PLUGIN_SYSTEM_PATH=\"\${XDG_DATA_HOME:-\${HOME:-~}/.local/share}/gstreamer-1.0/plugins:/usr/lib/${MULTI_ARCH}/gstreamer-1.0\${GST_PLUGIN_SYSTEM_PATH:+:\${GST_PLUGIN_SYSTEM_PATH}}\"\n\
export GI_TYPELIB_PATH=\"\${GSTREAMER_PATH}/lib/${MULTI_ARCH}/girepository-1.0:/usr/lib/${MULTI_ARCH}/girepository-1.0\${GI_TYPELIB_PATH:+:\${GI_TYPELIB_PATH}}\"\n\
export PYTHONPATH=\"\${GSTREAMER_PATH}/lib/python3/dist-packages\${PYTHONPATH:+:\${PYTHONPATH}}\"\n\
" > /opt/gstreamer/gst-env

# Bundle build result to tarball
RUN cd /opt && tar -czvf selkies-gstreamer-latest.tar.gz gstreamer
53 changes: 53 additions & 0 deletions addons/js-interposer/Dockerfile.debian_debpkg
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# Example docker build:
# docker build \
# --build-arg=DEBFULLNAME="Dan Isla" \
# [email protected] \
# --build-arg=PKG_NAME=selkies-js-interposer \
# --build-arg=PKG_VERSION=0.0.1 \
# --build-arg=DISTRIB_RELEASE=24.04 \
# -t selkies-js-interposer-deb:latest -f Dockerfile.debian_debpkg .

ARG DISTRIB_RELEASE=12
FROM debian:${DISTRIB_RELEASE} AS build

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install --no-install-recommends -y \
build-essential \
gzip \
tar && \
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="selkies-js-interposer"
ARG PKG_VERSION="0.0.0"
ARG DEBFULLNAME="Dan Isla"
ARG DEBEMAIL="[email protected]"

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

ARG DISTRIB_RELEASE
FROM debian:${DISTRIB_RELEASE} AS test
ARG PKG_NAME
ARG PKG_VERSION
ARG DEBFULLNAME
ARG DEBEMAIL

ARG DEBIAN_FRONTEND=noninteractive

COPY --from=build /opt/${PKG_NAME}_${PKG_VERSION}.deb /opt/${PKG_NAME}_${PKG_VERSION}.deb
COPY --from=build /opt/${PKG_NAME}_${PKG_VERSION}.tar.gz /opt/${PKG_NAME}_${PKG_VERSION}.tar.gz

WORKDIR /opt

RUN apt-get update && apt-get install --no-install-recommends -y \
gcc \
file \
/opt/${PKG_NAME}_${PKG_VERSION}.deb && \
apt-get clean && rm -rf /var/lib/apt/lists/* /var/cache/debconf/* /var/log/* /tmp/* /var/tmp/*

RUN file "/usr/lib/$(gcc -print-multiarch | sed -e 's/i.*86/i386/')/selkies_joystick_interposer.so" && \
if [ "$(dpkg --print-architecture)" = "amd64" ]; then file "/usr/lib/$(gcc -m32 -print-multiarch | sed -e 's/i.*86/i386/')/selkies_joystick_interposer.so"; fi
34 changes: 34 additions & 0 deletions addons/js-interposer/build_debian.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@

#!/bin/bah
N=selkies-js-interposer-deb
GIT_TAG=$(git describe --tag)
TAG=latest
V=12

ARCH=$(uname -m)
if [ "$ARCH" = "x86_64" ] || [ "$ARCH" = "amd64" ]; then
ARCH=amd64
fi
#_debian${V}_${ARCH}

docker build \
--build-arg=DEBFULLNAME="Alex Diaz" \
[email protected] \
--build-arg=PKG_NAME=selkies-js-interposer \
--build-arg=PKG_VERSION=${GIT_TAG#v} \
--build-arg=DISTRIB_RELEASE=12 \
-t $N:$TAG -f Dockerfile.debian_debpkg .

I=$(docker images $N:$TAG --format "{{.ID}}")
if [ ! -d dist ]; then
mkdir dist
fi

#echo $I

if [ "$1" = "-c" ]; then
rm -f ./dist/*
fi

(set -x; docker run -v $PWD/dist:/dist $I bash -c "cp /opt/selkies-js-interposer_${GIT_TAG#v}.tar.gz /dist/selkies-js-interposer_v${GIT_TAG#v}_debian${V}_${ARCH}.tar.gz")
(set -x; docker run -v $PWD/dist:/dist $I bash -c "cp /opt/selkies-js-interposer_${GIT_TAG#v}.deb /dist/selkies-js-interposer_v${GIT_TAG#v}_debian${V}_${ARCH}.deb")
34 changes: 34 additions & 0 deletions addons/js-interposer/build_debian_deb.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#!/bin/bash

set -e

PKG_DIR="/opt/${PKG_NAME?missing env}_${PKG_VERSION?missing env}"
mkdir -p "${PKG_DIR}/DEBIAN"

DEST_DIR="${PKG_DIR}/usr/lib/$(gcc -print-multiarch | sed -e 's/i.*86/i386/')"
mkdir -p "${DEST_DIR}"
gcc -shared -fPIC -o selkies_joystick_interposer.so joystick_interposer.c -ldl
cp -f selkies_joystick_interposer.so "${DEST_DIR}/selkies_joystick_interposer.so"

if [ "$(dpkg --print-architecture)" = "amd64" ]; then
DEST_DIR="${PKG_DIR}/usr/lib/$(gcc -m32 -print-multiarch | sed -e 's/i.*86/i386/')"
mkdir -p "${DEST_DIR}"
gcc -m32 -shared -fPIC -o selkies_joystick_interposer_x86.so joystick_interposer.c -ldl
cp -f selkies_joystick_interposer_x86.so "${DEST_DIR}/selkies_joystick_interposer.so"
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: Joystick device interposer for Selkies-GStreamer project
EOF

dpkg-deb --build ${PKG_DIR}
49 changes: 49 additions & 0 deletions dev/build-gstreamer-debian12.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#!/bin/bash

SCRIPT_DIR=$(readlink -f $(dirname $0))
BUILD_DIR=${SCRIPT_DIR?}/../addons/gstreamer

# Change this to set the base debian image
BASE_IMAGE=debian:12

IMAGE_TAG=gstreamer:latest-debian${BASE_IMAGE//*:/}

(cd ${BUILD_DIR?} && docker build --cache-from ${IMAGE_TAG?} --build-arg=BASE_IMAGE=${BASE_IMAGE?} -t ${IMAGE_TAG?} -f Dockerfile.debian .)

(
cd ${SCRIPT_DIR?}/..
# for image in dist web test; do
for image in dist web; do
echo "image = $image"
echo $PWD
GSTREAMER_BASE_IMAGE=gstreamer GSTREAMER_BASE_IMAGE_RELEASE=latest TEST_IMAGE=selkies-gstreamer-example:${IMAGE_TAG//*:/} DISTRIB_RELEASE=${BASE_IMAGE//*:/} docker-compose build ${image}
done
)

#if [ ! -d dist ]; then
# mkdir dist
#fi

cd $BUILD_DIR
if [ "$1" = "-c" ]; then
sudo rm -f ./dist/*
fi


NAME=gst-web
GIT_TAG=$(git describe --tag)
DOCKER_TAG=latest
I=$(set -x; docker images $NAME:$DOCKER_TAG --format "{{.ID}}")
(set -x; docker run -it -v ./dist:/dist $I sh -c "cp /opt/gst-web.tar.gz /dist/selkies-gstreamer-web_${GIT_TAG}.tar.gz")

ARCH=$(uname -m)
if [ "$ARCH" = "x86_64" ] || [ "$ARCH" = "amd64" ]; then
ARCH=amd64
fi
NAME=gstreamer
GIT_TAG=$(git describe --tag)
DOCKER_TAG=latest-debian${BASE_IMAGE//*:/}
I=$(set -x; docker images $NAME:$DOCKER_TAG --format "{{.ID}}")
(set -x; docker run -it -v ./dist:/dist $I sh -c "cp /opt/selkies-gstreamer-latest.tar.gz /dist/gstreamer-selkies_gpl_${GIT_TAG}_debian${BASE_IMAGE//*:/}_$ARCH.tar.gz")
sudo chown $USER:$USER -R $BUILD_DIR/dist/
ls -la $BUILD_DIR/dist/
4 changes: 2 additions & 2 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ services:
image: selkies-gstreamer-example:latest-ubuntu${DISTRIB_RELEASE:-24.04}
entrypoint: ["/tini", "--", "/bin/bash"]
build:
context: .
dockerfile: Dockerfile.example
context: ./addons/example
dockerfile: Dockerfile
args:
DISTRIB_RELEASE: ${DISTRIB_RELEASE:-24.04}

Expand Down
39 changes: 39 additions & 0 deletions local_debian_build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#!/bin/bash

ARCH=$(uname -m)
if [ "$ARCH" = "x86_64" ] || [ "$ARCH" = "amd64" ]; then
ARCH=amd64
fi

# py3-none-any
NAME=selkies-gstreamer
GIT_TAG=$(git describe --tag)
echo "selkies_gstreamer-${GIT_TAG#v}-py3-none-any.whl"

docker build --build-arg PACKAGE_VERSION=${GIT_TAG#v} . -t $NAME
DOCKER_TAG=latest
I=$(set -x; docker images $NAME:$DOCKER_TAG --format "{{.ID}}")
if [ ! -d dist ]; then
mkdir dist
fi
(set -x; docker run -v $PWD/dist:/dist $I bash -c "cp /opt/pypi/dist/* /dist/")

# selkies-js-interposer
echo "selkies-js-interposer_${GIT_TAG}_debian12_$ARCH.deb"
cd addons/js-interposer/
./build_debian.sh
ls -1 addons/js-interposer/

cd -

# web
echo "selkies-gstreamer-web_${GIT_TAG}.tar.gz"
# gpl
echo "gstreamer-selkies_gpl_${GIT_TAG}_debian12_$ARCH.tar.gz"
cd dev
./build-gstreamer-debian12.sh

cd ..
[ "$(ls -A ./addons/gstreamer/dist)" ] && mv addons/gstreamer/dist/* dist/
[ "$(ls -A ./addons/js-interposer/dist)" ] && mv addons/js-interposer/dist/* dist/
ls -1 dist/