Message ID | 20190324212345.4697-1-mail@cbaines.net |
---|---|
State | Accepted |
Headers | show |
Series | [bug#34982] guile-build-system: Support building in parallel. | expand |
Context | Check | Description |
---|---|---|
cbaines/applying patch | success | Successfully applied |
cbaines/applying patch | success | Successfully applied |
cbaines/applying patch | success | Successfully applied |
cbaines/applying patch | success | Successfully applied |
cbaines/applying patch | success | Successfully applied |
cbaines/applying patch | success | Successfully applied |
cbaines/applying patch | success | Successfully applied |
cbaines/applying patch | success | Successfully applied |
cbaines/applying patch | success | Successfully applied |
cbaines/applying patch | success | Successfully applied |
Hi, Christopher Baines <mail@cbaines.net> skribis: > * guix/build/guile-build-system.scm (build): Use n-par-for-each, instead of > for-each, to use multiple cores if available. [...] > + (n-par-for-each > + (parallel-job-count) > + (lambda (file) > + (catch #t > + (lambda () > + (let* ((go (string-append go-dir > + (file-sans-extension file) > + ".go"))) > + ;; Install source module. > + (install-file (string-append source-directory "/" file) > + (string-append module-dir > + "/" (dirname file))) > > - ;; Install and compile module. > - (apply invoke guild "compile" "-L" source-directory It probably doesn’t matter that much, but it feels wrong to create threads that do nothing but call ‘waitpid’, essentially. Commit f07041f7d25badb7d74b8fad6ee446a12af04f63 removed a ‘p-for-each’ procedure that could be useful here since it directly creates N processes and then does (waitpid WAITPID_ANY). Would it make sense to paste it here and use it in lieu of ‘n-par-for-each’? Thanks, Ludo’.
Ludovic Courtès <ludo@gnu.org> writes: > Hi, > > Christopher Baines <mail@cbaines.net> skribis: > >> * guix/build/guile-build-system.scm (build): Use n-par-for-each, instead of >> for-each, to use multiple cores if available. > > [...] > >> + (n-par-for-each >> + (parallel-job-count) >> + (lambda (file) >> + (catch #t >> + (lambda () >> + (let* ((go (string-append go-dir >> + (file-sans-extension file) >> + ".go"))) >> + ;; Install source module. >> + (install-file (string-append source-directory "/" file) >> + (string-append module-dir >> + "/" (dirname file))) >> >> - ;; Install and compile module. >> - (apply invoke guild "compile" "-L" source-directory > > It probably doesn’t matter that much, but it feels wrong to create > threads that do nothing but call ‘waitpid’, essentially. > > Commit f07041f7d25badb7d74b8fad6ee446a12af04f63 removed a ‘p-for-each’ > procedure that could be useful here since it directly creates N > processes and then does (waitpid WAITPID_ANY). Would it make sense to > paste it here and use it in lieu of ‘n-par-for-each’? I've sent a new patch with an updated approach now, I started with the n-par-for-each procedure, and adapted it. It seems to work, let me know what you think :) Chris
Hello Christopher! Christopher Baines <mail@cbaines.net> skribis: > I've sent a new patch with an updated approach now, I started with the > n-par-for-each procedure, and adapted it. It seems to work, let me know > what you think :) Sorry for the delay, but… where’s the new patch? Ludo’.
Ludovic Courtès <ludo@gnu.org> writes: > Hello Christopher! > > Christopher Baines <mail@cbaines.net> skribis: > >> I've sent a new patch with an updated approach now, I started with the >> n-par-for-each procedure, and adapted it. It seems to work, let me know >> what you think :) > > Sorry for the delay, but… where’s the new patch? Hmm, I'm not sure. I thought I sent it, but seemingly not. I've just sent the updated patch, and it's definately arrived now. Thanks, Chris
diff --git a/guix/build/guile-build-system.scm b/guix/build/guile-build-system.scm index 0bed049436..a5741081bf 100644 --- a/guix/build/guile-build-system.scm +++ b/guix/build/guile-build-system.scm @@ -23,6 +23,7 @@ #:use-module (ice-9 match) #:use-module (ice-9 popen) #:use-module (ice-9 rdelim) + #:use-module (ice-9 threads) #:use-module (guix build utils) #:export (target-guile-effective-version %standard-phases @@ -101,24 +102,32 @@ Return #false if it cannot be determined." (match (getenv "GUILE_LOAD_COMPILED_PATH") (#f "") (path (string-append ":" path))))) - (for-each (lambda (file) - (let* ((go (string-append go-dir - (file-sans-extension file) - ".go"))) - ;; Install source module. - (install-file (string-append source-directory "/" file) - (string-append module-dir - "/" (dirname file))) + (n-par-for-each + (parallel-job-count) + (lambda (file) + (catch #t + (lambda () + (let* ((go (string-append go-dir + (file-sans-extension file) + ".go"))) + ;; Install source module. + (install-file (string-append source-directory "/" file) + (string-append module-dir + "/" (dirname file))) - ;; Install and compile module. - (apply invoke guild "compile" "-L" source-directory - "-o" go - (string-append source-directory "/" file) - flags))) - - ;; Arrange to strip SOURCE-DIRECTORY from file names. - (with-directory-excursion source-directory - (find-files "." scheme-file-regexp))) + ;; Install and compile module. + (apply invoke guild "compile" "-L" source-directory + "-o" go + (string-append source-directory "/" file) + flags))) + (lambda (key . args) + ;; Since ports are not thread-safe as of Guile 2.0, reopen stderr. + (let ((port (fdopen 2 "w0"))) + (print-exception port #f key args) + (primitive-exit 1))))) + ;; Arrange to strip SOURCE-DIRECTORY from file names. + (with-directory-excursion source-directory + (find-files "." scheme-file-regexp))) #t)) (define* (install-documentation #:key outputs