unofficial mirror of guix-devel@gnu.org 
 help / color / mirror / code / Atom feed
* LLVM: "FileCheck" is missing
@ 2016-03-25 17:45 Danny Milosavljevic
  2016-03-25 21:58 ` Nils Gillmann
  2016-03-25 22:06 ` rust work in progress conflicts (was: Re: LLVM: "FileCheck" is missing) Nils Gillmann
  0 siblings, 2 replies; 24+ messages in thread
From: Danny Milosavljevic @ 2016-03-25 17:45 UTC (permalink / raw)
  To: guix-devel

Hi,

is anyone familiar with our LLVM packages? 

I'm trying to package rust and run into

  /gnu/store/pmiw7p7a6hwl6k2kblsk3zwhxh3gln21-llvm-3.6.2/bin/FileCheck is missing 

when configuring rust. Indeed, it is missing in the entire tree

  /gnu/store/pmiw7p7a6hwl6k2kblsk3zwhxh3gln21-llvm-3.6.2

.

It seems to be a tool for unit testing.

The rusts I'm trying to use are:

;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
;;; Copyright © 2014, 2015, 2016 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2015 Andreas Enge <andreas@enge.fr>
;;; Copyright © 2015 Efraim Flashner <efraim@flashner.co.il>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Guix is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.

(define-module (gnu packages rust)
  #:use-module ((guix licenses)
                #:select (asl2.0))
  #:use-module (gnu packages)
  #:use-module (gnu packages curl)
  #:use-module (gnu packages python)
  #:use-module (gnu packages llvm)
  #:use-module (guix packages)
  #:use-module (guix download)
  #:use-module (guix build-system gnu)
  #:use-module (guix build-system trivial)
  #:use-module (guix utils)
)

