制作兼容的ocaml, camlp4, ppx, node, js_of_ocaml, ocamlbuild
Make compatible ocaml, camlp4, ppx, node, js_of_ocaml, ocamlbuild
安装 npm
和 node
后,用 js_of_ocaml
编译 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 函数来制作一个可以在 web 中调用的 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
应该 return hello
。而js_of_ocaml T -o cubes.js
应该生成cubes.js
,这样cubes.js
的函数jsOneArgument
就可以很好的被其他JS或者HTML文件调用。
在我弄乱软件包之前,./T
return编辑了 Unimplemented Javascript primitive caml_pure_js_expr!
,这就是我安装 npm
、node
等的原因...
我切换回 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
return hello
.
不过,./T
还是returnUnimplemented Javascript primitive caml_pure_js_expr!
,我打算再开一个post...
安装 npm
和 node
后,用 js_of_ocaml
编译 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 函数来制作一个可以在 web 中调用的 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
应该 return hello
。而js_of_ocaml T -o cubes.js
应该生成cubes.js
,这样cubes.js
的函数jsOneArgument
就可以很好的被其他JS或者HTML文件调用。
在我弄乱软件包之前,./T
return编辑了 Unimplemented Javascript primitive caml_pure_js_expr!
,这就是我安装 npm
、node
等的原因...
我切换回 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
return hello
.
不过,./T
还是returnUnimplemented Javascript primitive caml_pure_js_expr!
,我打算再开一个post...