Сделайте совместимым ocaml, camlp4, ppx, node, js_of_ocaml, ocamlbuild

После установки npm и node компиляция файлов OCaml с js_of_ocaml дала ошибки, поэтому я сделал opam switch reinstall system:

:testweb $ opam switch reinstall system
Your system compiler has been changed. Do you want to upgrade your OPAM installation ? [Y/n] y

=-=- Upgrading system -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=  ???? 
[WARNING] base-ocamlbuild.base is not available because it requires OCaml >= 3.10 & < 4.03. Skipping.
[WARNING] camlp4.4.02+system is not available because your system doesn't comply with preinstalled &
      ocaml-version >= "4.02" & ocaml-version < "4.03". Skipping.
[WARNING] ppx_tools.4.02.3 is not available because your system doesn't comply with ocaml-version >=
      "4.02.0" & ocaml-version < "4.03.0". Skipping.
The following dependencies couldn't be met:
  - deriving -> camlp4
Your request can't be satisfied:
  - camlp4 is not available because your system doesn't comply with ocaml-version >= "4.04".

No solution found, exiting
The former package state can be restored with opam switch import "/Users/softtimur/.opam/backup/state-20160418124642.export" --switch system

Затем я понял, что ocamlfind больше не работает:

:testweb $ ocamlfind ocamlc -package js_of_ocaml.ppx -linkpkg cubes.ml -o T
-bash: /Users/softtimur/.opam/system/bin/ocamlfind: No such file or directory

PS: node --version дает v6.1.0; npm --version дает 3.8.6; ocaml -version дает The OCaml toplevel, version 4.03.0. js_of_ocaml --version был 2.7, но после opam swtich reinstall system он дает -bash: /Users/softtimur/.opam/system/bin/js_of_ocaml: No such file or directory.

Кто-нибудь знает, что сделать, чтобы все эти пакеты были совместимы?


Ранее: Вот ошибки компиляции после установки npm и node, но до выполнения opam switch reinstall system:

:testweb $ ocamlfind ocamlc -package js_of_ocaml.ppx -linkpkg cubes.ml -o T
Failure("Ast_mapper: OCaml version mismatch or malformed input")
File "cubes.ml", line 1:
Error: Error while running external preprocessor
Command line: /Users/softtimur/.opam/system/lib/js_of_ocaml/./ppx_js '/var/folders/fn/0rmvqqbs4k76lg5g6b7kll100000gn/T/camlppxffe989' '/var/folders/fn/0rmvqqbs4k76lg5g6b7kll100000gn/T/camlppx02e06a'

Другой способ тоже выдал ошибку:

:testweb $ ocamlfind ocamlc -package js_of_ocaml -syntax camlp4o -package js_of_ocaml.syntax -linkpkg -o cubes.byte cubes.ml
Fatal error: unknown C primitive `caml_is_printable'
File "cubes.ml", line 1:
Error: Error while running external preprocessor
Command line: camlp4 '-I' '/usr/local/lib/ocaml/camlp4' '-I' '/Users/softtimur/.opam/system/lib/js_of_ocaml' '-parser' 'o' '-parser' 'op' '-printer' 'p' 'pa_js.cmo'  'cubes.ml' > /var/folders/fn/0rmvqqbs4k76lg5g6b7kll100000gn/T/ocamlpp8b28e8

Первоначально: Моя первоначальная цель - написать и скомпилировать cubes.ml так, чтобы: 1) он оборачивал функцию OCaml для создания функции JS, которую можно было бы вызывать в сети; 2) функцию OCaml и байт-код можно протестировать в командной строке под Linux.

cubes.ml выглядит следующим образом:

let () =
  let oneArgument (a: int) = a + 100 in
  Js.Unsafe.global##.jsOneArgument := Js.wrap_callback oneArgument;
  print_string "hello\n";
  exit 0

Затем ocamlfind ocamlc -package js_of_ocaml.ppx -linkpkg cubes.ml -o T должен сгенерировать T, так что ./T должен вернуть hello. И js_of_ocaml T -o cubes.js должен генерировать cubes.js так, чтобы функция jsOneArgument из cubes.js могла вызываться другими файлами JS или HTML.

Прежде чем я испортил пакеты, ./T вернул Unimplemented Javascript primitive caml_pure_js_expr!, поэтому я установил npm, node и т. Д.


person SoftTimur    schedule 16.05.2016    source источник
comment
Разве $ node cubes.js недостаточно?   -  person zakki    schedule 17.05.2016
comment
вы имеете в виду запускать node cubes.js в командной строке? не могли бы вы рассказать подробнее?   -  person SoftTimur    schedule 17.05.2016
comment
да. node.js выводит hello в командной строке под Linux.   -  person zakki    schedule 18.05.2016
comment
Я понимаю, что вы имеете в виду ... пожалуйста, посмотрите мои обновления ...   -  person SoftTimur    schedule 18.05.2016
comment
Возможно, при установке node обновляется системный компилятор. opam switch reinstall system может понадобиться.   -  person zakki    schedule 18.05.2016
comment
я только что сделал opam swtich reinstall system, это выглядит тревожно ...   -  person SoftTimur    schedule 18.05.2016


Ответы (1)


Я снова перешел на OCaml 4.02.3:

opam switch 4.02.3

Потом,

eval `opam config env`

Потом,

opam install ppx_tools js_of_ocaml

В результате ocamlfind ocamlc -package js_of_ocaml.ppx -linkpkg cubes.ml -o T генерирует T, а js_of_ocaml T -o cubes.js генерирует cubes.js. node cubes.js действительно возвращает hello.

Однако ./T по-прежнему возвращает Unimplemented Javascript primitive caml_pure_js_expr!, я собираюсь открыть для этого другой пост ...

person SoftTimur    schedule 19.05.2016
comment
Обратите внимание, что это должно быть eval `opam config env` (обратная кавычка) или eval $(opam config env) (альтернативный синтаксис bash), простые кавычки не подходят. - person gasche; 16.06.2016
comment
eval $(opam env) тоже выполняет свою работу - person Hartmut P.; 25.04.2020