why do i insist on doing things the hard way

wow can't wait to try my hand at animating!

~% apk add synfig
ERROR: unable to select packages:
  synfig (no such package):
    required by: world[synfig]

~% apk search synfig

~% apk search opentoonz

~% apk search pencil2d

~% 

...

compile?

tried compiling synfig, took several whole hours

i'd much rather use a precompiled version

flatpak?

not doing this whole debate again

+ works on alpine
+ sandboxing
+ can share runtimes and libraries between apps
  > can be more space-efficient than appimage
- different runtimes
  - (oftentimes unnecessary) duplication of entire base systems

i like the concept and universality is certainly nice

but i dont use a whole lot of apps so i wont enjoy as much space-efficiency

im happy with just 1 package manager thanks

appimages!

nice little self-contained app bundles

could theoretically work on any platform...

except that most appimages are built against glibc (for now)

~% ./appimagetool-x86_64.AppImage
/bin/ash: ./appimagetool-x86_64.AppImage: not found

gcompat helps somewhat but it's still lacking

Error relocating /tmp/.mount_appimaJOmaIc/usr/lib//libgio-2.0.so.0: __res_nquery: symbol not found
Error relocating /tmp/.mount_appimaJOmaIc/usr/lib//libgio-2.0.so.0: __dn_expand: symbol not found

of course the better thing to do here would be to add those functions to gcompat

but

~% ./FireAlpaca-2.11.15-x86_64.AppImage
Error relocating /tmp/.mount_FireAlenlKkD/usr/bin/../lib/libQt6Core.so.6: renameat2: symbol not found
Error relocating /tmp/.mount_FireAlenlKkD/usr/bin/../lib/libsystemd.so.0: __ppoll_chk: symbol not found
Error relocating /tmp/.mount_FireAlenlKkD/usr/bin/../lib/libsystemd.so.0: __openat64_2: symbol not found
Error relocating /tmp/.mount_FireAlenlKkD/usr/bin/../lib/libsystemd.so.0: parse_printf_format: symbol not found
Error relocating /tmp/.mount_FireAlenlKkD/usr/bin/../lib/libkrb5.so.3: __res_nsearch: symbol not found

stuff like parse_printf_format isn't trivial to implement

also im lazy and just wanna draw things already

glibc?

alpine-pkg-glibc is nice and all but glibc doesn't play well with musl libraries (who could've guessed!)

