I tried and after adding ocaml-findlib in the shell, I was able to build with:
ocamlfind ocamlc -package zarith -linkpkg -o main main.ml I don't use ocaml often but it looks like how you need to specify the libraries to gcc with -I and -l. I don't know how it would work with ocamlc alone. Does it work like that on other distros? Le 31 décembre 2024 15:06:38 GMT+01:00, Zelphir Kaltstahl <zelphirkaltst...@posteo.de> a écrit : >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 >