Подтвердить что ты не робот

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

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

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

+1 для OMake.

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

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

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

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

Ответ 4

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

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

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

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

= > ocaml-autoconf с ocamlbuild