Глава 18 Генератор зависимостей (ocamldep)
Команда ocamldep сканирует набор файлов на языке OCaml (.ml и .mli) на предмет ссылок на внешние единицы компиляции и выводит строки зависимостей в формате, подходящем для утилиты make. Это гарантирует, что make будет компилировать файлы в правильном порядке и перекомпилировать те файлы, которые требуют перекомпиляции, при изменении исходного файла.
Типичное использование:
ocamldep options *.mli *.ml > .depend
где *.mli *.ml расширяется до всех исходных файлов в текущей директории, а .depend — это файл, который должен содержать зависимости. (См. ниже типовый Makefile.)
Зависимости генерируются как для компиляции с байт-кодовым компилятором ocamlc, так и с компилятором кода для нативного исполнения ocamlopt.
18.1 Параметры
Следующие параметры командной строки распознаются командой ocamldep.
- -absname
- Показать абсолютные имена файлов в сообщениях об ошибках.
- -all
- Генерировать зависимости от всех необходимых файлов, а не предполагать неявные зависимости.
- -allow-approx
- Разрешить обращение к приблизительному анализу, основанному на лексере, при сбоях разбора.
- -args filename
- Считать дополнительные параметры командной строки, разделенные символами новой строки, из файла filename.
- -args0 filename
- Считать дополнительные параметры командной строки, разделенные нулевыми символами, из файла filename.
- -as-map
- Для следующих файлов не включать отложенные зависимости для псевдонимов модулей. Этот параметр предполагает, что они скомпилированы с параметрами -no-alias-deps -w -49, и что эти файлы или их интерфейсы передаются с параметром -map при вычислении зависимостей для других файлов. Обратите также внимание, что для того, чтобы зависимости в реализации файла карты были корректными, интерфейс файла карты не должен кодировать какие-либо из содержащихся в нем псевдонимов.
- -debug-map
- Вывести карту отложенных зависимостей для каждого файла карты.
- -I directory
- Добавить указанную директорию в список директорий, которые будут просматриваться при поиске исходных файлов. Если исходный файл foo.ml упоминает внешнюю единицу компиляции Bar, зависимость от интерфейса этой единицы bar.cmi генерируется только в том случае, если исходный код bar находится в текущей директории или в одной из директорий, указанных с помощью -I. В противном случае Bar считается модулем из стандартной библиотеки, и зависимости не генерируются. Для программ, охватывающих несколько директорий, рекомендуется передавать команде ocamldep те же параметры -I, которые передаются компилятору.
- -nocwd
- Не добавлять текущую рабочую директорию в список директорий включения.
- -impl file
- Обработать file как файл .ml.
- -intf file
- Обработать file как файл .mli.
- -map file
- Считать и распространить отложенные зависимости для псевдонимов модулей в файле file, чтобы следующие файлы зависели от экспортированных псевдонимизированных модулей, если они их используют. См. пример ниже.
- -ml-synonym .ext
- Считать данное расширение (с начальной точкой) синонимом для .ml.
- -mli-synonym .ext
- Считать данное расширение (с начальной точкой) синонимом для .mli.
- -modules
- Вывод необработанных зависимостей в формате
filename: Module1 Module2 ... ModuleN
, где Module1, …, ModuleN — имена единиц компиляции, на которые ссылается файл filename, но эти имена не разрешаются в имена файлов исходного кода. Такие необработанные зависимости не могут использоваться командой make, но могут быть обработаны другими инструментами, такими как Omake. - -native
- Генерировать зависимости для программы с чистым кодом для нативного исполнения (без байт-кодовой версии). Когда файл реализации (.ml файл) не имеет явного файла интерфейса (.mli файл), ocamldep генерирует зависимости от скомпилированного в байт-код файла (.cmo файл), чтобы отразить изменения интерфейса. Это может привести к ненужным перекомпиляциям байт-кода для программ, которые компилируются только в код для нативного исполнения. Флаг -native заставляет генерировать зависимости от скомпилированных файлов для нативного исполнения (.cmx), вместо файлов .cmo. (Этот флаг не имеет значения, если все исходные файлы имеют явные файлы интерфейса .mli.)
- -one-line
- Выводить по одной строке на файл, независимо от длины.
- -open module
- Предполагать, что модуль module открыт перед разбором каждого из последующих файлов.
- -pp command
- Заставить ocamldep вызвать заданную команду command как препроцессор для каждого исходного файла.
- -ppx command
- Перенаправить абстрактные синтаксические деревья через препроцессор command.
- -shared
- Генерировать зависимости для файлов плагинов для нативного исполнения (.cmxs) помимо скомпилированных файлов для нативного исполнения (.cmx).
- -slash
- В Windows использовать прямой слэш (/) в качестве разделителя путей вместо обычного обратного слэша (\). В Unix этот параметр ничего не делает.
- -sort
- Сортировать файлы в соответствии с их зависимостями.
- -version
- Вывести строку версии и завершить работу.
- -vnum
- Вывести короткую версию номера и завершить работу.
- -help или --help
- Отобразить краткое резюме использования и завершить работу.
18.2 Типовой Makefile
Вот шаблон Makefile для программы на OCaml.
OCAMLC=ocamlc
OCAMLOPT=ocamlopt
OCAMLDEP=ocamldep
INCLUDES= # all relevant -I options here
OCAMLFLAGS=$(INCLUDES) # add other options for ocamlc here
OCAMLOPTFLAGS=$(INCLUDES) # add other options for ocamlopt here
# prog1 should be compiled to bytecode, and is composed of three
# units: mod1, mod2 and mod3.
# The list of object files for prog1
PROG1_OBJS=mod1.cmo mod2.cmo mod3.cmo
prog1: $(PROG1_OBJS)
$(OCAMLC) -o prog1 $(OCAMLFLAGS) $(PROG1_OBJS)
# prog2 should be compiled to native-code, and is composed of two
# units: mod4 and mod5.
# The list of object files for prog2
PROG2_OBJS=mod4.cmx mod5.cmx
prog2: $(PROG2_OBJS)
$(OCAMLOPT) -o prog2 $(OCAMLFLAGS) $(PROG2_OBJS)
# Common rules
%.cmo: %.ml
$(OCAMLC) $(OCAMLFLAGS) -c $<
%.cmi: %.mli
$(OCAMLC) $(OCAMLFLAGS) -c $<
%.cmx: %.ml
$(OCAMLOPT) $(OCAMLOPTFLAGS) -c $<
# Clean up
clean:
rm -f prog1 prog2
rm -f *.cm[iox]
# Dependencies
depend:
$(OCAMLDEP) $(INCLUDES) *.mli *.ml > .depend
include .depend
Если вы используете псевдонимы модулей для присвоения более коротких имен модулям, вам необходимо изменить вышеприведенные определения. Предполагая, что ваш файл карты называется mylib.mli, вот минимальные изменения.
OCAMLFLAGS=$(INCLUDES) -open Mylib
mylib.cmi: mylib.mli
$(OCAMLC) $(INCLUDES) -no-alias-deps -w -49 -c $<
depend:
$(OCAMLDEP) $(INCLUDES) -map mylib.mli $(PROG1_OBJS:.cmo=.ml) > .depend
Обратите внимание, что в этом случае вы не должны вычислять зависимости для mylib.mli вместе с другими файлами, поэтому необходимо явно передать список файлов для обработки. Если у mylib.mli самих есть зависимости, вы должны вычислить их с помощью -as-map.
© 1995-2022 INRIA.
https://v2.ocaml.org/releases/5.0/htmlman/depend.html