Правильная компиляция модулей в подпапках (ocamlbuild) - PullRequest
10 голосов
/ 05 февраля 2010

Я недавно решил организовать файлы в каталоге моего проекта. Я переместил парсеры, которые у меня были для нескольких разных типов файлов, в их собственный каталог, а также решил использовать ocamlbuild (так как проект становился все более сложным, а простого сценария оболочки больше не хватало).

Мне удалось успешно включить внешние проекты, изменив myocamlbuild с некоторыми базовыми правилами (вызов ocaml_lib, я буду использовать ocamlfind в другой раз), но я застрял в том, как включить папку в качестве модуля в проект должным образом. Я создал файл parser.mlpack и заполнил его соответствующими модулями (например, "parser / Date" и т. Д.), Записал parser.mli в корень каталога для их реализаций и изменил _tags файл (см. ниже).

Во время компиляции каталог парсера просматривается правильно, и parser.cmi, parser.mli.depends оба были созданы в каталоге _build; а также все файлы *.cm[xio] в подкаталоге анализатора.

Я чувствую, что могу делать что-то избыточное, но, несмотря на это, проект все еще не может найти модуль Parser при компиляции!

Спасибо!

_tags

debug : true
<*.ml> : annot
"parser" : include
<parser/*.cmx>: for-pack(Parser)
<curlIO.*> : use_curl
<mySQL.*> : use_mysql
<**/*.native> or <**/*.byte> : use_str,use_unix,use_curl,use_mysql

ошибка компиляции

/usr/local/bin/ocamlopt.opt unix.cmxa str.cmxa -g -I /usr/local/lib/ocaml/site-lib/mysql mysql.cmxa -I /usr/local/lib/ocaml/curl curl.cmxa curlIO.cmx utilities.cmx date.cmx fraction.cmx logger.cmx mySQL.cmx data.cmx project.cmx -o project.native  
File "\_none\_", line 1, characters 0-1:  
Error: **No implementations provided for the following modules:**
         Parser referenced from project.cmx  
Command exited with code 2.  

Вы заметите, -I parser не входит в фазу связывания выше; фактически ни один из файлов, связанных с парсером, не включен!

edit: Добавлены новые подробности из комментариев и ответа ниже.

Ответы [ 2 ]

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

Вам необходимо «включить» каталог парсера в путь поиска. Вы можете сделать это в _tags:

"parser": include

Затем ocamlbuild может искать интересные файлы в каталоге парсера.

3 голосов
/ 08 февраля 2010

Интересно, не влияет ли parser.mli на зависимости при обработке файла mlpack? parser.cmi будет сгенерировано из операции упаковки при обработке и компиляции parser.mlpack. Попробуйте построить с удаленным файлом parser.mli. Если это работает, то это может быть переработано в реальный ответ.

Кроме того, вам не нужно parser/ в качестве префикса для ваших модулей в parser.mlpack, если parser.mlpack находится в каталоге parser и у вас установлен тег include. Но это не должно иметь значения для этого.

Обновление : это помогло решить проблему, но не было основной причиной. Основной причиной, согласно комментарию ниже, был файл, упомянутый в .mlpack, который был перемещен.

...