could compile it
installed it
but when run direct on the smartphone it hang
if login ssh -CY phablet@10.42.0.1
and run then, gut the GUI
Dockerfile
FROM ubuntu:24.04
ENV DEBIAN_FRONTEND=noninteractive
# First, update and install basic tools
RUN apt-get update && apt-get install -y \
curl \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# Configure repositories properly
RUN rm /etc/apt/sources.list.d/ubuntu.sources && \
echo "deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ noble main restricted universe multiverse" > /etc/apt/sources.list && \
echo "deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ noble-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
echo "deb [arch=amd64] http://security.ubuntu.com/ubuntu/ noble-security main restricted universe multiverse" >> /etc/apt/sources.list && \
echo "" >> /etc/apt/sources.list && \
echo "deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ noble main restricted universe multiverse" >> /etc/apt/sources.list && \
echo "deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ noble-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
echo "deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ noble-security main restricted universe multiverse" >> /etc/apt/sources.list
# Enable arm64 architecture
RUN dpkg --add-architecture arm64
# Update and install dependencies
RUN apt-get update && apt-get install -y \
build-essential \
crossbuild-essential-arm64 \
git \
meson \
ninja-build \
pkg-config \
blueprint-compiler \
desktop-file-utils \
gobject-introspection \
libgirepository1.0-dev \
gir1.2-gtk-4.0 \
gir1.2-adw-1 \
gir1.2-gtksource-5 \
libglib2.0-bin \
libglib2.0-dev \
protobuf-compiler \
libglib2.0-dev:arm64 \
libgtk-4-dev:arm64 \
libadwaita-1-dev:arm64 \
libpango1.0-dev:arm64 \
libgdk-pixbuf-2.0-dev:arm64 \
libcairo2-dev:arm64 \
libgtksourceview-5-dev:arm64 \
gettext \
python3-pip \
&& rm -rf /var/lib/apt/lists/*
# Fix: Replace ARM64 glib-compile-schemas with wrapper to native version
RUN if [ -f /usr/lib/aarch64-linux-gnu/glib-2.0/glib-compile-schemas ]; then \
mv /usr/lib/aarch64-linux-gnu/glib-2.0/glib-compile-schemas \
/usr/lib/aarch64-linux-gnu/glib-2.0/glib-compile-schemas.arm64 && \
echo '#!/bin/bash\nexec /usr/lib/x86_64-linux-gnu/glib-2.0/glib-compile-schemas "$@"' \
> /usr/lib/aarch64-linux-gnu/glib-2.0/glib-compile-schemas && \
chmod +x /usr/lib/aarch64-linux-gnu/glib-2.0/glib-compile-schemas; \
fi
# Add this near the end of your Dockerfile, before WORKDIR
RUN pip3 install --break-system-packages clickable-ut
# Install Rust
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
ENV PATH="/root/.cargo/bin:${PATH}"
# Add aarch64 Rust target
RUN rustup target add aarch64-unknown-linux-gnu
# Configure Cargo
RUN mkdir -p /root/.cargo && \
echo '[target.aarch64-unknown-linux-gnu]' >> /root/.cargo/config.toml && \
echo 'linker = "aarch64-linux-gnu-gcc"' >> /root/.cargo/config.toml
# Set pkg-config paths for Cargo
ENV PKG_CONFIG_SYSROOT_DIR=/
ENV PKG_CONFIG_PATH=
ENV PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig
ENV PKG_CONFIG_ALLOW_CROSS=1
# CRITICAL: Force Cargo to build for aarch64
ENV CARGO_BUILD_TARGET=aarch64-unknown-linux-gnu
# Create simpler cargo wrapper
RUN mv /root/.cargo/bin/cargo /root/.cargo/bin/cargo-real && \
cat > /root/.cargo/bin/cargo << 'EOFWRAPPER'
#!/bin/bash
case "$1" in
build)
if [[ "$*" != *"--target"* ]]; then
/root/.cargo/bin/cargo-real "$@" --target aarch64-unknown-linux-gnu
result=$?
if [ $result -eq 0 ] && [ -n "$CARGO_TARGET_DIR" ] && [ -f "$CARGO_TARGET_DIR/aarch64-unknown-linux-gnu/release/flare" ]; then
mkdir -p "$CARGO_TARGET_DIR/release"
cp "$CARGO_TARGET_DIR/aarch64-unknown-linux-gnu/release/flare" "$CARGO_TARGET_DIR/release/flare"
fi
exit $result
fi
;;
esac
exec /root/.cargo/bin/cargo-real "$@"
EOFWRAPPER
RUN chmod +x /root/.cargo/bin/cargo
# Create pkg-config wrapper
RUN echo '#!/bin/bash\n\
export PKG_CONFIG_PATH=\n\
export PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig\n\
export PKG_CONFIG_SYSROOT_DIR=/\n\
exec pkg-config "$@"' > /usr/local/bin/aarch64-linux-gnu-pkg-config && \
chmod +x /usr/local/bin/aarch64-linux-gnu-pkg-config
WORKDIR /build
aarch64-cross.txt
[binaries]
c = 'aarch64-linux-gnu-gcc'
cpp = 'aarch64-linux-gnu-g++'
ar = 'aarch64-linux-gnu-ar'
strip = 'aarch64-linux-gnu-strip'
pkg-config = 'aarch64-linux-gnu-pkg-config'
rust = ['rustc', '--target', 'aarch64-unknown-linux-gnu']
[properties]
sys_root = '/usr/aarch64-linux-gnu'
[built-in options]
pkg_config_path = '/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig'
[host_machine]
system = 'linux'
cpu_family = 'aarch64'
cpu = 'aarch64'
endian = 'little'
[build_machine]
system = 'linux'
cpu_family = 'x86_64'
cpu = 'x86_64'
endian = 'little'
docker build -t flare-builder .
[docker run --rm -v $(pwd):/build flare-builder bash -c "
# Install clickable in the container
pip3 install clickable-ut
# Build the click package
cd /build
clickable build --arch arm64
clickable click-build --arch arm64
"
docker run --rm -v $(pwd):/build flare-builder bash -c "
cd /build
apt-get update && apt-get install -y click patchelf
rm -rf click-package
mkdir -p click-package/usr/bin
mkdir -p click-package/lib/aarch64-linux-gnu
# Copy binary
cp builddir/src/flare click-package/usr/bin/flare-bin
chmod +x click-package/usr/bin/flare-bin
# Explicitly copy ALL required GTK4/Libadwaita libraries
echo 'Copying libraries explicitly...'
# Copy each library with all its versions
cp -v /usr/lib/aarch64-linux-gnu/libgtksourceview-5.so.0* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || echo 'libgtksourceview-5 not found'
cp -v /usr/lib/aarch64-linux-gnu/libgtk-4.so.1* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || echo 'libgtk-4 not found'
cp -v /usr/lib/aarch64-linux-gnu/libadwaita-1.so.0* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || echo 'libadwaita-1 not found'
cp -v /usr/lib/aarch64-linux-gnu/libgraphene-1.0.so.0* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || echo 'libgraphene not found'
cp -v /usr/lib/aarch64-linux-gnu/libpangocairo-1.0.so.0* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || true
cp -v /usr/lib/aarch64-linux-gnu/libpango-1.0.so.0* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || true
cp -v /usr/lib/aarch64-linux-gnu/libharfbuzz.so.0* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || true
cp -v /usr/lib/aarch64-linux-gnu/libgdk_pixbuf-2.0.so.0* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || true
cp -v /usr/lib/aarch64-linux-gnu/libcairo-gobject.so.2* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || true
cp -v /usr/lib/aarch64-linux-gnu/libcairo.so.2* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || true
cp -v /usr/lib/aarch64-linux-gnu/libvulkan.so.1* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || true
cp -v /usr/lib/aarch64-linux-gnu/libgio-2.0.so.0* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || true
cp -v /usr/lib/aarch64-linux-gnu/libgobject-2.0.so.0* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || true
cp -v /usr/lib/aarch64-linux-gnu/libglib-2.0.so.0* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || true
cp -v /usr/lib/aarch64-linux-gnu/libfribidi.so.0* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || true
cp -v /usr/lib/aarch64-linux-gnu/libfontconfig.so.1* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || true
cp -v /usr/lib/aarch64-linux-gnu/libfreetype.so.6* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || true
cp -v /usr/lib/aarch64-linux-gnu/libpixman-1.so.0* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || true
cp -v /usr/lib/aarch64-linux-gnu/libpng16.so.16* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || true
cp -v /usr/lib/aarch64-linux-gnu/libxcb.so.1* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || true
cp -v /usr/lib/aarch64-linux-gnu/libxcb-render.so.0* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || true
cp -v /usr/lib/aarch64-linux-gnu/libxcb-shm.so.0* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || true
cp -v /usr/lib/aarch64-linux-gnu/libX11.so.6* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || true
cp -v /usr/lib/aarch64-linux-gnu/libXrender.so.1* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || true
cp -v /usr/lib/aarch64-linux-gnu/libXext.so.6* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || true
cp -v /usr/lib/aarch64-linux-gnu/libwayland-client.so.0* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || true
cp -v /usr/lib/aarch64-linux-gnu/libwayland-cursor.so.0* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || true
cp -v /usr/lib/aarch64-linux-gnu/libwayland-egl.so.1* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || true
cp -v /usr/lib/aarch64-linux-gnu/libepoxy.so.0* click-package/lib/aarch64-linux-gnu/ 2>/dev/null || true
# Set RPATH
patchelf --set-rpath '\$ORIGIN/../../lib/aarch64-linux-gnu' click-package/usr/bin/flare-bin
# Create wrapper
cat > click-package/usr/bin/flare << 'WRAPPER'
#!/bin/bash
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
APP_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
export LD_LIBRARY_PATH="$APP_ROOT/lib/aarch64-linux-gnu:$LD_LIBRARY_PATH"
export QT_QPA_PLATFORM=ubuntumirclient
export MIR_SOCKET="${MIR_SOCKET:-/run/user/$(id -u)/mir_socket}"
if [ -z "$DBUS_SESSION_BUS_ADDRESS" ]; then
export $(dbus-launch)
fi
exec "$SCRIPT_DIR/flare-bin" "$@"
WRAPPER
chmod +x click-package/usr/bin/flare
# Copy icon
find data -name '*Flare*.svg' -exec cp {} click-package/flare.svg \; -quit
# Create desktop file
cat > click-package/flare.desktop << 'DESKTOP'
[Desktop Entry]
Name=Flare
Comment=Signal messaging client
Exec=usr/bin/flare
Icon=flare.svg
Terminal=false
Type=Application
Categories=Network;InstantMessaging;
X-Ubuntu-Touch=true
DESKTOP
# Create manifest
cat > click-package/manifest.json << 'MANIFEST'
{
"name": "flare.dennisschweiger",
"title": "Flare",
"version": "0.18.6",
"maintainer": "Dennis Schweiger dennis@example.com",
"architecture": "arm64",
"description": "Signal messaging client",
"framework": "ubuntu-sdk-20.04",
"hooks": {
"flare": {
"apparmor": "flare.apparmor",
"desktop": "flare.desktop"
}
}
}
MANIFEST
# Create apparmor
cat > click-package/flare.apparmor << 'APPARMOR'
{
"template": "unconfined",
"policy_groups": [
"networking",
"audio"
]
}
APPARMOR](link url)
cd click-package
```
echo ''
echo '=== Bundled libraries (first 30) ==='
ls -lah lib/aarch64-linux-gnu/ | head -30
echo ''
echo 'Total library files:'
ls -1 lib/aarch64-linux-gnu/ | wc -l
echo ''
echo 'Verifying libgtksourceview-5:'
ls -la lib/aarch64-linux-gnu/libgtksourceview* || echo 'NOT FOUND!'
# Build
click build . --no-validate
mv *.click ../
cd ..
echo ''
echo '=== Package created ==='
ls -lh *.click
"
sudo click unregister --user=phablet flare.dennisschweiger 2>/dev/null || true
sudo click install --user=phablet --allow-unauthenticated /home/phablet/flare.dennisschweiger_0.18.6_arm64