Каков предпочтительный способ структурирования и построения проектов OCaml?


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

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

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

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

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

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

- любые из этих предпочтительнее, современный способ управления данные, используемые строит?

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

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

4 56

4 ответа:

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

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

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

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

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

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

+1 к дополнением.

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

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

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

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

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

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

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

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

=> ocaml-autoconf с ocamlbuild