标签: ocamlbuild

构建和构建OCaml项目的首选方法是什么?

对于生态系统的新手来说,目前尚不清楚构建和管理中小型OCaml项目的规范首选方式.我理解ocamlc&c.的基础知识- 它们反映了传统的UNIX C编译器,看起来很简单.但是,高于单个文件的一次性编译水平,目前还不清楚如何最好地简单干净地管理编译.问题不是寻找潜在的工具,而是通过社区的经验验证一种或几种正确的(足够的)方法来构建和构建标准的OCaml项目.

我的模型用例是一个适度但非常重要的项目,纯OCaml或OCaml加上C依赖项.这样一个项目:

  1. 包含许多源文件
  2. 链接到许多标准库
  3. 链接到一个或多个第三方库
  4. 可选地包括C库和OCaml包装器作为子项目(尽管这也可以单独管理并作为第三方库包含,如(3)中所示)

几个替代工具脱颖而出:

  • 自定义Makefile似乎是大多数开源OCaml包中的通用标准,但看起来令人沮丧的冗长和复杂 - 甚至比适度的C/C++项目更令人沮丧.更糟糕的是,许多甚至看似简单的OCaml库层都将autoconf/automake置于顶层,以实现更高的复杂性.
  • ocamlbuild似乎提供了一种现代化,简化的机制,可以使用最少的配置自动化构建,但是对于新手来说没有很好的文档记录,在OCaml生态系统的介绍性材料中也没有示例,也没有被各种已发布的OCaml项目明显使用.我一直在寻找灵感.
  • OASIS似乎是其他构建系统顶层的约定和库代码层,以支持构建包管理器和库,如Cabal.

(我也看过OMake,它似乎是一个自封的" make++",它还包括一套常用语言的标准规则,包括OCaml和ocaml- makenéeOCamlMakefile,为GNU提供标准规则的模板make.)

这些都是管理OCaml构建的首选现代方式吗?

项目文件的结构如何最佳?

如何包含和管理第三方库依赖项?是首选在系统级别安装它们,还是有一种标准和直接的方式在本地管理项目?我更喜欢一种模式,其中项目尽可能保持独立.

ocaml makefile build ocamlbuild

57
推荐指数
4
解决办法
6297
查看次数

如何在ocamlbuild中使用-thread编译器标志?

我现在用Jane Streetasync_corepackage(async_core)_tags.

当我使用时ocamlbuild -use-ocamlfind -I src test/test_airport.native,它给我以下错误:

camlfind ocamlopt -linkpkg -package async_core -package unix -package netclient -package mongo -package xml-light src/airport.cmx test/test_airport.cmx -o test/test_airport.native ocamlfind:包'threads'出错:缺少-thread或-vmthread开关


我用谷歌搜索了这里是我得到的http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual039.html

它说:

使用系统线程的程序必须按如下方式链接:

    ocamlc -thread other options unix.cma threads.cma other files
Run Code Online (Sandbox Code Playgroud)

所以我改变了我的ocamlbuild命令,如下所示:

ocamlbuild -use-ocamlfind -cflag -thread -I src test/test_airport.native

但错误仍然相同.还有ocamlbuild生成的实际命令保持不变-thread.


我怎么处理这个?

ocaml ocamlbuild

20
推荐指数
1
解决办法
2638
查看次数

正确编译子文件夹中的模块(ocamlbuild)

我最近决定在我的项目目录中组织文件.我将我拥有的几种不同文件类型的解析器移动到他们自己的目录中,并决定使用ocamlbuild(因为项目变得越来越复杂,简单的shell脚本不再足够).

