Ответ 1
Это не может быть действительно чистым в отношении системных библиотек. В противном случае вам нужно запустить свою собственную виртуальную машину или другой контейнер. Но в отношении среды OCaml вы можете достичь своей цели с помощью файла opam
в корне вашего проекта. После того, как вы описали все свои зависимости (в том числе и системные), вы можете pin
ваш проект, и это установит все ваши зависимости, скомпилирует ваш проект и разворачивает его в стек opam. Итак, рабочий процесс следующий:
$ # install opam 1.2
$ # install aspcud (optionally, but highly recommended)
$ opam switch install fresh -A 4.02.1
$ opam pin add proj /path/to/proj -n
$ opam depext --install proj
# optional part:
$ edit proj/src/main.ml # do the development
$ opam upgrade proj
Теперь пройдите через этот рабочий процесс поэтапно.
Установить компилятор
$ opam switch install fresh -A 4.02.1
Эта команда создает новую установку компилятора. Здесь fresh
не имеет особого значения, это просто произвольное имя для установки. Обычно я использую команду date +"%y%m%d"
вместо fresh
, которая создает имя, состоящее из текущего года, месяца и дня.
Вызов проекта
$ opam pin add proj /path/to/proj -n
Эта команда представит ваш проект в систему OPAM. Это похоже на создание собственного небольшого репозитория пакетов, содержащего только один пакет, proj
. Название proj
- это, конечно, просто название вашего проекта, что бы это ни было. pin
использует opam
файл, который описывает ваш проект в системе OPAM, вы можете создать его вручную с помощью инструкций. Или вы можете позволить команде pin
создать ее для вас. Это поможет вам осторожно пройти процесс, задав несколько вопросов. Вы можете узнать больше о закреплении в этом сообщении в блоге.
Установка пакета и зависимостей
В предыдущей команде мы добавляем флаг -n
, который остановит команду pin
от установки вашего пакета сразу после пиннинга, потому что мы хотим двигаться небольшими шагами.
$ opam depext --install proj
Эта команда будет вычислять транзитивное закрытие зависимостей вашего пакета и устанавливать их, включая ваши системные зависимости (если вы находитесь на ubuntu или fedora, и если вы указали свои зависимости в файле opam
на предыдущем шаге),
Работа над проектом
Предположим, вы хотите разработать код. Существует удобный рабочий процесс OPAM:
$ edit proj/src/main.ml # do the development
$ opam upgrade proj
Это переустановит ваши пакеты (и переустановит всех иждивенцев вашего пакета, если они существуют).
Этот рабочий процесс, с другой стороны, имеет серьезный недостаток, если ваш проект не крошечный, поскольку он скопирует все источники и скомпилирует их с нуля. Но если у вас есть набор зависимых пакетов, на которых вы работаете параллельно, то это способ сделать это.
Компиляция и другие материалы
Но это касается только управления пакетами и межпакетов. OPAM абсолютно не зависит от конкретной системы сборки и не дает никакой пользы никому из них (но для некоторых из них по-прежнему есть инструментальная поддержка). Таким образом, вы можете написать Makefile
самостоятельно или создать собственный набор сценариев оболочки, вызывающих ocamlbuild
, это абсолютно зависит от вас. Но если бы я был в вас, я буду использовать OASIS для управления процессом строительства. OASIS сама по себе не является системой сборки, ее цель - управлять системами сборки кросс-платформенным способом. Но по умолчанию он использует ocamlbuild
и интегрируется с ним плавно. Кроме того, он имеет интеграцию с OPAM (фактически это OPAM, у которого есть интеграция с OASIS). Существует пакет oasis2opam
, который создаст файл opam
из файла _oasis
. Что касается создания файла _oasis
, описывающего процесс построения вашего проекта, то вы можете создать его вручную с помощью своего любимого текстового emacs, или вы можете позволить OASIS создать его для вас с помощью oasis quickstart
.
В качестве заключительного замечания я бы предложил вам просмотреть существующие проекты и использовать их в качестве источника вдохновения. Вы можете начать с проекта BAP, который я поддерживаю, но он имеет довольно сложную конфигурацию. Таким образом, могут быть более простые примеры.