Как создать правильный make-файл для проекта Ocaml - PullRequest
1 голос
/ 13 апреля 2019

Я учусь тому, как работают компиляторы. Я прочитал учебное пособие о том, как использовать Ocamllex и Ocamlyacc для чтения входных данных из исходного кода, генерации токенов и генерации синтетического дерева для последующего вычисления выполнения программы. Мне приходилось часто перекомпилировать код, пока я был в процессе обучения, и я решил создать make-файл для автоматизации этого шага. Поскольку я новичок как в Ocaml, так и в make-файлах, я изо всех сил пытаюсь заставить работать make-файл.

Из моих исследований в Google я до сих пор мог создать этот make-файл, но последняя ошибка, которую я получил, была: "make: *** Нет правил для создания цели" lexer.mli ", необходимой для" зависимость ". Stop.".

# 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

Как мне создать подходящий make-файл для этой задачи?

1 Ответ

0 голосов
/ 14 апреля 2019

Ocamllex не создает mli-файл, вы должны удалить lexer.mli из списка файлов, сгенерированных ocamllex.

Обратите внимание, что если вы не хотите изучать Makefile, вам будет гораздо прощеdune, специфическая для ocaml система сборки, управляет процессом сборки.

Аналогично, ocamlyacc был заменен менгиром в плане возможностей.Возможно, вы захотите взглянуть.

...