Spec-Zone.ru › OCaml
☰Инструменты OCaml
  • Пакетная компиляция (ocamlc)
  • Система верхнего уровня или REPL (ocaml)
  • Система времени выполнения (ocamlrun)
  • Компиляция в машинный код (ocamlopt)
  • Генераторы лексических анализаторов и парсеров (ocamllex, ocamlyacc)
  • Генератор зависимостей (ocamldep)
  • Генератор документации (ocamldoc)
  • Отладчик (ocamldebug)
  • Отладка машинного кода (gdb, lldb)
  • Профилирование (ocamlprof, perf)
  • Взаимодействие C с OCaml
  • Оптимизация с помощью Flambda
  • Фаззинг с помощью afl-fuzz
  • Трассировка времени выполнения с помощью событий runtime
  • Преобразование программы «Tail Modulo Constructor»
  • Обнаружение гонок данных во время выполнения с помощью ThreadSanitizer

Глава 18 Генератор зависимостей (ocamldep)

Команда ocamldep сканирует набор исходных файлов OCaml (файлов .ml и .mli) на наличие ссылок на внешние единицы компиляции и выводит строки зависимостей в формате, подходящем для утилиты make. Это позволяет make компилировать исходные файлы в правильном порядке и перекомпилировать те файлы, которые требуется перекомпилировать после изменения исходного файла.

Обычно команда используется так:

        ocamldep options *.mli *.ml > .depend

где *.mli *.ml разворачивается в список всех исходных файлов в текущем каталоге, а .depend — это файл, в который следует записать зависимости. (Типичный файл Makefile приведён ниже.)

Зависимости генерируются как для компиляции байт-кодовым компилятором ocamlc, так и для компиляции компилятором машинного кода ocamlopt.

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, что и компилятору.
-H directory
Работает так же, как -I, но каталоги -H просматриваются последними. Этот флаг упрощает вызов ocamldep с теми же параметрами, что и у компилятора, где -H используется для транзитивных зависимостей, на которые программа не должна ссылаться напрямую.
-nocwd
Не добавлять текущий рабочий каталог в список каталогов включения.
-impl file
Обрабатывать file как файл .ml.
-intf file
Обрабатывать file как файл .mli.
-keywords version+list
Задать ключевые слова согласно спецификации version+list.

Эта спецификация начинается с необязательного номера версии, задающего базовый набор ключевых слов, за которым следует разделённый символом + список дополнительных ключевых слов, добавляемых к этому базовому набору.

Если номер версии не указан явно, базовым набором ключевых слов становится набор, используемый в текущей версии OCaml. Наличие в исходном коде дополнительных ключевых слов, не соответствующих ни одному ключевому слову текущей версии языка, приводит к ошибке.

-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
Вывести краткую сводку по использованию и завершить работу.

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.

« Генераторы лексических анализаторов и парсеров (ocamllex, ocamlyacc)Генератор документации (ocamldoc) »
Copyright © 2026 Национальный институт исследований в области информатики и автоматики

© 1995-2026 INRIA.
https://ocaml.org/manual/5.5/depend.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API