Dicas e aprendizados durante a criação de AppImages, bem como limitações, problemas encontrados, recomendações, soluções e dicas extras.
Links Extras:
- https://docs.appimage.org/user-guide/troubleshooting/index.html
- https://docs.appimage.org/packaging-guide/environment-variables.html
- https://github.com/AppImageCommunity/pkg2appimage/blob/master/excludelist
- https://abi-laboratory.pro/index.php?view=navigator
- https://specifications.freedesktop.org/menu-spec/latest/
Encontrar pacotes para criar AppImage com ArchImage e ArchAppImage:
Resolvendo problemas com ld-linux:
Projetos para tentar resolver os problemas com o glibc (não testei nunhum desses):
- https://github.com/AppImage/AppImageKit/tree/stable/v1.0/LibcWrapGenerator
- https://github.com/wheybags/glibc_version_header
- https://github.com/sulix/bingcc
Projetos | Link | Descrição |
---|---|---|
Projeto AppImage | https://github.com/AppImage/ | A Base de Tudo |
AppImageTool | https://github.com/AppImage/appimagetool | Ferramenta Base para Criar AppImage |
Pkg2AppImage | https://github.com/AppImageCommunity/pkg2appimage | Usa Arquivos .yml (pacotes deb) |
Deb2AppImage | https://github.com/simoniz0r/deb2appimage | Usa Arquivos .json (pacotes deb) |
ArchImage | https://github.com/ivan-hc/ArchImage | Usa Conteiner junest (Arch Linux) |
AppImaGen | https://github.com/ivan-hc/AppImaGen | Usa pacotes Debian e Ubuntu |
Snap2AppImage | https://github.com/ivan-hc/Snap2AppImage | Pacotes SNAP para AppImage |
FlatPak2AppDir | https://github.com/sudo-give-me-coffee/flatpak2appdir | FlatPak para AppDir |
LinuxDeployQt | https://github.com/probonopd/linuxdeployqt | Útil para Programas em Qt |
go-appimage | https://github.com/probonopd/go-appimage | Projeto AppImage em Go |
AppRun | https://github.com/AppImageCrafters/AppRun | AppRun Binário como Alternativa |
libunionpreload | https://github.com/project-portable/libunionpreload | Sistema de Arquivos Union |
Cada método tem seus objetivos, vantagens e desvantagens.
Recomendações:
- Programas autocontidos (tarball).
- Programas com poucas dependências.
- Programas que usam tecnologia Electron.
- Se o seu Sistema for muito desatualizado, você vai se deparar com um erro parecido com esse:
/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by /usr/lib/libstdc++.so.6)
-
Não é possível garantir a adição de todas as dependências, uma vez que bibliotecas de baixo nível não costumam ser recomendadas para adição no AppImage.
-
O AppImage é montado no modo somente leitura, se o programa precisar gravar suas configurações no diretório do próprio AppImage, o programa não terá permissão para isso e não funcionará corretamente.
-
Ainda há programas que não foram pensados para serem portáteis e podem exigir acesso a caminhos absolutos em seus códigos.
-
É difícil criar Appimages de programas desenvolvidos em Python.
Ao invés de LD_LIBRARY_PATH
, use LIBRARY_PATH
como abaixo e execute com ld-linux-x86-64.so.2
.
#!/bin/sh
HERE="$(dirname "$(readlink -f "${0}")")"
for dir in "$HERE/app/lib/"*/; do
export LIBRARY_PATH="$dir":$LIBRARY_PATH
done
export LIBRARY_PATH="$HERE/app/lib":$LIBRARY_PATH
export LIBRARY_PATH="$HERE/usr/lib":$LIBRARY_PATH
export LIBRARY_PATH="$HERE/lib":$LIBRARY_PATH
export LIBRARY_PATH="$HERE/usr/lib/i386-linux-gnu":$LIBRARY_PATH
export LIBRARY_PATH="$HERE/lib/i386-linux-gnu":$LIBRARY_PATH
export LIBRARY_PATH="$HERE/usr/lib/i386-linux-gnu/pulseaudio":$LIBRARY_PATH
export LIBRARY_PATH="$HERE/usr/lib/i386-linux-gnu/alsa-lib":$LIBRARY_PATH
export LIBRARY_PATH="$HERE/usr/lib/x86_64-linux-gnu":$LIBRARY_PATH
export LIBRARY_PATH="$HERE/lib/x86_64-linux-gnu":$LIBRARY_PATH
export LIBRARY_PATH="$HERE/usr/lib/x86_64-linux-gnu/pulseaudio":$LIBRARY_PATH
export LIBRARY_PATH="$HERE/usr/lib/x86_64-linux-gnu/alsa-lib":$LIBRARY_PATH
export LIBRARY_PATH="$LIBRARY_PATH":"${LD_LIBRARY_PATH}"
MAIN="$HERE/app/bin/comando
exec "${HERE}/lib64/ld-linux-x86-64.so.2" --inhibit-cache --library-path "${LIBRARY_PATH}" ${MAIN} "$@"
Recomendações:
- Programas com muitas dependências ou dependências complexas.
- Programas que dependem de caminhos absolutos.
-
Não é possível a execução do AppImage usando superusuário. É preciso uma conta de usuário comum para poder executar o AppImage. Distros modulares como o Puppy costumam usar conta root por padrão, o que faz do AppImage incompatível com o sistema sem uma conta de usuário comum.
-
Alguns programas podem necessitar de acesso ao sistema host para funcionar conforme esperado. Eles podem assumir o conteiner como host.
São problemas que eu encontrei ao gerar alguns AppImages que usavam Gtk e Qt e também programas em Python. Provavelmente vou me deparar com mais situações como essa.
No terminal, você vai visualizar um erro como esse:
(abiword:11736): Gtk-WARNING **: 16:39:45.175: Could not load a pixbuf from icon theme.
This may indicate that pixbuf loaders or the mime database could not be found.
Para solucionar esse problema, você precisa garantir que todas as dependências serão inclusas no AppImage e depois
atualizar o gdk-pixbuf-2
.
DEPENDENCES="gdk-pixbuf2 hicolor-icon-theme adwaita-icon-theme shared-mime-info"
/usr/bin/gdk-pixbuf-query-loaders --update-cache
No terminal, você vai visualizar um erro como esse:
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Isso ocore porque nem todos os recursos do Qt foram adicionados ao AppImage e isso deve ser Configurado. Acontece no ArchImage. A solução é simples:
LIBSAVED="qt6" # Ou qt para qt5.
No terminal, você vai visualizar vários erros como esse:
[000055f540e64a80] main libvlc error: stale plugins cache: modified /usr/lib/vlc/plugins/codec/libcc_plugin.so
A solução é atualizar o cache do Vlc dessa forma:
/usr/lib/vlc/vlc-cache-gen /usr/lib/vlc/plugins
No terminal, você vai visualizar um erro como esse:
01-12-24 11:29:31.534 [Warning ] kf.service.services: KServiceTypeTrader: serviceType "ThumbCreator" not found
Esse problema está relacionado ao kio
e ao kio-extras
, que precisam ser adicionados:
DEPENDENCES="kio kio-extras" # Para qt5 é kio5 e kio5-extras.
Pelo incrível que pareça, pode não aparecer uma mensagem aparente denunciando o problema. Mas para resolver, alguns temas devem ser inseridos:
DEPENDENCES="breeze-icons hicolor-icon-theme"
Se o programa usa ícones SVG pode ser necessário:
DEPENDENCES="qt6-svg" # Para qt5 é qt5-svg.
No terminal, você vai visualizar um erro como esse:
File "/usr/lib/hypnotix/mpv.py", line 49, in <module>
raise OSError("Cannot find libmpv in the usual places. Depending on your distro, you may try installing an "
OSError: Cannot find libmpv in the usual places. Depending on your distro, you may try installing an mpv-devel or mpv-libs package. If you have libmpv around but this script can't find it, consult the documentation for ctypes.util.find_library which this script uses to look up the library filename.
Isso acontece porque o ctypes.util.find_library
não está conseguindo encontrar as libs em /usr/lib pois ele precisa que o
pacote binutils
esteja incluído para incluir também as ferramentas relacionadas ao ld
em /usr/bin
. Então, deve-se
adicionar o binutils
como dependência mesmo:
DEPENDENCES="binutils"
No terminal, você vai visualizar um erro como esse:
gi.repository.GLib.GError: gdk-pixbuf-error-quark: Couldn’t recognize the image file format for file “/usr/share/hypnotix/pictures/tv.svg” (3)
É o pacote necessário para a exibição do svg que não está disponível e deve ser inserido:
DEPENDENCES="librsvg"
No terminal, você vai visualizar um erro como esse:
error while opening image svg. couldnt recognize the image file format
É o pacote necessário para a exibição do svg que não está disponível e também deve ser inserido:
DEPENDENCES="librsvg"
No terminal, você vai visualizar um erro como esse:
Failed to open VDPAU backend libvdpau_va_gl.so: cannot open shared object file: No such file or directory
Pra Nvidia, não tem muito o que fazer, pois precisa do nvidia-utils
, mas pra Intel ou AMD, dá pra resolver com:
DEPENDENCES="libvdpau-va-gl mesa"
No terminal, você vai visualizar um erro como esse:
terminate called after throwing an instance of 'Magick::ErrorMissingDelegate'
what(): converseen: Coder array not returned!
Nesse caso, o diretório do ImageMagick não foi adicionado e precisa ser configurado dessa forma dependendo da versão:
LIBSAVED="ImageMagick-7.1.1"
No terminal, você vai visualizar um erro como esse:
[FATAL] Could not initialize GLX
Para resolver esse problema, o GLX precisa ser incluído no AppImage:
DEPENDENCES="libglvnd"
No terminal, você vai visualizar um erro como esse:
BC_WindowBase::glx_window_fb_configs: opengl initialization failed failed
Geralmente acontece em programas que exigem aceleração de hardware. Essas dependências são necessárias para cobrir todos os casos:
mesa vulkan-intel vulkan-radeon nvidia nvidia-utils
Poder ser um problema adicionar as dependências relacionados a nvidia no AppImage, pois isso não resolveria o problema, necessitando de métodos alternativos.
No terminal, você vai visualizar um erro como esse:
GLib-GObject-CRITICAL **: g_boxed_type_register_static: assertion 'g_type_from_name (name) == 0' failed at /usr/lib/perl5/5.40/vendor_perl/Glib/Object/Introspection.pm line 110.
Alguma dependência relacionada ao Introspection está faltando. Pode ser resolvido da seguinte forma:
DEPENDENCES="glib2 gobject-introspection perl-glib-object-introspection perl-gtk3 pango-perl cairo-perl"
O ideal também é verificar a existência do diretório no AppImage: /usr/share/gir-1.0
.
No terminal, você vai visualizar um erro como esse:
Subroutine Pango::Layout::set_text redefined at /usr/share/perl5/vendor_perl/Gtk3.pm line 2299.
require Gtk3.pm called at /usr/bin/shutter line 72
É um erro avisando que requer o Gtk3.pm e portanto, ele aponta que não está disponível. Por isso, deve ser adicionado:
DEPENDENCES="perl-gtk3"
No terminal, você vai visualizar um erro como esse:
(shutter:829): Pango-WARNING **: 21:37:36.266: failed to create cairo scaled font, expect ugly output. the offending font is 'Noto Sans Bold 9.999'
O jeito é adicionar as fontes que o programa necessita:
DEPENDENCES="noto-fonts noto-fonts-extra noto-fonts-cjk noto-fonts-emoji"
Você pode remover os seguintes diretórios para deixar o AppImage mais leve:
rm -rf $APPDIR/usr/share/gtk-doc
rm -rf $APPDIR/usr/share/info
rm -rf $APPDIR/usr/share/licenses
rm -rf $APPDIR/usr/share/man
rm -rf $APPDIR/usr/share/pkgconfig
rm -rf $APPDIR/usr/share/doc
rm -rf $APPDIR/usr/lib64/cmake
rm -rf $APPDIR/usr/lib64/systemd
rm -rf $APPDIR/usr/lib64/tmpfiles.d
rm -rf $APPDIR/etc/pacman.d
rm -rf $APPDIR/etc/systemd
Dependendo do programa, você pode encontrar alguns problemas que necessitam ajustes específicos. Também há algumas soluções que podem ser utilizadas caso prefira uma auto integração.
Você preparou o AppDir e quando foi rodar o comando se deparou com um erro parecido com esse:
ventoy{.png,.svg,.xpm} defined in desktop file but not found
For example, you could put a 256x256 pixel png into
/home/mxnt/GIT_LDP/_APPIMAGE/ventoy.AppDir/ventoy.png
O comando appimagetool
usa como referência o arquivo .desktop
para buscar o ícone. O nome do ícone deve ser no formato
.png
, .svg
ou .xpm
e deve ter o mesmo nome configurado em Icon=
. Por Exemplo:
[Desktop Entry]
Name=Ventoy
GenericName=Ventoy
Comment=Bootable USB Creator
Exec=ventoy
Icon=ventoy
Type=Application
Terminal=false
Categories=Utility;
Conforme o Icon=ventoy
, o ícone deve ser por exemplo ventoy.png
e não Ventoy.png
.
Para executar um programa com permissões no modo gráfico, você pode executar:
pkexec DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY comando
Mas, esse comando não funciona após iniciar o AppImage e executar o comando
de exemplo, devido as propriedades
e a forma como o diretório do AppImage foi criado, só que funciona para executar o próprio AppImage.
Isso acontece porque o comando
de exemplo está dentro do diretório de montagem do AppImage e por isso o pkexec
não é executado corretamente , mas o próprio AppImage está fora desse diretório e por isso o pkexec
vai funcionar
corretamente, assim como qualquer outro comando externo que necessite ser aberto.
Então, segue a solução:
if [ "$EUID" -ne 0 ]; then
pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY "$APPIMAGE" "$@"
exit 0
fi
Se o AppImage não for executado como root, ele executa a si mesmo com sudo gráfico para ele poder executar como superusuário.
Eu usei isso no FreeOffice. A variável $APPIMAGE
retorna o seu próprio nome e isso é conveniente.
Assim, posso criar links simbólicos para executar diferentes aplicações no FreeOffice, permitindo uma autointegração
bem facilitada. Como por exemplo:
cd "$APPDIR"
BASEIMAGE="${APPIMAGE##*/}"
text="FreeOffice-TextMaker.AppImage"
plan="FreeOffice-PlanMaker.AppImage"
pres="FreeOffice-Presentations.AppImage"
cd FreeOffice
[ "$BASEIMAGE" == "$text" ] && {
./textmaker "$@"
exit 0
}
[ "$BASEIMAGE" == "$plan" ] && {
./planmaker "$@"
exit 0
}
[ "$BASEIMAGE" == "$pres" ] && {
ext="${@##*.}"
shopt -s nocasematch
case "$ext" in
"prs" ) ./presentations -S "$@";;
"pps" ) ./presentations -S "$@";;
"ppsx" ) ./presentations -S "$@";;
* ) ./presentations "$@";;
esac
exit 0
}
cwd="${APPIMAGE%/*}"
cd "$cwd"
ln -s "$BASEIMAGE" "$text"
ln -s "$BASEIMAGE" "$plan"
ln -s "$BASEIMAGE" "$pres"
Mas não funcionou. A definição da variável $APPIMAGE
parece seguir o link simbólico até o arquivo original e por isso
não funciona e a variável é sempre definida com a localização do arquivo original.
Então, uma alternativa é usar Hard Link. Enquanto o link simbólico é um link baseado no caminho do arquivo ou diretório, o Hard Link é baseado no inode do arquivo original. Ao invés de apontar para um caminho, ele compartilha o mesmo inode do arquivo original, ou seja, ele aponta direto para a localização do arquivo original no espaço físico. Então, é como se esse link fosse o próprio arquivo e por isso funciona.
Nesse caso, só foi preciso alterar essas linhas:
ln "$BASEIMAGE" "$text"
ln "$BASEIMAGE" "$plan"
ln "$BASEIMAGE" "$pres"
Você precisa testar bem o programa para descobrir isso. Como por exemplo o PeaZip, tinha esse comportamento. E isso pode ser resolvido da seguinte forma:
rm -rf peazip/res/conf
ln -sf ~/.local/share/peazip/conf peazip/res/conf
Esses comandos são executados dentro do AppDir do PeaZip ou no script que vai gerar o AppImage. Ele remove o diretório de configuração do PeaZip dentro do AppDir e substitui por um link simbólico para um local que deve ser criado pelo AppRun:
conf=~/.local/share/peazip/conf
test ! -f "$conf" && mkdir -p "$conf"
Tem desses. A solução é pré-instalar ele fora do AppImage para ser executado pelo AppRun. Como Exemplo:
test ! -e ~/.local/bin && mkdir ~/.local/bin
test ! -e ~/.local/bin/noisetorch && {
cp ./noisetorch ~/.local/bin
}
~/.local/bin/noisetorch
Se preferir fazer uma integração automática na primeira inicialização do AppImage, esse é um exemplo simplificado:
prg=abiword
cd $APPDIR
desktopfile=~/.local/share/applications/$prg.desktop
iconfile=~/.local/share/pixmaps/$prg.png
test ! -e "$desktopfile" && cp $prg.desktop ~/.local/share/applications/
test ! -e "$iconfile" && cp $prg.png ~/.local/share/pixmaps/
if ! grep -q "$APPIMAGE" "$desktopfile"; then
sed -i "s:Exec=.*:Exec=$APPIMAGE:" "$desktopfile"
sed -i "s:Icon=.*:Icon=$iconfile:" "$desktopfile"
/usr/bin/update-desktop-database -q || true
test -e usr/share/icons/hicolor/icon-theme.cache && {
test -x /usr/bin/gtk-update-icon-cache && /usr/bin/gtk-update-icon-cache ~/.local/share/pixmaps/ 2>&1 >&- || true
}
fi
Aqui está um exemplo simples de como fazer isso:
HERE="$(dirname "$(readlink -f "${0}")")"
export UNION_PRELOAD="${HERE}"
export LD_PRELOAD="${HERE}/libunionpreload.so"
Você vai precisar baixar a lib: https://github.com/project-portable/libunionpreload/releases
No terminal, você pode visualizar um erro como esse:
ERROR: cannot import name GObject, introspection typelib not found
Isso acontece porque programas em Python que usam introspection typelib
, geralmente necessitam
de pacotes como esses:
DEPENDENCES="libgirepository gobject-introspection-runtime python-gobject"
Há mais dependências como essas como glib2
e glibc
. Isso é necessário para que o módulo gi
funcione perfeitamente.
Ele é útil para usar os TypeLib
em /usr/lib/girepository-1.0
. Se alguma TypeLib
estiver faltando,
vai gerar erros parecidos com esses:
Typelib file for namespace 'libxml2', version '2.0' not found
Typelib file for namespace 'Pango', version '1.0' not found
Geralmente pode ser resolvido adicionando como dependência os pacotes de libs que contém os TypeLib
. Aqui estão alguns
pacotes que contém TypeLib
para consultar facilmente:
gobject-introspection-runtime:
usr/lib/girepository-1.0/DBus-1.0.typelib
usr/lib/girepository-1.0/DBusGLib-1.0.typelib
usr/lib/girepository-1.0/GL-1.0.typelib
usr/lib/girepository-1.0/Vulkan-1.0.typelib
usr/lib/girepository-1.0/cairo-1.0.typelib
usr/lib/girepository-1.0/fontconfig-2.0.typelib
usr/lib/girepository-1.0/freetype2-2.0.typelib
usr/lib/girepository-1.0/libxml2-2.0.typelib
usr/lib/girepository-1.0/win32-1.0.typelib
usr/lib/girepository-1.0/xfixes-4.0.typelib
usr/lib/girepository-1.0/xft-2.0.typelib
usr/lib/girepository-1.0/xlib-2.0.typelib
usr/lib/girepository-1.0/xrandr-1.3.typelib
glib2:
usr/lib/girepository-1.0/GIRepository-3.0.typelib
usr/lib/girepository-1.0/GLib-2.0.typelib
usr/lib/girepository-1.0/GLibUnix-2.0.typelib
usr/lib/girepository-1.0/GModule-2.0.typelib
usr/lib/girepository-1.0/GObject-2.0.typelib
usr/lib/girepository-1.0/Gio-2.0.typelib
usr/lib/girepository-1.0/GioUnix-2.0.typelib
at-spi2-core:
usr/lib/girepository-1.0/Atk-1.0.typelib
usr/lib/girepository-1.0/Atspi-2.0.typelib
gtk4:
usr/lib/girepository-1.0/Gdk-4.0.typelib
usr/lib/girepository-1.0/GdkWayland-4.0.typelib
usr/lib/girepository-1.0/GdkX11-4.0.typelib
usr/lib/girepository-1.0/Gsk-4.0.typelib
usr/lib/girepository-1.0/Gtk-4.0.typelib
gtk3:
usr/lib/girepository-1.0/Gdk-3.0.typelib
usr/lib/girepository-1.0/GdkX11-3.0.typelib
usr/lib/girepository-1.0/Gtk-3.0.typelib
gtk2:
usr/lib/girepository-1.0/Gdk-2.0.typelib
usr/lib/girepository-1.0/GdkX11-2.0.typelib
usr/lib/girepository-1.0/Gtk-2.0.typelib
gdk-pixbuf2:
usr/lib/girepository-1.0/GdkPixbuf-2.0.typelib
usr/lib/girepository-1.0/GdkPixdata-2.0.typelib
pango:
usr/lib/girepository-1.0/Pango-1.0.typelib
usr/lib/girepository-1.0/PangoCairo-1.0.typelib
usr/lib/girepository-1.0/PangoFT2-1.0.typelib
usr/lib/girepository-1.0/PangoFc-1.0.typelib
usr/lib/girepository-1.0/PangoOT-1.0.typelib
usr/lib/girepository-1.0/PangoXft-1.0.typelib
spice-gtk:
usr/lib/girepository-1.0/SpiceClientGLib-2.0.typelib
usr/lib/girepository-1.0/SpiceClientGtk-3.0.typelib
harfbuzz:
usr/lib/girepository-1.0/HarfBuzz-0.0.typelib
graphene:
usr/lib/girepository-1.0/Graphene-1.0.typelib
gtksourceview4:
usr/lib/girepository-1.0/GtkSource-4.typelib
Vte3:
usr/lib/girepository-1.0/Vte-2.91.typelib
Problemas com TypeLib também pode acontecer com Perl.
No terminal, você pode visualizar um erro como esse:
Can't locate Glib.pm in @INC (you may need to install the Glib module) (@INC entries checked:
[ ... ]
) at /usr/lib/perl5/5.40/vendor_perl/Glib/Object/Introspection.pm line 20.
Nesse caso, você precisa ir atrás dos módulos pm
. Aqui estão alguns pacotes para consultar facilmente:
perl-http-message:
usr/share/perl5/vendor_perl/HTTP/Config.pm
usr/share/perl5/vendor_perl/HTTP/Headers.pm
usr/share/perl5/vendor_perl/HTTP/Message.pm
usr/share/perl5/vendor_perl/HTTP/Request.pm
usr/share/perl5/vendor_perl/HTTP/Response.pm
usr/share/perl5/vendor_perl/HTTP/Status.pm
perl-libwww:
usr/share/perl5/vendor_perl/LWP.pm
usr/share/perl5/vendor_perl/LWP/Authen/Basic.pm
usr/share/perl5/vendor_perl/LWP/Authen/Digest.pm
usr/share/perl5/vendor_perl/LWP/Authen/Ntlm.pm
usr/share/perl5/vendor_perl/LWP/ConnCache.pm
usr/share/perl5/vendor_perl/LWP/Debug.pm
usr/share/perl5/vendor_perl/LWP/DebugFile.pm
usr/share/perl5/vendor_perl/LWP/MemberMixin.pm
usr/share/perl5/vendor_perl/LWP/Protocol.pm
usr/share/perl5/vendor_perl/LWP/RobotUA.pm
usr/share/perl5/vendor_perl/LWP/Simple.pm
usr/share/perl5/vendor_perl/LWP/UserAgent.pm
```r
```r
perl-sub-quote:
usr/share/perl5/vendor_perl/Sub/Defer.pm
usr/share/perl5/vendor_perl/Sub/Quote.pm
glib-perl:
usr/lib/perl5/5.40/vendor_perl/Glib.pm
perl-cairo-gobject:
usr/lib/perl5/5.40/vendor_perl/Cairo/GObject.pm
perl-xml-parser:
usr/lib/perl5/5.40/vendor_perl/XML/Parser.pm
perl-xml-twig:
usr/share/perl5/vendor_perl/XML/Twig.pm
perl-encode-locale:
usr/share/perl5/vendor_perl/Encode/Locale.pm
perl-uri:
usr/share/perl5/vendor_perl/URI.pm
perl-lwp-protocol-https:
usr/share/perl5/vendor_perl/LWP/Protocol/https.pm
Também acontece esse tipo de erro:
Can't load '/usr/lib/perl5/5.40/vendor_perl/auto/Pango/Pango.so' for module Pango: /usr/lib/perl5/5.40/vendor_perl/auto/Pango/Pango.so: undefined symbol: cairo_struct_from_sv at /usr/lib/perl5/5.40/core_perl/DynaLoader.pm line 206.
Nesse caso, é só instalar essas depencdências:
DEPENDENCES="cairo-perl pango-perl glib-perl"