Каков предпочтительный способ структурирования и построения проектов OCaml? - PullRequest
57 голосов
/ 11 мая 2011

Для новичков в экосистеме неясно, какой канонически предпочтительный способ структурировать и управлять созданием небольших и средних проектов OCaml.Я понимаю основы ocamlc и т. Д. - они достаточно отражают обычные компиляторы UNIX C, чтобы казаться простыми.Но выше уровня одноразовой компиляции отдельных файлов неясно, как лучше и проще управлять компиляцией.Проблема заключается не в поиске потенциальных инструментов, а в поиске одного или нескольких правильных (достаточных) способов - как это подтверждено опытом сообщества - для структурирования и построения стандартных проектов OCaml.

Мой вариант использования моделиэто скромный, но нетривиальный проект, чистый OCaml или OCaml плюс C-зависимость.Такой проект:

  1. содержит несколько исходных файлов
  2. ссылки на ряд стандартных библиотек
  3. ссылки на одну или несколько сторонних библиотек
  4. опционально включает библиотеку C и оболочку OCaml в качестве подпроекта (хотя этим также можно управлять отдельно и включать в качестве сторонней библиотеки, как в (3))

Выделяются несколько альтернативных инструментов:

  • Пользовательские файлы Makefile, кажется, являются общим стандартом в большинстве пакетов OCaml с открытым исходным кодом, но выглядят разочаровывающе многословными и сложными - даже в большей степени, чем для скромных проектов C / C ++.Хуже того, многие даже на первый взгляд простые библиотеки OCaml наносят слой autoconf / automake поверх еще большей сложности.
  • ocamlbuild , кажется, предлагает современный, оптимизированный механизм для автоматизации сборок с минимальной конфигурацией, но этонедостаточно хорошо документированы для новичков, не представлены в качестве примера во вводных материалах в экосистеме OCaml, и не используются явно ни в одном из различных опубликованных проектов OCaml, которые я просматривал для вдохновения.Похоже, это слой конвенции и библиотечного кода поверх других систем сборки для поддержки построения менеджера пакетов и библиотеки, например Cabal.

(я также видел OMake , который появляетсябыть самозванным «make++», который также включает набор стандартных правил для распространенных языков, включая OCaml и ocaml-make или OCamlMakefile, предоставляя шаблон стандартных правил для GNU make.)

Являются ли какие-либо из них предпочтительным современным способом управления OCaml b?uilds?

Как лучше всего структурировать файлы проекта?

Как включить и управлять зависимостями сторонних библиотек?Предпочтительнее ли устанавливать их на системном уровне или существует стандартный и простой способ управления ими локально в проекте?Я бы предпочел модель, в которой проекты остаются максимально автономными.

Ответы [ 4 ]

21 голосов
/ 11 мая 2011

У вас есть полный список доступных опций, но на этот вопрос не будет четкого ответа. Моя личная рекомендация также использовать ocamlbuild. Файл myocamlbuild.ml, предоставленный здесь , является хорошим началом. Это позволит вам легко компилировать проекты, которые зависят от различных библиотек. Я не думаю, что он обрабатывает случай привязки к библиотекам C, но на wiki есть дополнительные примеры, которые могут помочь.

Некоторые люди возражают против ocamlbuild, потому что это еще один инструмент сборки, усложняющий работу менеджеров пакетов. Однако его простота использования и тот факт, что он включен в официальный дистрибутив, делают его все более и более широко используемым.

Вы также можете пропустить все это и напрямую использовать оазис. Он очень новый, и стабильный выпуск еще не анонсирован, но он очень полезен. Он автоматически сгенерирует myocamlbuild.ml для вас. Это, вероятно, путь в самое ближайшее время, если не уже. Кроме того, используя oasis, вы сразу получите преимущество oasis-db, CPAN-подобной системы для OCaml, которая находится в стадии разработки.

Что касается управления библиотеками, то ответ ocamlfind. Если у вас установлено несколько экземпляров OCaml, вызов соответствующей копии ocamlfind автоматически приведет к тому, что все ссылки на библиотеки будут ссылками для этого конкретного экземпляра, при условии, что вы систематически используете ocamlfind для всех библиотек. В настоящее время я использую Godi для установки OCaml и библиотек. Он использует ocamlfind, и у меня нет проблем с несколькими установленными экземплярами OCaml.

14 голосов
/ 11 мая 2011

Лично я бы дал +1 за ocamlbuild. Правила по умолчанию достаточно хороши для компиляции небольших и средних проектов с помощью одной команды и без минимальной конфигурации. Он также применяет некоторые очень разумные соглашения (не смешивая источники с результатами сборки). А для более крупных проектов его можно настроить по своему желанию с помощью дополнительных правил и плагинов. В компании, где я работаю, мы используем его для большого проекта (Ocaml + немного C +, некоторая предварительная обработка + ...), и это работает как шарм (и дает нам гораздо меньше головной боли, чем Makefiles) .

Что касается руководств, я бы подумал, что руководства пользователя (доступного на странице автора ) должно быть достаточно для начала работы. Более интересные вещи могут потребовать немного больше копания.

10 голосов
/ 11 мая 2011

+ 1 для OMake.

Мы обновили нашу сборочную инфраструктуру несколько лет назад и выбрали OMake по следующим причинам:

  • наши продукты состоят из смеси C, C ++, Управляемый C ++, Ruby и OCaml.
  • мы нацелены как на Linux, так и на Windows.
  • мы взаимодействуем с базами данных во время сборки.
  • для некоторых производств нам пришлось использовать OCaml 3.10.
  • наша оригинальная система сборки использовала autoconf / automake.
  • нам требуются сборки из исходного кода *.

Если честно, я не знаю, еслимы могли бы сделать это с помощью ocamlbuild, я не проверял это.Инструмент используется наверняка, так как в багтрекер OCaml есть некоторые действия вокруг него.Если вы выбрали ocamlbuild, убедитесь, что у вас установлена ​​последняя версия OCaml.

* OMake поддерживает сборки из исходного кода немного неочевидным способом.Это также имеет некоторые проблемы, когда источники доступны только для чтения.Нам пришлось исправлять и перестраивать нашу версию OMake для Windows.

3 голосов
/ 22 мая 2012

хороший вопрос. Я хотел бы сказать:

1) ocamlbuild Вероятно, это будет стандартный способ компиляции, потому что это эффективный, быстрый и инструмент по умолчанию, предоставленный официальным дистрибутивом. Хорошим моментом является тот факт, что он находится в официальном выпуске, потому что он, скорее всего, останется со временем. Кроме того, у него включен ocamlfind, поэтому он может управлять пакетами, установленными с ocamlfind, еще одним стандартом для установки пакетов (ocamlfind немного похож на pkg-config для C)

2) Но этого будет недостаточно для вашего проекта. Интеграция с C является базовой с ocamlbuild. Поэтому я бы посоветовал вам использовать оазис, чтобы окончательно ответить на ваш вопрос. Я тоже пробовал OMake, но мне не понравилось.

3) Однако ваши сценарии сборки вряд ли будут работать правильно, если вы не хотите, чтобы другие люди могли загружать и создавать ваш проект на их собственной машине. Кроме того, oasis не обрабатывает pkg-config. По этим причинам я бы посоветовал вам использовать ocaml-autoconf (макросы ocaml для автоинструментов). Потому что автоинструменты являются стандартом для управления библиотеками Си и хорошо известны специалистам по сопровождению пакетов. Он также может обрабатывать кросс-компиляцию ...

=> ocaml-autoconf с ocamlbuild

...