Использование "ocamlfind" для создания компилятора OCaml и верхнего уровня библиотек поиска (специфичных для проекта) - PullRequest
4 голосов
/ 07 января 2010

Я пытаюсь использовать ocamlfind как с компилятором OCaml, так и с toplevel. Из того, что я понял, мне нужно поместить необходимые библиотеки в файл _tags в корне моего проекта, так что инструмент ocamlfind позаботится о их загрузке - что позволит мне открыть их в моих модулях, например итак:

open Sdl
open Sdlvideo
open Str

В настоящее время мой файл _tags выглядит следующим образом:

<*>: pkg_sdl,pkg_str

Я, очевидно, могу запустить команду ocamlfind с аргументом ocamlc или ocamlopt, при условии, что я не собираюсь компилировать свой проект, но я не видел возможности запуска верхнего уровня таким же образом. Есть ли способ сделать это (что-то вроде "ocamlfind ocaml")?

Я также не знаю, как поместить модули моего проекта в файл _tags: представьте, что у меня есть имя модуля Land . В настоящее время я использую директиву #use "land.ml", чтобы открыть файл и загрузить модуль, но было высказано предположение, что это не очень хорошая практика. Какой синтаксис я должен использовать в _tags, чтобы указать, что он должен быть загружен ocamlfind (учитывая, что land.ml отсутствует в пути поиска ocamlfind)?

Спасибо, Чарли П.

Редактировать: Согласно первому ответу этого поста, файл _tags не должен использоваться с ocamlfind . Приведенные выше вопросы все еще стоят, в списке есть только новый: как правильно указать библиотеки для ocamlfind ?

Ответы [ 3 ]

4 голосов
/ 08 января 2010

попробуйте это:

$ cat >> .ocamlinit
#use "topfind";;
#require "sdl";;
#require "sdlvideo";;

open Sdl
open Sdlvideo;;
open Str;;

.ocamlinit происходит из текущего каталога, возвращаясь к /home/user/.ocamlinit. Вы можете явно переопределить его через ocaml -init <filename>

4 голосов
/ 13 января 2010

Следует различать пакеты ocamlfind, имена модулей и имена файлов. Исходный код ссылается только на имена модулей. Модули предоставляются файлами .cma .cmo .cmx (и .cmi). Пакеты Ocamlfind являются именованными коллекциями таких файлов (двоичные файлы, созданные из некоторых источников библиотеки ocaml). Ocamlfind не является строго необходимым для создания проекта - просто укажите пути ко всем используемым библиотекам через -I. Но если проект распространяется в виде исходного кода - у других людей возникнут проблемы с его созданием, поскольку используемые библиотеки размещаются в разных местах. Затем ищется способ указать имена используемых «сторонних фрагментов кода» и некоторый внешний инструмент для преобразования этих имен в реальные пути. Этот инструмент ocamlfind.

  • Сначала найдите пакет ocamlfind, который предоставляет необходимые вам модули (в данном случае Sdl и Sdlvideo - просто запустите ocamlfind list, скорее всего, пакет называется sdl.
  • Компилировать с ocamlfind ocamlc -package <package name> -linkpkg source.ml -o program
  • В качестве альтернативы используйте ocamlfind, чтобы извлечь путь к файлу .cma (и другим), предоставленным пакетом (ocamlfind query <package name>), и используйте этот путь с инструментом сборки (обычный Makefile, ocamlbuild и т. Д.).
  • Более того, ocamlfind (предназначен) снимает с себя бремя запоминания того, как называются фактические файлы .cma и какие параметры компилятора требуются и в каком порядке пакеты зависят друг от друга. Нужно просто указать имя пакета.

Имейте в виду, что нет строгих формальных отношений один-к-одному между именем библиотеки (чисто ориентированным на человека именем, например ocaml-extlib), именами модулей (ExtLib, Enum, IO и т. Д.) имена файлов (extLib.cma) и имя пакета ocamlfind (extlib), хотя для удобства организаторы пакетов и авторы библиотек обычно выбирают предположительные имена:)

3 голосов
/ 07 января 2010

Файл _tags предназначен не для ocamlfind, а для ocamlbuild. Пример: ocamlbuild land.native

...