unofficial mirror of guix-devel@gnu.org 
 help / color / mirror / code / Atom feed
* on cabal revisions
@ 2019-06-11 20:56 Robert Vollmert
  2019-06-12  4:54 ` Timothy Sample
  0 siblings, 1 reply; 11+ messages in thread
From: Robert Vollmert @ 2019-06-11 20:56 UTC (permalink / raw)
  To: guix-devel

Hello all,

I have a question regarding how cabal revisions are handled
for haskell packages. Namely, would it make sense / is it
possible to make the revised cabal file part of the source
field in the package definition?


Summary for non-haskell-experts: A hackage package of
a given version can have metadata revisions that are applied
to its cabal file, but not the source tarball itself.

Consider e.g. the package utf8-string-1.0.1.1,

 http://hackage.haskell.org/package/utf8-string-1.0.1.1

The source tarball includes a file utf8-string.cabal, which
is “revision 0”. The latest revision of utf8-string-1.0.1.1
is revision 3, with cabal file at

 http://hackage.haskell.org/package/utf8-string-1.0.1.1/revision/3.cabal

Typically, such revisions update the version bounds on
dependencies; e.g. a package might not build against the
current guix set of haskell packages at revision 0, but might
build at a higher revision because some restrictive bound has
been lifted.


Currently, haskell-build-system supports cabal revision via
an argument field, e.g.:

   (arguments
    `(#:cabal-revision
      ("3" "02vhj5gykkqa2dyn7s6gn8is1b5fdn9xcqqvlls268g7cpv6rk38")))

This works; I’ve posted a patch

 https://debbugs.gnu.org/cgi/bugreport.cgi?bug=36048

to make guix import hackage aware of this so that it doesn’t
import stale version by default.


However, I was thinking that it might be better to have this
variant cabal file be part of the source field of the package
definition. Is there a nice way to do that?

It feels like this might be hacked in via the patching mechanism,
but that feels dirty. I’d rather patching be generalized to
something that both supports applying a patch (from a local file
or a URL), or copying a file. (Or unpacking another tar ball to
some subdirectory, for that matter.)

Alternatively, could this be achieved through the snippet field?
I couldn’t work out how, and none of the uses of snippet that I
found used any file input.

What I’m imagining is something roughly like this:

   (source
     (origin
       (method url-fetch)
       (uri “https://hackage.haskell.org/package-sources.tar.gz”))
       (sha256 …))
     (origin
       (destination “package.cabal”)
       (method url-fetch)
       (uri “https://hackage.haskell.org/package/1.cabal”)
       (sha256 …)))

probably with some way to specify how the sources should be
combined, by default unpacking over the previous result
sequentially. Would that be possible? A good idea even?


(My reasons why using the source field instead of the argument
field might be nicer:
- all sources in one place
- less special-casing for the haskell build system
- simpler 
- maaaybe a useful abstraction that allows simplifying things
 like patching, too)


What do you think?

Robert

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

* Re: on cabal revisions
  2019-06-11 20:56 on cabal revisions Robert Vollmert
@ 2019-06-12  4:54 ` Timothy Sample
  2019-06-13 11:46   ` Robert Vollmert
  2019-06-14 20:12   ` on cabal revisions Ricardo Wurmus
  0 siblings, 2 replies; 11+ messages in thread
From: Timothy Sample @ 2019-06-12  4:54 UTC (permalink / raw)
  To: Robert Vollmert; +Cc: guix-devel

Hi Robert,

I patched the “cabal-revision” stuff into the build system, so I suppose
I should weigh in here.  :)

Robert Vollmert <rob@vllmrt.net> writes:

> Hello all,
>
> I have a question regarding how cabal revisions are handled
> for haskell packages. Namely, would it make sense / is it
> possible to make the revised cabal file part of the source
> field in the package definition?

Yes it makes sense, and yes it is possible.  This is something I wanted
to do before, but I wasn’t sure how.  The only idea I had was to make a
new download method, but that’s a very heavy solution for such a simple
task.

> Summary for non-haskell-experts: A hackage package of
> a given version can have metadata revisions that are applied
> to its cabal file, but not the source tarball itself.
>
> Consider e.g. the package utf8-string-1.0.1.1,
>
>  http://hackage.haskell.org/package/utf8-string-1.0.1.1
>
> The source tarball includes a file utf8-string.cabal, which
> is “revision 0”. The latest revision of utf8-string-1.0.1.1
> is revision 3, with cabal file at
>
>  http://hackage.haskell.org/package/utf8-string-1.0.1.1/revision/3.cabal
>
> Typically, such revisions update the version bounds on
> dependencies; e.g. a package might not build against the
> current guix set of haskell packages at revision 0, but might
> build at a higher revision because some restrictive bound has
> been lifted.
>
>
> Currently, haskell-build-system supports cabal revision via
> an argument field, e.g.:
>
>    (arguments
>     `(#:cabal-revision
>       ("3" "02vhj5gykkqa2dyn7s6gn8is1b5fdn9xcqqvlls268g7cpv6rk38")))
>
> This works; I’ve posted a patch
>
>  https://debbugs.gnu.org/cgi/bugreport.cgi?bug=36048
>
> to make guix import hackage aware of this so that it doesn’t
> import stale version by default.

That’s fantastic, thanks!  I see it hasn’t been reviewed yet – I’ll try
and take a look tomorrow.

> However, I was thinking that it might be better to have this
> variant cabal file be part of the source field of the package
> definition. Is there a nice way to do that?
>
> It feels like this might be hacked in via the patching mechanism,
> but that feels dirty. I’d rather patching be generalized to
> something that both supports applying a patch (from a local file
> or a URL), or copying a file. (Or unpacking another tar ball to
> some subdirectory, for that matter.)
>
> Alternatively, could this be achieved through the snippet field?
> I couldn’t work out how, and none of the uses of snippet that I
> found used any file input.

There is a way to do it through the mighty power of gexps!  Behold:

    (origin
      (method url-fetch)
      (uri (string-append "https://hackage.haskell.org/package/"
                          "tree-diff/tree-diff-0.0.1.tar.gz"))
      (sha256
       (base32
        "049v44c520jy3icxlnrvbdblh3mjmvd7m6qmkzxbzkf02x63xqmz"))
      (snippet
       #~(copy-file
          #+(origin
              (method url-fetch)
              (uri (string-append "https://hackage.haskell.org/package/"
                                  "tree-diff-0.0.1/revision/4.cabal"))
              (sha256
               (base32
                "1rqxxyj6hqllahs11693g855cxz8mgnb490s7j1ksd300i5xgjsp")))
          "tree-diff.cabal")))

