build: copy-build-system: Allow specifying different output labels.

* guix/build/copy-build-system.scm: Introduce '#:output' parameter to specify
which output label to use for a given rule.
* doc/guix.texi (Build Systems): Document it.

Signed-off-by: Ludovic Courtès <ludo@gnu.org>
This commit is contained in:
Bruno Victal 2023-10-19 16:38:18 +01:00 committed by Ludovic Courtès
parent ccb4a92c34
commit b3d5e2d252
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
2 changed files with 19 additions and 5 deletions

View file

@ -9312,6 +9312,9 @@ install all files but those matching the exclusion filters.
If both inclusions and exclusions are specified, the exclusions are done If both inclusions and exclusions are specified, the exclusions are done
on top of the inclusions. on top of the inclusions.
@end itemize @end itemize
@item When a package has multiple outputs, the @code{#:output} argument
can be used to specify which output label the files should be installed
to.
@end itemize @end itemize
In all cases, the paths relative to @var{source} are preserved within In all cases, the paths relative to @var{source} are preserved within
@var{target}. @var{target}.
@ -9328,6 +9331,9 @@ e.g., install @file{foo/sub/file} to @file{share/my-app/sub/file}.
@file{share/my-app/sub/file}. @file{share/my-app/sub/file}.
@item @code{("foo/sub" "share/my-app" #:include ("file"))}: Install @file{foo/sub/file} to @item @code{("foo/sub" "share/my-app" #:include ("file"))}: Install @file{foo/sub/file} to
@file{share/my-app/file}. @file{share/my-app/file}.
@item @code{("foo/doc" "share/my-app/doc" #:output "doc")}: Install
@file{"foo/doc"} to @file{"share/my-app/doc"} within the @code{"doc"}
output.
@end itemize @end itemize
@end defvar @end defvar

View file

@ -2,6 +2,7 @@
;;; Copyright © 2019 Julien Lepiller <julien@lepiller.eu> ;;; Copyright © 2019 Julien Lepiller <julien@lepiller.eu>
;;; Copyright © 2020 Pierre Neidhardt <mail@ambrevar.xyz> ;;; Copyright © 2020 Pierre Neidhardt <mail@ambrevar.xyz>
;;; Copyright © 2021 Efraim Flashner <efraim@flashner.co.il> ;;; Copyright © 2021 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2023 Bruno Victal <mirai@makinata.eu>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
;;; ;;;
@ -40,9 +41,9 @@
An install plan is a list of plans in the form: An install plan is a list of plans in the form:
(SOURCE TARGET [FILTERS]) (SOURCE TARGET [FILTERS] [#:output OUTPUT])
In the above, FILTERS are optional. In the above, FILTERS and OUTPUT are optional.
- When SOURCE matches a file or directory without trailing slash, install it to - When SOURCE matches a file or directory without trailing slash, install it to
TARGET. TARGET.
@ -63,6 +64,9 @@ In the above, FILTERS are optional.
If both `#:include*` and `#:exclude*` are specified, the exclusion is done If both `#:include*` and `#:exclude*` are specified, the exclusion is done
on the inclusion list. on the inclusion list.
- When a package has multiple outputs, the `#:output` argument can be used
to specify which output label the files should be installed to.
Examples: Examples:
- `(\"foo/bar\" \"share/my-app/\")`: Install bar to \"share/my-app/bar\". - `(\"foo/bar\" \"share/my-app/\")`: Install bar to \"share/my-app/bar\".
@ -72,7 +76,9 @@ Examples:
- `(\"foo/\" \"share/my-app\" #:include (\"sub/file\"))`: Install only \"foo/sub/file\" to - `(\"foo/\" \"share/my-app\" #:include (\"sub/file\"))`: Install only \"foo/sub/file\" to
\"share/my-app/sub/file\". \"share/my-app/sub/file\".
- `(\"foo/sub\" \"share/my-app\" #:include (\"file\"))`: Install \"foo/sub/file\" to - `(\"foo/sub\" \"share/my-app\" #:include (\"file\"))`: Install \"foo/sub/file\" to
\"share/my-app/file\"." \"share/my-app/file\".
- `(\"foo/doc\" \"share/my-app/doc\" #:output \"doc\")`: Install \"foo/doc\" to
\"share/my-app/doc\" within the \"doc\" output."
(define (install-simple source target) (define (install-simple source target)
"Install SOURCE to TARGET. "Install SOURCE to TARGET.
TARGET must point to a store location. TARGET must point to a store location.
@ -133,8 +139,10 @@ given, then the predicate always returns DEFAULT-VALUE."
(string-append target "/"))) (string-append target "/")))
file-list)))) file-list))))
(define* (install source target #:key include exclude include-regexp exclude-regexp) (define* (install source target
(let ((final-target (string-append (assoc-ref outputs "out") "/" target)) #:key include exclude include-regexp exclude-regexp
(output "out"))
(let ((final-target (string-append (assoc-ref outputs output) "/" target))
(filters? (or include exclude include-regexp exclude-regexp))) (filters? (or include exclude include-regexp exclude-regexp)))
(when (and (not (file-is-directory? source)) (when (and (not (file-is-directory? source))
filters?) filters?)