问题标签 [ocamlbuild]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
3091 浏览

compiler-construction - 编译 OCaml 项目的简单方法是什么?

我正在玩弄 OCaml。我想知道的第一件事是构建一个 OCaml 项目。现在,我只是想要一些愚蠢的简单的东西,因为我只是在学习。任何人都可以将我指向一个构建系统以及使用该构建系统的“hello world”类型示例吗?

0 投票
3 回答
3640 浏览

ocaml - 使用“ocamlfind”使 OCaml 编译器和顶层查找(项目特定)库

我正在尝试将ocamlfind与 OCaml 编译器和顶层一起使用。据我了解,我需要将所需的库放在项目根目录的 _tags 文件中,以便ocamlfind工具负责加载它们 - 允许我在模块中打开它们,如下所示:

目前,我的 _tags 文件如下所示:

如果我不想编译我的项目,我显然可以使用 ocamlc 或 ocamlopt 参数启动ocamlfind命令,但我没有看到以相同方式启动顶层的选项。有没有办法做到这一点(类似“ ocamlfind ocaml”)?

我也不知道如何将我的项目特定模块放在 _tags 文件中:假设我有一个模块名称Land。我目前正在使用该#use "land.ml"指令打开文件并加载模块,但有人建议这不是一个好习惯。我应该在 _tags 中使用什么语法来指定它应该由ocamlfind加载(考虑到 land.ml 不在 ocamlfind 搜索路径中)?

谢谢你,查理 P。

编辑:根据这篇文章的第一个答案, _tags 文件不能与ocamlfind一起使用。上面的问题仍然存在,列表中只有一个新问题:将库指定为ocamlfind的正确方法是什么?

0 投票
2 回答
2446 浏览

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

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

我能够通过使用一些基本规则修改 myocamlbuild 成功地包含外部项目(调用ocaml_lib,我将在其他时间使用 ocamlfind ),但我坚持如何将文件夹作为模块正确包含到项目中。我创建了一个parser.mlpack文件并用要包含的正确模块填充它(例如,“解析器/日期”等),parser.mli在目录的根目录中为它们的实现写了一个,并修改了_tags文件(见下文)。

在编译过程中,正确遍历了解析器目录,并且parser.cmi,parser.mli.depends都在该_build目录中创建;以及*.cm[xio]解析器子目录中的所有文件。

我觉得我可能做了一些多余的事情,但无论如何,当我编译时,项目仍然找不到 Parser 模块!

谢谢!

_tags

编译错误

您会注意到-I parser上面的链接阶段不包括在内;实际上没有包含任何与解析器相关的文件!

编辑:从下面的评论和答案中添加了新的细节。

0 投票
1 回答
1101 浏览

build-automation - ocamlbuild; 建筑顶层

在成功地用子目录和使用 ocamlfind 为 ocamlbuild 重组了我的项目后,我发现很难构建顶层。

我已经构建了一个.mltop文件,其中包含将包含的所有模块并将包添加到_tags,但构建不起作用。它找不到使用其中一个模块编译的 C 函数。-classic-display打开后,我可以看到该文件 ,没有libcside.a被包含,甚至根本没有被编译!c文件作为依赖添加在myocamlbuild.mlby中,

并且在_tags,

最后,在 中libcside.clib

我在为顶层设置构建时遗漏了一些东西,但我在网上找不到可靠的资源。谢谢。

0 投票
2 回答
1296 浏览

ocaml - 我可以使用 OCamlBuild 生成可以在没有 OCaml 库的计算机上运行的本机可执行文件吗?

我有一个使用 ocamlbuild 编译的大型 OCaml 项目。一切正常,我有一个很棒的可执行文件,它可以做任何我想做的事情。问题是,当我使用本机可执行文件“my_prog.n​​ative”并在其他地方运行它(具有相同操作系统的不同机器等)时,新机器抱怨它找不到甘菊(用于电池我正在使用的库)。我认为我们从 ocamlbuild 获得的可执行文件是独立的,并且不需要 OCaml 或 Camomile 存在于我们运行它的机器中,但情况似乎并非如此。

关于如何生成真正独立的可执行文件的任何想法?

0 投票
1 回答
573 浏览

eclipse-plugin - OcaIDE 没有看到 JoCaml 工具

在 ocamlbuild 模式下使用OcaIDE时遇到问题。我正在尝试编译我自己的JoCaml源代码。根据JoCaml 手册(页面底部),要将 ocamlbuild 与 JoCaml 一起使用,我只需将-use-jocaml参数添加到 ocamlbuild。事实上,如果我去我的项目的根并写

ocamlbuild -use-jocaml foo.native

它生成我的可执行文件就好了。

但是,在 OcaIDE 我得到

/bin/sh: jocamldep: command not found

在 OcaIDE 中,-use-jocaml标志在“其他标志”框中(在项目属性中)传递。这当然是有效的,因为抱怨恰恰是它没有找到 jocaml 的东西。令人费解的是 jocaml 已安装并且可以从任何随机终端窗口访问。例如,运行

