;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2016 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
-;;; Copyright © 2016, 2017, 2019 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2016, 2017, 2019, 2020, 2021 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
(current-processor-count))))
(loop tail)))))))))
+(define (parallel-job-count*)
+ ;; XXX: Work around memory requirements not sustainable on i686 above '-j4'
+ ;; or so: <https://bugs.gnu.org/40522>.
+ (let ((count (parallel-job-count)))
+ (if (string-prefix? "i686" %host-type)
+ (min count 4)
+ count)))
+
(define (% completed total)
"Return the completion percentage of COMPLETED over TOTAL as an integer."
(inexact->exact (round (* 100. (/ completed total)))))
(exit 1)))
(match (command-line)
- ((_ . files)
+ ((_ "--total" (= string->number grand-total)
+ "--completed" (= string->number processed)
+ . files)
+ ;; GRAND-TOTAL is the total number of .scm files in the project; PROCESSED
+ ;; is the total number of .scm files already compiled in previous
+ ;; invocations of this script.
(catch #t
(lambda ()
- (compile-files srcdir (getcwd)
- (filter file-needs-compilation? files)
- #:workers (parallel-job-count)
- #:host host
- #:report-load (lambda (file total completed)
- (when file
- (format #t "[~3d%] LOAD ~a~%"
- (% (+ 1 completed) (* 2 total))
- file)
- (force-output)))
- #:report-compilation (lambda (file total completed)
- (when file
- (format #t "[~3d%] GUILEC ~a~%"
- (% (+ total completed 1)
- (* 2 total))
- (scm->go file))
- (force-output)))))
+ (let* ((to-build (filter file-needs-compilation? files))
+ (processed (+ processed
+ (- (length files) (length to-build)))))
+ (compile-files srcdir (getcwd) to-build
+ #:workers (parallel-job-count*)
+ #:host host
+ #:report-load (lambda (file total completed)
+ (when file
+ (format #t "[~3d%] LOAD ~a~%"
+ (% (+ 1 completed
+ (* 2 processed))
+ (* 2 grand-total))
+ file)
+ (force-output)))
+ #:report-compilation (lambda (file total completed)
+ (when file
+ (format #t "[~3d%] GUILEC ~a~%"
+ (% (+ total completed 1
+ (* 2 processed))
+ (* 2 grand-total))
+ (scm->go file))
+ (force-output))))))
(lambda _
(primitive-exit 1))
(lambda args
(false-if-exception
(module-ref ui 'report-load-error)))))
(if report
- ;; In Guile <= 2.2.5, 'current-load-port' was not exported.
- (let ((load-port ((module-ref (resolve-module '(ice-9 ports))
- 'current-load-port))))
- (report (or (and=> load-port port-filename) "?.scm")
- args frame))
+ (report (or (and=> (current-load-port) port-filename) "?.scm")
+ args frame)
(begin
(print-exception (current-error-port) frame
(car args) (cdr args))