ocamlbuild:“ all”不做任何事情

时间:2019-07-18 22:39:35

标签: makefile ocaml ocamlbuild

我正在ocamlbuild中使用makefile来构建代码,并希望在代码发生任何更改时重新编译。但是make返回并显示错误消息: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

2 个答案:

答案 0 :(得分:3)

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

   .PHONY: test1 test2

此外,您似乎仍在学习make和ocamlbuild实用程序,并且鉴于您将花费时间在学习这些工具上,因此最好专注于那些非传统的东西。虽然习惯于制作可能会有用,但ocamlbuild工具或多或少已被较新的dune所淘汰,并且记录得更好。非常简单,只需创建一个名为dune的新文件,并将以下内容放在其中,

(executable 
   (name test1))

(executable 
   (name test2))

现在,您可以使用dune build test1.exe建立目标。对于那些不知道如何调用dune的人,您仍然可以创建Makefile。而且像往常一样,不要忘记在makefile中使目标成为伪造。

答案 1 :(得分:2)

此Makefile特别指出test1test2无关。只要它们都存在,make就会说没事做。

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

就其价值而言,在我看来,许多当前的OCaml开发人员都在为构建系统切换到沙丘。