(define-public rust
  (package
    (name "rust")
    (version "1.9.0")
    (home-page "http://www.rust-lang.org/")
    (synopsis "Rust Programming Language")
    (description "Safe, Concurrent Programming Language")
    (license (list asl2.0)) ; FIXME and which MIT
    (build-system gnu-build-system) ; FIXME rust-build-system
    (inputs `(
; TODO llvm python jemalloc nacl musl
("llvm" ,llvm)

))
    (native-inputs `(
("curl" ,curl) ; FIXME remove
("python-2" ,python-2)
("llvm" ,llvm) ; 3.6 ??
; TODO ?
))
    (source
      (origin
         (method url-fetch)
         (uri "https://static.rust-lang.org/dist/2016-03-25/rustc-nightly-src.tar.gz")
         (sha256 (base32 "01sxhssllwqckmmzck6b17kaqqx622mwslwhjdrrkwjwa5qy7v54"))
         ;(uri (string-append "https://github.com/rust-lang/rust/archive/" version ".tar.gz"))
         ;(sha256 (base32 "1m2d1dc243s7ym8fq2yag3fr5jvki0q9c39llfwgcpq1gc8jvcn8"))
))
    (arguments
      `(#:configure-flags `( ;"-DCFG_BUILD=x86_64-unknown-linux-gnu"
                              ;"-disable-codegen-tests" ; because FileCheck is not built in llvm. https://github.com/alexcrichton/rust/commit/295a70f4b92d961c2e74cc750e47083e118ee10a
                             ) ; FIXME don't hard-code
        #:phases
          (modify-phases %standard-phases
            (replace 'configure
                     (lambda* (#:key inputs outputs configure-flags #:allow-other-keys)
                      (let ((out (assoc-ref outputs "out")))
                        (zero? (apply system*
                                      `("./configure"
                                        ,(string-append "--prefix=" out)
                                        ,(string-append "--llvm-root=" (assoc-ref inputs "llvm"))
                                        ; FIXME (string-append "--extra-ldflags=-Wl,-rpath-=" out "/lib")
                                        ,@configure-flags)))))))))

; FIXME remove src/llvm
;configure: CFG_LLVM_ROOT        :=  
;configure: CFG_PYTHON           :=  
;configure: CFG_JEMALLOC_ROOT    :=  
;configure: CFG_NACL_CROSS_PATH  :=  
;configure: CFG_MUSL_ROOT        := /usr/local 

))

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

* Re: LLVM: "FileCheck" is missing
  2016-03-25 17:45 LLVM: "FileCheck" is missing Danny Milosavljevic
@ 2016-03-25 21:58 ` Nils Gillmann
  2016-03-25 22:06 ` rust work in progress conflicts (was: Re: LLVM: "FileCheck" is missing) Nils Gillmann
  1 sibling, 0 replies; 24+ messages in thread
From: Nils Gillmann @ 2016-03-25 21:58 UTC (permalink / raw)
  To: guix-devel

Danny Milosavljevic <dannym@scratchpost.org> writes:

Hi Danny,

in my long journey to panopticon (https://panopticon.re) I am at
rust now.
Through what I tested and searched while I packaged rust, the
next release candidate of rust will have an option for us where
we can disable the llvm tests because they are optional for rust.

I don't have the links at hand, but there were open tickets on
this at rust.

I need to send out another message, I'll append my breaking
(new) rust.scm file to this thread later. Maybe we could
co-author this? I would be happy for some kind of workload
balance.

> Hi,
>
> is anyone familiar with our LLVM packages? 
>
> I'm trying to package rust and run into
>
>   /gnu/store/pmiw7p7a6hwl6k2kblsk3zwhxh3gln21-llvm-3.6.2/bin/FileCheck is missing 
>
> when configuring rust. Indeed, it is missing in the entire tree
>
>   /gnu/store/pmiw7p7a6hwl6k2kblsk3zwhxh3gln21-llvm-3.6.2
>
> .
>
> It seems to be a tool for unit testing.
>
> The rusts I'm trying to use are:
>
> ;;; GNU Guix --- Functional package management for GNU
> ;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
> ;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
> ;;; Copyright © 2014, 2015, 2016 Ricardo Wurmus <rekado@elephly.net>
> ;;; Copyright © 2015 Andreas Enge <andreas@enge.fr>
> ;;; Copyright © 2015 Efraim Flashner <efraim@flashner.co.il>
> ;;;
> ;;; This file is part of GNU Guix.
> ;;;
> ;;; GNU Guix is free software; you can redistribute it and/or modify it
> ;;; under the terms of the GNU General Public License as published by
> ;;; the Free Software Foundation; either version 3 of the License, or (at
> ;;; your option) any later version.
> ;;;
> ;;; GNU Guix is distributed in the hope that it will be useful, but
> ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
> ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> ;;; GNU General Public License for more details.
> ;;;
> ;;; You should have received a copy of the GNU General Public License
> ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
>
> (define-module (gnu packages rust)
>   #:use-module ((guix licenses)
>                 #:select (asl2.0))
>   #:use-module (gnu packages)
>   #:use-module (gnu packages curl)
>   #:use-module (gnu packages python)
>   #:use-module (gnu packages llvm)
>   #:use-module (guix packages)
>   #:use-module (guix download)
>   #:use-module (guix build-system gnu)
>   #:use-module (guix build-system trivial)
>   #:use-module (guix utils)
> )
>
> (define-public rust
>   (package
>     (name "rust")
>     (version "1.9.0")
>     (home-page "http://www.rust-lang.org/")
>     (synopsis "Rust Programming Language")
>     (description "Safe, Concurrent Programming Language")
>     (license (list asl2.0)) ; FIXME and which MIT
>     (build-system gnu-build-system) ; FIXME rust-build-system
>     (inputs `(
> ; TODO llvm python jemalloc nacl musl
> ("llvm" ,llvm)
>
> ))
>     (native-inputs `(
> ("curl" ,curl) ; FIXME remove
> ("python-2" ,python-2)
> ("llvm" ,llvm) ; 3.6 ??
> ; TODO ?
> ))
>     (source
>       (origin
>          (method url-fetch)
>          (uri "https://static.rust-lang.org/dist/2016-03-25/rustc-nightly-src.tar.gz")
>          (sha256 (base32 "01sxhssllwqckmmzck6b17kaqqx622mwslwhjdrrkwjwa5qy7v54"))
>          ;(uri (string-append "https://github.com/rust-lang/rust/archive/" version ".tar.gz"))
>          ;(sha256 (base32 "1m2d1dc243s7ym8fq2yag3fr5jvki0q9c39llfwgcpq1gc8jvcn8"))
> ))
>     (arguments
>       `(#:configure-flags `( ;"-DCFG_BUILD=x86_64-unknown-linux-gnu"
>                               ;"-disable-codegen-tests" ; because FileCheck is not built in llvm. https://github.com/alexcrichton/rust/commit/295a70f4b92d961c2e74cc750e47083e118ee10a
>                              ) ; FIXME don't hard-code
>         #:phases
>           (modify-phases %standard-phases
>             (replace 'configure
>                      (lambda* (#:key inputs outputs configure-flags #:allow-other-keys)
>                       (let ((out (assoc-ref outputs "out")))
>                         (zero? (apply system*
>                                       `("./configure"
>                                         ,(string-append "--prefix=" out)
>                                         ,(string-append "--llvm-root=" (assoc-ref inputs "llvm"))
>                                         ; FIXME (string-append "--extra-ldflags=-Wl,-rpath-=" out "/lib")
>                                         ,@configure-flags)))))))))
>
> ; FIXME remove src/llvm
> ;configure: CFG_LLVM_ROOT        :=  
> ;configure: CFG_PYTHON           :=  
> ;configure: CFG_JEMALLOC_ROOT    :=  
> ;configure: CFG_NACL_CROSS_PATH  :=  
> ;configure: CFG_MUSL_ROOT        := /usr/local 
>
> ))
>
>

-- 
ng
personal contact: http://krosos.sdf.org
EDN: https://wiki.c3d2.de/EDN

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

* rust work in progress conflicts (was: Re: LLVM: "FileCheck" is missing)
  2016-03-25 17:45 LLVM: "FileCheck" is missing Danny Milosavljevic
  2016-03-25 21:58 ` Nils Gillmann
@ 2016-03-25 22:06 ` Nils Gillmann
  2016-05-04 10:34   ` Jelle Licht
  1 sibling, 1 reply; 24+ messages in thread
From: Nils Gillmann @ 2016-03-25 22:06 UTC (permalink / raw)
  To: guix-devel

Here is my work in progress rust.scm, it is on pause until the
next release of rust as mentioned before:


~/projects/guix_project/guix/gnu/packages $ cat rust.scm
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2016 Nils Gillmann <niasterisk@grrlz.net>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Guix is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.

(define-module (gnu packages rust)
  #:use-module ((guix licenses) #:prefix license:)
  #:use-module (guix packages)
  #:use-module (guix download)
  #:use-module (guix git-download)
  #:use-module (guix utils)
  #:use-module (guix build-system gnu)
  ;; #:use-module (gnu packages gcc)
  #:use-module (gnu packages perl)
  #:use-module (gnu packages libffi)
  #:use-module (gnu packages valgrind)
  #:use-module (gnu packages version-control)
  #:use-module (gnu packages curl)
  #:use-module (gnu packages python)
  #:use-module (gnu packages llvm))

;;(list
;; (string-append
;; "https://github.com/rust-lang/rust/archive/"
;; version ".tar.gz")
;;gh "1m2d1dc243s7ym8fq2yag3fr5jvki0q9c39llfwgcpq1gc8jvcn8"))))

(define-public rustc
  (package
    (name "rustc")
    (version "1.7.0")
    (source (origin
              (method url-fetch)
              (uri (string-append
                    "https://static.rust-lang.org/dist/" name "-"
                    version "-src.tar.gz"))
              (file-name (string-append name "-" version ".tar.gz"))
              (sha256
               (base32
                "0fpiggrnvdmmnp6b95ik16v1h972wir9d1ydv5v8cwbvv1cn1ybd"))))
    (build-system gnu-build-system)
    (arguments
     `(#:phases
       (alist-replace
        'configure
        (lambda* (#:key outputs #:allow-other-keys)
          ;; This old `configure' script doesn't support
          ;; variables passed as arguments.
          (let ((out (assoc-ref outputs "out"))
                (llvm (assoc-ref %build-inputs "llvm")))
            (setenv "CONFIG_SHELL" (which "bash"))
            (zero?
             (system* "./configure"
                      (string-append "--prefix=" out)
                      (string-append "--llvm-root=" llvm)))))
        %standard-phases)))
       ;; #:configure-flags
       ;; (list
       ;;  (string-append "--llvm-root="
       ;;                 (assoc-ref %build-inputs "llvm")))))
    (inputs
     `(("python-2" ,python-2)
       ("curl" ,curl)
       ("git" ,git)
       ("valgrind" ,valgrind)
       ("libffi" ,libffi)
       ("perl" ,perl)
       ("llvm" ,llvm)))
    (home-page "https://www.rust-lang.org/")
    (synopsis
     "The Rust Programming Language")
    (description
     "LOREM IPSUM BLA")
    (license license:gpl3+)))
-- 
ng
personal contact: http://krosos.sdf.org
EDN: https://wiki.c3d2.de/EDN

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

* Re: rust work in progress conflicts (was: Re: LLVM: "FileCheck" is missing)
  2016-03-25 22:06 ` rust work in progress conflicts (was: Re: LLVM: "FileCheck" is missing) Nils Gillmann
@ 2016-05-04 10:34   ` Jelle Licht
  2016-05-05 13:35     ` rust work in progress conflicts Ludovic Courtès
  2016-05-05 15:06     ` ng0
  0 siblings, 2 replies; 24+ messages in thread
From: Jelle Licht @ 2016-05-04 10:34 UTC (permalink / raw)
  To: Nils Gillmann; +Cc: guix-devel


I have taken the liberty to try my hand at finishing this, as I figured
it would be a good way for me to get more familiar with 'the Guix way'
of packaging things.

Wow, did I misjudge this rabbit hole though. It seems to be the case that
rust needs the (most recent) snapshotted binary stage-0 compiler as part
of the build process. This was not the case some years ago[1], but since
then, some 319 snapshots have been released.

Now there are two approaches which might make sense to me:

1) We package a recent stage-0 binary (thus adding yet another random
binary to the mix)

2) We bootstrap all the way from the original rust compiler, written in
ocaml. This would then presumably need to be repeated for each snapshot,
leading to about 319 iterative compiler build. On my kind-of-okay i7,
compiling a single rust iteration takes about 25 to 40 minutes.

I tentatively went with option 1, if only because I would like to see
results this decade still, and ran into several hurdles that became
quite manageable with help from the good people of #guix and
#rust-internals. One more issue yet remains: part of the rust
compilation process actually calls the 'cc linker'. This part does not
respect make flags, setenv calls or even rust's special configure flag
for setting cc.

Option 1 does not seem feasible at this point of time, but there is some
light at the end of the tunnel: rust is at some point going to follow a
convention that will allow bootstrapping compilers via 'master from
beta, beta from stable and stable from previous stable'[2].

I am currently thinking of a compromise; basically, at this moment go
for option 1, and once the policy previously described is properly
implemented by the rust team, start iteratively bootstrapping rust from
that point in time.


tldr: If we can get 'cc' in the build environment, we can have a 'dirty'
bootstrapped rust very soon. If we want to do it properly, it might take
a lot longer.  

WDYT?

[1]: https://news.ycombinator.com/item?id=8732669
[2]: https://botbot.me/mozilla/rust-internals/2016-04-29/?page=3, look
for eddyb

Nils Gillmann <niasterisk@grrlz.net> writes:

> Here is my work in progress rust.scm, it is on pause until the
> next release of rust as mentioned before:
>
>
> ~/projects/guix_project/guix/gnu/packages $ cat rust.scm
> ;;; GNU Guix --- Functional package management for GNU
> ;;; Copyright © 2016 Nils Gillmann <niasterisk@grrlz.net>
> ;;;
> ;;; This file is part of GNU Guix.
> ;;;
> ;;; GNU Guix is free software; you can redistribute it and/or modify it
> ;;; under the terms of the GNU General Public License as published by
> ;;; the Free Software Foundation; either version 3 of the License, or (at
> ;;; your option) any later version.
> ;;;
> ;;; GNU Guix is distributed in the hope that it will be useful, but
> ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
> ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> ;;; GNU General Public License for more details.
> ;;;
> ;;; You should have received a copy of the GNU General Public License
> ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
>
> (define-module (gnu packages rust)
>   #:use-module ((guix licenses) #:prefix license:)
>   #:use-module (guix packages)
>   #:use-module (guix download)
>   #:use-module (guix git-download)
>   #:use-module (guix utils)
>   #:use-module (guix build-system gnu)
>   ;; #:use-module (gnu packages gcc)
>   #:use-module (gnu packages perl)
>   #:use-module (gnu packages libffi)
>   #:use-module (gnu packages valgrind)
>   #:use-module (gnu packages version-control)
>   #:use-module (gnu packages curl)
>   #:use-module (gnu packages python)
>   #:use-module (gnu packages llvm))
>
> ;;(list
> ;; (string-append
> ;; "https://github.com/rust-lang/rust/archive/"
> ;; version ".tar.gz")
> ;;gh "1m2d1dc243s7ym8fq2yag3fr5jvki0q9c39llfwgcpq1gc8jvcn8"))))
>
> (define-public rustc
>   (package
>     (name "rustc")
>     (version "1.7.0")
>     (source (origin
>               (method url-fetch)
>               (uri (string-append
>                     "https://static.rust-lang.org/dist/" name "-"
>                     version "-src.tar.gz"))
>               (file-name (string-append name "-" version ".tar.gz"))
>               (sha256
>                (base32
>                 "0fpiggrnvdmmnp6b95ik16v1h972wir9d1ydv5v8cwbvv1cn1ybd"))))
>     (build-system gnu-build-system)
>     (arguments
>      `(#:phases
>        (alist-replace
>         'configure
>         (lambda* (#:key outputs #:allow-other-keys)
>           ;; This old `configure' script doesn't support
>           ;; variables passed as arguments.
>           (let ((out (assoc-ref outputs "out"))
>                 (llvm (assoc-ref %build-inputs "llvm")))
>             (setenv "CONFIG_SHELL" (which "bash"))
>             (zero?
>              (system* "./configure"
>                       (string-append "--prefix=" out)
>                       (string-append "--llvm-root=" llvm)))))
>         %standard-phases)))
>        ;; #:configure-flags
>        ;; (list
>        ;;  (string-append "--llvm-root="
>        ;;                 (assoc-ref %build-inputs "llvm")))))
>     (inputs
>      `(("python-2" ,python-2)
>        ("curl" ,curl)
>        ("git" ,git)
>        ("valgrind" ,valgrind)
>        ("libffi" ,libffi)
>        ("perl" ,perl)
>        ("llvm" ,llvm)))
>     (home-page "https://www.rust-lang.org/")
>     (synopsis
>      "The Rust Programming Language")
>     (description
>      "LOREM IPSUM BLA")
>     (license license:gpl3+)))

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

* Re: rust work in progress conflicts
  2016-05-04 10:34   ` Jelle Licht
@ 2016-05-05 13:35     ` Ludovic Courtès
  2016-05-05 14:46       ` Alex Griffin
  2016-05-05 15:06     ` ng0
  1 sibling, 1 reply; 24+ messages in thread
From: Ludovic Courtès @ 2016-05-05 13:35 UTC (permalink / raw)
  To: Jelle Licht; +Cc: guix-devel, Nils Gillmann

Jelle Licht <jlicht@fsfe.org> skribis:

> Now there are two approaches which might make sense to me:
>
> 1) We package a recent stage-0 binary (thus adding yet another random
> binary to the mix)

This is something we want to avoid as much as possible.  Part of the
solution is to raise awareness about the security and freedom issues
that arise from the use of binary blobs to build compilers.

This has been discussed earlier:

  https://lists.gnu.org/archive/html/guix-devel/2016-03/msg00828.html

Based on this discussion…

> 2) We bootstrap all the way from the original rust compiler, written in
> ocaml. This would then presumably need to be repeated for each snapshot,
> leading to about 319 iterative compiler build. On my kind-of-okay i7,
> compiling a single rust iteration takes about 25 to 40 minutes.

… I strongly encourage you to try and take this route.

Hopefully, not every version of Rust needs to be compiled with exactly
the previous version of itself.

Anyway, your experience in trying this will be invaluable!

> I tentatively went with option 1, if only because I would like to see
> results this decade still, and ran into several hurdles that became
> quite manageable with help from the good people of #guix and
> #rust-internals. One more issue yet remains: part of the rust
> compilation process actually calls the 'cc linker'. This part does not
> respect make flags, setenv calls or even rust's special configure flag
> for setting cc.

At worst, you can always add a ‘cc’ script that does:

  #!$SHELL
  exec gcc "$@"

in $PATH, in a pre-build phase.

> Option 1 does not seem feasible at this point of time, but there is some
> light at the end of the tunnel: rust is at some point going to follow a
> convention that will allow bootstrapping compilers via 'master from
> beta, beta from stable and stable from previous stable'[2].
>
> I am currently thinking of a compromise; basically, at this moment go
> for option 1, and once the policy previously described is properly
> implemented by the rust team, start iteratively bootstrapping rust from
> that point in time.

Yeah it’s OK to do it in the order: write the package bootstrapped from
the binary blob, and then work on bootstrapping it from OCaml.

Thanks for looking into it!

Ludo’.

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

* Re: rust work in progress conflicts
  2016-05-05 13:35     ` rust work in progress conflicts Ludovic Courtès
@ 2016-05-05 14:46       ` Alex Griffin
  2016-05-06  9:05         ` Andy Wingo
  2016-05-06  9:59         ` Ludovic Courtès
  0 siblings, 2 replies; 24+ messages in thread
From: Alex Griffin @ 2016-05-05 14:46 UTC (permalink / raw)
  To: guix-devel


On Thu, May 5, 2016, at 08:35 AM, Ludovic Courtès wrote:
> 
> Yeah it’s OK to do it in the order: write the package bootstrapped from
> the binary blob, and then work on bootstrapping it from OCaml.

I do not think that bootstrapping Rust from OCaml is a practical goal.
When you guys have talked about bootstrapping gcc from an older version,
I don't think it has involved even a dozen gcc versions, let alone 319!
It's a huge amount of work, to the point where it may even be easier to
write a new Rust compiler from scratch. Even if it succeeded, it would
take over a full week to build the current Rust release, meanwhile OCaml
requires a blob anyway.

I'd love to be proven wrong, but in any case I don't think it's
reasonable to expect Jelle Licht to take on this project just because he
assumed the mantle of rustc packager.
-- 
Alex Griffin

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

* Re: rust work in progress conflicts
  2016-05-04 10:34   ` Jelle Licht
  2016-05-05 13:35     ` rust work in progress conflicts Ludovic Courtès
@ 2016-05-05 15:06     ` ng0
  2016-07-28  8:28       ` ng0
  1 sibling, 1 reply; 24+ messages in thread
From: ng0 @ 2016-05-05 15:06 UTC (permalink / raw)
  To: guix-devel

Jelle Licht <jlicht@fsfe.org> writes:

> I have taken the liberty to try my hand at finishing this, as I figured
> it would be a good way for me to get more familiar with 'the Guix way'
> of packaging things.

Thanks!
Also, could you please use this email address for further CC
things (I tend to avoid them completely if possible), as the
@grrlz.net is no longer subscribed to the mailinglist afaik.

> Wow, did I misjudge this rabbit hole though. It seems to be the case that
> rust needs the (most recent) snapshotted binary stage-0 compiler as part
> of the build process. This was not the case some years ago[1], but since
> then, some 319 snapshots have been released.
>
> Now there are two approaches which might make sense to me:
>
> 1) We package a recent stage-0 binary (thus adding yet another random
> binary to the mix)
>
> 2) We bootstrap all the way from the original rust compiler, written in
> ocaml. This would then presumably need to be repeated for each snapshot,
> leading to about 319 iterative compiler build. On my kind-of-okay i7,
> compiling a single rust iteration takes about 25 to 40 minutes.

This sounds expensive. Isn't there a chance to speed this up,
some other developer with a small Cluster of CPUs for computing
at hand?

> I tentatively went with option 1, if only because I would like to see
> results this decade still, and ran into several hurdles that became
> quite manageable with help from the good people of #guix and
> #rust-internals. One more issue yet remains: part of the rust
> compilation process actually calls the 'cc linker'. This part does not
> respect make flags, setenv calls or even rust's special configure flag
> for setting cc.
>
> Option 1 does not seem feasible at this point of time, but there is some
> light at the end of the tunnel: rust is at some point going to follow a
> convention that will allow bootstrapping compilers via 'master from
> beta, beta from stable and stable from previous stable'[2].
>
> I am currently thinking of a compromise; basically, at this moment go
> for option 1, and once the policy previously described is properly
> implemented by the rust team, start iteratively bootstrapping rust from
> that point in time.
>
>
> tldr: If we can get 'cc' in the build environment, we can have a 'dirty'
> bootstrapped rust very soon. If we want to do it properly, it might take
> a lot longer.  
>
> WDYT?
>
> [1]: https://news.ycombinator.com/item?id=8732669
> [2]: https://botbot.me/mozilla/rust-internals/2016-04-29/?page=3, look
> for eddyb

It's good that there seems to be light at the end, though I did
not expect rust to be that challenging when I started with it to
just package panopticon[0] through cargo import which needs to be
written once rust is done.


[0]: https://panopticon.re

>>---snip-snap----

-- 
♥Ⓐ ng0

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

* Re: rust work in progress conflicts
  2016-05-05 14:46       ` Alex Griffin
@ 2016-05-06  9:05         ` Andy Wingo
  2016-05-06  9:15           ` Andy Wingo
  2016-05-06  9:59         ` Ludovic Courtès
  1 sibling, 1 reply; 24+ messages in thread
From: Andy Wingo @ 2016-05-06  9:05 UTC (permalink / raw)
  To: Alex Griffin; +Cc: guix-devel

On Thu 05 May 2016 16:46, Alex Griffin <a@ajgrf.com> writes:

> On Thu, May 5, 2016, at 08:35 AM, Ludovic Courtès wrote:
>> 
>> Yeah it’s OK to do it in the order: write the package bootstrapped from
>> the binary blob, and then work on bootstrapping it from OCaml.
>
> I do not think that bootstrapping Rust from OCaml is a practical goal.
> When you guys have talked about bootstrapping gcc from an older version,
> I don't think it has involved even a dozen gcc versions, let alone 319!
> It's a huge amount of work, to the point where it may even be easier to
> write a new Rust compiler from scratch. Even if it succeeded, it would
> take over a full week to build the current Rust release, meanwhile OCaml
> requires a blob anyway.
>
> I'd love to be proven wrong, but in any case I don't think it's
> reasonable to expect Jelle Licht to take on this project just because he
> assumed the mantle of rustc packager.

I agree with Alex FWIW.

Also FWIW, I think in the future a sane bootstrap is probably more
likely from a MIR interpreter (something like this but implemented from
another language: https://github.com/tsion/miri/tree/master/src).

But given that even OCaml includes a binary blob (!), I don't think that
we can practically require bootstrapped language implementations to
bootstrap all the way.

Andy

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

* Re: rust work in progress conflicts
  2016-05-06  9:05         ` Andy Wingo
@ 2016-05-06  9:15           ` Andy Wingo
  0 siblings, 0 replies; 24+ messages in thread
From: Andy Wingo @ 2016-05-06  9:15 UTC (permalink / raw)
  To: Alex Griffin; +Cc: guix-devel

On Fri 06 May 2016 11:05, Andy Wingo <wingo@igalia.com> writes:

> But given that even OCaml includes a binary blob (!), I don't think that
> we can practically require bootstrapped language implementations to
> bootstrap all the way.

To clarify!  Obviously it would be better from a reproducibility POV if
we had fewer root binary blobs.  I don't mean to argue against that.
Just that the tradeoff between "include OCaml and its world" and "always
bootstrap only from GCC" in the short term leans towards inclusion
rather than purity.  Just my POV though.

A

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

* Re: rust work in progress conflicts
  2016-05-05 14:46       ` Alex Griffin
  2016-05-06  9:05         ` Andy Wingo
@ 2016-05-06  9:59         ` Ludovic Courtès
  1 sibling, 0 replies; 24+ messages in thread
From: Ludovic Courtès @ 2016-05-06  9:59 UTC (permalink / raw)
  To: Alex Griffin; +Cc: guix-devel

Alex Griffin <a@ajgrf.com> skribis:

> On Thu, May 5, 2016, at 08:35 AM, Ludovic Courtès wrote:
>> 
>> Yeah it’s OK to do it in the order: write the package bootstrapped from
>> the binary blob, and then work on bootstrapping it from OCaml.
>
> I do not think that bootstrapping Rust from OCaml is a practical goal.
> When you guys have talked about bootstrapping gcc from an older version,
> I don't think it has involved even a dozen gcc versions, let alone 319!

If it really has to be 319 versions of Rust, then I agree.
I thought/hoped that it would in fact be just a few of them.

Andy Wingo <wingo@igalia.com> skribis:

> Also FWIW, I think in the future a sane bootstrap is probably more
> likely from a MIR interpreter (something like this but implemented from
> another language: https://github.com/tsion/miri/tree/master/src).

Yeah, though MIR it not source (not the “preferred form”), AIUI.

Thanks,
Ludo’.

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

* Re: rust work in progress conflicts
  2016-05-05 15:06     ` ng0
@ 2016-07-28  8:28       ` ng0
  2016-07-28 18:31         ` Eric Le Bihan
  0 siblings, 1 reply; 24+ messages in thread
From: ng0 @ 2016-07-28  8:28 UTC (permalink / raw)
  To: guix-devel

Hi,

ng0 <ng0@libertad.pw> writes:

> Jelle Licht <jlicht@fsfe.org> writes:
>
>> I have taken the liberty to try my hand at finishing this, as I figured
>> it would be a good way for me to get more familiar with 'the Guix way'
>> of packaging things.
>
> Thanks!
> Also, could you please use this email address for further CC
> things (I tend to avoid them completely if possible), as the
> @grrlz.net is no longer subscribed to the mailinglist afaik.
>
>> Wow, did I misjudge this rabbit hole though. It seems to be the case that
>> rust needs the (most recent) snapshotted binary stage-0 compiler as part
>> of the build process. This was not the case some years ago[1], but since
>> then, some 319 snapshots have been released.
>>
>> Now there are two approaches which might make sense to me:
>>
>> 1) We package a recent stage-0 binary (thus adding yet another random
>> binary to the mix)
>>
>> 2) We bootstrap all the way from the original rust compiler, written in
>> ocaml. This would then presumably need to be repeated for each snapshot,
>> leading to about 319 iterative compiler build. On my kind-of-okay i7,
>> compiling a single rust iteration takes about 25 to 40 minutes.
>
> This sounds expensive. Isn't there a chance to speed this up,
> some other developer with a small Cluster of CPUs for computing
> at hand?
>
>> I tentatively went with option 1, if only because I would like to see
>> results this decade still, and ran into several hurdles that became
>> quite manageable with help from the good people of #guix and
>> #rust-internals. One more issue yet remains: part of the rust
>> compilation process actually calls the 'cc linker'. This part does not
>> respect make flags, setenv calls or even rust's special configure flag
>> for setting cc.
>>
>> Option 1 does not seem feasible at this point of time, but there is some
>> light at the end of the tunnel: rust is at some point going to follow a
>> convention that will allow bootstrapping compilers via 'master from
>> beta, beta from stable and stable from previous stable'[2].
>>
>> I am currently thinking of a compromise; basically, at this moment go
>> for option 1, and once the policy previously described is properly
>> implemented by the rust team, start iteratively bootstrapping rust from
>> that point in time.
>>
>>
>> tldr: If we can get 'cc' in the build environment, we can have a 'dirty'
>> bootstrapped rust very soon. If we want to do it properly, it might take
>> a lot longer.  
>>
>> WDYT?
>>
>> [1]: https://news.ycombinator.com/item?id=8732669
>> [2]: https://botbot.me/mozilla/rust-internals/2016-04-29/?page=3, look
>> for eddyb
>
> It's good that there seems to be light at the end, though I did
> not expect rust to be that challenging when I started with it to
> just package panopticon[0] through cargo import which needs to be
> written once rust is done.
>
>
> [0]: https://panopticon.re
>
>>>---snip-snap----
>
> -- 
> ♥Ⓐ ng0
>

So I picked up rust.scm again and forgot about this thread, only a
search for rust brought it up again.
As this will be a long task obviously, however we finish it, can we file
a bug on it so it is obvious that work is being done on it and there'll
be no dual work on this?

Recently released version 1.10.0 of rust merged the
"--disable-codegen-tests" I needed back when i worked on it.
-- 
♥Ⓐ  ng0
Current Keys: https://we.make.ritual.n0.is/ng0.txt
For non-prism friendly talk find me on http://www.psyced.org

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

* Re: rust work in progress conflicts
  2016-07-28  8:28       ` ng0
@ 2016-07-28 18:31         ` Eric Le Bihan
  2016-07-29  9:03           ` Andreas Enge
  2016-07-29 15:16           ` Rust Ludovic Courtès
  0 siblings, 2 replies; 24+ messages in thread
From: Eric Le Bihan @ 2016-07-28 18:31 UTC (permalink / raw)
  To: ng0; +Cc: guix-devel

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

Hi ng0, all!

Le Thu, 28 Jul 2016 08:28:18 +0000,
ng0 <ng0@we.make.ritual.n0.is> a écrit :

> ng0 <ng0@libertad.pw> writes:
[...]
>
> So I picked up rust.scm again and forgot about this thread, only a
> search for rust brought it up again.
> As this will be a long task obviously, however we finish it, can we
> file a bug on it so it is obvious that work is being done on it and
> there'll be no dual work on this?
> 
> Recently released version 1.10.0 of rust merged the
> "--disable-codegen-tests" I needed back when i worked on it.

It happens that I tried to package Rust, as an introduction to Guix.
Here is my version, inspired by the Haskell package, where Rust 1.10.0
is built, bootstrapped by a binary version of rustc 1.9.0. It uses the
"cc" wrapper trick previously presented.

Some questions, though:

1. I can compile a sample program in a guix environment created using
`guix environment gcc glibc binutils rust`, but the program
generated fails to run because libgcc_s.so.1 can not be found. How can
it be added to the environment?

2. Having a Rust compiler is cool, but having Cargo, the Rust package
manager, would be even better. Cargo is also bootstrapped, and it is
also built using zillions of crates (Rust packages) downloaded from the
Internet. How could this case be handled in Guix?

Best regards,

-- 
ELB

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-gnu-Add-rust.patch --]
[-- Type: text/x-patch, Size: 6884 bytes --]

From fb1fbc92cd68331b3dea94c238274f8a01b98afa Mon Sep 17 00:00:00 2001
From: Eric Le Bihan <eric.le.bihan.dev@free.fr>
Date: Thu, 28 Jul 2016 20:09:01 +0200
Subject: [PATCH 1/1] gnu: Add rust

* gnu/packages/rust.scm(rust): New variable.

Signed-off-by: Eric Le Bihan <eric.le.bihan.dev@free.fr>
---
 gnu/packages/rust.scm | 141 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 141 insertions(+)
 create mode 100644 gnu/packages/rust.scm

diff --git a/gnu/packages/rust.scm b/gnu/packages/rust.scm
new file mode 100644
index 0000000..6c6ec0c
--- /dev/null
+++ b/gnu/packages/rust.scm
@@ -0,0 +1,141 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2016 Eric Le Bihan <eric.le.bihan.dev@free.fr>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu packages rust)
+  #:use-module (ice-9 regex)
+  #:use-module ((guix licenses) #:select (asl2.0 x11-style))
+  #:use-module (guix packages)
+  #:use-module (guix download)
+  #:use-module (guix build-system gnu)
+  #:use-module (gnu packages base)
+  #:use-module (gnu packages bootstrap)
+  #:use-module (gnu packages curl)
+  #:use-module (gnu packages elf)
+  #:use-module (gnu packages gcc)
+  #:use-module (gnu packages jemalloc)
+  #:use-module (gnu packages perl)
+  #:use-module (gnu packages python))
+
+(define rust-bootstrap-x86_64-1.9.0
+  (origin
+   (method url-fetch)
+   (uri
+    "https://static.rust-lang.org/dist/2016-05-24/rustc-1.9.0-x86_64-unknown-linux-gnu.tar.gz")
+   (sha256
+    (base32
+     "1i44rlvvn3pr81sli6bdbkzd78ar1ibybxx6mzpw6rkw4c84sw6h"))))
+
+(define rust-bootstrap-i686-1.9.0
+  (origin
+   (method url-fetch)
+   (uri
+    "https://static.rust-lang.org/dist/2016-05-24/rustc-1.9.0-i686-unknown-linux-gnu.tar.gz")
+   (sha256
+    (base32
+     "0fdf5xvh3g4hdza0y80w1r9vnfczjqnbzbvs7k878yc26p4dwl99"))))
+
+(define-public rust
+  (package
+   (name "rust")
+   (version "1.10.0")
+   (source (origin
+            (method url-fetch)
+            (uri (string-append "https://static.rust-lang.org/dist/rustc-"
+                                version "-src.tar.gz"))
+            (sha256
+             (base32
+              "0sb82xb8y2pzs8l1hk91z228bambwx3dmi2kj8isin7nyjn5l0d4"))))
+   (build-system gnu-build-system)
+   (native-inputs
+    `(("curl" ,curl)
+      ("gcc" ,gcc)
+      ("gcc-lib" ,gcc "lib")
+      ("jemalloc" ,jemalloc)
+      ("patchelf" ,patchelf)
+      ("perl" ,perl)
+      ("python" ,python-2)
+      ("rust-bootstrap"
+       ,(if (string-match "x86_64" (or (%current-target-system) (%current-system)))
+            rust-bootstrap-x86_64-1.9.0
+            rust-bootstrap-i686-1.9.0))
+      ("which" ,which)))
+   (arguments
+    `(#:phases
+      (modify-phases %standard-phases
+        (add-after 'unpack 'unpack-bootstrap
+                   (lambda* (#:key inputs #:allow-other-keys)
+                     (with-directory-excursion (getcwd)
+                       (zero? (system*
+                               "tar"
+                               "--strip-components=1"
+                               "-xzf"
+                               (assoc-ref inputs "rust-bootstrap"))))))
+        (replace 'configure
+                 (lambda* (#:key inputs outputs #:allow-other-keys)
+                   (let ((out (assoc-ref outputs "out"))
+                         (binutils (assoc-ref inputs "binutils"))
+                         (gcc (assoc-ref inputs "gcc"))
+                         (gcc-lib (assoc-ref inputs "gcc-lib"))
+                         (jemalloc (assoc-ref inputs "jemalloc"))
+                         (ld-so (string-append
+                                 (assoc-ref inputs "libc")
+                                 ,(glibc-dynamic-linker)))
+                         (python (assoc-ref inputs "python")))
+            (setenv "SHELL" (which "sh"))
+            (setenv "CONFIG_SHELL" (which "sh"))
+            ;; Tell where to find libgcc_s.so
+            (setenv "LD_LIBRARY_PATH" (string-append gcc-lib "/lib"))
+            ;; Remove reference to "/lib64/ld-linux-x86-64.so.2" from binary
+            (zero? (system*
+                    "patchelf"
+                    "--set-interpreter" ld-so
+                    (string-append (getcwd) "/rustc/bin/rustc")))
+            (zero? (system*
+                    "./configure"
+                    (string-append "--prefix=" out)
+                    (string-append "--default-linker=" gcc "/bin/gcc")
+                    (string-append "--default-ar=" binutils "/bin/ar")
+                    (string-append "--jemalloc-root=" jemalloc "/lib")
+                    (string-append "--enable-rpath")
+                    (string-append "--enable-local-rust")
+                    (string-append "--local-rust-root=" (getcwd) "/rustc")
+                    (string-append "--python=" python "/bin/python2")
+                    "--disable-manage-submodules")))))
+        (add-before 'build 'pre-build
+                    (lambda _
+                      (let* ((bindir (string-append (getcwd) "/bin"))
+                             (cc (string-append bindir "/cc")))
+                        (mkdir bindir)
+                        (call-with-output-file cc
+                          (lambda (port)
+                            (format port
+                                    "#!~a\n\nexec gcc \"$@\"\n" (which "sh"))))
+                        (chmod cc #o755))))
+      (replace 'build
+               (lambda* (#:key outputs #:allow-other-keys)
+                 (setenv "PATH"
+                         (string-append (getcwd) "/bin:" (getenv "PATH")))
+                 (mkdir (assoc-ref outputs "out"))
+                 (zero? (system* "make")))))
+      #:tests? #f))
+   (synopsis "Compiler for the Rust progamming language")
+   (description
+    "Rust is a systems programming language that runs blazingly fast, prevents
+ segfaults, and guarantees thread safety.")
+   (home-page "https://www.rust-lang.org")
+   (license (list asl2.0 (x11-style "file://LICENSE-MIT")))))
-- 
2.4.11


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

* Re: rust work in progress conflicts
  2016-07-28 18:31         ` Eric Le Bihan
@ 2016-07-29  9:03           ` Andreas Enge
  2016-07-29 11:40             ` Vincent Legoll
  2016-07-30 10:04             ` Eric Le Bihan
  2016-07-29 15:16           ` Rust Ludovic Courtès
  1 sibling, 2 replies; 24+ messages in thread
From: Andreas Enge @ 2016-07-29  9:03 UTC (permalink / raw)
  To: Eric Le Bihan; +Cc: guix-devel

Hello,

On Thu, Jul 28, 2016 at 08:31:44PM +0200, Eric Le Bihan wrote:
> 1. I can compile a sample program in a guix environment created using
> `guix environment gcc glibc binutils rust`, but the program
> generated fails to run because libgcc_s.so.1 can not be found. How can
> it be added to the environment?

I would suggest to replace "gcc glibc binutils" by "gcc-toolchain", which
installs a specially modified linker.

Andreas

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

* Re: rust work in progress conflicts
@ 2016-07-29  9:46 David Craven
  0 siblings, 0 replies; 24+ messages in thread
From: David Craven @ 2016-07-29  9:46 UTC (permalink / raw)
  To: guix-devel

Hi Eric!

Nice!

1. Try using 'guix environment --ad-hoc gcc gcc:lib'.

2. I thought about this. Maybe we could add a cargo subcommand that
interacts with the guix/nix daemon directly [0] and then have a small
cargo-build-system that wraps it. I think this would be neat because
we could avoid repackaging all rust crates and nixos could maybe reuse
it too. Otherwise we are rewriting a lot of stuff that cargo already
does really well (not like python and ruby package managers for
example)


[0] https://github.com/rust-lang/cargo/wiki/Third-party-cargo-subcommands

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

* Re: rust work in progress conflicts
  2016-07-29  9:03           ` Andreas Enge
@ 2016-07-29 11:40             ` Vincent Legoll
  2016-07-29 14:37               ` ng0
  2016-07-30 10:04             ` Eric Le Bihan
  1 sibling, 1 reply; 24+ messages in thread
From: Vincent Legoll @ 2016-07-29 11:40 UTC (permalink / raw)
  To: Andreas Enge; +Cc: guix-devel

> On Thu, Jul 28, 2016 at 08:31:44PM +0200, Eric Le Bihan wrote:
>> 1. I can compile a sample program in a guix environment created using
>> `guix environment gcc glibc binutils rust`, but the program
>> generated fails to run because libgcc_s.so.1 can not be found. How can
>> it be added to the environment?
>
> I would suggest to replace "gcc glibc binutils" by "gcc-toolchain", which
> installs a specially modified linker.

Looks like I'm not alone doing the gcc mistake. Maybe this should be explained
in the doc.

WDYT

-- 
Vincent Legoll

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

* Re: rust work in progress conflicts
  2016-07-29 11:40             ` Vincent Legoll
@ 2016-07-29 14:37               ` ng0
  0 siblings, 0 replies; 24+ messages in thread
From: ng0 @ 2016-07-29 14:37 UTC (permalink / raw)
  To: guix-devel

Vincent Legoll <vincent.legoll@gmail.com> writes:

>> On Thu, Jul 28, 2016 at 08:31:44PM +0200, Eric Le Bihan wrote:
>>> 1. I can compile a sample program in a guix environment created using
>>> `guix environment gcc glibc binutils rust`, but the program
>>> generated fails to run because libgcc_s.so.1 can not be found. How can
>>> it be added to the environment?
>>
>> I would suggest to replace "gcc glibc binutils" by "gcc-toolchain", which
>> installs a specially modified linker.
>
> Looks like I'm not alone doing the gcc mistake. Maybe this should be explained
> in the doc.
>
> WDYT
>
> -- 
> Vincent Legoll
>

Yes, definitely from what I read and watched in the time involved here
and my own experiences.
Can you try and come up with an addition?

Thanks.
-- 
♥Ⓐ  ng0
Current Keys: https://we.make.ritual.n0.is/ng0.txt
For non-prism friendly talk find me on http://www.psyced.org

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

* Rust
  2016-07-28 18:31         ` Eric Le Bihan
  2016-07-29  9:03           ` Andreas Enge
@ 2016-07-29 15:16           ` Ludovic Courtès
  2016-07-29 15:34             ` Rust Alex Griffin
  2016-07-30 11:01             ` Rust Eric Le Bihan
  1 sibling, 2 replies; 24+ messages in thread
From: Ludovic Courtès @ 2016-07-29 15:16 UTC (permalink / raw)
  To: Eric Le Bihan; +Cc: guix-devel

Hello,

Eric Le Bihan <eric.le.bihan.dev@free.fr> skribis:

> It happens that I tried to package Rust, as an introduction to Guix.
> Here is my version, inspired by the Haskell package, where Rust 1.10.0
> is built, bootstrapped by a binary version of rustc 1.9.0. It uses the
> "cc" wrapper trick previously presented.

As you might have seen from previous discussions, we try hard to reduce
the number of binary blobs needed to bootstrap packages, such that we
have a full source-to-binary path that everyone can audit.
Unfortunately, this usually hard to achieve for self-hosted compilers.

Do you know what’s Rust’s bootstrapping story is?  Can we reasonably
expect to bootstrap it from source, using a series of previous Rust
versions, or using an alternative implementation?

> Some questions, though:
>
> 1. I can compile a sample program in a guix environment created using
> `guix environment gcc glibc binutils rust`, but the program
> generated fails to run because libgcc_s.so.1 can not be found. How can
> it be added to the environment?

As Andreas notes, ‘gcc-toolchain’, which includes ‘ld-wrapper’, should
fix this.

Does Rust use GCC, or just ld?

> 2. Having a Rust compiler is cool, but having Cargo, the Rust package
> manager, would be even better. Cargo is also bootstrapped, and it is
> also built using zillions of crates (Rust packages) downloaded from the
> Internet. How could this case be handled in Guix?

Assuming Cargo itself is just a regular Rust program, it should be
possible to make a Guix package of Cargo.  Then, Guix users can install
it and use it the normal way; we won’t be able to use Cargo in package
recipes though, because our package build environments purposefully
lacks network access.

Besides, I would encourage you or anyone interested to write a crate
importer, like we do for most other language packages:

  https://www.gnu.org/software/guix/manual/html_node/Invoking-guix-import.html

Having crates available as normal Guix packages is the best option for
Guix users: uniform interface, the ability to use ‘guix environment’ and
all the tools, transactional upgrade and rollback, etc.

> From fb1fbc92cd68331b3dea94c238274f8a01b98afa Mon Sep 17 00:00:00 2001
> From: Eric Le Bihan <eric.le.bihan.dev@free.fr>
> Date: Thu, 28 Jul 2016 20:09:01 +0200
> Subject: [PATCH 1/1] gnu: Add rust
>
> * gnu/packages/rust.scm(rust): New variable.
>
> Signed-off-by: Eric Le Bihan <eric.le.bihan.dev@free.fr>

Apart from the bootstrapping thing discussed above, this looks good to
me (and a great first package!).

> +            ;; Tell where to find libgcc_s.so
> +            (setenv "LD_LIBRARY_PATH" (string-append gcc-lib "/lib"))

“LIBRARY_PATH” may be enough.

> +            ;; Remove reference to "/lib64/ld-linux-x86-64.so.2" from binary
> +            (zero? (system*
> +                    "patchelf"
> +                    "--set-interpreter" ld-so
> +                    (string-append (getcwd) "/rustc/bin/rustc")))

“rustc/bin/rustc” is enough here.

> +        (add-before 'build 'pre-build
> +                    (lambda _
> +                      (let* ((bindir (string-append (getcwd) "/bin"))
> +                             (cc (string-append bindir "/cc")))
> +                        (mkdir bindir)
> +                        (call-with-output-file cc
> +                          (lambda (port)
> +                            (format port
> +                                    "#!~a\n\nexec gcc \"$@\"\n" (which "sh"))))
> +                        (chmod cc #o755))))

Can we avoid this trick using a configure flag
(--with-compiler=/path/to/gcc) or a configure or environment variable
(CC=gcc)?  If not, that’s fine.

> +      (replace 'build
> +               (lambda* (#:key outputs #:allow-other-keys)
> +                 (setenv "PATH"
> +                         (string-append (getcwd) "/bin:" (getenv "PATH")))
> +                 (mkdir (assoc-ref outputs "out"))
> +                 (zero? (system* "make")))))

Rather do:

  (add-before 'build 'change-PATH
    (lambda _
      (setenv …)
      #t))

so we can reuse the normal ‘build’ phase, which passes -jX to ‘make’.

> +      #:tests? #f))

We normally run test suites, unless we have a good reason not to do so.
:-)  Any ideas why “make check” fails?

Thanks!

Ludo’.

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

* Re: Rust
  2016-07-29 15:16           ` Rust Ludovic Courtès
@ 2016-07-29 15:34             ` Alex Griffin
  2016-07-29 16:08               ` Rust Jelle Licht
  2016-07-30 13:34               ` Rust Ludovic Courtès
  2016-07-30 11:01             ` Rust Eric Le Bihan
  1 sibling, 2 replies; 24+ messages in thread
From: Alex Griffin @ 2016-07-29 15:34 UTC (permalink / raw)
  To: guix-devel

On Fri, Jul 29, 2016, at 10:16 AM, Ludovic Courtès wrote:
> Do you know what’s Rust’s bootstrapping story is?  Can we reasonably
> expect to bootstrap it from source, using a series of previous Rust
> versions, or using an alternative implementation?

Yes, Rust 1.10 builds with the previous stable release (1.9) for the
first time. So we will only need one binary to bootstrap Rust. Although
this will quickly require a long chain of builds because Rust releases
every 6 weeks and 1.11 is only guaranteed to build with 1.10, etc.

So after only two years we may need to compile like 17 different
releases to get the current version.
-- 
Alex Griffin

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

* Re: Rust
  2016-07-29 15:34             ` Rust Alex Griffin
@ 2016-07-29 16:08               ` Jelle Licht
  2016-07-30 13:34               ` Rust Ludovic Courtès
  1 sibling, 0 replies; 24+ messages in thread
From: Jelle Licht @ 2016-07-29 16:08 UTC (permalink / raw)
  To: Alex Griffin; +Cc: guix-devel

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

I looked into this once;
I found a Rust compiler written in OCaml on the web.
There should be a path from that compiler to the current version of Rust.
The problem lies in the fact that the entire "1.9 build 1.10 builds 1.11"
spiel only become the official policy of the Rust project recently.

disclaimer: the following is how I interpreted my communications with
the rust community. My apologies to anyone involved for any inaccuracies
and/or misrepresentations.

This means that you could be looking at individual commits, as before this,
I believe nightlies (snapshots) were used to compile the Rust compiler.

So, to ad to Alex' point, we would also need to expend (one-time) effort to
find this 'bootstrap-path' from the OCaml-based compiler to a more recent
rustc.

In my admittedly little amounts of experience, the people working on rust
were not really seeing the problem with the current state of affairs, so
good luck getting support with some arcane issues one might encounter
packaging these ancient versions of rustc.

To quote kibwen from [1]:
"We can determine exactly how many builds you'd need by looking at the
master snapshot file:
https://github.com/rust-lang/rust/blob/master/src/snapshots....
<https://github.com/rust-lang/rust/blob/master/src/snapshots.txt>

According to this, there have been 290 snapshots in total. And keep in mind
that you would also need to rebuild LLVM quite a few times as well during
this process, as Rust has continually upgraded its custom LLVM fork over
the years."

Not sure if all this is worth the effort...

- Jelle


[1]: https://news.ycombinator.com/item?id=8732669


2016-07-29 17:34 GMT+02:00 Alex Griffin <a@ajgrf.com>:

> On Fri, Jul 29, 2016, at 10:16 AM, Ludovic Courtès wrote:
> > Do you know what’s Rust’s bootstrapping story is?  Can we reasonably
> > expect to bootstrap it from source, using a series of previous Rust
> > versions, or using an alternative implementation?
>
> Yes, Rust 1.10 builds with the previous stable release (1.9) for the
> first time. So we will only need one binary to bootstrap Rust. Although
> this will quickly require a long chain of builds because Rust releases
> every 6 weeks and 1.11 is only guaranteed to build with 1.10, etc.
>
> So after only two years we may need to compile like 17 different
> releases to get the current version.
> --
> Alex Griffin
>
>

[-- Attachment #2: Type: text/html, Size: 3286 bytes --]

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

* Re: rust work in progress conflicts
  2016-07-29  9:03           ` Andreas Enge
  2016-07-29 11:40             ` Vincent Legoll
@ 2016-07-30 10:04             ` Eric Le Bihan
  1 sibling, 0 replies; 24+ messages in thread
From: Eric Le Bihan @ 2016-07-30 10:04 UTC (permalink / raw)
  To: Andreas Enge; +Cc: guix-devel

Le Fri, 29 Jul 2016 11:03:41 +0200,
Andreas Enge <andreas@enge.fr> a écrit :

> On Thu, Jul 28, 2016 at 08:31:44PM +0200, Eric Le Bihan wrote:
> > 1. I can compile a sample program in a guix environment created
> > using `guix environment gcc glibc binutils rust`, but the program
> > generated fails to run because libgcc_s.so.1 can not be found. How
> > can it be added to the environment?  
> 
> I would suggest to replace "gcc glibc binutils" by "gcc-toolchain",
> which installs a specially modified linker.

This solves the problem. Thank you.

-- 
ELB

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

* Re: Rust
  2016-07-29 15:16           ` Rust Ludovic Courtès
  2016-07-29 15:34             ` Rust Alex Griffin
@ 2016-07-30 11:01             ` Eric Le Bihan
  2016-07-30 13:44               ` Rust Ludovic Courtès
  1 sibling, 1 reply; 24+ messages in thread
From: Eric Le Bihan @ 2016-07-30 11:01 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: guix-devel

Le Fri, 29 Jul 2016 17:16:29 +0200,
ludo@gnu.org (Ludovic Courtès) a écrit :

> Eric Le Bihan <eric.le.bihan.dev@free.fr> skribis:
> 
> > It happens that I tried to package Rust, as an introduction to Guix.
> > Here is my version, inspired by the Haskell package, where Rust
> > 1.10.0 is built, bootstrapped by a binary version of rustc 1.9.0.
> > It uses the "cc" wrapper trick previously presented.  
> 
> As you might have seen from previous discussions, we try hard to
> reduce the number of binary blobs needed to bootstrap packages, such
> that we have a full source-to-binary path that everyone can audit.
> Unfortunately, this usually hard to achieve for self-hosted compilers.
> 
> Do you know what’s Rust’s bootstrapping story is?  Can we reasonably
> expect to bootstrap it from source, using a series of previous Rust
> versions, or using an alternative implementation?

As explained by others, starting with version 1.10.0, Rust version N
will be guaranteed to bootstrap with version N-1.

> > Some questions, though:
> >
> > 1. I can compile a sample program in a guix environment created
> > using `guix environment gcc glibc binutils rust`, but the program
> > generated fails to run because libgcc_s.so.1 can not be found. How
> > can it be added to the environment?  
> 
> As Andreas notes, ‘gcc-toolchain’, which includes ‘ld-wrapper’, should
> fix this.

Yes. It solved my problem.
 
> Does Rust use GCC, or just ld?

It only uses the linker, i.e. ld on GNU/Linux.

> > 2. Having a Rust compiler is cool, but having Cargo, the Rust
> > package manager, would be even better. Cargo is also bootstrapped,
> > and it is also built using zillions of crates (Rust packages)
> > downloaded from the Internet. How could this case be handled in
> > Guix?  
> 
> Assuming Cargo itself is just a regular Rust program, it should be
> possible to make a Guix package of Cargo.  Then, Guix users can
> install it and use it the normal way; we won’t be able to use Cargo
> in package recipes though, because our package build environments
> purposefully lacks network access.
> 
> Besides, I would encourage you or anyone interested to write a crate
> importer, like we do for most other language packages:
> 
>   https://www.gnu.org/software/guix/manual/html_node/Invoking-guix-import.html
> 
> Having crates available as normal Guix packages is the best option for
> Guix users: uniform interface, the ability to use ‘guix environment’
> and all the tools, transactional upgrade and rollback, etc.

IIUC, to provide a Guix package for Cargo, the following should be done:

1. write a crate importer.
2. list all the crates needed by Cargo to build itself.
3. package each crate with the importer.
4. add a Cargo package which depends on the newly-imported crates and
uses a binary version of Cargo to bootstrap itself (though this is not
the best option in terms of auditing/reproducibility).

Unlike Rust, Cargo still uses an "anonymous" binary version of itself
for bootstrapping. I hope this may change soon.

> > From fb1fbc92cd68331b3dea94c238274f8a01b98afa Mon Sep 17 00:00:00
> > 2001 From: Eric Le Bihan <eric.le.bihan.dev@free.fr>
> > Date: Thu, 28 Jul 2016 20:09:01 +0200
> > Subject: [PATCH 1/1] gnu: Add rust
> >
> > * gnu/packages/rust.scm(rust): New variable.
> >
> > Signed-off-by: Eric Le Bihan <eric.le.bihan.dev@free.fr>  
> 
> Apart from the bootstrapping thing discussed above, this looks good to
> me (and a great first package!).
> 
> > +            ;; Tell where to find libgcc_s.so
> > +            (setenv "LD_LIBRARY_PATH" (string-append gcc-lib
> > "/lib"))  
> 
> “LIBRARY_PATH” may be enough.

OK.
 
> > +            ;; Remove reference to "/lib64/ld-linux-x86-64.so.2"
> > from binary
> > +            (zero? (system*
> > +                    "patchelf"
> > +                    "--set-interpreter" ld-so
> > +                    (string-append (getcwd) "/rustc/bin/rustc")))  
> 
> “rustc/bin/rustc” is enough here.

OK.

> 
> > +        (add-before 'build 'pre-build
> > +                    (lambda _
> > +                      (let* ((bindir (string-append (getcwd)
> > "/bin"))
> > +                             (cc (string-append bindir "/cc")))
> > +                        (mkdir bindir)
> > +                        (call-with-output-file cc
> > +                          (lambda (port)
> > +                            (format port
> > +                                    "#!~a\n\nexec gcc
> > \"$@\"\n" (which "sh"))))
> > +                        (chmod cc #o755))))  
> 
> Can we avoid this trick using a configure flag
> (--with-compiler=/path/to/gcc) or a configure or environment variable
> (CC=gcc)?  If not, that’s fine.

To build the Rust standard library, only the linker is needed. The
default value is "cc". I thought this could be overridden using the
"--default-linker=" of the ./configure script, but it looks like it is
not properly handled. Hence the need for the wrapper. 

I haven't checked too deeply to know if it is a bug or a feature. On
the Rust issue tracker, an entry [1] relates to this problem, but only
in terms of documentation. I'll bump the topic upstream.

> > +      (replace 'build
> > +               (lambda* (#:key outputs #:allow-other-keys)
> > +                 (setenv "PATH"
> > +                         (string-append (getcwd) "/bin:" (getenv
> > "PATH")))
> > +                 (mkdir (assoc-ref outputs "out"))
> > +                 (zero? (system* "make")))))  
> 
> Rather do:
> 
>   (add-before 'build 'change-PATH
>     (lambda _
>       (setenv …)
>       #t))
> 
> so we can reuse the normal ‘build’ phase, which passes -jX to ‘make’.

OK.

> 
> > +      #:tests? #f))  
> 
> We normally run test suites, unless we have a good reason not to do
> so. :-)  Any ideas why “make check” fails?

Out of laziness, I skipped the tests. I'll give it a look.

[1] https://github.com/rust-lang/rust/issues/32208

Best regards,

-- 
ELB

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

* Re: Rust
  2016-07-29 15:34             ` Rust Alex Griffin
  2016-07-29 16:08               ` Rust Jelle Licht
@ 2016-07-30 13:34               ` Ludovic Courtès
  2016-07-30 17:57                 ` Rust Pjotr Prins
  1 sibling, 1 reply; 24+ messages in thread
From: Ludovic Courtès @ 2016-07-30 13:34 UTC (permalink / raw)
  To: Alex Griffin; +Cc: guix-devel

Alex Griffin <a@ajgrf.com> skribis:

> On Fri, Jul 29, 2016, at 10:16 AM, Ludovic Courtès wrote:
>> Do you know what’s Rust’s bootstrapping story is?  Can we reasonably
>> expect to bootstrap it from source, using a series of previous Rust
>> versions, or using an alternative implementation?
>
> Yes, Rust 1.10 builds with the previous stable release (1.9) for the
> first time. So we will only need one binary to bootstrap Rust. Although
> this will quickly require a long chain of builds because Rust releases
> every 6 weeks and 1.11 is only guaranteed to build with 1.10, etc.
>
> So after only two years we may need to compile like 17 different
> releases to get the current version.

Bah.  If that were the only problem, we could regularly cut the
dependency graph by storing a pre-built binary built using Guix,
assuming Rust builds are reproducible.  (Note that each node in the
dependency graph contributes to the ‘guix build -d’ time by less than a
hundred milliseconds, so the chain can be quite long before it’s a
practical problem.)

Jelle Licht <jlicht@fsfe.org> skribis:

> So, to ad to Alex' point, we would also need to expend (one-time) effort to
> find this 'bootstrap-path' from the OCaml-based compiler to a more recent
> rustc.

I suspect this one-time effort would be quite huge.

> To quote kibwen from [1]:
> "We can determine exactly how many builds you'd need by looking at the
> master snapshot file:
> https://github.com/rust-lang/rust/blob/master/src/snapshots....
> <https://github.com/rust-lang/rust/blob/master/src/snapshots.txt>
>
> According to this, there have been 290 snapshots in total. And keep in mind
> that you would also need to rebuild LLVM quite a few times as well during
> this process, as Rust has continually upgraded its custom LLVM fork over
> the years."
>
> Not sure if all this is worth the effort...

It’s discouraging, indeed.

We need to find a reasonable way forward.  What about starting from the
version that Eric submitted (bootstrapped from the opaque binary), and
from there on do the “build with previous version” thing?

When the chain becomes too long, we’ll host new bootstrap binaries
produced with Guix and cut the initial part of the chain.

Thoughts?

Obviously not ideal, but at least we’d have a clearer track record of
our binaries: we’d document the Guix commit needed to reproduce a
specific binary, and anyone could verify it.

Ludo’.

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

* Re: Rust
  2016-07-30 11:01             ` Rust Eric Le Bihan
@ 2016-07-30 13:44               ` Ludovic Courtès
  0 siblings, 0 replies; 24+ messages in thread
From: Ludovic Courtès @ 2016-07-30 13:44 UTC (permalink / raw)
  To: Eric Le Bihan; +Cc: guix-devel

Eric Le Bihan <eric.le.bihan.dev@free.fr> skribis:

> Le Fri, 29 Jul 2016 17:16:29 +0200,
> ludo@gnu.org (Ludovic Courtès) a écrit :

[...]

>> > Some questions, though:
>> >
>> > 1. I can compile a sample program in a guix environment created
>> > using `guix environment gcc glibc binutils rust`, but the program
>> > generated fails to run because libgcc_s.so.1 can not be found. How
>> > can it be added to the environment?  
>> 
>> As Andreas notes, ‘gcc-toolchain’, which includes ‘ld-wrapper’, should
>> fix this.
>
> Yes. It solved my problem.
>  
>> Does Rust use GCC, or just ld?
>
> It only uses the linker, i.e. ld on GNU/Linux.

Then it should be enough to add ‘ld-wrapper’ to the inputs (no need for
‘gcc-toolchain’ or ‘gcc’.)  Just make sure Rust captures the absolute
file name of ‘ld’.

> IIUC, to provide a Guix package for Cargo, the following should be done:
>
> 1. write a crate importer.
> 2. list all the crates needed by Cargo to build itself.
> 3. package each crate with the importer.
> 4. add a Cargo package which depends on the newly-imported crates and
> uses a binary version of Cargo to bootstrap itself (though this is not
> the best option in terms of auditing/reproducibility).
>
> Unlike Rust, Cargo still uses an "anonymous" binary version of itself
> for bootstrapping. I hope this may change soon.

Something along these lines, yes.  We may also need a
‘rust-build-system’, like we did for other languages:

  https://www.gnu.org/software/guix/manual/html_node/Build-Systems.html

If that build system works without invoking Cargo, then we probably
don’t need a Cargo binary to build Cargo.

Anyway, we’re not there yet.  :-)

>> > +        (add-before 'build 'pre-build
>> > +                    (lambda _
>> > +                      (let* ((bindir (string-append (getcwd)
>> > "/bin"))
>> > +                             (cc (string-append bindir "/cc")))
>> > +                        (mkdir bindir)
>> > +                        (call-with-output-file cc
>> > +                          (lambda (port)
>> > +                            (format port
>> > +                                    "#!~a\n\nexec gcc
>> > \"$@\"\n" (which "sh"))))
>> > +                        (chmod cc #o755))))  
>> 
>> Can we avoid this trick using a configure flag
>> (--with-compiler=/path/to/gcc) or a configure or environment variable
>> (CC=gcc)?  If not, that’s fine.
>
> To build the Rust standard library, only the linker is needed. The
> default value is "cc". I thought this could be overridden using the
> "--default-linker=" of the ./configure script, but it looks like it is
> not properly handled. Hence the need for the wrapper. 

OK, makes sense.  Please leave this explanation as a comment in the
code.

>> > +      #:tests? #f))  
>> 
>> We normally run test suites, unless we have a good reason not to do
>> so. :-)  Any ideas why “make check” fails?
>
> Out of laziness, I skipped the tests. I'll give it a look.

Let us know how it goes, even if the outcome is “too painful, giving
up”.  :-)

Thanks,
Ludo’.

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

* Re: Rust
  2016-07-30 13:34               ` Rust Ludovic Courtès
@ 2016-07-30 17:57                 ` Pjotr Prins
  0 siblings, 0 replies; 24+ messages in thread
From: Pjotr Prins @ 2016-07-30 17:57 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: guix-devel

On Sat, Jul 30, 2016 at 03:34:08PM +0200, Ludovic Courtès wrote:
> When the chain becomes too long, we’ll host new bootstrap binaries
> produced with Guix and cut the initial part of the chain.
> 
> Thoughts?

This sounds like a very good approach for compilers written in their
own language. Same will be true for the D compilers. The D compiler
was recently ported to D and the authors say they will aim to keep
support for bootstrapping from C - but they added it may grow
complicated over time. I think the Elixir compiler will also be ported
to Elixer in time... there have been some noises.

The bootstrapping from source is a fine idea(l), but not always
practical for package authors.

Interesting point is if we can share one such cross-building binary
compiler for all target platforms, or are we going to store binaries
for each of them?

Pj.

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

end of thread, other threads:[~2016-07-30 17:57 UTC | newest]

Thread overview: 24+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-03-25 17:45 LLVM: "FileCheck" is missing Danny Milosavljevic
2016-03-25 21:58 ` Nils Gillmann
2016-03-25 22:06 ` rust work in progress conflicts (was: Re: LLVM: "FileCheck" is missing) Nils Gillmann
2016-05-04 10:34   ` Jelle Licht
2016-05-05 13:35     ` rust work in progress conflicts Ludovic Courtès
2016-05-05 14:46       ` Alex Griffin
2016-05-06  9:05         ` Andy Wingo
2016-05-06  9:15           ` Andy Wingo
2016-05-06  9:59         ` Ludovic Courtès
2016-05-05 15:06     ` ng0
2016-07-28  8:28       ` ng0
2016-07-28 18:31         ` Eric Le Bihan
2016-07-29  9:03           ` Andreas Enge
2016-07-29 11:40             ` Vincent Legoll
2016-07-29 14:37               ` ng0
2016-07-30 10:04             ` Eric Le Bihan
2016-07-29 15:16           ` Rust Ludovic Courtès
2016-07-29 15:34             ` Rust Alex Griffin
2016-07-29 16:08               ` Rust Jelle Licht
2016-07-30 13:34               ` Rust Ludovic Courtès
2016-07-30 17:57                 ` Rust Pjotr Prins
2016-07-30 11:01             ` Rust Eric Le Bihan
2016-07-30 13:44               ` Rust Ludovic Courtès
  -- strict thread matches above, loose matches on Subject: below --
2016-07-29  9:46 rust work in progress conflicts David Craven

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