jocamldep -modules foo.ml > foo.ml.depends

在我的项目上确实生成了所需的依赖文件。

所以,似乎我必须配置 OcaIDE 并告诉它 JoCaml 可执行文件在哪里或其他东西。例如,这是为 OCaml 完成的。但是对于 JoCaml,没有地方可以这样做。真的很奇怪,如果 jocamldep/jocamlc/etc 都可以从任何地方访问,OcaIDE 将无法选择它们。

有任何想法吗?

(我知道我可以做一个 ocamlbuild 插件并在“myocamlbuild.ml”文件中传递标志。在我熟悉 ocamlbuild 插件之后,我可能会在后期使用它。但这里的问题是关于 OcaIDE。编辑:实际上,ocamlbuild 插件似乎不是一个解决方案,因为尽管-use-jocamlocamlbuild 中有一个选项可以强制使用 jocaml(并且工作正常),但插件系统不支持它,即 use_jocaml(或涉及 jocaml 的东西)是不在选项列表中。)

0 投票
5 回答
6680 浏览

build - 构建和构建 OCaml 项目的首选方式是什么?

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

我的模型用例是一个普通但不平凡的项目,纯 OCaml 或 OCaml 加上 C 依赖项。这样的项目:

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

几个替代工具脱颖而出:

  • 自定义 Makefile 似乎是大多数开源 OCaml 包中的通用标准,但显得冗长和复杂——甚至比普通的 C/C++ 项目还要复杂。更糟糕的是,许多甚至看似简单的 OCaml 库都将 autoconf/automake 置于顶层,以实现更大的复杂性。
  • ocamlbuild似乎提供了一种现代的、流线型的机制,用于以最少的配置自动构建,但对于新手来说没有很好的文档记录,也没有在 OCaml 生态系统的介绍性材料中以示例为代表,也没有被任何已发布的 OCaml 项目明显使用我已经浏览了灵感。
  • OASIS似乎是其他构建系统之上的一层约定和库代码,以支持构建包管理器和库,例如 Cabal。

(我还看到OMake,它似乎是一个自封的“ make++”,其中还包括一套通用语言的标准规则,包括 OCaml 和ocaml-make née OCamlMakefile,为 GNU 提供标准规则模板make。)

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

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

如何包含和管理 3rd 方库依赖项?是首选在系统级别安装它们,还是有一种标准且直接的方式将它们本地管理到项目中?我更喜欢项目尽可能独立的模型。

0 投票
1 回答
806 浏览

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

我有一个使用电池的简单 ocamlbuild 项目,包括语法扩展。

_tags

something.ml

它是为调试而构建的:

但是,尝试使用printin 中的命令ocamldebug会出现以下错误:

这似乎只在ed的范围内调试Batteries时发生。open

这个错误的原因是什么?怎么可能解决?

0 投票
1 回答
96 浏览

ocamlbuild - 如果两个不同的目标串行编译,如何使用已构建的 obj 文件强制 ocamlbuild

我有两个不同的 ml 目标,应该编译为本机代码。两个目标共享一些模块。

问题是,如果我运行“ocamlbuild targetA”,模块 C、D 和 E 将被编译为目标代码。但是当我运行“ocamlbuild targetB”时,模块 D 和 E 将再次重新编译。

如何强制避免重新编译模块 D 和 E(由 targetA 和 targetB 共享)?

我正在使用 ocamlbuild 3.11.2。

有什么提示吗?

再见安德烈亚斯

0 投票
1 回答
1960 浏览

ocaml - OCamlbuild 编译失败,抱怨 Netsys 的实现没有提供

我正在尝试使用 ocamlbuild 编译使用 OCaml 中的xmlrpc-light 库编写的 XML-RPC 服务器,但我得到:

请注意,我有一个myocamlbuild.ml这样的文件和一个_tags包含一行的文件:

这个插件在其他情况下对我来说很好用(client.native例如,对于相同的客户端/服务器应用程序),但不适用于server.native. 投诉表明库 Netsys 对编译器不可用。但我们得到

这意味着 netsys 安装在/usr/lib/ocaml/netsys. 检查该目录给了我:

还,

因此,确实安装了一个名为 netsys 的库,它确实有一个 cmxa 文件可供使用,但出于某种奇怪的原因,ocamlbuild 抱怨没有为模块 Netsys 提供实现。ocamlbuild 可以读取的事实/usr/lib/ocaml/equeue/equeue.cmxa应该足以得出结论,在查找库方面,关于环境($PATH 等)的一切都应该没问题。

这一切都在 Debian 6.0 中,我的 OCaml 的版本是 3.11.2。

经过一番浏览,我发现了一条svn 提交消息存储库差异),这表明它可能与使用的线程数有关。而且,事实上,我在我的代码中的某处使用了 Mutex(检查代码和server.ml另一个问题)。如果我从我的错误中删除 Mutex 的东西,错误仍然会发生。但是如果我另外从文件中删除,那么一切都会编译。所以,我的结论是我不能直接使用线程库,这很奇怪。client.mlserver.mlpkg_threads_tagsxmlrpc-light