help-guix
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: OCaml package `ocaml-zarith` not working / Guix installed `ocamlc` n


From: Zelphir Kaltstahl
Subject: Re: OCaml package `ocaml-zarith` not working / Guix installed `ocamlc` not picking up installed libraries (addendum 3 - comparison with guile)
Date: Tue, 31 Dec 2024 14:06:38 +0000

On 30.12.24 18:50, Zelphir Kaltstahl wrote:

Hello Guix users,

I am facing a problem trying to use Guix to install Ocaml packages.

I was implementing a simple recursive factorial function, as part of learning the language, and tested what would happen, if I calculated factorial of 100 ... Result: 0. "Ah!" I thought, "all I need to do is get that Zarith package I have been reading about before, and import that in my code!". So I added it to my manifest.scm file, which I use for a `guix shell`, and expected the Ocaml compiler to naturally pick up packages installed via guix, since the Ocaml compiler ocamlc is also installed using guix. However, it seems this is dysfunctional currently and ocamlc does not realize that the library is in fact installed. I am not sure where it is looking for libraries.

Here is how to reproduce:

~~~~guix-env/channels.scm~~~~
(list (channel
         (name 'guix)
         (url"https://git.savannah.gnu.org/git/guix.git";)
         (branch "master")
         (commit
           "4473f8ae902c2192cab6919363a9101ce9861e45")
         (introduction
           (make-channel-introduction
             "9edb3f66fd807b096b48283debdcddccfea34bad"
             (openpgp-fingerprint
               "BBB0 2DDF 2CEA F6A8 0D1D  E643 A2A0 6DF2 A33A 54FA")))))
~~~~

~~~~guix-env/manifest.scm~~~~
(specifications->manifest
  '("ocaml"
    "ocaml-utop"
    "dune"
    ;; "opam"  ; using guix to install packages, should not need opam
    "bash"
    "ocaml-zarith"))
~~~~

~~~~main.ml~~~~
open Z

let factorial n =
   let rec iter n =
     if n < (of_int 2)
     then of_int 1
     else mul n (iter (sub n (of_int 1)))
   in
     iter (of_int n)


let _ = 5 |> factorial |> to_string |> print_endline
let _ = 100 |> factorial |> to_string |> print_endline
~~~~

~~~~command~~~~
guix time-machine --channels=guix-env/channels.scm -- shell --check 
--manifest=guix-env/manifest.scm -- bash -c 'ocamlc -c main.ml -o main.byte'

guix shell: checking the environment variables visible from shell '/bin/bash'...
guix shell: All is good!  The shell gets correct environment variables.
File "main.ml", line 1, characters 5-6:
1 | open Z
          ^
Error: Unbound module Z
~~~~

If ocamlc does not check locations, where guix installs ocaml libraries, then it is completely useless to install Ocaml libraries using Guix. Of course a programming language without any libraries would also be unpleasant to use for many things.

How can I make ocamlc realize, that the library is in fact installed, that it just needs to look in the right places?

Is this something that can be properly fixed in some dynamically created configuration of ocamlc, so that it automatically will look in the correct directories, depending on which guix shell or which guix profile it is installed in?

Is this perhaps even a defect of ocamlc itself, having hardcoded locations where it looks for libraries?

Do I have to tell ocamlc somehow where it is supposed to be looking? (In that case I guess it cannot be used with `guix shell`, as the directories are not predictable, and I would have to use a Guix profile.)

Best regards,
Zelphir

I want to draw attention to the following:

This behavior is different from what we can observe with GNU Guile. When installing libraries for Guile via GNU Guix, Guile picks them up inside guix shells and guix profiles without issues. I suspect, that the way the `ocaml` package is installed or the way `ocamlc` itself works or is built, makes the difference.

Best regards,
Zelphir

--
repositories:https://notabug.org/ZelphirKaltstahl,https://codeberg.org/ZelphirKaltstahl


reply via email to

[Prev in Thread] Current Thread [Next in Thread]