параллельная установка разных версий ocaml - PullRequest
2 голосов
/ 05 июля 2011

Я пытаюсь скомпилировать пример сумматора из пакета xml-rpc-light ocaml.После включения (я подозреваю, что все) необходимые библиотеки я получаю эту ошибку при компиляции:

File "_none_", line 1, characters 0-1:
Error: Files /[...]/godi/lib/ocaml/site-lib/xmlrpc-light/xmlrpc-light.cma(XmlRpcBase64)
       and /[...]/godi/lib/ocaml/std-lib/stdlib.cma(Buffer)
       make inconsistent assumptions over interface Buffer
Command exited with code 2.

Я понимаю, что это значит.По сути, xmlrpc-light.cma и stdlib.cma почему-то не предполагают одинаковый интерфейс Buffer, и это приводит к ошибке типа во время компиляции.Но как я могу примирить их, не изменяя код этих библиотек?

Редактировать после ответов Игрека и Гаше

Из обоих ответов я думаю, что знаю, в чем проблема сейчас, но я не совсемуверен, как с этим бороться.Я использую GODI, и там все обычно компилируется (версия 3.11.2).Совсем недавно я установил OCaml 3.12 самостоятельно, чтобы поиграть с ним.Теперь, если я перейду к новой командной строке и напишу ocaml, запускается именно этот новый 3.12.В настоящее время в GODI все по-прежнему работает как обычно (или почти - см. Ниже), но если я хочу установить некоторую не-GODI библиотеку (например, xmlrpc-light), я должен использовать командную строку.Если я попытаюсь скомпилировать xmlrpc-light, используя make, я получу:

ocamlfind ocamlc -package xml-light,netclient,nethttpd-for-netcgi2 -c XmlRpc.mli
File "XmlRpc.mli", line 1, characters 0-1:
Error: /[...]/godi/lib/ocaml/pkg-lib/xml-light/xml.cmi
is not a compiled interface
make[1]: *** [XmlRpc.cmi] Error 2
make: *** [native-code-library] Error 2

Причина, по которой он ищет здесь библиотеки GODI, несмотря на то, что ocaml, доступный в командной строке, не являетсяGODI 3.12, это то, что ocamlfind на самом деле вызывает /[...]/godi/bin/ocamlfind.Я могу понять, почему 3.12 ocaml жалуется на то, что xml.cmi не является скомпилированным интерфейсом (он был скомпилирован с GODI - 3.11.2).

Итак, подводя итог, моя система в настоящее время находится в беспорядке.И я не знаю, как сохранить две среды ocaml (GODI и 3.12) и выбирать каждый раз, какую из них я хочу использовать.Но я рад удалить 3.12, если это решит все мои проблемы.

Проблема с GODI

Просто чтобы дать больше информации, я недавно попытался добавить библиотеку godi-ocaml-xml-rpc (потому что это альтернативная библиотека xml-rpc и она доступна в GODI), но я получаю

> ocamlfind ocamlopt -a -o xmlrpc.cmxa \
>   -predicates "" xmlRPCTypes.cmx xmlRPCDtd.cmx xmlRPCNet.cmx xmlRPCClient.cmx xmlRPCServer.cmx cgiSource.cmx  
> ocamlfind ocamlopt -o oxridl.opt -package "pcre annexlib" -linkpkg oxridl.ml
> cd /[...]/godi/build/godi/godi-ocaml-xml-rpc/work/ocaml-xml-rpc-0.2.6/httpd && make && make opt
> ocamlfind ocamlc -c -I .. httpdSource.mli -package "http annexlib"
> File "httpdSource.mli", line 1, characters 0-1:
> Error: ../xmlRPCServer.cmi
> is not a compiled interface
> make[7]: *** [httpdSource.cmi] Error 2
> Error: Exec error: File /[...]/godi/build/godi/godi-ocaml-xml-rpc/./makefile, line 38: Command returned with non-zero exit code
> Error: Exec error: File /[...]/godi/build/godi/godi-ocaml-xml-rpc/./../../mk/bsd.pkg.mk, line 1378: Command returned with non-zero exit code

### Error: Command fails with code 1: godi_console

, что, я подозреваю, может быть связано с той же проблемой.Странно то, что он жалуется на то, что xmlRPCServer.cmi не является скомпилированным интерфейсом, когда, я думаю, это именно один из файлов, которые он должен компилировать для установки godi-ocaml-xml-rpc.

Ответы [ 2 ]

3 голосов
/ 05 июля 2011

Убедитесь, что вы используете одну версию компилятора ocaml, и пересоберите xmlrpc.

ОБНОВЛЕНИЕ

Простое правило - используйте отдельный ocamlfind для каждой установки ocaml и убедитесь, что только одинocaml + ocamlfind находятся в PATH в любой момент времени.т.е. установить ocaml-3.12 в /opt/ocaml-3.12 и установить свежий ocamlfind в /opt/ocaml-3.12/bin.Затем, когда вы захотите использовать ocaml 3.12, просто используйте PATH=/opt/ocaml-3.12/bin:$PATH, и он подберет ocamlfind и соответствующий ocaml, и все установки ocamlfind будут отделены от системного ocaml.На старую установку ocaml это никак не повлияет.

(Можно использовать один ocamlfind и множество установок ocaml, но это сложнее, и я бы не рекомендовал - ocamlfind в любом случае быстро собирается).

2 голосов
/ 06 июля 2011

Чтобы немного расширить ответ ygrek: это, вероятно, означает, что xmlrpc-light был скомпилирован для другой версии стандартной библиотеки (... отличной от той, что доступна в вашей системе).Это возможно, если вы переустановили новую стандартную библиотеку после установки xmlrpc-light или если вы используете двоичный пакет xmlrpc-light, скомпилированный для другой системы.Решение, вероятно, состоит в том, чтобы перестроить xmlrpc в соответствии с вашей текущей стандартной библиотекой.

Эти проблемы управления версиями интерфейса являются деликатными, поскольку они не соответствуют тому, что является обычным в решениях интерфейса C / C ++;в этих языках при изменении интерфейса пакета по умолчанию предполагается, что он совместим с предыдущим интерфейсом.В OCaml предполагается, что они несовместимы (они сравнивают хэш всего интерфейса модуля), и перекомпиляция обязательна.

Большинство инструментов упаковки, например, для дистрибутивов GNU / Linux, предполагают совместимость по умолчаниюповедение, и не имеют инструментов для обеспечения перекомпиляции при изменении интерфейса.GODI, который был разработан специально для OCaml, выполняет это отслеживание зависимостей (если вы обновляете пакет в GODI, он перекомпилирует все зависимые пакеты), и команда по пакетированию Debian имеет схему для достижения того же поведения с их системой упаковки (Подробнее об этом см. статью Обеспечение безопасной связи по типу с использованием межпакетных отношений ).Некоторые другие инструменты осторожны с этим, но, к сожалению, это не является нормой, и такие ошибки могут возникать только при использовании менеджера пакетов вашего дистрибутива.

...