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
~~~~
I would also like to add, that utop _does_ pick up the library and that in utop
I can:
~~~~in utop~~~~
#require "zarith";;
~~~~
And work with its functions.
So this really seems to be about ocamlc.
--
repositories:https://notabug.org/ZelphirKaltstahl,https://codeberg.org/ZelphirKaltstahl