Пытаюсь установить utop для OCaml в Fedora 26; получил ошибку об установке LWT

В настоящее время у меня установлена ​​Fedora 26, и я установил следующие пакеты:

sudo dnf install opam ocaml gcc gcc-c++ m4 make ocamldoc sqlite-devel libcurl-devel fuse-devel zlib-devel ocaml-camlp4-devel redhat-rpm-config

Это ошибка, которую я сейчас получаю, пытаясь установить utop:

#=== ERROR while installing lwt.2.7.1 =========================================#
# opam-version 1.2.2
# os           linux
# command      make build
# path         /home/z/.opam/system/build/lwt.2.7.1
# compiler     system (4.02.3)
# exit-code    2
# env-file     /home/z/.opam/system/build/lwt.2.7.1/lwt-21869-a00279.env
# stdout-file  /home/z/.opam/system/build/lwt.2.7.1/lwt-21869-a00279.out
# stderr-file  /home/z/.opam/system/build/lwt.2.7.1/lwt-21869-a00279.err
### stdout ###
# ./setup.exe -build 
# ocamlfind ocamlopt -package unix -package ocamlbuild -linkpkg -package cppo_ocamlbuild myocamlbuild.ml /usr/lib64/ocaml/ocamlbuild/ocamlbuild.cmx -o myocamlbuild
# + ocamlfind ocamlopt -package unix -package ocamlbuild -linkpkg -package cppo_ocamlbuild myocamlbuild.ml /usr/lib64/ocaml/ocamlbuild/ocamlbuild.cmx -o myocamlbuild
# File "myocamlbuild.ml", line 1:
# Error: Files /home/z/.opam/system/lib/cppo_ocamlbuild/ocamlbuild_cppo.cmxa
#        and /usr/lib64/ocaml/ocamlbuild/ocamlbuildlib.cmxa
#        make inconsistent assumptions over implementation Ocamlbuild_plugin
# Command exited with code 2.
# Makefile:33: recipe for target 'build' failed
### stderr ###
# W: Cannot find source file matching module 'Lwt_unix' in library lwt-unix.
# W: Use InterfacePatterns or ImplementationPatterns to define this file with feature "source_patterns".
# W: Cannot find source file matching module 'Lwt_unix' in library lwt-unix.
# W: Use InterfacePatterns or ImplementationPatterns to define this file with feature "source_patterns".
# E: Failure("Command ''/usr/bin/ocamlbuild' src/core/lwt.cma src/core/lwt.cmxa src/core/lwt.a src/core/lwt.cmxs src/logger/lwt-log.cma src/logger/lwt-log.cmxa src/logg$r/lwt-log.a src/logger/lwt-log.cmxs src/unix/liblwt-unix_stubs.a src/unix/dlllwt-unix_stubs.so src/unix/lwt-unix.cma src/unix/lwt-unix.cmxa src/unix/lwt-unix.a src/unix$lwt-unix.cmxs src/simple_top/lwt-simple-top.cma src/simple_top/lwt-simple-top.cmxa src/simple_top/lwt-simple-top.a src/simple_top/lwt-simple-top.cmxs src/react/lwt-reac$.cma src/react/lwt-react.cmxa src/react/lwt-react.a src/react/lwt-react.cmxs src/preemptive/lwt-preemptive.cma src/preemptive/lwt-preemptive.cmxa src/preemptive/lwt-pre$mptive.a src/preemptive/lwt-preemptive.cmxs src/ppx/ppx.cma src/ppx/ppx.cmxa src/ppx/ppx.a src/ppx/ppx.cmxs src/ppx/ppx_lwt_ex.native doc/examples/unix/logging.native d$c/examples/unix/relay.native doc/examples/unix/parallelize.native -use-ocamlfind -plugin-tags 'package(cppo_ocamlbuild)' -tag debug' terminated with error code 10")
# make: *** [build] Error 1

Что я должен делать?

Благодарю вас!


person zeldangit    schedule 27.04.2017    source источник
comment
Это не решение вашей конкретной проблемы, но в целом я рекомендую не использовать системный компилятор (т. е. не устанавливать пакеты Fedora OCaml). У меня есть Fedora 26, я установил OPAM через его двоичный файл (используя opam-installer.sh), затем установил с ним OCaml 4.02.3, а затем utop, и у меня не было описанной вами проблемы. Я избегаю установки OCaml из дистрибутивов, потому что они обновляются реже и, по моему опыту, с большей вероятностью приведут к странным проблемам.   -  person anol    schedule 27.04.2017
comment
То, что предлагает @anol, является хорошим советом. Возможно, вы просто пропустили eval $(opam config env) перед установкой, но если это не решит проблему, я предлагаю последовать совету @anol.   -  person Daniel Bünzli    schedule 27.04.2017
comment
Хорошо, я думаю, я попробую это.   -  person zeldangit    schedule 27.04.2017
comment
Это действительно сработало! В качестве примечания для других, удаление ocaml и просто использование файла opam оболочки сработало. Однако я все еще думаю, что ocamldocs необходимо устанавливать через диспетчер пакетов.   -  person zeldangit    schedule 27.04.2017


Ответы (1)


«Системный компилятор» Opam, который по умолчанию используется в opam init, представляет собой гибридную настройку, в которой пакеты устанавливаются в локальной песочнице opam, но используется компилятор из системы (/usr). См. команду opam switch, чтобы вместо этого использовать песочницу с компилятором, скомпилированным opam, или переключиться обратно.

Ваш пример показывает, что вы используете системный компилятор, предоставленный dnf install ocaml ; Следовательно, предполагается, что opam использует например, /usr/bin/ocamlopt, но устанавливает программное обеспечение и библиотеки из ~/.opam/system/{bin,lib}.

Что должно произойти, так это то, что lwt зависит от ocamlbuild и ocamlfind, которые opam устанавливает первым; тогда PATH устанавливается так, что ~/.opam/system/bin/ стоит первым, и всегда выбираются эти установленные двоичные файлы. Должно быть, что-то идет не так, потому что конец журнала показывает, что был вызван /usr/bin/ocamlbuild.

Трудно понять, что без подробностей, и мне не удалось воспроизвести на контейнере Fedora 25. Но вы могли бы:

  • проверьте правильность установки ocamlbuild и ocamlfind с помощью opam и наличие ~/.opam/system/bin/ocaml{find,build}
  • проверьте, есть ли какая-либо глобальная конфигурация или конфигурация среды ocamlfind, которая может помешать (which ocamlfind; ocamlfind printconf; opam config exec -- ocamlfind printconf).
  • проверьте связанный файл среды: /home/z/.opam/system/build/lwt.2.7.1/lwt-21869-a00279.env, чтобы убедиться, что PATH определен правильно
  • запустите с -v, чтобы увидеть все команды, выданные opam

Конечно, как упоминалось в комментариях выше, использование стандартного (то есть несистемного) переключателя, включающего собственный компилятор OCaml, помогло бы обойти эту проблему. Однако для компиляции требуется немного больше времени.

person AltGr    schedule 28.04.2017