mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-12-23 21:17:11 -05:00
gnu: glibc: Add "static" output.
This shrinks glibc:out from 37 MiB to 29 MiB. * gnu/packages/base.scm (glibc/linux)[outputs]: Add "static". [arguments]: Add #:modules. Add 'move-static-libs' phase. * gnu/packages/commencement.scm (static-bash-for-glibc): Augment #:configure-flags to pass "-L LIBC:STATIC". Add the "static" output of GLIBC-FINAL to 'inputs'. (%boot2-inputs, %final-inputs): Likewise. (canonical-package): Adjust to deal with multiple-output packages. * gnu/packages/cross-base.scm (cross-gcc): Add the "static" output of LIBC to 'native-inputs'.
This commit is contained in:
parent
48623f5be8
commit
6dff905e51
3 changed files with 66 additions and 6 deletions
|
@ -542,7 +542,8 @@ (define-public glibc/linux
|
|||
;; users should automatically pull Linux headers as well.
|
||||
(propagated-inputs `(("kernel-headers" ,linux-libre-headers)))
|
||||
|
||||
(outputs '("out" "debug"))
|
||||
(outputs '("out" "debug"
|
||||
"static")) ;9 MiB of .a files
|
||||
|
||||
(arguments
|
||||
`(#:out-of-source? #t
|
||||
|
@ -553,6 +554,11 @@ (define-public glibc/linux
|
|||
;; RUNPATH checks.
|
||||
#:validate-runpath? #f
|
||||
|
||||
#:modules ((ice-9 ftw)
|
||||
(srfi srfi-26)
|
||||
(guix build utils)
|
||||
(guix build gnu-build-system))
|
||||
|
||||
#:configure-flags
|
||||
(list "--enable-add-ons"
|
||||
"--sysconfdir=/etc"
|
||||
|
@ -657,7 +663,46 @@ (define-public glibc/linux
|
|||
;; "bilingual" eval/exec magic at the top of the file.
|
||||
"")
|
||||
(("exec @PERL@")
|
||||
"exec perl"))))))))
|
||||
"exec perl")))))
|
||||
|
||||
(add-after 'install 'move-static-libs
|
||||
(lambda* (#:key outputs #:allow-other-keys)
|
||||
;; Move static libraries to the "static" output.
|
||||
(define (static-library? file)
|
||||
;; Return true if FILE is a static library. The
|
||||
;; "_nonshared.a" files are referred to by libc.so,
|
||||
;; libpthread.so, etc., which are in fact linker
|
||||
;; scripts.
|
||||
(and (string-suffix? ".a" file)
|
||||
(not (string-contains file "_nonshared"))))
|
||||
|
||||
(define (linker-script? file)
|
||||
;; Guess whether FILE, a ".a" file, is actually a
|
||||
;; linker script.
|
||||
(and (not (ar-file? file))
|
||||
(not (elf-file? file))))
|
||||
|
||||
(let* ((out (assoc-ref outputs "out"))
|
||||
(lib (string-append out "/lib"))
|
||||
(files (scandir lib static-library?))
|
||||
(static (assoc-ref outputs "static"))
|
||||
(slib (string-append static "/lib")))
|
||||
(mkdir-p slib)
|
||||
(for-each (lambda (base)
|
||||
(rename-file (string-append lib "/" base)
|
||||
(string-append slib "/" base)))
|
||||
files)
|
||||
|
||||
;; Usually libm.a is a linker script so we need to
|
||||
;; change the file names in there to refer to STATIC
|
||||
;; instead of OUT.
|
||||
(for-each (lambda (ld-script)
|
||||
(substitute* ld-script
|
||||
((out) static)))
|
||||
(filter linker-script?
|
||||
(map (cut string-append slib "/" <>)
|
||||
files)))
|
||||
#t))))))
|
||||
|
||||
(inputs `(("static-bash" ,static-bash)))
|
||||
|
||||
|
|
|
@ -583,12 +583,24 @@ (define static-bash-for-glibc
|
|||
(let* ((gcc (cross-gcc-wrapper gcc-boot0 binutils-boot0
|
||||
glibc-final-with-bootstrap-bash
|
||||
(car (assoc-ref %boot1-inputs "bash"))))
|
||||
(bash (package (inherit static-bash)
|
||||
(bash (package
|
||||
(inherit static-bash)
|
||||
(arguments
|
||||
`(#:guile ,%bootstrap-guile
|
||||
,@(package-arguments static-bash)))))
|
||||
(substitute-keyword-arguments
|
||||
(package-arguments static-bash)
|
||||
((#:guile _ #f)
|
||||
'%bootstrap-guile)
|
||||
((#:configure-flags flags '())
|
||||
;; Add a '-L' flag so that the pseudo-cross-ld of
|
||||
;; BINUTILS-BOOT0 can find libc.a.
|
||||
`(append ,flags
|
||||
(list (string-append "LDFLAGS=-static -L"
|
||||
(assoc-ref %build-inputs
|
||||
"libc:static")
|
||||
"/lib"))))))))
|
||||
(inputs `(("gcc" ,gcc)
|
||||
("libc" ,glibc-final-with-bootstrap-bash)
|
||||
("libc:static" ,glibc-final-with-bootstrap-bash "static")
|
||||
,@(fold alist-delete %boot1-inputs
|
||||
'("gcc" "libc")))))
|
||||
(package-with-bootstrap-guile
|
||||
|
@ -663,6 +675,7 @@ (define gcc-boot0-wrapped
|
|||
(define %boot2-inputs
|
||||
;; 3rd stage inputs.
|
||||
`(("libc" ,glibc-final)
|
||||
("libc:static" ,glibc-final "static")
|
||||
("gcc" ,gcc-boot0-wrapped)
|
||||
,@(fold alist-delete %boot1-inputs '("libc" "gcc"))))
|
||||
|
||||
|
@ -923,12 +936,13 @@ (define-public %final-inputs
|
|||
("binutils" ,binutils-final)
|
||||
("gcc" ,gcc-final)
|
||||
("libc" ,glibc-final)
|
||||
("libc:static" ,glibc-final "static")
|
||||
("locales" ,glibc-utf8-locales-final))))
|
||||
|
||||
(define-public canonical-package
|
||||
(let ((name->package (fold (lambda (input result)
|
||||
(match input
|
||||
((_ package)
|
||||
((_ package . outputs)
|
||||
(vhash-cons (package-full-name package)
|
||||
package result))))
|
||||
vlist-null
|
||||
|
|
|
@ -248,6 +248,7 @@ (define* (cross-gcc target
|
|||
,@inputs)))
|
||||
(libc
|
||||
`(("libc" ,libc)
|
||||
("libc:static" ,libc "static")
|
||||
("xkernel-headers" ;the target headers
|
||||
,@(assoc-ref (package-propagated-inputs libc)
|
||||
"kernel-headers"))
|
||||
|
|
Loading…
Reference in a new issue