(I’m constantly amazed at how useful, composable, and empowering gexps
are.)  This could be cleaned up with some procedures and made just as
nice as the current setup.  What do you think?

> What I’m imagining is something roughly like this:
>
>    (source
>      (origin
>        (method url-fetch)
>        (uri “https://hackage.haskell.org/package-sources.tar.gz”))
>        (sha256 …))
>      (origin
>        (destination “package.cabal”)
>        (method url-fetch)
>        (uri “https://hackage.haskell.org/package/1.cabal”)
>        (sha256 …)))
>
> probably with some way to specify how the sources should be
> combined, by default unpacking over the previous result
> sequentially. Would that be possible? A good idea even?

This makes sense, but I’m not sure it’s a common enough use case to
warrant a specialized interface.  Besides these Cabal revisions, only a
handful of packages (that I’ve seen) need to download extra non-patch
stuff.  Some packages have external test suites, for instance.  Since it
would be mostly just the Haskell packages that would use it, and we
already have one and a half Cabal revision interfaces, I don’t see a
strong need.  That being said, I don’t know the package collection as
well as many others here, so maybe I’ve missed something.

> (My reasons why using the source field instead of the argument
> field might be nicer:
> - all sources in one place
> - less special-casing for the haskell build system
> - simpler 
> - maaaybe a useful abstraction that allows simplifying things
>  like patching, too)
>
>
> What do you think?

I think the first three points you make are good ones!  I’m less sure
about that last one, though.  :)


-- Tim

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

* Re: on cabal revisions
  2019-06-12  4:54 ` Timothy Sample
@ 2019-06-13 11:46   ` Robert Vollmert
  2019-06-13 14:25     ` Timothy Sample
  2019-06-14 20:12   ` on cabal revisions Ricardo Wurmus
  1 sibling, 1 reply; 11+ messages in thread
From: Robert Vollmert @ 2019-06-13 11:46 UTC (permalink / raw)
  To: Timothy Sample; +Cc: guix-devel

Hi Timothy,

thanks for your reply.

> On 12. Jun 2019, at 06:54, Timothy Sample <samplet@ngyro.com> wrote:
> 
> Hi Robert,
> 
> I patched the “cabal-revision” stuff into the build system, so I suppose
> I should weigh in here.  :)
> 
> Robert Vollmert <rob@vllmrt.net> writes:
> 
>> Hello all,
>> 
>> I have a question regarding how cabal revisions are handled
>> for haskell packages. Namely, would it make sense / is it
>> possible to make the revised cabal file part of the source
>> field in the package definition?
> 
> Yes it makes sense, and yes it is possible.  This is something I wanted
> to do before, but I wasn’t sure how.  The only idea I had was to make a
> new download method, but that’s a very heavy solution for such a simple
> task.

