Вопрос или проблема
Я создал множество портов FreeBSD для программы, которая поддерживает различные базы данных (например, PostgreSQL, MariaDB и т.д.). Эта часть работает прекрасно.
Теперь я хочу создать зависимость от всех различных портов программы-базы данных, но должна быть выбрана только одна. Я знаю, как добавить зависимости к порту с помощью BUILD_DEPENDS
и RUN_DEPENDS
, но не знаю, как сделать список взаимно исключительным?
Ответ или решение
Для создания взаимно исключительных портов FreeBSD, вам нужно использовать систему конфигураций, предоставляемую в конфигурационных файлах порта. Основная идея заключается в использовании механизма опций, который позволяет выбирать только один из нескольких взаимозависимых вариантов. Рассмотрим все шаги более подробно.
Шаг 1: Определение опций порта
В вашем порте (например, в Makefile
) необходимо указать опции для выбора между различными зависимости, такими как PostgreSQL, MariaDB и т.д. Для этого используйте секцию OPTIONS_DEFINE
и секцию OPTIONS_PARALLELABLE
.
Пример:
OPTIONS_DEFINE= POSTGRESQL MARIADB
OPTIONS_DEFAULT= POSTGRESQL
POSTGRESQL_DESC= Use PostgreSQL as database
MARIADB_DESC= Use MariaDB as database
.include <bsd.options.mk>
Шаг 2: Условное добавление зависимостей
В зависимости от выбора пользователя, вы можете добавлять зависимости только для одной из опций. Это делается с помощью условных выражений в Makefile
. Используйте директивы .if
и .else
для включения зависимостей в зависимости от выбранной опции.
Пример:
.if ${PORT_OPTIONS:MPOSTGRESQL}
BUILD_DEPENDS+= postgresql-client>=9.6:databases/postgresql96-client
RUN_DEPENDS+= postgresql-server>=9.6:databases/postgresql96-server
.elseif ${PORT_OPTIONS:MMARIADB}
BUILD_DEPENDS+= mariadb-client>=10.3:databases/mariadb103-client
RUN_DEPENDS+= mariadb-server>=10.3:databases/mariadb103-server
.else
IGNORE= At least one database option must be selected
.endif
Шаг 3: Обработка конфигурации
Чтобы пользователю было проще выбирать опции, добавьте инструкцию в конец вашего Makefile
, чтобы указать, что необходимо выбрать один из вариантов.
# Make sure only one database option is selected
. for opt in POSTGRESQL MARIADB; .if ${PORT_OPTIONS:${opt}} && ${PORT_OPTIONS:${:M${:S/^/!/}}}
IGNORE= "Only one database type can be selected at a time: choose either PostgreSQL or MariaDB."
.endif; .endfor
Шаг 4: Тестирование
После внесения всех изменений, соберите ваш порт и проверьте его поведение. Убедитесь, что:
- Пользователи могут выбрать только одну базу данных.
- При попытке выбрать несколько баз данных появляется сообщение об ошибке.
- Все зависимости корректно устанавливаются в зависимости от выбора опции.
Заключение
Создание взаимно исключительных портов FreeBSD требует четкой настройки опций и условий в Makefile
. Использование системы опций позволяет пользователям выбирать необходимую конфигурацию без конфликтов. Выполнив вышеописанные шаги, вы сможете успешно реализовать требуемую функциональность для вашего порта.