[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] gnu: make-bootstrap: Produce the correct %glibc-bootstrap-ta
From: |
Ludovic Courtès |
Subject: |
Re: [PATCH] gnu: make-bootstrap: Produce the correct %glibc-bootstrap-tarball for Hurd systems. |
Date: |
Tue, 30 Jun 2015 21:56:59 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) |
Γειά σας!
Manolis Ragkousis <address@hidden> skribis:
> I chose this approach in %glibc-stripped because later on, as more
> things will be needed to be Hurd-specific, it's going to get messy
> with conditional code. This way we can safely change/add things
> without worrying it will break the other. WDYT?
The problem is that this patch duplicates 54 lines that are mostly
identical.
I think it would be preferable to make it more concise.
> From fa84fdeb8a479f3b59b38f762f551d744def2e5f Mon Sep 17 00:00:00 2001
> From: Manolis Ragkousis <address@hidden>
> Date: Tue, 30 Jun 2015 12:53:24 +0300
> Subject: [PATCH] gnu: make-bootstrap: Produce the correct
> %glibc-bootstrap-tarball for Hurd systems.
>
> * gnu/packages/make-bootstrap.scm (%glibc-bootstrap-tarball): Make it a
> procedure.
> (%glibc-stripped): Make it a procedure that produces the correct
> %glibc-stripped
> depending on the target system.
[...]
> + (match target
> + ("i586-pc-gnu"
> + (let ((glibc (glibc-for-bootstrap)))
> + (package (inherit glibc/hurd)
> + (name "glibc-stripped")
> + (build-system trivial-build-system)
> + (arguments
> + `(#:modules ((guix build utils))
> + #:builder
> + (begin
> + (use-modules (guix build utils))
> +
> + (setvbuf (current-output-port) _IOLBF)
> + (let* ((out (assoc-ref %outputs "out"))
> + (libdir (string-append out "/lib"))
> + (incdir (string-append out "/include"))
> + (libc (assoc-ref %build-inputs "libc"))
> + (mach (assoc-ref %build-inputs "gnumach-headers")))
> + (mkdir-p libdir)
> + (for-each (lambda (file)
> + (let ((target (string-append libdir "/"
> + (basename file))))
> + (copy-file file target)
> + (remove-store-references target)))
> + (find-files (string-append libc "/lib")
> +
> "^(crt.*|ld.*|lib(c|m|dl|rt|pthread|nsl|util).*\\.so(\\..*)?|libc_nonshared\\.a)$"))
> +
> + (copy-recursively (string-append libc "/include") incdir)
> +
> + (copy-recursively (string-append mach "/include/mach")
> + (string-append incdir "/mach"))
> + #t))))
What about introducing a (guix build make-bootstrap) module to hide all
this plumbing?
It could expose a procedure like:
(define (make-stripped-libc output libc kernel-headers)
"Copy to OUTPUT the subset of LIBC and KERNEL-HEADERS that is needed
when producing a bootstrap libc."
;; ...
(if (directory-exists? (string-append kernel-headers "/mach"))
(copy-mach-headers output kernel-headers)
(copy-linux-headers output kernel-headers)))
;; ...
That way, the #:builder above would become:
#:builder (begin
(use-modules (guix build make-bootstrap))
(make-stripped-libc (assoc-ref %outputs "out")
(assoc-ref %build-inputs "libc")
(assoc-ref %build-inputs "kernel-headers")))
and so we’d be duplicating fewer lines.
The ‘match’ itself could be moved to the ‘inputs’ field, where we’d be
selecting the right headers:
(define (%glibc-stripped)
(package (inherit (glibc-for-bootstrap))
;; ...
(inputs `(("kernel-headers"
,(if (or (and (%current-target-system)
(hurd-triplet? (%current-target-system)))
(string-suffix? "-hurd" (%current-system)))
gnumach-headers
linux-libre-headers))
...))))
where:
(define (hurd-triplet? triplet)
(and (string-suffix? "-gnu" triplet)
(not (string-contains triplet "linux"))))
Note that (%current-target-system) is a GNU triplet whereas
(%current-system) is ARCH-KERNEL.
Does that make sense? Does that sound doable?
Thank you!
Ludo’.