Каков предпочтительный способ структурирования и сборки проектов 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?
Как файлы проекта лучше всего структурированы?
Как включены и управляются зависимостей сторонних библиотек? Желательно ли устанавливать их на системном уровне или существует стандартный и простой способ управления ими локально для проекта? Я бы предпочел модель, в которой проекты остаются как можно более самодостаточными.
Ответы
Ответ 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