Subject: [bug#58230] [PATCH] build: copy-build-system: Add #:output filter.

From: Hilton Chain <[email-masked]>
Date: Sat, 01 Oct 2022 23:46:44 +0800

* guix/build/copy-build-system.scm (install): Add #:output filter.
---
 guix/build/copy-build-system.scm | 49 +++++++++++++++++++-------------
 1 file changed, 30 insertions(+), 19 deletions(-)

diff --git a/guix/build/copy-build-system.scm b/guix/build/copy-build-system.scm
index fb2d1db056..111032eed8 100644
--- a/guix/build/copy-build-system.scm
+++ b/guix/build/copy-build-system.scm
@@ -54,7 +54,7 @@ (define* (install #:key install-plan outputs #:allow-other-keys)
   - Without FILTERS, install the full SOURCE _content_ to TARGET.
     The paths relative to SOURCE are preserved within TARGET.
   - With FILTERS among `#:include`, `#:include-regexp`, `#:exclude`,
-    `#:exclude-regexp`:
+    `#:exclude-regexp`, `#:output`:
     - With `#:include`, install only the paths which suffix exactly matches
       one of the elements in the list.
     - With `#:include-regexp`, install subpaths matching the regexps in the list.
@@ -62,6 +62,8 @@ (define* (install #:key install-plan outputs #:allow-other-keys)
       install every subpath but the files matching the `#:exclude*` filters.
       If both `#:include*` and `#:exclude*` are specified, the exclusion is done
       on the inclusion list.
+    - With `#:output`, install into TARGET of every specified output(s), the
+      default value is \"out\".
 
 Examples:
 
@@ -72,7 +74,13 @@ (define* (install #:key install-plan outputs #:allow-other-keys)
 - `(\"foo/\" \"share/my-app\" #:include (\"sub/file\"))`: Install only \"foo/sub/file\" to
 \"share/my-app/sub/file\".
 - `(\"foo/sub\" \"share/my-app\" #:include (\"file\"))`: Install \"foo/sub/file\" to
-\"share/my-app/file\"."
+\"share/my-app/file\".
+-  As the previout example, when not specifying `#:output`: Install \"foo/sub/file\" to
+\"share/my-app/file\" of \"out\" output.
+- `(\"foo/sub\" \"share/my-app\" #:include (\"file\")) #:output (\"lib\")`: Install
+\"foo/sub/file\" to \"share/my-app/file\" of \"lib\" output.
+- `(\"foo/sub\" \"share/my-app\" #:include (\"file\")) #:output (\"out\"\"lib\")`:
+Install \"foo/sub/file\" to \"share/my-app/file\" of both \"out\" and \"lib\" outputs."
   (define (install-simple source target)
     "Install SOURCE to TARGET.
 TARGET must point to a store location.
@@ -133,23 +141,26 @@ (define* (install-file-list source target #:key include exclude include-regexp e
                                       (string-append target "/")))
              file-list))))
 
-  (define* (install source target #:key include exclude include-regexp exclude-regexp)
-    (let ((final-target (string-append (assoc-ref outputs "out") "/" target))
-          (filters? (or include exclude include-regexp exclude-regexp)))
-      (when (and (not (file-is-directory? source))
-                 filters?)
-        (error "Cannot use filters when SOURCE is a file."))
-      (let ((multi-files-in-source?
-             (or (string-suffix? "/" source)
-                 (and (file-is-directory? source)
-                      filters?))))
-        (if multi-files-in-source?
-            (install-file-list source final-target
-                               #:include include
-                               #:exclude exclude
-                               #:include-regexp include-regexp
-                               #:exclude-regexp exclude-regexp)
-            (install-simple source final-target)))))
+  (define* (install source target #:key include exclude include-regexp exclude-regexp (output '("out")))
+    (for-each
+     (lambda (out)
+       (let ((final-target (string-append (assoc-ref outputs out) "/" target))
+             (filters? (or include exclude include-regexp exclude-regexp)))
+         (when (and (not (file-is-directory? source))
+                    filters?)
+           (error "Cannot use filters when SOURCE is a file."))
+         (let ((multi-files-in-source?
+                (or (string-suffix? "/" source)
+                    (and (file-is-directory? source)
+                         filters?))))
+           (if multi-files-in-source?
+               (install-file-list source final-target
+                                  #:include include
+                                  #:exclude exclude
+                                  #:include-regexp include-regexp
+                                  #:exclude-regexp exclude-regexp)
+               (install-simple source final-target)))))
+     output))
 
   (for-each (lambda (plan) (apply install plan)) install-plan)
   #t)

base-commit: 225e00bd1925487fb045d9184fd249d93accad08
-- 
2.37.3