OCaml: как мне скомпилировать / создать программу с расширениями файлов .ml.x?

#makefile #ocaml #ocamlbuild

#makefile #ocaml #ocamlbuild

Вопрос:

Я загрузил проект, который содержит следующие файлы:

 assert.mli
assert.ml
deque.ml
deque.mli
eventloop.ml
eventloop.mli
g.ml
gctx.ml
gctx.mli
gdemo.html
gdemo.ml
gdemo.mli
g-js.ml.x
g-native.ml.x
lightbulb.html
lightbulb.ml
lightbulb.mli
Makefile
paint.html
paint.ml
paint.mli
widget.ml
widget.mli
widgetTest.ml
widgetTest.mli
  

Я могу скомпилировать некоторые файлы, которые не зависят от других файлов, выполнив

 $ ocamlc assert.mli assert.ml
  

например. Однако, eventloop.ml зависит от widget.ml и widget.ml зависит от gctx.ml . gctx кажется, зависит от модуля G , который, как я полагаю, является графической библиотекой. Когда я заглядываю внутрь g-js.ml.x , я вижу подтверждение того, что этот файл импортирует фиксированную версию графической библиотеки. Однако я понятия не имею, как использовать этот файл. Я попробовал несколько догадок в терминале, но безрезультатно. Предположение об одном примере было

 $ ocamlc g-js.ml.x g.ml
  

Я попытался погуглить «как скомпилировать ocaml «.ml.x»», но ничего не нашел, и я не уверен, следует ли мне искать что-то еще, или просто не так много информации о том, как обрабатывать эти файлы.

Я также попробовал в терминале $ make -f Makefile и получил ошибку

   ocamlfind ocamldep -package js_of_ocaml-lwt.graphics -package js_of_ocaml-lwt -package js_of_ocaml -modules gdemo.mli > gdemo.mli.depends
ocamlfind: Package `js_of_ocaml-lwt.graphics' not found
Command exited with code 2.
Compilation unsuccessful after building 1 target (0 cached) in 00:00:00.
Makefile:51: recipe for target 'gdemo.byte' failed
make: *** [gdemo.byte] Error 10 
  

Просматривая эту ошибку, другие люди обнаружили, что она исправлена путем обновления библиотек OPAM и особенно обновления cppo_ocamlbuild , но это не исправило ее для меня.


Редактировать: После выполнения некоторых инструкций в комментариях я получаю новое сообщение об ошибке при попытке создать Makefile:

 rm -rf g.ml
cp g-js.ml.x g.ml
ocamlbuild -use-ocamlfind -pkg js_of_ocaml -pkg js_of_ocaml-lwt -pkg js_of_ocaml-lwt.graphics gdemo.byte
Failure: ocamlfind not found on path, but -no-ocamlfind not used.
Compilation unsuccessful after building 0 targets (0 cached) in 00:00:00.
Makefile:51: recipe for target 'gdemo.byte' failed
make: *** [gdemo.byte] Error 2
  

Комментарии:

1. Вы проверили, что подпакет js_of_ocaml-lwt.graphics установлен вместе с ocamlfind query js_of_ocaml-lwt.graphics ? В противном случае расширение .x , вероятно, указывает на то, что файл предварительно обработан пользовательским препроцессором (и невозможно догадаться, что это за препроцессор из доступной информации).

2. @octachron запрос не нашел подпакет, поэтому я его установил. Однако, похоже, что это не изменило ни одно из сообщений об ошибках.

3. Возникает ли у вас такая же ошибка при ocamlfind ocamldep -package js_of_ocaml-lwt.graphics -package js_of_ocaml-lwt -package js_of_ocaml -modules gdemo.mli > gdemo.mli.depends независимом запуске?

4. @octachron Итак, мне немного неясно, какую именно «половину» ошибок это должно устранить. Я запустил эту команду, а затем запустил make -f Makefile и получил сообщение об ошибке с жалобой на предварительно скомпилированный файл из gdemo (предположительно, созданный командой, которую вы написали выше). Если это не та ошибка, которую я пытаюсь исправить, я попытался запустить ocamlc g-js.ml.x g.ml , и он просто не знает, что я пытаюсь сделать.

5. Как я уже говорил, ваши файлы *.x требуют предварительной обработки перед компиляцией. Этап предварительной обработки должен быть подробно описан в Makefile. Вы должны обновить сообщение об ошибке, чтобы отразить новое.