Spec-Zone.ru › OCaml
☰Инструменты OCaml
  • Партиционная компиляция (ocamlc)
  • Система верхнего уровня или REPL (ocaml)
  • Система выполнения (ocamlrun)
  • Компиляция нативный код (ocamlopt)
  • Генераторы лексических и синтаксических анализаторов (ocamllex, ocamlyacc)
  • Генератор зависимостей (ocamldep)
  • Генератор документации (ocamldoc)
  • Отладчик (ocamldebug)
  • Профилирование (ocamlprof)
  • Интерфейс C с OCaml
  • Оптимизация с Flambda
  • Мультирование с afl-fuzz
  • Отслеживание выполнения с событиями времени выполнения
  • Программа преобразования «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.
-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 © 2024 Institut National de Recherche en Informatique et en Automatique

© 1995-2024 INRIA.
https://ocaml.org/manual/5.2/depend.html

Spec-Zone.ru

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