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

如何为Ocaml项目生成适当的makefile,makefile,compiler-construction,ocaml,ocamllex,ocamlyacc,Makefile,Compiler Construction,Ocaml,Ocamllex,Ocamlyacc,我正在学习如何使用编译器。我阅读了一篇关于如何使用ocamlex和Ocamlyacc从源代码中读取输入、生成令牌和生成语法树的教程,以便稍后计算程序的执行。在学习过程中,我不得不经常重新编译代码,我决定创建一个makefile来自动化这一步骤。因为我对Ocaml和makefiles都是新手,所以我在努力使makefile正常工作 从我的谷歌研究到目前为止,我可以创建这个makefile,但我得到的最新错误是“make:**No rule to make target'lexer.mli',dep

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

从我的谷歌研究到目前为止,我可以创建这个makefile,但我得到的最新错误是“make:**No rule to make target'lexer.mli',depend.Stop.需要它。”

#Caml编译器。您可能需要添加各种-I选项。
CAMLC=ocamlc
CAMLDEP=ocamldep
卡姆莱克斯=奥卡姆莱克斯
CAMLYACC=ocamlyaacc
#莱克斯的东西
LEXSOURCES=lexer.mll
lexegenerated=lexer.mli lexer.ml
#Yacc材料
YACCSOURCES=parser.mly
YACCGENERATED=parser.mli parser.ml
生成=$(LEXGENERATED)$(YACCGENERATED)
#Caml源
SOURCES=$(已生成)calc.ml
#要链接的Caml对象文件
OBJS=lexer.cmo parser.cmo calc.cmo
#要生成的可执行文件的名称
EXEC=计算
#这部分应该是通用的
#别忘了创建(触摸)文件。/。请先使用。
#建设世界
全部:依赖$(执行)
$(执行):$(已生成)$(OBJS)
$(CAMLC)$(OBJS)-o$(执行)
.后缀:
.后缀:.ml.mli.cmo.cmi.cmx
.后缀:.mll.mly
.ml.cmo:
$(CAMLC)-c$<
.mli.cmi:
$(CAMLC)-c$<
.mll.ml:
$(卡姆莱克斯)$<
.mly.ml:
$(CAMLYACC)$<
#清理
清洁:
rm-f*.cm[io]*.cmx*~.*#*#
rm-f$(已生成)
rm-f$(执行)
#依赖关系
依赖:$(源)$(已生成)$(LEXSOURCES)$(YACCSOURCES)
$(CAMLDEP)*.mli*.ml>.dependent
包括,取决于

如何为该任务创建适当的makefile?

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

请注意,如果您的目标不是学习Makefile,那么让dune(一个特定于ocaml的构建系统)处理构建过程会容易得多


同样,ocamlyacc在功能方面也被menhir所取代。您可能想看看。

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

请注意,如果您的目标不是学习Makefile,那么让dune(一个特定于ocaml的构建系统)处理构建过程会容易得多

同样,ocamlyacc在功能方面也被menhir所取代。您可能想看一看。

仔细阅读
# 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