Error: cannot pack "/root/prime": cannot validate snap "mysnap": layout "/usr/lib/x86_64-linux-gnu/webkit2gtk-4.0"

I’m making a snap of an mono/xamarin gtk app.

It uses mono-complete which installs a lot of .libraries and .dll

I had problems with .dll.config files referencing /. Fort hat I got help and the advice to use layout:, e.g.

layout:
  /usr/lib/cli/gdk-sharp-2.0:
    bind: $SNAP/usr/lib/cli/gdk-sharp-2.0

My app uses libraries from

/usr/lib/x86_64-linux-gnu

Because the app snap uses

extensions: [gnome-3-38]

and gnome-3-38 includes

/usr/lib/x86_64-linux-gnu

in

$SNAP/gnome-platform/usr/lib/x86_64-linux-gnu

I set

layout:
  /usr/lib/x86_64-linux-gnu:
     bind: $SNAP/gnome-platform/usr/lib/x86_64-linux-gnu

BUT then snapcraft gives the error

Failed to create snap, snap command failed: stdout:

stderr: error: cannot pack “/root/prime”: cannot validate snap “timedatecalculator”: layout “/usr/lib/x86_64-linux-gnu/webkit2gtk-4.0” underneath prior layout item “/usr/lib/x86_64-linux-gnu”

I get the same error if I include lib/x86_64-linux-gnu in stage-packages: and bind to that.

Question

How do I prevent that error ?

I could perhaps include lib/x86_64-linux-gnu in stage-packages:, bind to that and delete lib/x86_64-linux-gnu/webkit2gtk-4.0 but then lib/x86_64-linux-gnu would be included twice in two different locations.

the extension will set up that layout and a matching LD_LIBRARY_PATH entry on its own through the automatically added desktop-launch command-chain script, you should not need to apply any layout for gnome-platform dirs …

Problem is that a lot of the .dll have dllmaps in .dll.config files that references either /usr/lib/... or just a target, and then when I run the snapd app I get errors like:

Mono: DllImport error loading library ‘/snap/timedatecalculator/x1/usr/lib/libgobject-2.0.so.0.so’: ‘/snap/timedatecalculator/x1/usr/lib/libgobject-2.0.so.0.so: cannot open shared object file: No such file or directory’.

where, if investigated:

sudo snap run --shell snappedapp root@stendell:/home/eigil/Projects/xamarinProjs/snappedapp# grep -i ‘libgobject-2.0’ . -r|grep : ./etc/mono/config: ./usr/lib/cli/atk-sharp-2.0/atk-sharp.dll.config: ./usr/lib/cli/gdk-sharp-2.0/gdk-sharp.dll.config: ./usr/lib/cli/glib-sharp-2.0/glib-sharp.dll.config: ./usr/lib/cli/gtk-sharp-2.0/gtk-sharp.dll.config: ./usr/lib/cli/pango-sharp-2.0/pango-sharp.dll.config: ./usr/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll.config:

root@stendell:/snap/snappedapp/x1# find . -path ./mnt -prune -o -name ‘libgobject-2.0.so’ -print ./gnome-platform/usr/lib/x86_64-linux-gnu/libgobject-2.0.so ./gnome-platform/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 ./gnome-platform/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.6400.6 ./gnome-platform/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.6400.6-gdb.py

MONO_PATH in the snap/snapcraft.yaml

MONO_PATH: $SNAP/etc/mono:$SNAP/usr/bin:$SNAP/usr/lib:$SNAP/usr/lib/mono:$SNAP/usr/share/mono:$SNAP/usr/lib/cli:$SNAP/usr/lib/cli/atk-sharp-2.0:$SNAP/usr/lib/cli/gdk-sharp-2.0:$SNAP/usr/lib/cli/gtk-sharp-2.0:$SNAP/usr/lib/cli/glib-sharp-2.0:$SNAP/gnome-platform/usr/lib/x86_64-linux-gnu

and

sudo snap run --shell snappedapp root@stendell:/home/eigil/Projects/xamarinProjs/snap_snappedapp# echo $MONO_PATH /snap/snappedapp/x1/etc/mono:/snap/snappedapp/x1/usr/bin:/snap/snappedapp/x1/usr/lib:/snap/snappedapp/x1/usr/lib/mono:/snap/snappedapp/x1/usr/share/mono:/snap/snappedapp/x1/usr/lib/cli:/snap/snappedapp/x1/usr/lib/cli/atk-sharp-2.0:/snap/snappedapp/x1/usr/lib/cli/gdk-sharp-2.0:/snap/snappedapp/x1/usr/lib/cli/gtk-sharp-2.0:/snap/snappedapp/x1/usr/lib/cli/glib-sharp-2.0:/snap/snappedapp/x1/gnome-platform/usr/lib/x86_64-linux-gnu

So mono just searches the first lib path.