~% ./FireAlpaca-2.11.15-x86_64.AppImage
./FireAlpaca-2.11.15-x86_64.AppImage: /usr/lib/libstdc++.so.6: no version information available (required by ./FireAlpaca-2.11.15-x86_64.AppImage)`
...
./FireAlpaca-2.11.15-x86_64.AppImage: /usr/lib/libstdc++.so.6: no version information available (required by /tmp/.mount_FireAliPfa4A/usr/bin/../lib/libicuuc.so.56)
./FireAlpaca-2.11.15-x86_64.AppImage: Relink `/usr/lib/libpng16.so.16' with `/usr/glibc-compat/lib/libm.so.6' for IFUNC symbol `floor'
Segmentation fault

the no version information available is harmless but the relinking isn't

using patchelf:

~% cp /usr/lib/libpng16.so.16 .
~% patchelf libpng16.so.16 --add-needed /usr/glibc-compat/lib/libm.so.6
~% LD_PRELOAD='libpng16.so.16' ./FireAlpaca-2.11.15-x86_64.AppImage
...
qt.qpa.plugin: Could not find the Qt platform plugin "wayland" in ""
The X11 connection broke: I/O error (code 1)
XIO:  fatal IO error 62 (Timer expired) on X server ":0"
      after 407 requests (407 known processed) with 2 events remaining.

different error now! yay!

couldn't figure out how to fix this so im giving up

chroot?

needs root, anyway we've got...

proot!

distrobox > docker > proot > unshare

im not masochistic enough to make my own unshare shellscript so proot it will be

(bubblewrap looks cool but im lazy to change the wrapper script)

so anyways

~% touch /HEHE
touch: /HEHE: Permission denied
~% ls /
bin    boot   dev    etc    home   lib    lib64  media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var
~% ls alp/
~% ls alp.work/
bin    dev    etc    home   lib    lib64  media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var
~% alproot ./alp
alp:~% touch /HEHE
alp:~% ls /
bin    boot   dev    etc    HEHE   home   lib    lib64  media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var
alp:~% exit
~% ls alp.work/
bin    dev    etc    HEHE   home   lib    lib64  media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var
~% ls /
bin    boot   dev    etc    home   lib    lib64  media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var

dunno how to explain a userspace rootfs so hopefully this suffices

basically it union mounts / readonly on the rootfs so i can use my cursor theme

but it binds a clean home directory to prevent my configs from getting in the way

and everything is contained in the rootfs for ease of disposal

back to running glibc apps

yes this isn't actually about appimages

a few months back i got pissed about minecraft 1.20 not working with musl so i set up a void rootfs

don't really remember how i set that up but apparently alpine packages xbps?

void is cool but i like apk more so

wolfi!

wolfi is basically appimage containers from source

important point: Designed to support glibc

you can see where this is going

wolfi-based glibc rootfs

wolfi uses apk so the bootstrapping process is the same as alpine's, just make /etc/apk/repositories point to wolfi's package repo

DISCLAIMER: DO NOT COPYPASTE THESE COMMANDS THEY ARE PROBABLY UNSAFE

# set up wolfi rootfs
mkdir wolfi
cd wolfi/
mkdir -p etc/apk
echo 'https://packages.wolfi.dev/os' > etc/apk/repositories
apk add --root . --no-script --initdb --allow-untrusted wolfi-base  # or add wolfi keys to etc/apk/keys/
mkdir ."$HOME"
proot -R . apk fix  # to run post-install scripts

# copy the appimage in
cp ../FireAlpaca-2.11.15-x86_64.AppImage ."$HOME"

# proot in
proot -R . -b ."$HOME":"$HOME" -b /usr/share/fonts -w "$HOME"

and now we're in the proot!

if you like you can prepend a PS1="(basename "PWD"):$PS1" so it's easier to tell if you're in the chroot (remember to edit /etc/profile so it doesn't set PS1)

running the appimage

wolfi:~% ./FireAlpaca-2.11.15-x86_64.AppImage 
dlopen(): error loading libfuse.so.2

AppImages require FUSE to run. 
You might still be able to extract the contents of this AppImage 
if you run it with the --appimage-extract option. 
See https://github.com/AppImage/AppImageKit/wiki/FUSE 
for more information

unfortunately wolfi doesn't seem to package fuse-2 so we'll have to extract the appimage

wolfi:~% ./FireAlpaca-2.11.15-x86_64.AppImage --appimage-extract
...
wolfi:~% ./squashfs-root/AppRun 
./squashfs-root/AppRun: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory

let's quickly add that...

wolfi:~% apk add libstdc++
wolfi:~% ./squashfs-root/AppRun
./squashfs-root/AppRun: error while loading shared libraries: libGL.so.1: cannot open shared object file: No such file or directory

...

after a bit of back and forth (shoutout to apk search so:$LIB)

wolfi:~% apk add libstdc++ mesa-gl libnss fontconfig alsa-lib mesa-egl libcom_err libgpg-error mesa llvm16
wolfi:~% ./squashfs-root/AppRun
qt.qpa.plugin: Could not find the Qt platform plugin "wayland" in ""
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: xcb.

Aborted

quickly unset QT_QPA_PLATFORM...

wolfi:~% ./squashfs-root/AppRun
...
Trace/breakpoint trap
[10420:10420:0100/000000.148665:ERROR:zygote_linux.cc(661)] write: Broken pipe (32)

flashes for a moment and then dies. hm.

disable the web engine sandbox...

wolfi:~% export QTWEBENGINE_DISABLE_SANDBOX=1

and it works! firealpaca running

great, there's ads

i think that's what's using the web engine, will see if i can disable it

conclusion

just use krita.

if you really need to run glibc apps, check out distrobox.


made with <3 and /.gen.sh