Subject: [bug#36346] [PATCH] gnu: Allow building toolchain with non-default libc.

From: Carl Dong <[email-masked]>
Date: Sun, 23 Jun 2019 20:15:43 +0000

From: Carl Dong <[email-masked]>

* gnu/packages/base.scm (make-gcc-libc): Make public.
* gnu/packages/commencement.scm (make-gcc-toolchain): Add 'libc'
  optional argument to specify using a non-default glibc package, also
  make public.
---
 gnu/packages/base.scm         |   2 +-
 gnu/packages/commencement.scm | 103 ++++++++++++++++++----------------
 2 files changed, 55 insertions(+), 50 deletions(-)

diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm
index 15f35009a9..e40b40681b 100644
--- a/gnu/packages/base.scm
+++ b/gnu/packages/base.scm
@@ -1009,7 +1009,7 @@ with the Linux kernel.")
                   (("/bin/pwd") "pwd"))
                 #t))))))))
 
-(define (make-gcc-libc base-gcc libc)
+(define-public (make-gcc-libc base-gcc libc)
   "Return a GCC that targets LIBC."
   (package (inherit base-gcc)
            (name (string-append (package-name base-gcc) "-"
diff --git a/gnu/packages/commencement.scm b/gnu/packages/commencement.scm
index a8ec677cee..13912f1352 100644
--- a/gnu/packages/commencement.scm
+++ b/gnu/packages/commencement.scm
@@ -54,7 +54,8 @@
   #:use-module (srfi srfi-26)
   #:use-module (ice-9 vlist)
   #:use-module (ice-9 match)
-  #:use-module (ice-9 regex))
+  #:use-module (ice-9 regex)
+  #:export (make-gcc-toolchain))
 
 ;;; Commentary:
 ;;;
@@ -1014,55 +1015,59 @@ COREUTILS-FINAL vs. COREUTILS, etc."
 ;;; GCC toolchain.
 ;;;
 
-(define (make-gcc-toolchain gcc)
+(define* (make-gcc-toolchain gcc
+                            #:optional
+                            (libc #f))
   "Return a complete toolchain for GCC."
-  (package
-    (name "gcc-toolchain")
-    (version (package-version gcc))
-    (source #f)
-    (build-system trivial-build-system)
-    (arguments
-     '(#:modules ((guix build union))
-       #:builder (begin
-                   (use-modules (ice-9 match)
-                                (srfi srfi-26)
-                                (guix build union))
-
-                   (let ((out (assoc-ref %outputs "out")))
-
-                     (match %build-inputs
-                       (((names . directories) ...)
-                        (union-build out directories)))
-
-                     (union-build (assoc-ref %outputs "debug")
-                                  (list (assoc-ref %build-inputs
-                                                   "libc-debug")))
-                     (union-build (assoc-ref %outputs "static")
-                                  (list (assoc-ref %build-inputs
-                                                   "libc-static")))
-                     #t))))
-
-    (native-search-paths (package-native-search-paths gcc))
-    (search-paths (package-search-paths gcc))
-
-    (license (package-license gcc))
-    (synopsis "Complete GCC tool chain for C/C++ development")
-    (description
-     "This package provides a complete GCC tool chain for C/C++ development to
-be installed in user profiles.  This includes GCC, as well as libc (headers
-and binaries, plus debugging symbols in the @code{debug} output), and Binutils.")
-    (home-page "https://gcc.gnu.org/")
-    (outputs '("out" "debug" "static"))
-
-    ;; The main raison d'être of this "meta-package" is (1) to conveniently
-    ;; install everything that we need, and (2) to make sure ld-wrapper comes
-    ;; before Binutils' ld in the user's profile.
-    (inputs `(("gcc" ,gcc)
-              ("ld-wrapper" ,(car (assoc-ref %final-inputs "ld-wrapper")))
-              ("binutils" ,binutils-final)
-              ("libc" ,glibc-final)
-              ("libc-debug" ,glibc-final "debug")
-              ("libc-static" ,glibc-final "static")))))
+  (let ((gcc (if libc (make-gcc-libc gcc libc) gcc))
+        (libc (if libc libc gcc-final)))
+    (package
+      (name (string-append (package-name gcc) "-toolchain"))
+      (version (package-version gcc))
+      (source #f)
+      (build-system trivial-build-system)
+      (arguments
+       '(#:modules ((guix build union))
+         #:builder (begin
+                     (use-modules (ice-9 match)
+                                  (srfi srfi-26)
+                                  (guix build union))
+
+                     (let ((out (assoc-ref %outputs "out")))
+
+                       (match %build-inputs
+                         (((names . directories) ...)
+                          (union-build out directories)))
+
+                       (union-build (assoc-ref %outputs "debug")
+                                    (list (assoc-ref %build-inputs
+                                                     "libc-debug")))
+                       (union-build (assoc-ref %outputs "static")
+                                    (list (assoc-ref %build-inputs
+                                                     "libc-static")))
+                       #t))))
+
+      (native-search-paths (package-native-search-paths gcc))
+      (search-paths (package-search-paths gcc))
+
+      (license (package-license gcc))
+      (synopsis "Complete GCC tool chain for C/C++ development")
+      (description
+       "This package provides a complete GCC tool chain for C/C++ development to
+be   installed in user profiles.  This includes GCC, as well as libc (headers
+an  d binaries, plus debugging symbols in the @code{debug} output), and Binutils.")
+      (home-page "https://gcc.gnu.org/")
+      (outputs '("out" "debug" "static"))
+
+      ;; The main raison d'être of this "meta-package" is (1) to conveniently
+      ;; install everything that we need, and (2) to make sure ld-wrapper comes
+      ;; before Binutils' ld in the user's profile.
+      (inputs `(("gcc" ,gcc)
+                ("ld-wrapper" ,(car (assoc-ref %final-inputs "ld-wrapper")))
+                ("binutils" ,binutils-final)
+                ("libc" ,libc)
+                ("libc-debug" ,libc "debug")
+                ("libc-static" ,libc "static"))))))
 
 (define-public gcc-toolchain-4.8
   (make-gcc-toolchain gcc-4.8))
-- 
2.22.0