unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
From: Hilton Chain via Guix-patches via <guix-patches@gnu.org>
To: 58230@debbugs.gnu.org
Subject: [bug#58230] [PATCH] build: copy-build-system: Add #:output filter.
Date: Sat, 01 Oct 2022 23:46:44 +0800	[thread overview]
Message-ID: <y76edvrsg0r.wl-hako@ultrarare.space> (raw)

* 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





                 reply	other threads:[~2022-10-01 15:48 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://guix.gnu.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=y76edvrsg0r.wl-hako@ultrarare.space \
    --to=guix-patches@gnu.org \
    --cc=58230@debbugs.gnu.org \
    --cc=hako@ultrarare.space \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).