ocamlbuild:“全部”无所事事

ocamlbuild: Nothing to be done for `all'

我在 makefile 中使用 ocamlbuild 来构建我的代码,并希望在有任何代码更改时重新编译。但是 make returns 错误信息:make: Nothing to be done for `all'.

我的makefile代码:

all: test1 test2

test1:
    ocamlbuild $(INCLUDES) $(FLAGS) $(TEST1_BYTE)
    mv $(TEST1_BYTE) test1.out

test2:
    ocamlbuild $(INCLUDES) $(FLAGS) $(TEST2_BYTE)
    mv $(TEST2_BYTE) test2.out

clean:
    rm -f test1.out test2.out
    rm -rf _build

我预计 make 将执行重新编译而不是 make clean; make。它现在只适用于 make clean; make

这个 Makefile 明确指出 test1test2 不依赖于任何东西。只要它们都存在,make 就会说无事可做。

我对 ocamlbuild 一无所知,但我怀疑您应该单独使用它而不是将其与 make 结合使用,make 是一个单独的(非常灵活,但非常古老的)构建系统。

就其价值而言,在我看来,许多当前的 OCaml 开发人员正在转向 dune 构建系统。

将目标设置为 phony 然后 make 实用程序将始终重建它们。 ocamlbuild 将使用 OCaml 基础结构的所有知识来跟踪依赖关系,并且永远不会重建任何不必要的东西。以下是如何声明你的目标虚假,将其添加到你的 Makefile

   .PHONY: test1 test2

此外,您似乎仍在学习 make 和 ocamlbuild 实用程序,鉴于您将投入时间学习这些工具,最好将注意力集中在那些不是传统的东西上。虽然习惯 make 可能被认为是有用的,但 ocamlbuild 工具或多或少被更新的 dune 和更好的记录所弃用。这很容易,只需创建一个名为 dune 的新文件并将以下内容放在那里,

(executable 
   (name test1))

(executable 
   (name test2))

现在您可以使用 dune build test1.exe 构建您的目标。您仍然可以创建一个 Makefile 作为对那些不知道如何调用 dune 的人的礼貌。和往常一样,不要忘记在 makefile 中使您的目标虚假。