[…]

>> Alternatively, could this be achieved through the snippet field?
>> I couldn’t work out how, and none of the uses of snippet that I
>> found used any file input.
> 
> There is a way to do it through the mighty power of gexps!  Behold:
> 
>    (origin
>      (method url-fetch)
>      (uri (string-append "https://hackage.haskell.org/package/"
>                          "tree-diff/tree-diff-0.0.1.tar.gz"))
>      (sha256
>       (base32
>        "049v44c520jy3icxlnrvbdblh3mjmvd7m6qmkzxbzkf02x63xqmz"))
>      (snippet
>       #~(copy-file
>          #+(origin
>              (method url-fetch)
>              (uri (string-append "https://hackage.haskell.org/package/"
>                                  "tree-diff-0.0.1/revision/4.cabal"))
>              (sha256
>               (base32
>                "1rqxxyj6hqllahs11693g855cxz8mgnb490s7j1ksd300i5xgjsp")))
>          "tree-diff.cabal")))
> 
> (I’m constantly amazed at how useful, composable, and empowering gexps
> are.)  This could be cleaned up with some procedures and made just as
> nice as the current setup.  What do you think?

Lovely, thanks. The following works for me:

    (source
     (origin
       (method url-fetch)
       (uri (string-append
             "https://hackage.haskell.org/package/tree-diff/tree-diff-"
             version
             ".tar.gz"))
       (sha256
        (base32
         "049v44c520jy3icxlnrvbdblh3mjmvd7m6qmkzxbzkf02x63xqmz"))
       (snippet
        (snippet-hackage-revision "tree-diff" version "4"
          (base32
            "1rqxxyj6hqllahs11693g855cxz8mgnb490s7j1ksd300i5xgjsp")))))

with

