У меня есть проект OCaml, который в настоящее время построен с использованием OCamlMake. Я не доволен текущей системой сборки, так как она оставляет все артефакты сборки в том же каталоге, что и исходные файлы, а также требует вручную указать порядок зависимостей между модулями. Я хотел бы перейти на систему сборки, которая не страдает от этих проблем. Я решил попробовать Oasis, но столкнулся с проблемами.Дополнительные зависимости с ocamlbuild
Проблемы возникают из-за того, что проект построен очень определенным образом. Он поддерживает несколько разных баз данных (PostgreSQL, MySQL, SQLite). В настоящее время для компиляции бэкэнда базы данных пользователь должен установить дополнительные библиотеки, необходимые для этого бэкэнд, и включить его, установив переменную среды. Вот как это выглядит в Makefile:
ifdef MYSQL_LIBDIR
DB_CODE += mysql_database.ml
DB_AUXLIBS += $(MYSQL_LIBDIR)
DB_LIBS += mysql
endif
Обратите внимание, что это также добавляет дополнительный модуль в список скомпилированных модулей. Важный бит заключается в том, что нет никакой зависимости (в смысле импорта модуля) между любым доступным модулем из точки входа приложения и модуля БД. Скорее всего, каждый модуль базы данных базы данных содержит код верхнего уровня, который запускается, когда модуль инициируется и регистрируется, используя побочные эффекты, с основным приложением.
Я не могу настроить эту настройку для работы с Oasis. Я заявил, каждый из серверных баз данных модулей в качестве отдельной библиотеки, которые могут быть включены для компиляции с флагом:
Library mysql-backend
Path : .
Build $: flag(mysql)
Install : false
BuildTools : ocamlbuild
BuildDepends : main, mysql
Modules : Mysql_backend
Однако, я не могу понять, способ сказать Oasis, чтобы связать дополнительные модули в исполняемый файл. Я попытался выяснить способ сделать это, изменив файл myocamlbuild.ml
, но не смог. Могу ли я достичь этого с помощью описанной функции rule
here?
Если то, что я описываю, не может быть достигнуто с помощью ocamlbuild
, есть ли какой-нибудь инструмент ither, который мог бы выполнить эту работу и избежать проблем с OCamlMake?
Я не уверен, как это решает проблему. Вопрос заключался в том, как реализовать необязательные зависимости, раздел объекта не решает этого, вам все равно нужно явно указывать зависимость в главной программе. В основном, вопрос заключался в том, как реализовать полиморфизм на уровне компиляции, когда вы можете заменить библиотеки одним и тем же интерфейсом, но разными реализациями. – ivg
ah, ok Я вижу, вы также внедрили условную ссылку в плагине myocamlbuild. Немного жестко, но должно работать. В идеале мы должны внести свой вклад в оазис. Поскольку ваш PR - это PoC, он может работать :) – ivg