* [bug#28336] [PATCH 0/1] core-updates: Add "static" output to glibc
@ 2017-09-03 12:32 Ludovic Courtès
2017-09-03 12:33 ` [bug#28336] [PATCH 1/1] gnu: glibc: Add "static" output Ludovic Courtès
2017-09-05 8:19 ` bug#28336: [PATCH 0/1] core-updates: Add "static" output to glibc Ludovic Courtès
0 siblings, 2 replies; 3+ messages in thread
From: Ludovic Courtès @ 2017-09-03 12:32 UTC (permalink / raw)
To: 28336
Hello Guix!
This patch for ‘core-updates’ adds a “static” output to glibc, which
shaves 9 MiB out of it.
“glibc:static” is always part of the implicit inputs of
‘gnu-build-system’ though, such that building a statically-linked
package does not require any modification.
I’d like to apply it shortly if there are no issues.
Thanks,
Ludo’.
Ludovic Courtès (1):
gnu: glibc: Add "static" output.
gnu/packages/base.scm | 49 +++++++++++++++++++++++++++++++++++++++++--
gnu/packages/commencement.scm | 22 +++++++++++++++----
gnu/packages/cross-base.scm | 1 +
3 files changed, 66 insertions(+), 6 deletions(-)
--
2.14.1
^ permalink raw reply [flat|nested] 3+ messages in thread
* [bug#28336] [PATCH 1/1] gnu: glibc: Add "static" output.
2017-09-03 12:32 [bug#28336] [PATCH 0/1] core-updates: Add "static" output to glibc Ludovic Courtès
@ 2017-09-03 12:33 ` Ludovic Courtès
2017-09-05 8:19 ` bug#28336: [PATCH 0/1] core-updates: Add "static" output to glibc Ludovic Courtès
1 sibling, 0 replies; 3+ messages in thread
From: Ludovic Courtès @ 2017-09-03 12:33 UTC (permalink / raw)
To: 28336
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'.
---
gnu/packages/base.scm | 49 +++++++++++++++++++++++++++++++++++++++++--
gnu/packages/commencement.scm | 22 +++++++++++++++----
gnu/packages/cross-base.scm | 1 +
3 files changed, 66 insertions(+), 6 deletions(-)
diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm
index 532bb3e95..ef81f2069 100644
--- a/gnu/packages/base.scm
+++ b/gnu/packages/base.scm
@@ -542,7 +542,8 @@ store.")
;; 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 @@ store.")
;; 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 @@ store.")
;; "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)))
diff --git a/gnu/packages/commencement.scm b/gnu/packages/commencement.scm
index 2b67881ed..318a2795b 100644
--- a/gnu/packages/commencement.scm
+++ b/gnu/packages/commencement.scm
@@ -583,12 +583,24 @@ exec ~a/bin/~a-~a -B~a/lib -Wl,-dynamic-linker -Wl,~a/~a \"$@\"~%"
(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 @@ exec ~a/bin/~a-~a -B~a/lib -Wl,-dynamic-linker -Wl,~a/~a \"$@\"~%"
(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 @@ exec ~a/bin/~a-~a -B~a/lib -Wl,-dynamic-linker -Wl,~a/~a \"$@\"~%"
("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
diff --git a/gnu/packages/cross-base.scm b/gnu/packages/cross-base.scm
index abc3a2821..369083eab 100644
--- a/gnu/packages/cross-base.scm
+++ b/gnu/packages/cross-base.scm
@@ -248,6 +248,7 @@ target that libc."
,@inputs)))
(libc
`(("libc" ,libc)
+ ("libc:static" ,libc "static")
("xkernel-headers" ;the target headers
,@(assoc-ref (package-propagated-inputs libc)
"kernel-headers"))
--
2.14.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* bug#28336: [PATCH 0/1] core-updates: Add "static" output to glibc
2017-09-03 12:32 [bug#28336] [PATCH 0/1] core-updates: Add "static" output to glibc Ludovic Courtès
2017-09-03 12:33 ` [bug#28336] [PATCH 1/1] gnu: glibc: Add "static" output Ludovic Courtès
@ 2017-09-05 8:19 ` Ludovic Courtès
1 sibling, 0 replies; 3+ messages in thread
From: Ludovic Courtès @ 2017-09-05 8:19 UTC (permalink / raw)
To: 28336-done
Ludovic Courtès <ludo@gnu.org> skribis:
> This patch for ‘core-updates’ adds a “static” output to glibc, which
> shaves 9 MiB out of it.
>
> “glibc:static” is always part of the implicit inputs of
> ‘gnu-build-system’ though, such that building a statically-linked
> package does not require any modification.
>
> I’d like to apply it shortly if there are no issues.
Pushed as 6dff905e51202bbdebbad8811b6509584d12a796.
Ludo’.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2017-09-05 8:20 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-09-03 12:32 [bug#28336] [PATCH 0/1] core-updates: Add "static" output to glibc Ludovic Courtès
2017-09-03 12:33 ` [bug#28336] [PATCH 1/1] gnu: glibc: Add "static" output Ludovic Courtès
2017-09-05 8:19 ` bug#28336: [PATCH 0/1] core-updates: Add "static" output to glibc Ludovic Courtès
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).