unofficial mirror of guix-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Packaging Mercury & Some Struggles
@ 2019-12-03  1:23 Brett Gilio
  2019-12-05  0:34 ` Brett Gilio
  0 siblings, 1 reply; 3+ messages in thread
From: Brett Gilio @ 2019-12-03  1:23 UTC (permalink / raw)
  To: guix-devel

Greetings all!

I am continuing my prolific streak of trying to move as many things from
my channel to the main repository as possible.

Up next on the menu: the Mercury language and compiler.
http://mercurylang.org/

So here are a few issues I am wanting to get resolved with this package,
and I am hoping some support from the community can get this package
further along.

1. Mercury comes with a number of "grades", which you can think of as
anything relating to do with support for extra backends, libraries, and
a number of other functionalities. The default setting in Mercury is to
compile the compiler including all of the standard grades, which can
take one heck of a long time! As a result, I was thinking of adopting
something similar to `emacs-minimal`, for people who need to use the
Mercury compiler but do not need all of that overhead of having all of
the grades included by default.

--8<---------------cut here---------------start------------->8---
(define-public mercury-minimal
  (package (inherit mercury)
	   (name "mercury-minimal")
	   (build-system gnu-build-system)
	   (arguments
            (substitute-keyword-arguments (package-arguments mercury)
              ((#:configure-flags flags ''())
               `(list "--enable-minimal-install"))))
           (inputs
            `(("gcc-toolchain" ,gcc-toolchain)))
           (synopsis "A pure logic programming language (used only for
compiling packages dependent on base Mercury)")))
--8<---------------cut here---------------end--------------->8---

So this example comes with a few points I want to address. Most distinct
is the modification of the inherited mercury args to use the
minimal-install flag (disabling grades not related to the compiler
itself). Additionally, to use the mercury compiler in projects it
depends on having some C-based toolchain to handoff the extracted code
to. Is including gcc-toolchain as an Input/Prop-Input the best solution
here? I worry that it might conflict with versions of the toolchain
already in a user profile, or if somebody wants to use a different
version of the gcc-toolchain (though they could replace the input using
the appropriate guix flag.)

2. The Mercury source tarball includes a git submodule copy of
boehm-gc. Of course, I think the "Guix way"TM of doing this is to strip
out the submodule and replace it using a Native-Input (assuming the two
versions are compatible, anyways). Here is the method I have assumed for
trying to get that done.

--8<---------------cut here---------------start------------->8---
(add-after 'unpack 'replace-boehm
           (lambda* (#:key inputs #:allow-other-keys)
             (let ((boehm (assoc-ref inputs "libgc")))
               (map (match-lambda
                      ((src orig-name new-name)
                       (with-directory-excursion "."
                         (apply unpack (list #:source src))
                         (apply patch-source-shebangs (list #:source src)))
                       (delete-file-recursively new-name)
                       (invoke "mv" orig-name new-name)))
                    `((,boehm "source" "libgc"))))))
--8<---------------cut here---------------end--------------->8---

Now, this code may not be perfectly correct (feel free to do the work
for me here, if you want, but I can probably figure it out ;). But, the
code is at least in the spirit of what I am trying to achieve here. The
issue here may just be that I am tired, but for whatever reason
`match-lambda' is not resolving.

--8<---------------cut here---------------start------------->8---
starting phase `replace-boehm'
Backtrace:
           8 (primitive-load "/gnu/store/z0wfywmlbn079q07hgab4fafmqx…")
