我正在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
。
答案 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特别指出test1
和test2
无关。只要它们都存在,make就会说没事做。
我对ocamlbuild
一无所知,但是我怀疑您应该单独使用它,而不是将其与make结合使用,make是一个单独的(非常灵活,但是非常旧的)构建系统。
就其价值而言,在我看来,许多当前的OCaml开发人员都在为构建系统切换到沙丘。