unofficial mirror of help-guix@gnu.org 
 help / color / mirror / Atom feed
* Design decision behind inputs/native-inputs/propagated-inputs
@ 2016-01-21  4:49 Steven Allen
  2016-01-21  9:59 ` Ludovic Courtès
  0 siblings, 1 reply; 10+ messages in thread
From: Steven Allen @ 2016-01-21  4:49 UTC (permalink / raw)
  To: help-guix

[-- Attachment #1: Type: text/plain, Size: 1199 bytes --]

All,

I just attended David Thompson's talk about Guix and asked some
questions about the difference between inputs, propagated-inputs, and
native-inputs. I believe I now understand what each does but am unclear
as to why.

Currently, I use Arch. On Arch, we have makedepends and depends where
only depends are kept at runtime. On Guix, this distinction is detected
at build time by searching the output files for references into the
inputs. However, unless I'm mistaken, native-inputs are *usually* build
dependencies and inputs are *usually* runtime dependencies. So, my
question is why not:

1. Get rid of the automagic run/build dependency detection.
2. Have:
  a. private-inputs -- runtime dependencies not linked into the environment
  b. propagated-inputs -- no change
  c. build-inputs -- always native, never included in the final output

Specifically, what is the use case for non-native build-only dependencies 
(inputs that are not included in the final package) and native runtime
dependencies (native-inputs that *are* included in the final package)?
Alternatively, am I completely missing the point?

P.S. Please CC, I'm not subscribed.

-- 
Steven Allen

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Design decision behind inputs/native-inputs/propagated-inputs
  2016-01-21  4:49 Design decision behind inputs/native-inputs/propagated-inputs Steven Allen
@ 2016-01-21  9:59 ` Ludovic Courtès
  2016-01-21 16:08   ` Steven Allen
  0 siblings, 1 reply; 10+ messages in thread
From: Ludovic Courtès @ 2016-01-21  9:59 UTC (permalink / raw)
  To: Steven Allen; +Cc: help-guix

Hello,

Steven Allen <steven@stebalien.com> skribis:

> I just attended David Thompson's talk about Guix and asked some

Cool, glad that it led you to contact us!  ;-)

> Currently, I use Arch. On Arch, we have makedepends and depends where
> only depends are kept at runtime. On Guix, this distinction is detected
> at build time by searching the output files for references into the
> inputs. However, unless I'm mistaken, native-inputs are *usually* build
> dependencies and inputs are *usually* runtime dependencies. So, my
> question is why not:
>
> 1. Get rid of the automagic run/build dependency detection.
> 2. Have:
>   a. private-inputs -- runtime dependencies not linked into the environment
>   b. propagated-inputs -- no change
>   c. build-inputs -- always native, never included in the final output
>
> Specifically, what is the use case for non-native build-only dependencies 
> (inputs that are not included in the final package) and native runtime
> dependencies (native-inputs that *are* included in the final package)?
> Alternatively, am I completely missing the point?

The description of these three things has been improved in the manual on
‘master’, compared to what’s on the on-line manual:

--8<---------------cut here---------------start------------->8---
     ‘inputs’ (default: ‘'()’)
     ‘native-inputs’ (default: ‘'()’)
     ‘propagated-inputs’ (default: ‘'()’)
          These fields list dependencies of the package.  Each one is a
          list of tuples, where each tuple has a label for the input (a
          string) as its first element, a package, origin, or derivation
          as its second element, and optionally the name of the output
          thereof that should be used, which defaults to ‘"out"’ (*note
          Packages with Multiple Outputs::, for more on package
          outputs).  For example, the list below specifies 3 inputs:

               `(("libffi" ,libffi)
                 ("libunistring" ,libunistring)
                 ("glib:bin" ,glib "bin"))  ;the "bin" output of Glib

          The distinction between ‘native-inputs’ and ‘inputs’ is
          necessary when considering cross-compilation.  When
          cross-compiling, dependencies listed in ‘inputs’ are built for
          the _target_ architecture; conversely, dependencies listed in
          ‘native-inputs’ are built for the architecture of the _build_
          machine.

          ‘native-inputs’ is typically where you would list tools needed
          at build time but not at run time, such as Autoconf, Automake,
          pkg-config, Gettext, or Bison.  ‘guix lint’ can report likely
          mistakes in this area (*note Invoking guix lint::).

          Lastly, ‘propagated-inputs’ is similar to ‘inputs’, but the
          specified packages will be force-installed alongside the
          package they belong to (*note ‘guix package’:
          package-cmd-propagated-inputs, for information on how ‘guix
          package’ deals with propagated inputs.)

          For example this is necessary when a C/C++ library needs
          headers of another library to compile, or when a pkg-config
          file refers to another one via its ‘Requires’ field.

          Another example where ‘propagated-inputs’ is useful is for
          languages that lack a facility to record the run-time search
          path akin to ELF’s ‘RUNPATH’; this includes Guile, Python,
          Perl, GHC, and more.  To ensure that libraries written in
          those languages can find library code they depend on at run
          time, run-time dependencies must be listed in
          ‘propagated-inputs’ rather than ‘inputs’.
