In dev_mode
I was using a layout
so that erl
could fine erlexec
without modification:
Erlang is built and installed with --prefix=/usr
which is why the layout creates a symlink for /usr/lib/erlang
, it is where erl
script will look for the erlexec
binary.
After learning layout
is not supported by classic confinement I’m wondering what is the best alternative for this snap to work?
Can you just use --prefix=/snap/erlang/current/usr
instead?
Is that standard practice? I had thought that a bad solution since current
is a symlink and could be pointed to a different install. But if running a non-current version is supposed to not work I suppose it would work. Is that the case?
Would setting ERL_LIBS
make any difference? It looks like, from a very quick scan of the docs so I might be very wrong, this environment variable sets the library path. Try setting it to $SNAP/usr/lib
?
Na, ERL_LIBS
is for discovering Erlang libraries that are only loaded after initial boot which requires finding erts
.
You can see how the erl
script is generated when compiling Erlang and how it references the install directory directly here:
You could manually patch that file before building with the following substitution:
sed -i 's|ROOTDIR="%FINAL_ROOTDIR%"|ROOTDIR="$SNAP/%FINAL_ROOTDIR%"|' erl.src.src
1 Like
The current
symlink will always be there and point to a valid install when your snap is installed and enabled (except for bugs of course), so I would say try this and see what happens. It’s possibly you might run into issues down the road installing this snap on distros that don’t use /snap/...
and instead have /var/lib/snapd/snap/...
but I’m not sure.
Ok. I had done that in my very first snap attempt and it worked for erl
at least. I worried there might be other places that reference the install directly and then discovered layouts
in the docs so moved on with that.
There must be other snaps that build projects don’t work if where they are told to install with --prefix
is different from where they actually are on the filesystem? Is patching the strategy usually used? I couldn’t find anything in the docs for what I thought would be a common issue – well except for layouts
docs
I’ll move forward with patching the erl
script for now.
Thanks!
So the use of patching the script to use $SNAP
breaks when the snap is used to build other snaps.
I was creating an Elixir snap using the Erlang snap as a build-snap
depedency which lead to:
Building elixir
/root/parts/elixir/install/usr/bin/erl: 29: exec: /snap/snapcraft/4007/usr/lib/erlang/erts-10.6.4/bin/erlexec: not found
Which makes sense, in the case of building a snap the $SNAP
path is /snap/snapcraft/<revision>
.
So I may have to switch to use /snap/erlang/current
for now, until a better solution is known.
Is there at least a environment variable that is set for where snap
directory is in case it isn’t in the root at /snap
?
Also concerned about how this will work with parallel installs?
Oh wait, duh, if I’m going this direction I might as well just make the path by constructing it from the location of the script itself.
So I’m going to try to use the (path to the script)/../lib/erts-10.6.4/bin
.