Γειά σας! Manolis Ragkousis <manolis...@gmail.com> 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 <manolis...@gmail.com> > 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’.