ocaml-installer icon indicating copy to clipboard operation
ocaml-installer copied to clipboard

Wrong output of "camlp4 -where"

Open murmour opened this issue 9 years ago • 10 comments

OCaml binaries are installed in c:\OCaml, and ocamlc -where returns this path, yet camlp4 -where returns C:/ocamlmgw/lib\camlp4.

This seems to break compilation of Camlp4-related packages, e.g. type_conv.

murmour avatar Jan 28 '16 20:01 murmour

And yes, the OCAMLLIB environment variable has a correct value of C:\OCaml\lib.

murmour avatar Jan 28 '16 20:01 murmour

Urgh. I can't rely on OPAM to install camlp4 properly because you still need a silly patch to make camlp4 compile on Windows... see https://github.com/ocaml/camlp4/issues/41#issuecomment-55229048

Or maybe you can try it? The issue says that you should be able to do it...?

msprotz avatar Jan 28 '16 20:01 msprotz

I have built and installed the 4.02 branch of Camlp4 (by pinning the git repo), and camlp4 -where returns the correct path now: /cygdrive/c/OCaml/bin/camlp4. However, I still can't install type_conv, getting the same error message as before:

#=== ERROR while installing type_conv.113.00.02 ===============================#
# opam-version 1.2.2
# os           cygwin
# command      make
# path         /home/mrm/.opam/system/build/type_conv.113.00.02
# compiler     system (4.02.3)
# exit-code    2
# env-file     /home/mrm/.opam/system/build/type_conv.113.00.02/type_conv-2464-ffb3fd.env
# stdout-file  /home/mrm/.opam/system/build/type_conv.113.00.02/type_conv-2464-ffb3fd.out
# stderr-file  /home/mrm/.opam/system/build/type_conv.113.00.02/type_conv-2464-ffb3fd.err
### stdout ###
# [...]
# pkg_camlp4_extend: ................................... C:/OCaml/lib/camlp4
#
# ./setup.exe -build
# mkdir 'C:\wodi32\home\mrm\.opam\system\build\type_conv.113.00.02\_build'
# ''ocamlfind ocamlc unix.cma -I 'C:\OCaml\lib\ocamlbuild' 'C:\OCaml\lib\ocamlbuild/ocamlbuildlib.cma' -linkpkg myocamlbuild.ml 'C:\OCaml\lib\ocamlbuild/ocamlbuild.cmo' -o myocamlbuild.exe
# mkdir src
# ''C:/wodi32/home/mrm/.opam/system/bin/ocamlfind.EXE ocamldep -syntax camlp4o -package camlp4.quotations -package camlp4.extend -modules src/pa_type_conv.mli > src/pa_type_conv.mli.depends
# Exit code 2 while executing this command:
#   ''C:/wodi32/home/mrm/.opam/system/bin/ocamlfind.EXE ocamldep -syntax camlp4o -package camlp4.quotations -package camlp4.extend -modules src/pa_type_conv.mli > src/pa_type_conv.mli.depends
# Makefile:21: ошибка выполнения рецепта для цели «build»
### stderr ###
# Camlp4: Uncaught exception: DynLoader.Error ("Camlp4OCamlRevisedParser.cmo", "file not found in path")
#
# File "src/pa_type_conv.mli", line 1:
# Error: Error while running external preprocessor
# Command line: camlp4 "-I" "C:/OCaml/lib/camlp4" "-I" "C:/OCaml/lib/camlp4" "-I" "C:/OCaml/lib/camlp4" "-I" "C:/OCaml/lib/camlp4" "-parser" "o" "-parser" "op" "-printer" "p" "-parser" "Camlp4QuotationCommon" "-parser" "Camlp4OCamlRevisedQuotationExpander" "-ignore" "foo" "-parser" "Camlp4GrammarParser"  "src/pa_type_conv.mli" > C:\wodi32\tmp\ocamlpp6a61ab
#
# E: Failure("Command 'C:\\OCaml\\bin\\ocamlbuild.EXE -classic-display -no-log -no-links -install-lib-dir C:\\OCaml\\lib\\ocamlbuild -byte-plugin src/pa_type_conv.cma src/pa_type_conv.cmxa src/pa_type_conv.a src/pa_type_conv.cmxs -use-ocamlfind -tag debug' terminated with error code 2")
# make: *** [build] Ошибка 1

As if Camlp4 couldn't locate C:/OCaml/lib/camlp4/Camlp4Parsers...

murmour avatar Jan 28 '16 22:01 murmour

The root of the problem seems to be neither in OASIS nor in ocamlbuild:

$ camlp4 -I "C:/OCaml/lib/camlp4" "-parser" "o"
Camlp4: Uncaught exception: DynLoader.Error ("Camlp4OCamlRevisedParser.cmo", "file not found in path")

murmour avatar Jan 28 '16 22:01 murmour

huh. the dynloader should try to load a cmxs, shouldn't it?

msprotz avatar Jan 28 '16 22:01 msprotz

camlp4 is a byte-compiled executable, so it needs a .cmo.

murmour avatar Jan 28 '16 22:01 murmour

Suddenly, this works:

camlp4 -I "C:/OCaml/lib/camlp4" "-parser" Camlp4Parsers/Camlp4OCamlRevisedParser.cmo

And even without specifying the search path:

camlp4 "-parser" Camlp4Parsers/Camlp4OCamlRevisedParser.cmo

Puzzling. Seems like a yet another path-handling-related bug in Camlp4.

murmour avatar Jan 28 '16 23:01 murmour

This did the trick:

export CAMLP4LIB=C:/OCaml/lib/camlp4

I'm not sure how or why does it work, but the installer can also set this variable, at least as a temporary workaround. Something is probably wrong with handling those paths in Camlp4, but I haven't figured that out yet.

murmour avatar Jan 28 '16 23:01 murmour

Can you submit a pull request?

(I'm short on time right now.)

Thanks,

Jonathan

msprotz avatar Jan 29 '16 11:01 msprotz

Hello. I haven't figured out how to add this environment variable into the installation script (I'm not familiar with NSIS), and I didn't have time to test the modified installer, so I put that "export" line into my .bashrc and it didn't bother me after that.

murmour avatar Feb 07 '17 02:02 murmour