--8<---------------cut here---------------end--------------->8---

In short, the distinction between ‘native-inputs’ and ‘inputs’ exists
solely because Guix supports cross-compilation.  Otherwise it would be
unneeded.

Propagated inputs are a way to manually say: “I want this package to
automatically pull in those other packages.”  This is necessary in the
cases given above.

Does this clarify the rationale?

Thanks for your feedback,
Ludo’.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Design decision behind inputs/native-inputs/propagated-inputs
  2016-01-21  9:59 ` Ludovic Courtès
@ 2016-01-21 16:08   ` Steven Allen
  2016-01-21 21:42     ` Ben Woodcroft
  0 siblings, 1 reply; 10+ messages in thread
From: Steven Allen @ 2016-01-21 16:08 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: help-guix

[-- Attachment #1: Type: text/plain, Size: 2129 bytes --]

On 01-21-16, Ludovic Courtès wrote:
> In short, the distinction between ‘native-inputs’ and ‘inputs’ exists
> solely because Guix supports cross-compilation.  Otherwise it would be
> unneeded.
> 
> Propagated inputs are a way to manually say: “I want this package to
> automatically pull in those other packages.”  This is necessary in the
> cases given above.
> 
> Does this clarify the rationale?

I believe I understand what they mean and how they solve the problem. My
question is more "why autodetect runtime dependencies"? That is,
dependencies are currently available at runtime as follows:

 Type              | Run Time
 ------------------+----------------------------------------------
 inputs            | autodetect (if referenced)
 propagated-inputs | always (included in the profile)
 native-inputs     | autodetect (if referenced)

However, I can't think of any cases where the following wouldn't suffice:

 Type              | Run Time                         | In Arch
 ------------------+----------------------------------+-----------
 inputs            | always                           | (pseudo-)depends
 propagated-inputs | always (included in the profile) | depends
 native-inputs     | never                            | makedepends

The key difference being the lack of autodetection in the second case.

In words, I can't think of any cases where one *would* want
native-inputs at runtime and/or *not* want (non-native) inputs at
runtime.

I ask because I hate automagic (magical autodetection). To illustrate,
given:

    (package
        (name "foo")
        (inputs `(("bar", bar)))
        (native-inputs `(("baz", baz)))
        ...
    )

I know that the default output of bar, will be available at build time
but whether or not it remains available at runtime depends on whether or
not my package includes the string `/gnu/store/$hash-bar/...` somewhere
in its output. Why not just say "bar will be available at runtime and
baz will not" (really "baz may not" because it might be an input to
another package).

-- 
Steven Allen

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Design decision behind inputs/native-inputs/propagated-inputs
  2016-01-21 16:08   ` Steven Allen
@ 2016-01-21 21:42     ` Ben Woodcroft
       [not found]       ` <20160121221340.GA6151@stebalien.com>
  0 siblings, 1 reply; 10+ messages in thread
From: Ben Woodcroft @ 2016-01-21 21:42 UTC (permalink / raw)
  To: Steven Allen, Ludovic Courtès; +Cc: help-guix

Hi Steven,

On 22/01/16 02:08, Steven Allen wrote:
> On 01-21-16, Ludovic Courtès wrote:
>> In short, the distinction between ‘native-inputs’ and ‘inputs’ exists
>> solely because Guix supports cross-compilation.  Otherwise it would be
>> unneeded.
>>
>> Propagated inputs are a way to manually say: “I want this package to
>> automatically pull in those other packages.”  This is necessary in the
>> cases given above.
>>
>> Does this clarify the rationale?
> I believe I understand what they mean and how they solve the problem. My
> question is more "why autodetect runtime dependencies"?
Can I ask, what do you mean by "autodetect" ?

Thanks,
ben

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Design decision behind inputs/native-inputs/propagated-inputs
       [not found]         ` <56A15FC4.2060501@uq.edu.au>
@ 2016-01-21 23:19           ` Steven Allen
  2016-01-21 23:57             ` Ben Woodcroft
  0 siblings, 1 reply; 10+ messages in thread
From: Steven Allen @ 2016-01-21 23:19 UTC (permalink / raw)
  To: Ben Woodcroft; +Cc: help-guix

[-- Attachment #1: Type: text/plain, Size: 1345 bytes --]

Ben,

Replying back on list because I managed to take us off...

On 01-22-16, Ben Woodcroft wrote:
> On 22/01/16 08:13, Steven Allen wrote:
> >Most distros distinguish between build dependencies and runtime
> >dependencies. Guix doesn't appear to have this distinction and I am
> >under the impression that it autodetects which inputs are needed at
> >runtime (as apposed to at compile time only) by scanning the output
> >files for references to files in the inputs. Is this not the case?
> In short, no.

> You could say it scans the derivation which includes a list of "runtime"
> dependencies i.e. inputs and propagated-inputs. Derivations are in a
> well-defined format that guix generates, and are just a way of keeping track
> of dependencies that are needed at runtime. Guix doesn't scan the binaries
> or shared libraries for instance. Indeed that would be mayhem as you
> suggest.

Thanks! That makes so much more sense. Just to be clear, given:

    (package
        (name "foo")
        (inputs `(("bar", bar)))
        (native-inputs `(("baz", baz)))
        ...
    )

If I install "foo", "foo" will **always** be able to use the files in "bar"
but will not (may not?) be able to use the files in "baz"?

Sorry about the confusion...

-- 
Steven Allen
((Do Not Email <honeypot@stebalien.com>))

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Design decision behind inputs/native-inputs/propagated-inputs
  2016-01-21 23:19           ` Steven Allen
@ 2016-01-21 23:57             ` Ben Woodcroft
  2016-01-22  1:30               ` Steven Allen
  0 siblings, 1 reply; 10+ messages in thread
From: Ben Woodcroft @ 2016-01-21 23:57 UTC (permalink / raw)
  To: Steven Allen; +Cc: help-guix

Hi,

On 22/01/16 09:19, Steven Allen wrote:
> Just to be clear, given:
>
>      (package
>          (name "foo")
>          (inputs `(("bar", bar)))
>          (native-inputs `(("baz", baz)))
>          ...
>      )
>
> If I install "foo", "foo" will **always** be able to use the files in "bar"
> but will not (may not?) be able to use the files in "baz"?
That's true for some definition of 'use', yes. If you add foo to your 
profile and it is downloaded from a substitute (as opposed to being 
built from source on your machine), then you'll have to download bar as 
well, but not necessarily baz.
> Sorry about the confusion...
Not at all.

ben

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Design decision behind inputs/native-inputs/propagated-inputs
  2016-01-21 23:57             ` Ben Woodcroft
@ 2016-01-22  1:30               ` Steven Allen
  2016-01-23 16:59                 ` Steven Allen
  0 siblings, 1 reply; 10+ messages in thread
From: Steven Allen @ 2016-01-22  1:30 UTC (permalink / raw)
  To: Ben Woodcroft; +Cc: help-guix

[-- Attachment #1: Type: text/plain, Size: 750 bytes --]

On 01-22-16, Ben Woodcroft wrote:
> On 22/01/16 09:19, Steven Allen wrote:
> >Just to be clear, given:
> >
> >     (package
> >         (name "foo")
> >         (inputs `(("bar", bar)))
> >         (native-inputs `(("baz", baz)))
> >         ...
> >     )
> >
> >If I install "foo", "foo" will **always** be able to use the files in "bar"
> >but will not (may not?) be able to use the files in "baz"?
> That's true for some definition of 'use', yes. If you add foo to your
> profile and it is downloaded from a substitute (as opposed to being built
> from source on your machine), then you'll have to download bar as well, but
> not necessarily baz.

Got it. Thanks.

-- 
Steven Allen
((Do Not Email <honeypot@stebalien.com>))

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Design decision behind inputs/native-inputs/propagated-inputs
  2016-01-22  1:30               ` Steven Allen
@ 2016-01-23 16:59                 ` Steven Allen
  2016-01-23 21:12                   ` Ludovic Courtès
  0 siblings, 1 reply; 10+ messages in thread
From: Steven Allen @ 2016-01-23 16:59 UTC (permalink / raw)
  To: help-guix

[-- Attachment #1: Type: text/plain, Size: 864 bytes --]

Sorry to bug you again but I was going through some reports on the bug
tracker and came across https://debbugs.gnu.org/cgi/bugreport.cgi?bug=20765:

> Python .egg files must not be compressed
> ========================================
> ...
> Because it is compressed, the daemon’s conservative scanning fails to
> see what store items it refers to; in particular Ricardo noted that
> on his machine, python-pillow refers to a non-existent store item for
> OpenJPEG.
> ...
    
This kind of behavior is what initially gave me the impression that
runtime dependencies were auto detected.

Can anyone tell me what's going on here or point me to the relevant
documentation? Specifically, why does the daemon (assuming guix-daemon)
need to see what store items the package refers to?

-- 
Steven Allen
((Do Not Email <honeypot@stebalien.com>))

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Design decision behind inputs/native-inputs/propagated-inputs
  2016-01-23 16:59                 ` Steven Allen
@ 2016-01-23 21:12                   ` Ludovic Courtès
  2016-01-23 22:55                     ` Steven Allen
  0 siblings, 1 reply; 10+ messages in thread
From: Ludovic Courtès @ 2016-01-23 21:12 UTC (permalink / raw)
  To: Steven Allen; +Cc: help-guix

Steven Allen <steven@stebalien.com> skribis:

> Can anyone tell me what's going on here or point me to the relevant
> documentation? Specifically, why does the daemon (assuming guix-daemon)
> need to see what store items the package refers to?

At the end of a build, guix-daemon scans all the produced file in search
of references to other store items.  It then records those run-time
references (so a subset of the build-time dependencies) in the
/var/guix/db/db.sqlite database, which can be queried with
‘guix gc --references’.

Scanning is also made from ‘registerOutputs’ in build.cc.

For background, see Eelco Dolstra’s thesis at
<http://nixos.org/~eelco/pubs/phd-thesis.pdf>.

HTH!

Ludo’.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Design decision behind inputs/native-inputs/propagated-inputs
  2016-01-23 21:12                   ` Ludovic Courtès
@ 2016-01-23 22:55                     ` Steven Allen
  0 siblings, 0 replies; 10+ messages in thread
From: Steven Allen @ 2016-01-23 22:55 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: help-guix

[-- Attachment #1: Type: text/plain, Size: 2371 bytes --]

Ludovic,

On 01-23-16, Ludovic Courtès wrote:
> At the end of a build, guix-daemon scans all the produced file in search
> of references to other store items.  It then records those run-time
> references (so a subset of the build-time dependencies) in the
> /var/guix/db/db.sqlite database, which can be queried with
> ‘guix gc --references’.

So Guix does auto detect which inputs are needed at runtime! Back to my
original question: why? I've read the relevant parts of the thesis (2.1,
3.3, 7.1.5) and none of them actually answer this question. The thesis
answers "why is this not a horrible idea?" with "it appears to work in
practice" (2.1, 7.1.5) which:

1. Isn't very satisfying.
2. Is wrong. It works in practice until some unexpected case comes up
   (e.g. python eggs) and the package manager itself has to be changed.
3. Doesn't actually motivate this feature.

The only motivation I can think of is that it makes packaging (1) easier
(2) less error prone. You don't have to care about what inputs are
needed at runtime, you just have to write down all inputs and the
package manager will detect which ones are needed at runtime for you.
However, this Guix can't fully take advantage of this because it needs
to support cross compilation. Therefore, all *platform-dependent* inputs
needed at build time need to be specially designated.

My proposal is to:

1. Keep everything in the inputs list at runtime (write this list down
   somewhere).
2. Move all build-only inputs into native-inputs.
3. Turn this auto detection into a lint that validates the inputs list
   (verify that the inputs list isn't *missing* an input).
4. Optionally rename native-inputs to build-inputs.

Motivation:

1. One can tell which inputs will be kept at runtime and which will not
   by looking at the package definition.
2. One can package any program without ever having to modify the build
   system or play games (e.g. decompress random files).
3. It's less error prone because it's explicit. Unlike the current
   system, it won't break if some file happens to be compressed or
   encoded in some unexpected format.

And my question is: are there any use cases that this doesn't support?

Sorry for the wall of text and thanks for the thesis/explanation!

-- 
Steven Allen
((Do Not Email <honeypot@stebalien.com>))

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2016-01-23 22:55 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-01-21  4:49 Design decision behind inputs/native-inputs/propagated-inputs Steven Allen
2016-01-21  9:59 ` Ludovic Courtès
2016-01-21 16:08   ` Steven Allen
2016-01-21 21:42     ` Ben Woodcroft
     [not found]       ` <20160121221340.GA6151@stebalien.com>
     [not found]         ` <56A15FC4.2060501@uq.edu.au>
2016-01-21 23:19           ` Steven Allen
2016-01-21 23:57             ` Ben Woodcroft
2016-01-22  1:30               ` Steven Allen
2016-01-23 16:59                 ` Steven Allen
2016-01-23 21:12                   ` Ludovic Courtès
2016-01-23 22:55                     ` Steven Allen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).