我可以用一些基本的规则(修改调用成功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
Run Code Online (Sandbox Code Playgroud)

编译错误

/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 …
Run Code Online (Sandbox Code Playgroud)

ocaml compilation ocamlbuild

10
推荐指数
1
解决办法
2141
查看次数

在OCaml utop中使用多个模块

我最近正在阅读一个OCaml项目,我想把源文件放在utop中,这样我就可以做一些实验了.
假设我有两个文件amodule.ml,bmodule.ml.
bmodule.ml将使用amodule.ml中定义的函数,例如,bmodule使用Amodule.anyfunction(),其中anyfunction()amodule.ml中定义.
我想把它们都放在utop中:

#directory "/directory contain amodule.ml and bmodule.ml"
#use "amodule.ml"
#use "bmodule.ml"
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为Amoduleamodule.ml文件的模块名称,utop不知道这些东西,我想.
那么如何在不改变文件内容的情况下将这些文件放在utop中呢?

ocaml ocamlbuild ocamlfind

9
推荐指数
1
解决办法
1738
查看次数

创建OCaml库

我正在尝试创建一个可以在其他OCaml项目中使用的库,我完全迷失了.

我目前正在使用ocamlbuild哪个非常适合吐出可执行文件,但我不知道如何从中获取库.

我发现了-a选项ocamlopt,ocamlc但我不确定如何使用它.我发现的文档(例如,这里)似乎假设了一些预先存在的知识.我甚至都不知道.a文件是什么.运行之后,我需要构建一个依赖于此库的项目的输出文件?我是否需要mli文件以便应用程序知道库代码的签名,或者以某种方式包含在输出中?此外,能够将所有文件打包在一起会很好,类似于Java的.jar文件.

在任何情况下,我都希望能ocamlbuild为我做所有这些,因为如果我必须调用,ocamlopt -a我将不得不手动指定依赖项或破解脚本ocamldep- ocamlbuild应该修复的东西.但是,我不知道如何告诉它建立一个库.

如果有必要,我愿意使用绿洲或OPAM或其他东西,但我想首先使用基本工具学习如何做到这一点.

ocaml ocamlbuild

9
推荐指数
1
解决办法
977
查看次数

使ocamlbuild将.ml和.mli文件传递给ocamldoc

我想在生成的文档中包含源代码.当我ocamldoc在命令行上调用时,这可以工作:ocamldoc -I _build -html -keep-code -colorize-code *.{ml,mli} -d .docdir.但是,我遇到了麻烦ocamlbuild.

我正在使用以下代码myocamlbuild.ml:

open Ocamlbuild_plugin;;

dispatch begin function
  | After_options ->
      Options.ocamldoc := S[A"ocamldoc"; A"-keep-code"; A"-colorize-code"]
  | _ -> ()
end
Run Code Online (Sandbox Code Playgroud)

但是这只包含没有相应接口文件的文件源 - 与此处所说的相反,它看起来像是在存在文件时ocamlbuild拒绝传递.ml文件.有没有办法哄ocamlbuild做我想要的?ocamldoc.mli

ocaml ocamlbuild ocamldoc

8
推荐指数
1
解决办法
657
查看次数

ocamldebug如何与包含电池的项目一起使用?

我有一个简单的ocamlbuild项目,它使用Batteries,包括语法扩展.

_tags:

<*>: pkg_batteries,pkg_threads,pkg_batteries.syntax,syntax_camlp4o
Run Code Online (Sandbox Code Playgroud)

something.ml:

open Batteries
…
let () = …
Run Code Online (Sandbox Code Playgroud)

它是为调试而构建的:

$ ocamlbuild something.d.byte
$ ocamldebug something.d.byte
Run Code Online (Sandbox Code Playgroud)

但是,尝试使用该print命令ocamldebug会出现以下错误:

(ocd) print x
Cannot find module Batteries.
Run Code Online (Sandbox Code Playgroud)

这似乎只在一个范围内进行调试时,发生Batteriesopen编.

这个错误的原因是什么?如何解决这个问题?

debugging ocaml ocamlbuild ocaml-batteries

7
推荐指数
1
解决办法
779
查看次数

通过Opam安装Ocamlbuild和Packages

我正在尝试制作这段代码:

open Lwt;;
open Cohttp;;
(* a simple function to access the content of the response *)
let content = function
  | Some (_, body) -> Cohttp_lwt_unix.Body.string_of_body body


(* launch both requests in parallel *)
let t = Lwt_list.map_p Cohttp_lwt_unix.Client.get
  (List.map Uri.of_string
     [ "http://example.org/";
       "http://example2.org/" ])

(* maps the result through the content function *)
let t2 = t >>= Lwt_list.map_p content

(* launch the event loop *)
let v = Lwt_main.run t2
Run Code Online (Sandbox Code Playgroud)

但是,当我跑

Ocamlbuild file.native
Run Code Online (Sandbox Code Playgroud)

我得到了未绑定的模块错误.

这些模块是通过opam安装的,当我运行时

ocamlfind query …
Run Code Online (Sandbox Code Playgroud)

ocaml ocamlbuild opam

7
推荐指数
1
解决办法
2612
查看次数

使用ocamlbuild时生成Menhir的转储/解释文件

我发现Menhir提供了--dump和--explain选项,它有助于调试很多.但是如何在ocamlbuild下启用这些选项,以便Menhir始终在编译时生成转储文件?

我试着编写处理自定义标签的myocamlbuild文件menhir_dump,如下所示:

... snip ...
(* OASIS_STOP *)

Ocamlbuild_plugin.dispatch (
  MyOCamlbuildBase.dispatch_combine [
    (function
      | After_rules ->
          flag ["menhir_dump"] (S [A "--dump"; A "--explain"])

      | _ -> ()
    );
    dispatch_default
  ]
)
Run Code Online (Sandbox Code Playgroud)

但是当它编译时,选项被插入到子命令中,并且编译在ocamlc阶段期间失败.

menhir --dump --explain --raw-depend --ocamldep 'ocamlfind ocamldep -modules' src/parser.mly > src/parser.mly.depends
menhir --ocamlc 'ocamlfind ocamlc -g -annot -bin-annot --dump --explain -I src -package cmdliner -package menhirLib -I src' --dump --explain --infer src/parser.mly
+ menhir --ocamlc 'ocamlfind ocamlc -g -annot -bin-annot --dump --explain -I src …
Run Code Online (Sandbox Code Playgroud)

ocaml ocamlbuild menhir

7
推荐指数
1
解决办法
524
查看次数

如何使用Jane Street的Core with Reason?

我是OCaml的新手,我正试图尝试(:P)Facebook Reason语法.我无法找到一种方法来进行编译,因为如果找不到Core模块(已经安装了opam).

我正在尝试从Real World OCaml编译一个示例程序

open Core.Std;

let rec read_and_accumulate accum => {
  let line = In_channel.input_line In_channel.stdin;
  switch line {
    | None => accum
    | Some x => read_and_accumulate (accum +. Float.of_string x)
  }
};

let () = printf "Total: %F\n" (read_and_accumulate 0.);
Run Code Online (Sandbox Code Playgroud)

这是我用于编译的命令:rebuild accum.native.

当我有这个_tags(来自https://janestreet.github.io/installation.html中的说明)

true: package(core,ppx_jane)
true: thread,debug
Run Code Online (Sandbox Code Playgroud)

我的错误发生了变化,但我仍然不知道该怎么做:

File "_tags", line 1, characters 6-28:
Warning: tag "package" does not expect a parameter, but is used with parameter "core,ppx_jane"
File "_tags", …
Run Code Online (Sandbox Code Playgroud)

ocaml ocamlbuild reason

7
推荐指数
1
解决办法
1157
查看次数