gnu: make-bootstrap: Memoize GCC variant.
This reduces the number of nodes in "guix graph guile-static-stripped" from 165 to 150. Likewise, the hit rate in the 'add-data-to-store' cache for "guix build guile-static-stripped -nd" goes from 24% to 12%. * gnu/packages/make-bootstrap.scm (gcc-for-bootstrap): New procedure. (package-with-relocatable-glibc): Use it.
This commit is contained in:
		
							parent
							
								
									2a4309de43
								
							
						
					
					
						commit
						0c72a719ef
					
				
					 1 changed files with 34 additions and 28 deletions
				
			
		| 
						 | 
					@ -88,6 +88,39 @@ for `sh' in $PATH, and without nscd, and with static NSS modules."
 | 
				
			||||||
      ;; contain store file names, so the CRC changes at every rebuild.)
 | 
					      ;; contain store file names, so the CRC changes at every rebuild.)
 | 
				
			||||||
      (outputs (delete "debug" (package-outputs base))))))
 | 
					      (outputs (delete "debug" (package-outputs base))))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define gcc-for-bootstrap
 | 
				
			||||||
 | 
					  (mlambdaq (glibc)
 | 
				
			||||||
 | 
					    "Return a variant of GCC that uses the bootstrap variant of GLIBC."
 | 
				
			||||||
 | 
					    (package
 | 
				
			||||||
 | 
					      (inherit gcc)
 | 
				
			||||||
 | 
					      (outputs '("out")) ;all in one so libgcc_s is easily found
 | 
				
			||||||
 | 
					      (native-search-paths
 | 
				
			||||||
 | 
					       ;; Set CPLUS_INCLUDE_PATH so GCC is able to find the libc
 | 
				
			||||||
 | 
					       ;; C++ headers.
 | 
				
			||||||
 | 
					       (cons (search-path-specification
 | 
				
			||||||
 | 
					              (variable "CPLUS_INCLUDE_PATH")
 | 
				
			||||||
 | 
					              (files '("include")))
 | 
				
			||||||
 | 
					             (package-native-search-paths gcc)))
 | 
				
			||||||
 | 
					      (inputs
 | 
				
			||||||
 | 
					       `( ;; Distinguish the name so we can refer to it below.
 | 
				
			||||||
 | 
					         ("bootstrap-libc" ,(glibc-for-bootstrap glibc))
 | 
				
			||||||
 | 
					         ("libc:static" ,(glibc-for-bootstrap glibc) "static")
 | 
				
			||||||
 | 
					         ,@(package-inputs gcc)))
 | 
				
			||||||
 | 
					      (arguments
 | 
				
			||||||
 | 
					       (substitute-keyword-arguments (package-arguments gcc)
 | 
				
			||||||
 | 
					         ((#:phases phases)
 | 
				
			||||||
 | 
					          `(modify-phases ,phases
 | 
				
			||||||
 | 
					             (add-before 'configure 'treat-glibc-as-system-header
 | 
				
			||||||
 | 
					               (lambda* (#:key inputs #:allow-other-keys)
 | 
				
			||||||
 | 
					                 (let ((libc (assoc-ref inputs "bootstrap-libc")))
 | 
				
			||||||
 | 
					                   ;; GCCs build processes requires that the libc
 | 
				
			||||||
 | 
					                   ;; we're building against is on the system header
 | 
				
			||||||
 | 
					                   ;; search path.
 | 
				
			||||||
 | 
					                   (for-each (lambda (var)
 | 
				
			||||||
 | 
					                               (setenv var (string-append libc "/include")))
 | 
				
			||||||
 | 
					                             '("C_INCLUDE_PATH" "CPLUS_INCLUDE_PATH"))
 | 
				
			||||||
 | 
					                   #t))))))))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (package-with-relocatable-glibc p)
 | 
					(define (package-with-relocatable-glibc p)
 | 
				
			||||||
  "Return a variant of P that uses the libc as defined by
 | 
					  "Return a variant of P that uses the libc as defined by
 | 
				
			||||||
`glibc-for-bootstrap'."
 | 
					`glibc-for-bootstrap'."
 | 
				
			||||||
| 
						 | 
					@ -127,34 +160,7 @@ for `sh' in $PATH, and without nscd, and with static NSS modules."
 | 
				
			||||||
            ,@(%final-inputs)))
 | 
					            ,@(%final-inputs)))
 | 
				
			||||||
        `(("libc" ,(glibc-for-bootstrap glibc))
 | 
					        `(("libc" ,(glibc-for-bootstrap glibc))
 | 
				
			||||||
          ("libc:static" ,(glibc-for-bootstrap glibc) "static")
 | 
					          ("libc:static" ,(glibc-for-bootstrap glibc) "static")
 | 
				
			||||||
          ("gcc" ,(package (inherit gcc)
 | 
					          ("gcc" ,(gcc-for-bootstrap glibc))
 | 
				
			||||||
                    (outputs '("out"))  ;all in one so libgcc_s is easily found
 | 
					 | 
				
			||||||
                    (native-search-paths
 | 
					 | 
				
			||||||
                     ;; Set CPLUS_INCLUDE_PATH so GCC is able to find the libc
 | 
					 | 
				
			||||||
                     ;; C++ headers.
 | 
					 | 
				
			||||||
                     (cons (search-path-specification
 | 
					 | 
				
			||||||
                            (variable "CPLUS_INCLUDE_PATH")
 | 
					 | 
				
			||||||
                            (files '("include")))
 | 
					 | 
				
			||||||
                           (package-native-search-paths gcc)))
 | 
					 | 
				
			||||||
                    (inputs
 | 
					 | 
				
			||||||
                     `(;; Distinguish the name so we can refer to it below.
 | 
					 | 
				
			||||||
                       ("bootstrap-libc" ,(glibc-for-bootstrap glibc))
 | 
					 | 
				
			||||||
                       ("libc:static" ,(glibc-for-bootstrap glibc) "static")
 | 
					 | 
				
			||||||
                       ,@(package-inputs gcc)))
 | 
					 | 
				
			||||||
                    (arguments
 | 
					 | 
				
			||||||
                     (substitute-keyword-arguments (package-arguments gcc)
 | 
					 | 
				
			||||||
                       ((#:phases phases)
 | 
					 | 
				
			||||||
                        `(modify-phases ,phases
 | 
					 | 
				
			||||||
                           (add-before 'configure 'treat-glibc-as-system-header
 | 
					 | 
				
			||||||
                             (lambda* (#:key inputs #:allow-other-keys)
 | 
					 | 
				
			||||||
                               (let ((libc (assoc-ref inputs "bootstrap-libc")))
 | 
					 | 
				
			||||||
                                 ;; GCCs build processes requires that the libc
 | 
					 | 
				
			||||||
                                 ;; we're building against is on the system header
 | 
					 | 
				
			||||||
                                 ;; search path.
 | 
					 | 
				
			||||||
                                 (for-each (lambda (var)
 | 
					 | 
				
			||||||
                                             (setenv var (string-append libc "/include")))
 | 
					 | 
				
			||||||
                                           '("C_INCLUDE_PATH" "CPLUS_INCLUDE_PATH"))
 | 
					 | 
				
			||||||
                                 #t)))))))))
 | 
					 | 
				
			||||||
          ,@(fold alist-delete (%final-inputs) '("libc" "gcc")))))
 | 
					          ,@(fold alist-delete (%final-inputs) '("libc" "gcc")))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (package-with-explicit-inputs p inputs
 | 
					  (package-with-explicit-inputs p inputs
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Reference in a new issue