In ice-9/eval.scm:
   191:35  7 (_ #f)
In ice-9/boot-9.scm:
    829:9  6 (catch srfi-34 #<procedure 7ffff2d1a420 at /gnu/store/…> …)
In srfi/srfi-1.scm:
   863:16  5 (every1 #<procedure 7ffff2d1a3e0 at /gnu/store/w3jlc8p…> …)
In /gnu/store/w3jlc8pk8416m7h677r5vq92b66h8cqd-module-import/guix/build/gnu-build-system.scm:
   839:30  4 (_ _)
In ice-9/eval.scm:
    159:9  3 (_ #(#(#(#<directory (guile-user) 7ffff3c6b140>) (…)) #))
   182:19  2 (proc #(#(#(#<directory (guile-user) 7ffff3c6b140>) …) …))
   142:16  1 (compile-top-call _ (7 . match-lambda) ((10 (10 # …) …)))
In unknown file:
           0 (%resolve-variable (7 . match-lambda) #<directory (guil…>)

ERROR: In procedure %resolve-variable:
Unbound variable: match-lambda
--8<---------------cut here---------------end--------------->8---

Last I checked, match-lambda belongs to `(ice-9 match)`. Though it is
very possible that there is just some syntactical issue here that I am
just not seeing right now. Again, eyes on this would be appreciated :).

3. Last, but not least: If any of you can find documentation on how to
run the tests for the Mercury compiler, I would greatly appreciate it! I
am completely lost on how to run them. I can not find an appropriate
make target for them to run off of.

4. This one is not a real issue, per se; however, so far I am doing this
work in a new module (gnu packages mercury). I would have preferred to
place this in a (gnu packages prolog), but we only have a (gnu packages
gprolog) named for the GNU implementation. I personally find this naming
convention unfortunate, as I have SWI-Prolog packaged in my channel too,
and I would like to see SWI-Prolog, gprolog, and mercury all reside in
an appropriately named module.

Alright, hopefully this is enough information to get some help but not
too much for you all to not eventually consider me for maintainer status
in the project. Haha.

Below is the complete WIP for Mercury. All thoughts, criticism, and
confused stares are welcome:

--8<---------------cut here---------------start------------->8---
(define-public mercury
  (package
    (name "mercury")
    (version "14.01.1")
    (source (origin
              (method url-fetch)
              (uri (string-append "https://dl.mercurylang.org/release/mercury-srcdist-"
                                  version
                                  ".tar.gz"))
              (sha256
               (base32
                "12z8qi3da8q50mcsjsy5bnr4ia6ny5lkxvzy01a3c9blgbgcpxwq"))))
    (build-system gnu-build-system)
    (arguments
     '(#:tests? #f ; TODO: tests are cryptic. Figure it out later.
       #:phases
       (modify-phases %standard-phases
         (add-after 'unpack 'patch
           (lambda _ (substitute*
                         (list "Makefile"
                               "Mmakefile"
                               "scripts/mercury_update_interface.in"
                               "scripts/mercury_config.in"
                               "scripts/mmake.in"
                               "scripts/mmake.sh"
                               "scripts/Mmake.vars.in"
                               "scripts/mdb.in"
                               "scripts/rs6000_hack"
                               "scripts/fullarch"
                               "scripts/mmc.in"
                               "scripts/canonical_grade"
                               "scripts/mprof.in"
                               "scripts/gud.el"
                               "scripts/ml.in"
                               "scripts/canonical_grade.in"
                               "scripts/mdprof.in"
                               "scripts/vpath_find"
                               "scripts/mkfifo_using_mknod.in"
                               "scripts/prepare_install_dir.in"
                               "scripts/ml.sh"
                               "scripts/mprof_merge_runs"
                               "scripts/mtc"
                               "scripts/mgnuc.in"
                               "scripts/c2init.in"
                               "bindist/bindist.Makefile")
                       (("/bin/sh") (which "sh"))
                       (("/bin/pwd") (which "pwd"))
                       (("/bin/rm") (which "rm")))))
         (add-after 'unpack 'replace-boehm
           (lambda* (#:key inputs #:allow-other-keys)
             (let ((boehm (assoc-ref inputs "libgc")))
               (map (match-lambda
                      ((src orig-name new-name)
                       (with-directory-excursion "."
                         (apply unpack (list #:source src))
                         (apply patch-source-shebangs (list #:source src)))
                       (delete-file-recursively new-name)
                       (invoke "mv" orig-name new-name)))
                    `((,boehm "source" "libgc")))))))))
    (native-inputs
     `(("texinfo" ,texinfo)
       ("flex" ,flex)
       ("tcsh", tcsh)
       ("bison" ,bison)
       ("readline" ,readline)
       ("libgc" ,libgc)))
    (synopsis "A pure logic programming language")
    (description "Mercury is a logic/functional programming language which 
combines the clarity and expressiveness of declarative programming with advanced
static analysis and error detection features.  Its highly optimized execution 
algorithm delivers efficiency far in excess of existing logic programming 
systems, and close to conventional programming systems. Mercury addresses 
the problems of large-scale program development, allowing modularity, 
separate compilation, and numerous optimization/time trade-offs.")
    (home-page "https://mercurylang.org")
    (license license:gpl2)))

(define-public mercury-minimal
  (package (inherit mercury)
	   (name "mercury-minimal")
	   (build-system gnu-build-system)
	   (arguments
            (substitute-keyword-arguments (package-arguments mercury)
              ((#:configure-flags flags ''())
               `(list "--enable-minimal-install"))))
           (inputs
            `(("gcc-toolchain" ,gcc-toolchain)))
           (synopsis "A pure logic programming language (used only for
compiling packages dependent on base Mercury)")))
--8<---------------cut here---------------end--------------->8---


-- 
Brett M. Gilio
https://git.sr.ht/~brettgilio/

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Packaging Mercury & Some Struggles
  2019-12-03  1:23 Packaging Mercury & Some Struggles Brett Gilio
@ 2019-12-05  0:34 ` Brett Gilio
  2019-12-05 16:16   ` John Soo
  0 siblings, 1 reply; 3+ messages in thread
From: Brett Gilio @ 2019-12-05  0:34 UTC (permalink / raw)
  To: guix-devel

Brett Gilio <brettg@posteo.net> writes:

> Greetings all!
>
> I am continuing my prolific streak of trying to move as many things from
> my channel to the main repository as possible.
>
> Up next on the menu: the Mercury language and compiler.
> http://mercurylang.org/
>
> So here are a few issues I am wanting to get resolved with this package,
> and I am hoping some support from the community can get this package
> further along.
>
> 1. Mercury comes with a number of "grades", which you can think of as
> anything relating to do with support for extra backends, libraries, and
> a number of other functionalities. The default setting in Mercury is to
> compile the compiler including all of the standard grades, which can
> take one heck of a long time! As a result, I was thinking of adopting
> something similar to `emacs-minimal`, for people who need to use the
> Mercury compiler but do not need all of that overhead of having all of
> the grades included by default.
>
> (define-public mercury-minimal
>   (package (inherit mercury)
> 	   (name "mercury-minimal")
> 	   (build-system gnu-build-system)
> 	   (arguments
>             (substitute-keyword-arguments (package-arguments mercury)
>               ((#:configure-flags flags ''())
>                `(list "--enable-minimal-install"))))
>            (inputs
>             `(("gcc-toolchain" ,gcc-toolchain)))
>            (synopsis "A pure logic programming language (used only for
> compiling packages dependent on base Mercury)")))
>
>
> So this example comes with a few points I want to address. Most distinct
> is the modification of the inherited mercury args to use the
> minimal-install flag (disabling grades not related to the compiler
> itself). Additionally, to use the mercury compiler in projects it
> depends on having some C-based toolchain to handoff the extracted code
> to. Is including gcc-toolchain as an Input/Prop-Input the best solution
> here? I worry that it might conflict with versions of the toolchain
> already in a user profile, or if somebody wants to use a different
> version of the gcc-toolchain (though they could replace the input using
> the appropriate guix flag.)
>
> 2. The Mercury source tarball includes a git submodule copy of
> boehm-gc. Of course, I think the "Guix way"TM of doing this is to strip
> out the submodule and replace it using a Native-Input (assuming the two
> versions are compatible, anyways). Here is the method I have assumed for
> trying to get that done.
>
> (add-after 'unpack 'replace-boehm
>            (lambda* (#:key inputs #:allow-other-keys)
>              (let ((boehm (assoc-ref inputs "libgc")))
>                (map (match-lambda
>                       ((src orig-name new-name)
>                        (with-directory-excursion "."
>                          (apply unpack (list #:source src))
>                          (apply patch-source-shebangs (list #:source src)))
>                        (delete-file-recursively new-name)
>                        (invoke "mv" orig-name new-name)))
>                     `((,boehm "source" "libgc"))))))
>
>
> Now, this code may not be perfectly correct (feel free to do the work
> for me here, if you want, but I can probably figure it out ;). But, the
> code is at least in the spirit of what I am trying to achieve here. The
> issue here may just be that I am tired, but for whatever reason
> `match-lambda' is not resolving.
>
> starting phase `replace-boehm'
> Backtrace:
>            8 (primitive-load "/gnu/store/z0wfywmlbn079q07hgab4fafmqx…")
> In ice-9/eval.scm:
>    191:35  7 (_ #f)
> In ice-9/boot-9.scm:
>     829:9  6 (catch srfi-34 #<procedure 7ffff2d1a420 at /gnu/store/…> …)
> In srfi/srfi-1.scm:
>    863:16  5 (every1 #<procedure 7ffff2d1a3e0 at /gnu/store/w3jlc8p…> …)
> In /gnu/store/w3jlc8pk8416m7h677r5vq92b66h8cqd-module-import/guix/build/gnu-build-system.scm:
>    839:30  4 (_ _)
> In ice-9/eval.scm:
>     159:9  3 (_ #(#(#(#<directory (guile-user) 7ffff3c6b140>) (…)) #))
>    182:19  2 (proc #(#(#(#<directory (guile-user) 7ffff3c6b140>) …) …))
>    142:16  1 (compile-top-call _ (7 . match-lambda) ((10 (10 # …) …)))
> In unknown file:
>            0 (%resolve-variable (7 . match-lambda) #<directory (guil…>)
>
> ERROR: In procedure %resolve-variable:
> Unbound variable: match-lambda
>
>
> Last I checked, match-lambda belongs to `(ice-9 match)`. Though it is
> very possible that there is just some syntactical issue here that I am
> just not seeing right now. Again, eyes on this would be appreciated :).
>
> 3. Last, but not least: If any of you can find documentation on how to
> run the tests for the Mercury compiler, I would greatly appreciate it! I
> am completely lost on how to run them. I can not find an appropriate
> make target for them to run off of.
>
> 4. This one is not a real issue, per se; however, so far I am doing this
> work in a new module (gnu packages mercury). I would have preferred to
> place this in a (gnu packages prolog), but we only have a (gnu packages
> gprolog) named for the GNU implementation. I personally find this naming
> convention unfortunate, as I have SWI-Prolog packaged in my channel too,
> and I would like to see SWI-Prolog, gprolog, and mercury all reside in
> an appropriately named module.
>
> Alright, hopefully this is enough information to get some help but not
> too much for you all to not eventually consider me for maintainer status
> in the project. Haha.
>
> Below is the complete WIP for Mercury. All thoughts, criticism, and
> confused stares are welcome:
>
> (define-public mercury
>   (package
>     (name "mercury")
>     (version "14.01.1")
>     (source (origin
>               (method url-fetch)
>               (uri (string-append "https://dl.mercurylang.org/release/mercury-srcdist-"
>                                   version
>                                   ".tar.gz"))
>               (sha256
>                (base32
>                 "12z8qi3da8q50mcsjsy5bnr4ia6ny5lkxvzy01a3c9blgbgcpxwq"))))
>     (build-system gnu-build-system)
>     (arguments
>      '(#:tests? #f ; TODO: tests are cryptic. Figure it out later.
>        #:phases
>        (modify-phases %standard-phases
>          (add-after 'unpack 'patch
>            (lambda _ (substitute*
>                          (list "Makefile"
>                                "Mmakefile"
>                                "scripts/mercury_update_interface.in"
>                                "scripts/mercury_config.in"
>                                "scripts/mmake.in"
>                                "scripts/mmake.sh"
>                                "scripts/Mmake.vars.in"
>                                "scripts/mdb.in"
>                                "scripts/rs6000_hack"
>                                "scripts/fullarch"
>                                "scripts/mmc.in"
>                                "scripts/canonical_grade"
>                                "scripts/mprof.in"
>                                "scripts/gud.el"
>                                "scripts/ml.in"
>                                "scripts/canonical_grade.in"
>                                "scripts/mdprof.in"
>                                "scripts/vpath_find"
>                                "scripts/mkfifo_using_mknod.in"
>                                "scripts/prepare_install_dir.in"
>                                "scripts/ml.sh"
>                                "scripts/mprof_merge_runs"
>                                "scripts/mtc"
>                                "scripts/mgnuc.in"
>                                "scripts/c2init.in"
>                                "bindist/bindist.Makefile")
>                        (("/bin/sh") (which "sh"))
>                        (("/bin/pwd") (which "pwd"))
>                        (("/bin/rm") (which "rm")))))
>          (add-after 'unpack 'replace-boehm
>            (lambda* (#:key inputs #:allow-other-keys)
>              (let ((boehm (assoc-ref inputs "libgc")))
>                (map (match-lambda
>                       ((src orig-name new-name)
>                        (with-directory-excursion "."
>                          (apply unpack (list #:source src))
>                          (apply patch-source-shebangs (list #:source src)))
>                        (delete-file-recursively new-name)
>                        (invoke "mv" orig-name new-name)))
>                     `((,boehm "source" "libgc")))))))))
>     (native-inputs
>      `(("texinfo" ,texinfo)
>        ("flex" ,flex)
>        ("tcsh", tcsh)
>        ("bison" ,bison)
>        ("readline" ,readline)
>        ("libgc" ,libgc)))
>     (synopsis "A pure logic programming language")
>     (description "Mercury is a logic/functional programming language which 
> combines the clarity and expressiveness of declarative programming with advanced
> static analysis and error detection features.  Its highly optimized execution 
> algorithm delivers efficiency far in excess of existing logic programming 
> systems, and close to conventional programming systems. Mercury addresses 
> the problems of large-scale program development, allowing modularity, 
> separate compilation, and numerous optimization/time trade-offs.")
>     (home-page "https://mercurylang.org")
>     (license license:gpl2)))
>
> (define-public mercury-minimal
>   (package (inherit mercury)
> 	   (name "mercury-minimal")
> 	   (build-system gnu-build-system)
> 	   (arguments
>             (substitute-keyword-arguments (package-arguments mercury)
>               ((#:configure-flags flags ''())
>                `(list "--enable-minimal-install"))))
>            (inputs
>             `(("gcc-toolchain" ,gcc-toolchain)))
>            (synopsis "A pure logic programming language (used only for
> compiling packages dependent on base Mercury)")))

Hey all! Just bumping this as I had not heard anything yet.

-- 
Brett M. Gilio
https://git.sr.ht/~brettgilio/

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Packaging Mercury & Some Struggles
  2019-12-05  0:34 ` Brett Gilio
@ 2019-12-05 16:16   ` John Soo
  0 siblings, 0 replies; 3+ messages in thread
From: John Soo @ 2019-12-05 16:16 UTC (permalink / raw)
  To: Brett Gilio; +Cc: guix-devel

Hi Brett,

I like having mercury-minimal I think that’s pretty considerate.

To use (ice-9 match) you will need to add it to the list of #:modules in the arguments field then use-module in your phase. I.E.:

(arguments
  `( #:modules ,(cons '(ice-9 match) %gnu-build-system-modules) ...

Then in your phase:
    (lambda ...
      (use-modules (ice-9 match)) ...

A phase should work well for this purpose, as long as the submodule does not include any binaries.  If it does, you should use the snippets field of the origin record instead.

Happy to help, and good luck,

John

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2019-12-05 16:16 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-12-03  1:23 Packaging Mercury & Some Struggles Brett Gilio
2019-12-05  0:34 ` Brett Gilio
2019-12-05 16:16   ` John Soo

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).