(define* (snippet-hackage-revision hackage-name version revision hash)
  #~(copy-file
     #+(origin
         (method url-fetch)
         (uri (string-append "https://hackage.haskell.org/package/"
                             hackage-name "-" version "/revision/"
                             revision ".cabal"))
         (sha256 hash))
     (string-append #+hackage-name ".cabal")))

Would this be a worthwhile change? What would be a good place (and name)
for snippet-hackage-revision?

One disadvantage that I see is that it moves the revision information
from plain data in the arguments field to a rather opaque code snippet.

>> (My reasons why using the source field instead of the argument
>> field might be nicer:
>> - all sources in one place
>> - less special-casing for the haskell build system
>> - simpler 
>> - maaaybe a useful abstraction that allows simplifying things
>> like patching, too)

I remembered one more: guix refresh. As far as I understand, it works
only on the level of the source field, thus having the revision there
would help make it revision-aware. I’m unsure though whether the
snippet approach actually improves things here — probably the refresh
code would see the resulting gexp and not the raw data.

Cheers
Rob

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

* Re: on cabal revisions
  2019-06-13 11:46   ` Robert Vollmert
@ 2019-06-13 14:25     ` Timothy Sample
  2019-06-14 14:30       ` Robert Vollmert
  0 siblings, 1 reply; 11+ messages in thread
From: Timothy Sample @ 2019-06-13 14:25 UTC (permalink / raw)
  To: Robert Vollmert; +Cc: guix-devel

Hi Robert,

Robert Vollmert <rob@vllmrt.net> writes:

> Hi Timothy,
>
> thanks for your reply.
>
>> On 12. Jun 2019, at 06:54, Timothy Sample <samplet@ngyro.com> wrote:
>> 
>> Hi Robert,
>> 
>> I patched the “cabal-revision” stuff into the build system, so I suppose
>> I should weigh in here.  :)
>> 
>> Robert Vollmert <rob@vllmrt.net> writes:
>> 
>>> Hello all,
>>> 
>>> I have a question regarding how cabal revisions are handled
>>> for haskell packages. Namely, would it make sense / is it
>>> possible to make the revised cabal file part of the source
>>> field in the package definition?
>> 
>> Yes it makes sense, and yes it is possible.  This is something I wanted
>> to do before, but I wasn’t sure how.  The only idea I had was to make a
>> new download method, but that’s a very heavy solution for such a simple
>> task.
>
> […]
>
>>> Alternatively, could this be achieved through the snippet field?
>>> I couldn’t work out how, and none of the uses of snippet that I
>>> found used any file input.
>> 
>> There is a way to do it through the mighty power of gexps!  Behold:
>> 
>>    (origin
>>      (method url-fetch)
>>      (uri (string-append "https://hackage.haskell.org/package/"
>>                          "tree-diff/tree-diff-0.0.1.tar.gz"))
>>      (sha256
>>       (base32
>>        "049v44c520jy3icxlnrvbdblh3mjmvd7m6qmkzxbzkf02x63xqmz"))
>>      (snippet
>>       #~(copy-file
>>          #+(origin
>>              (method url-fetch)
>>              (uri (string-append "https://hackage.haskell.org/package/"
>>                                  "tree-diff-0.0.1/revision/4.cabal"))
>>              (sha256
>>               (base32
>>                "1rqxxyj6hqllahs11693g855cxz8mgnb490s7j1ksd300i5xgjsp")))
>>          "tree-diff.cabal")))
>> 
>> (I’m constantly amazed at how useful, composable, and empowering gexps
>> are.)  This could be cleaned up with some procedures and made just as
>> nice as the current setup.  What do you think?
>
> Lovely, thanks. The following works for me:
>
>     (source
>      (origin
>        (method url-fetch)
>        (uri (string-append
>              "https://hackage.haskell.org/package/tree-diff/tree-diff-"
>              version
>              ".tar.gz"))
>        (sha256
>         (base32
>          "049v44c520jy3icxlnrvbdblh3mjmvd7m6qmkzxbzkf02x63xqmz"))
>        (snippet
>         (snippet-hackage-revision "tree-diff" version "4"
>           (base32
>             "1rqxxyj6hqllahs11693g855cxz8mgnb490s7j1ksd300i5xgjsp")))))
>
> with
>
> (define* (snippet-hackage-revision hackage-name version revision hash)
>   #~(copy-file
>      #+(origin
>          (method url-fetch)
>          (uri (string-append "https://hackage.haskell.org/package/"
>                              hackage-name "-" version "/revision/"
>                              revision ".cabal"))
>          (sha256 hash))
>      (string-append #+hackage-name ".cabal")))
>
> Would this be a worthwhile change? What would be a good place (and name)
> for snippet-hackage-revision?
>
> One disadvantage that I see is that it moves the revision information
> from plain data in the arguments field to a rather opaque code snippet.

True, but we could move the procedure to the build side, and then the
gexp would be simple enough to understand mechanically.  The downside to
this is that we would (probably) have to put something in the “modules”
field in the “origin” record, making it a little more verbose.

To be clear, what I mean is to write

    (snippet
     #~(snippet-hackage-revision "tree-diff" version "4"
         (base32
          "1rqxxyj6hqllahs11693g855cxz8mgnb490s7j1ksd300i5xgjsp")))

and then put “snippet-hackage-revision” somewhere in “(guix build ...)”.
This way, at least in most cases, you could get the Cabal revision if
you had nothing but an “origin” record.  I’m not sure how important this
is, though (see below).

>>> (My reasons why using the source field instead of the argument
>>> field might be nicer:
>>> - all sources in one place
>>> - less special-casing for the haskell build system
>>> - simpler 
>>> - maaaybe a useful abstraction that allows simplifying things
>>> like patching, too)
>
> I remembered one more: guix refresh. As far as I understand, it works
> only on the level of the source field, thus having the revision there
> would help make it revision-aware. I’m unsure though whether the
> snippet approach actually improves things here — probably the refresh
> code would see the resulting gexp and not the raw data.

This is a very good point!  Unfortunately, AFAICT, the refresh mechanism
only works on the level of versions.  It has no support for automated
patches or snippet changes.  It looks like updating the Cabal revision
using the refresh script would require one or two far-reaching changes.
Are there other package repositories that use a release-with-patches
style?  Having another example would make it easier to design at the
right level of abstraction.

Now I think that we should have a good plan for refreshing before making
a bunch of changes to the Cabal revision stuff.  Otherwise, we might
have to change everything again if and when we make refreshing work.

Thoughts?


-- Tim

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

* Re: on cabal revisions
  2019-06-13 14:25     ` Timothy Sample
@ 2019-06-14 14:30       ` Robert Vollmert
  2019-06-14 15:36         ` Timothy Sample
  0 siblings, 1 reply; 11+ messages in thread
From: Robert Vollmert @ 2019-06-14 14:30 UTC (permalink / raw)
  To: Timothy Sample; +Cc: guix-devel

On 13. Jun 2019, at 16:25, Timothy Sample <samplet@ngyro.com> wrote:
> 
>> I remembered one more: guix refresh. As far as I understand, it works
>> only on the level of the source field, thus having the revision there
>> would help make it revision-aware. I’m unsure though whether the
>> snippet approach actually improves things here — probably the refresh
>> code would see the resulting gexp and not the raw data.
> 
> This is a very good point!  Unfortunately, AFAICT, the refresh mechanism
> only works on the level of versions.  It has no support for automated
> patches or snippet changes.  It looks like updating the Cabal revision
> using the refresh script would require one or two far-reaching changes.
> Are there other package repositories that use a release-with-patches
> style?  Having another example would make it easier to design at the
> right level of abstraction.
> 
> Now I think that we should have a good plan for refreshing before making
> a bunch of changes to the Cabal revision stuff.  Otherwise, we might
> have to change everything again if and when we make refreshing work.
> 
> Thoughts?

I agree that reworking the revision thing shouldn’t happen first. I’m
happy to understand how it might work for now.

Is “guix refresh” even a good approach for the haskell packages? There’s
a lot of work being done to put consistent sets of haskell packages, e.g.
the whole stackage project. Does Guix mean to replicate this work, or would
it maybe be a good choice to follow stackage sets?

How big is the diff between the current haskell package definitions and
the result of guix hackage import? It would be tempting to consider most
as an output of guix hackage import, and to refresh them by reimporting,
possibly based on a version set pulled from stackage.

Hmm another tangential question: Is there any particular system to the
splitting of gnu/packages/haskell*.scm?

haskell.scm itself is huge — does this have performance implications? I’ve been
wondering whether guile scales well with module size. It appears that circular
imports between package modules are not a problem? Personally I’d like to
see the haskell compiler in a different module from hackage modules. Other
than that, keeping our own categorization seems wasteful, why not one
haskell-hackage.scm that’s sorted alphabetically by package name?

Robert

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

* Re: on cabal revisions
  2019-06-14 14:30       ` Robert Vollmert
@ 2019-06-14 15:36         ` Timothy Sample
  2019-06-14 20:24           ` Ricardo Wurmus
                             ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Timothy Sample @ 2019-06-14 15:36 UTC (permalink / raw)
  To: Robert Vollmert; +Cc: guix-devel

Hi Robert,

I don’t have a lot of time, so here’s a “hot take” on the points you
bring up.

Robert Vollmert <rob@vllmrt.net> writes:

> On 13. Jun 2019, at 16:25, Timothy Sample <samplet@ngyro.com> wrote:
>> 
>>> I remembered one more: guix refresh. As far as I understand, it works
>>> only on the level of the source field, thus having the revision there
>>> would help make it revision-aware. I’m unsure though whether the
>>> snippet approach actually improves things here — probably the refresh
>>> code would see the resulting gexp and not the raw data.
>> 
>> This is a very good point!  Unfortunately, AFAICT, the refresh mechanism
>> only works on the level of versions.  It has no support for automated
>> patches or snippet changes.  It looks like updating the Cabal revision
>> using the refresh script would require one or two far-reaching changes.
>> Are there other package repositories that use a release-with-patches
>> style?  Having another example would make it easier to design at the
>> right level of abstraction.
>> 
>> Now I think that we should have a good plan for refreshing before making
>> a bunch of changes to the Cabal revision stuff.  Otherwise, we might
>> have to change everything again if and when we make refreshing work.
>> 
>> Thoughts?
>
> I agree that reworking the revision thing shouldn’t happen first. I’m
> happy to understand how it might work for now.
>
> Is “guix refresh” even a good approach for the haskell packages? There’s
> a lot of work being done to put consistent sets of haskell packages, e.g.
> the whole stackage project. Does Guix mean to replicate this work, or would
> it maybe be a good choice to follow stackage sets?

We mostly do this already.  There is a Stackage importer, and a little
while ago I updated most of our Haskell packages to their LTS 12
versions.

> How big is the diff between the current haskell package definitions and
> the result of guix hackage import? It would be tempting to consider most
> as an output of guix hackage import, and to refresh them by reimporting,
> possibly based on a version set pulled from stackage.

IIRC, Nix automatically imports all Haskell packages from Hackage (I’m a
little fuzzy on the details, though).

Our refresh script knows about Stackage, so you can use it to keep
packages up to date with Stackage.  One of the main issues with
automatic package maintenance in Guix is that we have some
unconventional, non-technical and semi-technical requirements on our
packages.  We need to follow the FSDG (Free Software Distribution
Guidelines); we try and make sure that everything has a useful synopsis
and description; and we try to make sure everything is bootstrappable
and reproducible.  I say “unconventional” above because there are often
upstream issues with these things that need to be fixed manually.

The reason I bring these up is that we would have to develop some
mechanism to maintain documentation changes, extra license information,
and any other changes we make.  Basically, we can’t “just” reimport
every time.  I also worry that trying to move in that direction would
result in less care taken to maintain our own standards of quality,
since the tools would put pressure on us to just use whatever we get
from upstream.

This is just me thinking out loud, of course.

> Hmm another tangential question: Is there any particular system to the
> splitting of gnu/packages/haskell*.scm?

Not beyond the obvious one (that is, crypto packages go in “crypto”).

> haskell.scm itself is huge — does this have performance implications?

Yes.  It is an ongoing problem with Guix, and one of the reasons we
split up the files in the first place.  If you want to know more, there
have been many discussions on this list.

> I’ve been
> wondering whether guile scales well with module size. It appears that circular
> imports between package modules are not a problem? Personally I’d like to
> see the haskell compiler in a different module from hackage modules.

We are moving towards this in general.  The “guile.scm” and
“guile-xyz.scm” split is a recent example of this.

> Other
> than that, keeping our own categorization seems wasteful, why not one
> haskell-hackage.scm that’s sorted alphabetically by package name?

The subcategories (e.g., “web”) are mostly for performance reasons,
AIUI.  I’m not sure why packages are not alphabetical.  I don’t think
there is any formal organization to the packages within modules.

Hope that helps!


-- Tim

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

* Re: on cabal revisions
  2019-06-12  4:54 ` Timothy Sample
  2019-06-13 11:46   ` Robert Vollmert
@ 2019-06-14 20:12   ` Ricardo Wurmus
  1 sibling, 0 replies; 11+ messages in thread
From: Ricardo Wurmus @ 2019-06-14 20:12 UTC (permalink / raw)
  To: Timothy Sample; +Cc: guix-devel, Robert Vollmert

Hi,

>> What I’m imagining is something roughly like this:
>>
>>    (source
>>      (origin
>>        (method url-fetch)
>>        (uri “https://hackage.haskell.org/package-sources.tar.gz”))
>>        (sha256 …))
>>      (origin
>>        (destination “package.cabal”)
>>        (method url-fetch)
>>        (uri “https://hackage.haskell.org/package/1.cabal”)
>>        (sha256 …)))
>>
>> probably with some way to specify how the sources should be
>> combined, by default unpacking over the previous result
>> sequentially. Would that be possible? A good idea even?
>
> This makes sense, but I’m not sure it’s a common enough use case to
> warrant a specialized interface.  Besides these Cabal revisions, only a
> handful of packages (that I’ve seen) need to download extra non-patch
> stuff.

One notorious class of packages that could benefit from a general
mechanism like this: the TeX Live packages.  They consist of various
subsets of a big SVN repository.  Currently, we pick an arbitrary
directory of the SVN repository as the main source and add all the other
locations as native inputs.

I wanted to add a procedure that accepts multiple locations in the SVN
repository, creates a union, and computes the single hash of the union.
This would make the texlive-* packages a lot simpler.

--
Ricardo

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

* Re: on cabal revisions
  2019-06-14 15:36         ` Timothy Sample
@ 2019-06-14 20:24           ` Ricardo Wurmus
  2019-06-16  8:00             ` haskell package organization (Re: on cabal revisions) Robert Vollmert
  2019-06-14 20:28           ` on cabal revisions Ricardo Wurmus
  2019-06-15  9:02           ` reproducibility and bootstrapping in mid 2019 (was Re: on cabal revisions) Giovanni Biscuolo
  2 siblings, 1 reply; 11+ messages in thread
From: Ricardo Wurmus @ 2019-06-14 20:24 UTC (permalink / raw)
  To: Timothy Sample; +Cc: guix-devel, Robert Vollmert


Timothy Sample <samplet@ngyro.com> writes:

>> Is “guix refresh” even a good approach for the haskell packages? There’s
>> a lot of work being done to put consistent sets of haskell packages, e.g.
>> the whole stackage project. Does Guix mean to replicate this work, or would
>> it maybe be a good choice to follow stackage sets?
>
> We mostly do this already.  There is a Stackage importer, and a little
> while ago I updated most of our Haskell packages to their LTS 12
> versions.

At the beginning we just had all the latest packages from Hackage and it
took considerable time and effort to upgrade them all to a consistent
LTS set.

This makes the review of updates to ghc-* packages a little slower for
me because these packages really ought to be upgraded together so that
they closely resemble whichever LTS version we’re following.

(This is what I’m doing for Bioconductor and CRAN packages and it would
be great if we could regularly sync our Haskell packages in the same
manner.)

--
Ricardo

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

* Re: on cabal revisions
  2019-06-14 15:36         ` Timothy Sample
  2019-06-14 20:24           ` Ricardo Wurmus
@ 2019-06-14 20:28           ` Ricardo Wurmus
  2019-06-15  9:02           ` reproducibility and bootstrapping in mid 2019 (was Re: on cabal revisions) Giovanni Biscuolo
  2 siblings, 0 replies; 11+ messages in thread
From: Ricardo Wurmus @ 2019-06-14 20:28 UTC (permalink / raw)
  To: Timothy Sample; +Cc: guix-devel, Robert Vollmert


Timothy Sample <samplet@ngyro.com> writes:

>> I’ve been
>> wondering whether guile scales well with module size. It appears that circular
>> imports between package modules are not a problem? Personally I’d like to
>> see the haskell compiler in a different module from hackage modules.
>
> We are moving towards this in general.  The “guile.scm” and
> “guile-xyz.scm” split is a recent example of this.

Separating the compiler packages from the libraries and applications
written in the language is a goal.  We need the work to be done for at
least Java and for Haskell.

--
Ricardo

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

* reproducibility and bootstrapping in mid 2019 (was Re: on cabal revisions)
  2019-06-14 15:36         ` Timothy Sample
  2019-06-14 20:24           ` Ricardo Wurmus
  2019-06-14 20:28           ` on cabal revisions Ricardo Wurmus
@ 2019-06-15  9:02           ` Giovanni Biscuolo
  2 siblings, 0 replies; 11+ messages in thread
From: Giovanni Biscuolo @ 2019-06-15  9:02 UTC (permalink / raw)
  To: Timothy Sample, Robert Vollmert; +Cc: guix-devel

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

Hello Timothy and Robert,

(a little OT re cabal import, but...)

sorry if I repeat something already said on this list... and sorry for a
*personal* rant :-)

Timothy Sample <samplet@ngyro.com> writes:

[...]

> IIRC, Nix automatically imports all Haskell packages from Hackage (I’m a
> little fuzzy on the details, though).

https://github.com/NixOS/nixpkgs/blob/release-19.03/pkgs/development/haskell-modules/hackage-packages.nix

--8<---------------cut here---------------start------------->8---
/* hackage-packages.nix is an auto-generated file -- DO NOT EDIT! */
--8<---------------cut here---------------end--------------->8---

Please do not this in Guix.

I don't have details about auto imported Haskell packages
reproducibility in Nix, I just remember other *historical* approaces
with Javascript packages in a fine 2015 analisys by Christopher Lemmer
Webber

https://web.archive.org/web/20180528141816/http:/dustycloud.org/blog/javascript-packaging-dystopia/

«Unfortunately, Nix just downloads the prebuilt binary and installs
that»

Today Nix ships this jquery related packages:
https://nixos.org/nixos/packages.html#jquery

and AFAIU jquery (python37Packages.xstatic-jquery,
haskellPackages.js-jquery) are still static prebuilt binaries

Are they counted as reproducible by this kind of checks:
https://r13y.com/ ?

[...]

> One of the main issues with automatic package maintenance in Guix is
> that we have some unconventional, non-technical and semi-technical
> requirements on our packages.  We need to follow the FSDG (Free
> Software Distribution Guidelines); we try and make sure that
> everything has a useful synopsis and description; and we try to make
> sure everything is bootstrappable and reproducible.  I say
> “unconventional” above because there are often upstream issues with
> these things that need to be fixed manually.

Re. reproducibility, unfortunately it's **not** a shared goal between
_packaging systems_ developers, so for example we have a good pile of
npm packaged code that is _still_ a *nightmare* from the reproducibility
POV

Hey developers: please come and work with Guix on a reproducible way to
build and distribute software; Guix have all it's needed, please stop
reinventing the *square* wheel.

Citing Christopher article above:

«And let's face it, "fuck it, I'm out" seems to be the mantra of web
application packaging these days. Our deployment and build setups have
gotten so complicated that I doubt anyone really has a decent
understanding of what is going on, really.»

AFAIU this is _still_ the sad situation today with web applications
development, probably 99% of web developers/deployers in the world are
"solving" this with Docker app bundles containing piles of misterious
layers of mixed reproducible and static binaries downloaded _somewhere_,
cryptominers included

There are succesful projects out there that _proudly_ declare the *only*
officially supported distribution method is their Docker
bundle... World: **we have a problem**

https://web.archive.org/web/20180528121826/https://www.vitavonni.de/blog/201503/2015031201-the-sad-state-of-sysadmin-in-the-age-of-containers.html
«Feels like downloading Windows shareware in the 90s to me.»

I don't know the reproducibility situation with Stackage or Hackage
defined packages (and web applications), I just hope it's better than
this.

Re. boostrapping, unfortunately we still have an unbootstrappable
Haskell toolchain
https://web.archive.org/web/20190615075205/http://www.joachim-breitner.de/blog/748-Thoughts_on_bootstrapping_GHC
https://elephly.net/posts/2017-01-09-bootstrapping-haskell-part-1.html

...but that's the same with some jvm languages
http://bootstrappable.org/projects/jvm-languages.html

Anyway at least "the plan" to work it out is in good shape... the world
just needs to invest much more resurces on this serious infrastrutcure
problems, but it's too... distracted :-D

Last but not least: a huge pile of deep gratitude to all the people
around the world working to solve this sad sad situation!

Happy Guix! Gio'.

[...]

-- 
Giovanni Biscuolo

Xelera IT Infrastructures

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

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

* haskell package organization (Re: on cabal revisions)
  2019-06-14 20:24           ` Ricardo Wurmus
@ 2019-06-16  8:00             ` Robert Vollmert
  0 siblings, 0 replies; 11+ messages in thread
From: Robert Vollmert @ 2019-06-16  8:00 UTC (permalink / raw)
  To: Ricardo Wurmus; +Cc: guix-devel

On 14. Jun 2019, at 22:24, Ricardo Wurmus <rekado@elephly.net> wrote:
> Timothy Sample <samplet@ngyro.com> writes:
>> 
>> We mostly do this already.  There is a Stackage importer, and a little
>> while ago I updated most of our Haskell packages to their LTS 12
>> versions.
> 
> At the beginning we just had all the latest packages from Hackage and it
> took considerable time and effort to upgrade them all to a consistent
> LTS set.
> 
> This makes the review of updates to ghc-* packages a little slower for
> me because these packages really ought to be upgraded together so that
> they closely resemble whichever LTS version we’re following.

[ This is really in reply to multiple threads of this discussion. Also
  it’s based on my limited understanding of issues — please correct my
  misunderstandings. E.g. I don’t quite understand how guile works around
  circular imports. Finally, for my motivation: I’m packaging a few
  Haskell programs that pull in quite a few new libraries, and would
  rather use that opportunity to make matters better not worse. ]

So what do you all think of some organization like the following:

gnu/packages/haskell.scm:
  Haskell compilers (ghc), and their dependencies if any. Shouldn’t import
  any of the the other haskell modules.

gnu/packages/haskell-stackage-*.scm:
  Various Haskell library modules (ghc-*) that are consistent with some
  stackage set (LTS 12 currently).

gnu/packages/haskell-other.scm:
  Various Haskell library modules that are either on a non-LTS version,
  or not on stackage at all. This might include alternate versions of
  stackage modules, under a different name.

gnu/packages/haskell-tools.scm:
  Haskell executables that are Haskell specific. E.g. hlint,
  hspec-discover, ….

gnu/packages/*.scm:
  Programs that happen to be built using the Haskell build system. E.g.
  things that are currently in haskell-apps.scm: darcs, git-annex.

The idea would be that the stackage updates would be clearly targeted
to those haskell-stackage files.

My personal preference for the haskell-stackage-*.scm files would be to
simply split them by name prefix, e.g.

  haskell-stackage-abc.scm, haskell-stackage-def.scm

so that they are of manageable size. (I think the current categorization
into haskell-web, haskell-crypto etc. causes quite a bit of cognitive
overhead for little benefit: Where should I file this oauth package?
Where do I import it from?)

Robert

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

end of thread, other threads:[~2019-06-16  8:00 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-11 20:56 on cabal revisions Robert Vollmert
2019-06-12  4:54 ` Timothy Sample
2019-06-13 11:46   ` Robert Vollmert
2019-06-13 14:25     ` Timothy Sample
2019-06-14 14:30       ` Robert Vollmert
2019-06-14 15:36         ` Timothy Sample
2019-06-14 20:24           ` Ricardo Wurmus
2019-06-16  8:00             ` haskell package organization (Re: on cabal revisions) Robert Vollmert
2019-06-14 20:28           ` on cabal revisions Ricardo Wurmus
2019-06-15  9:02           ` reproducibility and bootstrapping in mid 2019 (was Re: on cabal revisions) Giovanni Biscuolo
2019-06-14 20:12   ` on cabal revisions Ricardo Wurmus

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

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).