Help with zef Portfile

raf macports at raf.org
Sun Nov 26 09:15:22 UTC 2023


On Sun, Nov 26, 2023 at 02:07:39AM +1100, Joshua Root <jmr at macports.org> wrote:

> raf wrote:
> 
> > The destroot part looks like this:
> > 
> >    destroot {
> >        "${prefix}/bin/rakudo" -I"${worksrcpath}" bin/zef \
> >            --to="inst#${destroot}${prefix}/share/perl6/site" \
> >            install "${worksrcpath}"
> > 
> >        ln -s "${prefix}/share/perl6/site/bin/zef"   "${prefix}/bin/zef"
> >        ln -s "${prefix}/share/perl6/site/bin/zef-m" "${prefix}/bin/zef-m"
> >    }
> > 
> > Which results in this error:
> > 
> >    :error:destroot Failed to destroot raku-zef: invalid command name "/opt/local/bin/rakudo"
> >    :debug:destroot Error code: NONE
> >    :debug:destroot Backtrace: invalid command name "/opt/local/bin/rakudo"
> >    :debug:destroot     while executing
> >    :debug:destroot "$procedure $targetname"
> > 
> > As "${prefix}/bin/rakudo" is valid in test.cmd,
> > why isn't it valid during destroot?
> > And how do I help destroot find it?
> 
> This is really a macports-dev question, so cross-posting this there.
> 
> When you override (e.g. destroot { ... }) or augment (e.g. post-build { ...
> }) a port phase, the code you provide is executed in the Tcl interpreter.
> '${prefix}/bin/rakudo' is indeed not a valid Tcl command. It happens that we
> do define an 'ln' Tcl command that takes args very much like ln(1). If you
> want to execute something in the shell, you have to use the 'system' command
> (or sometimes 'exec' if you want to capture the output.)
> 
> The default destroot phase builds a string to pass to 'system' by combining
> destroot.cmd, destroot.args, etc. In this case, it might be easiest to use
> those for the rakudo command, and create the symlinks in a post-destroot
> block?
> 
> - Josh

Thanks! That's super helpful.

I tried just putting "system" before the command but it didn't work.
I couldn't find the documentation for tcl's system, so I tried using
destroot.cmd "${prefix}/bin/rakudo" ... instead, but it added extra
arguments: install DESTROOT=... which break the command. But erasing
destroot's args, pre_args, and post_args fixed the build.

Then the problem was activating it. It said:

  Error: Failed to activate raku-zef: Image error:
  /opt/local/share/perl6/site/version is being used by the active rakudo port.
  Please deactivate this port first, or use 'port -f activate raku-zef' to
  force the activation.

So I added the removal of that file to post-destroot and now it works!
It installs and avtivates...

However, when I now test with "sudo port install -vst raku-zef", and add the
missing dependencies (curl, git, wget), I get this error:

  :info:destroot Failed to create directory '/opt/local/share/perl6/site/short' with mode '0o777': Failed to mkdir: Operation not permitted
  :info:destroot Command failed:  cd "/opt/local/var/macports/build/_Users_raf_macports_ports_lang_raku-zef/raku-zef/work/zef-0.21.1" && /opt/local/bin/rakudo -I"/opt/local/var/macports/build/_Users_raf_macports_ports_lang_raku-zef/raku-zef/work/zef-0.21.1" bin/zef --to="inst#/opt/local/var/macports/build/_Users_raf_macports_ports_lang_raku-zef/raku-zef/work/destroot/opt/local/share/perl6/site" install /opt/local/var/macports/build/_Users_raf_macports_ports_lang_raku-zef/raku-zef/work/zef-0.21.1 
  :info:destroot Exit code: 1

And now, I get the same error without -vst. Wierd, that did work before trying -vst.
And port test isn't working anymore either with teh same error.

  $ ls -lasp /opt/local/share/perl6/site
  0 drwxr-xr-x  3 root  wheel   96 26 Nov 11:58 ./
  0 drwxr-xr-x  7 root  admin  224 26 Nov 11:58 ../
  0 -rw-r--r--  1 root  wheel  1 26 Nov 11:57 version

Any idea what's happening? Or what to try next?

I tried uninstalling and reinstalling rakudo just in case it might
help, but it didn't. My current attempt is
https://github.com/macportsraf/raku-zef-portfile

cheers,
raf



More information about the macports-users mailing list