[oi-dev] manually specifying dependencies between scripting language modules
Tim Mooney
Tim.Mooney at ndsu.edu
Tue Jan 4 06:39:26 UTC 2022
In regard to: Re: [oi-dev] manually specifying dependencies between...:
>
> Am 04.01.22 um 06:10 schrieb Tim Mooney via oi-dev:
>>
>> All-
>>
>> My basic question is what the best practice is for how packagers
>> should be
>> specifying dependencies between language modules/libraries for scripting
>> languages? Currently I'm specifically interested in perl modules, but
>> the same idea is relevant for python, ruby, etc.
>>
>> As an example of one way to do it, there's
>> oi-userland/components/perl/libwww-perl/libwww-perl-PERLVER.p5m.
>> Alexander manually added all of the modules that are needed for
>> libwww-perl-###, using the most obvious, "friendly" syntax for depend:
>>
>> depend fmri=library/perl-5/encode-locale-$(PLV) type=require
>> depend fmri=library/perl-5/file-listing-$(PLV) type=require
>> depend fmri=library/perl-5/html-parser-$(PLV) type=require
>>
>> etc.
>>
>> Doing it that way, though, those dependencies don't get added to Makefile
>> when you do "gmake REQUIRED_PACKAGES", and they don't appear to be added
>> to the "pkg5" metadata after a successful publish.
>
> This is intended. The requirements modeled in the Makefile (and thus in
> pkg5) are BUILD dependencies whereas depend actions in the manifest are
> RUNTIME dependencies.
Thanks Andreas! That's the clearest explanation I've seen of that, and
it does help to clear up some things.
So thinking not about scripting languages but instead a traditional
ELF binary that's linked against multiple libraries, when I do a
gmake install; gmake REQUIRED_PACKAGES
pkg is adding build-time dependencies to the Makefile, but a later
gmake publish
is also adding the same dependencies to the package automatically as
runtime dependencies, correct? It must be, based on ELF linkage,
otherwise we would have a lot of packages that don't have correct runtime
dependencies because we're not (manually) specifying them in the manifest.
>Alas our tools are not good at detecting runtime
> dependencies and sometimes fail on build dependencies (eg. for test
> requirements). So we need to manually add missing dependencies. The
> actual state of both, runtime and build dependencies is lacking. And
> sometimes you'll be hit by this fact when you build or install packages
> locally. This is also a reason why sometimes local builds are fine while
> they fail on the build server (and vice versa).
>
>
>>
>> The same is true if you want to make a language module depend upon the
>> version of the perl interpreter it was built for. I first tried using
>> this syntax:
>>
>> depend fmri=runtime/perl-$(PLV) type=require
>>
>> or variants of it as outlined in the pkg guide, like:
>>
>> depend fmri=pkg:/runtime/perl-$(PLV) type=require
>>
>> Dependencies specified that way aren't output by REQUIRED_PACKAGES.
>>
>> However, if you change the syntax to a "less obvious" method:
>>
>> depend fmri=__TBD pkg.debug.depend.file=perl \
>> pkg.debug.depend.path=usr/perl5/$(PERLVER)/bin type=require
>>
>> then REQUIRED_PACKAGES *does* add the dependency to the Makefile and the
>> pkg5 metadata. That's a trick that Aurélien has used in some places.
>
> When IPS is working (eg. by running pkg install) it does not have access
> to the information in the Makefiles or pkg5.
> From what I know pkg5 files aren't yet used at all. They are artifacts
> from future enhancements of the build tools Aurélien has been working on.
Oh, interesting, I wasn't aware that pkg5 wasn't really even being used.
I assumed that was some critical metadata that pkg used.
>> So what's the right thing to do here? Use the simple syntax in the .p5m
>> file and don't care that the dependency isn't listed in the Makefile or
>> pkg5? Use the more complicated syntax, with "fmri=__TBD" and a file and
>> path from the dependency? Don't specify anything in the .p5m file and
>> instead manually add the dependency in the Makefile, as you might for
>> a build dependency?
>
> It depends on what you want to model: build dependency, runtime
> dependency or both.
In the case that prompted my question, it would be both.
For example the perl/File-Listing module has an unrecorded build-time
and runtime dependency on library/perl-5/http-date for the same version
of perl (i.e. library/perl-5/file-listing-524 needs
library/perl-5/http-date-524).
It's needed at build time to run the test suite.
It's also needed at runtime for the correct functioning of the module.
I want to correctly record that file-listing for one version of perl
needs http-date from the same version of perl.
In this case, am I correct in thinking I should be doing both of these
things:
1) manually add REQUIRED_PACKAGES += library/perl-5/http-date-###
to the Makefile for the build-time dependency.
2) add
depend fmri=library/perl-5/http-date-$(PLV) type=require
to the manifest as a runtime dependency?
Thanks,
Tim
--
Tim Mooney Tim.Mooney at ndsu.edu
Enterprise Computing & Infrastructure /
Division of Information Technology / 701-231-1076 (Voice)
North Dakota State University, Fargo, ND 58105-5164
More information about the oi-dev
mailing list