Subject: [bug#50833] [PATCH v2] gnu: Add bower.

From: Maxime Devos <[email-masked]>
Date: Wed, 20 Jul 2022 13:59:19 +0200

On 20-07-2022 07:18, jgart via Guix-patches via wrote:
> * gnu/packages/mail.scm (bower): New variable.
>
> Hi Maxim, Here's v2 patching the executables you requested. Sorry for the delay.
>
> all best,
>
> jgart
> ---
>   gnu/packages/mail.scm | 80 +++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 80 insertions(+)
>
> diff --git a/gnu/packages/mail.scm b/gnu/packages/mail.scm
> index 556c5b4305..afad1cc4bf 100644
> --- a/gnu/packages/mail.scm
> +++ b/gnu/packages/mail.scm
> @@ -48,6 +48,7 @@
>   ;;; Copyright © 2022 Justin Veilleux<[email-masked]>
>   ;;; Copyright © 2022 Thiago Jung Bauermann<[email-masked]>
>   ;;; Copyright © 2022 Guillaume Le Vaillant<[email-masked]>
> +;;; Copyright © 2022 jgart<[email-masked]>
>   ;;;
>   ;;; This file is part of GNU Guix.
>   ;;;
> @@ -124,6 +125,7 @@ (define-module (gnu packages mail)
>     #:use-module (gnu packages lua)
>     #:use-module (gnu packages m4)
>     #:use-module (gnu packages man)
> +  #:use-module (gnu packages mercury)
>     #:use-module (gnu packages ncurses)
>     #:use-module (gnu packages nettle)
>     #:use-module (gnu packages networking)
> @@ -1522,6 +1524,84 @@ (define-public python-notmuch2
>       (synopsis "Pythonic bindings for the notmuch mail database using CFFI")
>       (license license:gpl3+)))
>   
> +(define-public bower
> +  (package
> +    (name "bower")
> +    (version "0.13")
> +    (home-page"https://github.com/wangp/bower")
> +    (source
> +     (origin
> +       (method git-fetch)
> +       (uri
> +        (git-reference
> +         (url home-page)
> +         (commit version)))
> +       (file-name (git-file-name name version))
> +       (sha256
> +        (base32 "0r5s16pc3ym5nd33lv9ljv1p1gpb7yysrdni4g7w7yvjrnwk35l6"))))
> +    (build-system gnu-build-system)
> +    (arguments
> +     `(#:make-flags
> +       (list
> +        "bower"
> +        "man"
> +        (string-append "CC=" ,(cc-for-target))
> +        (string-append "prefix=" %output))

IIRC, %output is not documented -- you can use #$output instead:

(arguments
   (list #:make-flags
         #~(list "bower" "man" (string-append "CC=" #$(cc-for-target)) (string-append "prefix=" #$output))
         [...]))

> +       #:phases
> +       (modify-phases %standard-phases
> +         (delete 'configure)
> +         (add-after 'unpack 'patch-executables
> +           (lambda* (#:key inputs #:allow-other-keys)
> +             (let ((file (assoc-ref inputs "file"))
> +                   (base64 (assoc-ref inputs "coreutils"))
> +                   (lynx (assoc-ref inputs "lynx"))
> +                   (sendmail (assoc-ref inputs "sendmail"))
> +                   (notmuch (assoc-ref inputs "notmuch")))
> +               (substitute* "src/detect_mime_type.m"
> +                 (("\"file")
> +                  (string-append "\"" file "/bin/file")))

Not using input labels is preferred (such that package transformations 
can easily be used to, say, replace "coreutils" with something 
sufficiently compatible that isn't "coreutils"). You can use 
search-input-file instead. E.g.,:

(substitute* "src/detect_mime_type.m"
   ("\"file") (string-append "\"" (search-input-file inputs "/bin/file")))
   [...])

and likewise for the other substitutions.

> +               (substitute* "src/compose.m"
> +                 (("\"base64")
> +                  (string-append "\"" base64 "/bin/base64"))
> +                  (("\"lynx")
> +                   (string-append "\"" lynx "/bin/lynx")))
> +               (substitute* "src/prog_config.m"
> +                 (("\"notmuch\"")
> +                  (string-append "\"" notmuch "/bin/notmuch\""))
> +                  (("/usr/bin/sendmail")
> +                  (string-append sendmail "/sbin/sendmail"))
> +                  (("\"lynx")
> +                   (string-append "\"" lynx "/bin/lynx"))))))
> +         (replace 'check
> +           (lambda* (#:key inputs outputs tests? #:allow-other-keys)

You are not using inputs or outputs here, so they can be removed.

> +             (when tests?
> +               (chdir "tests")
> +               (invoke "make"))))

Due to the issue noted below, I recommend keeping the 'chdir' 
unconditional. I believe (with-directory-excursion ...) to be even 
better, as it restores the change in directory automatically, less room 
for trouble.

> +         (replace 'install
> +           (lambda* (#:key outpus #:allow-other-keys)

You are not using 'outpus' here (also, 'outpus' -> 'outputs'), so it can 
be removed.

> +             (let ((bin (string-append (assoc-ref %outputs "out") "/bin"))
> +                   (man (string-append (assoc-ref %outputs "out") "/share/man/man1")))
I'd replace (assoc-ref %outputs "out") by #$output (don't forget to add 
#~ before the (modify-phases ...)) to avoid the assoc-ref construct and 
%outputs in favour of the simpler #$output.
> +               (chdir "..")
This is to undo the (chdir "tests") above, right?  If so, remember that 
the (chdir "tests") above is unconditional, so this will break when 
tests are disabled (in case of --without-tests, or in case of 
cross-compiling with --target=aarch64-linux-gnu or such).  So it needs 
to be made conditional on tests? as well, or the (chdir "tests") from 
above would need to be made unconditional, or the with-directory-excursion.

Greetings,
Maxime