如何为Ocaml项目生成适当的Makefile

时间:2019-04-13 19:06:36

标签: makefile compiler-construction ocaml ocamllex ocamlyacc

我正在学习编译器如何工作。我阅读了有关如何使用Ocamllex和Ocamlyacc从源代码中读取输入,生成令牌和生成语法树的教程,以便稍后计算程序的执行。在学习过程中,我不得不经常重新编译代码,因此我决定创建一个makefile来自动执行此步骤。由于我对Ocaml和makefile都不熟悉,因此我为使makefile正常工作付出了很多努力。

到目前为止,根据我在Google上的研究,我可以创建此makefile,但是我得到的最新错误是“ make:***没有规则可以使目标'lexer.mli'成为'depend'所必需。请停止。”。

# The Caml compilers. You may have to add various -I options.

CAMLC = ocamlc
CAMLDEP = ocamldep
CAMLLEX = ocamllex
CAMLYACC = ocamlyacc

# Lex stuff
LEXSOURCES = lexer.mll
LEXGENERATED = lexer.mli lexer.ml

# Yacc stuff
YACCSOURCES = parser.mly
YACCGENERATED = parser.mli parser.ml

GENERATED = $(LEXGENERATED) $(YACCGENERATED)

# Caml sources
SOURCES =  $(GENERATED) calc.ml
# Caml object files to link
OBJS = lexer.cmo parser.cmo calc.cmo

# Name of executable file to generate
EXEC = calc

# This part should be generic
# Don't forget to create (touch) the file ./.depend at first use.

# Building the world
all: depend $(EXEC)

$(EXEC): $(GENERATED) $(OBJS)
    $(CAMLC) $(OBJS) -o $(EXEC)

.SUFFIXES:
.SUFFIXES: .ml .mli .cmo .cmi .cmx
.SUFFIXES: .mll .mly

.ml.cmo:
    $(CAMLC) -c $<

.mli.cmi:
    $(CAMLC) -c $<

.mll.ml:
    $(CAMLLEX) $<

.mly.ml:
    $(CAMLYACC) $<

# Clean up
clean:
    rm -f *.cm[io] *.cmx *~ .*~ #*#
    rm -f $(GENERATED)
    rm -f $(EXEC)

# Dependencies
depend: $(SOURCES) $(GENERATED) $(LEXSOURCES) $(YACCSOURCES)
    $(CAMLDEP) *.mli *.ml > .depend

include .depend

如何为该任务创建合适的Makefile?

1 个答案:

答案 0 :(得分:0)

Ocamllex不会生成任何mli文件,您应该从ocamllex生成的文件列表中删除lexer.mli。

请注意,如果您的目标不是学习Makefile,则让ocal特定的构建系统dune处理构建过程会容易得多。

类似地,ocamlyacc在功能方面已被竖琴取代。您可能想看看。