Как обрабатывать альтернативные серверные зависимости в pkg-config? - PullRequest
1 голос
/ 01 июня 2011

У меня есть библиотека, которая разбита на интерфейс и несколько фонов. Клиентские программы должны связываться с внешней библиотекой и одной внутренней библиотекой. Когда для внешнего интерфейса вызывается pkg-config, я бы хотел, чтобы pkg-config принудительно указывал некоторый внутренний интерфейс.

Давайте назовем внешний интерфейс libfoo-frontend, а внутренние - libfoo-backend-alpha и libfoo-backend-beta.

Может показаться, что очевидным решением является инвертирование зависимостей - каждый бэкэнд должен иметь 'требуются: libfoo-frontend'. Однако это не сработает, поскольку pkg-config передаст флаги libfoo-backend до флаги libfoo-frontend. Т.е. мы получим командную строку ссылки с «-lfoo-backend-alpha -lfoo-frontend», и компоновщик не будет включать libfoo-backend-alpha, поскольку он не удовлетворяет никаким неудовлетворенным зависимостям в предыдущие объекты, а затем потерпит неудачу, когда зависимости в libfoo-frontend не удовлетворены.

Мое текущее решение состоит в том, что в спецификациях pkg-config не указывается и зависимость между внешним и внутренним интерфейсами. Это зависит от пользователя, чтобы связать как с интерфейсом, так и с некоторым фоном. Недостатком является то, что пользователь должен знать, что это необходимо, и если он забудет связать его с внутренним сервером, у него будет сбой связи с неудовлетворенными зависимостями, что относительно неинформативно.

Решение, на которое я надеялся, состоит в том, чтобы спецификация внешнего интерфейса содержала строку наподобие «Требуется: libfoo-backend», а все спецификации внутреннего интерфейса pkg-config содержали строчку «Обеспечивает: libfoo-backend» ». Затем пользователь будет делать что-то вроде «pkg-config --libs libfoo-frontend libfoo-backend-beta». Если пользователь забудет указать какой-либо бэкэнд, pkg-config будет жаловаться на напоминание о них. К сожалению, pkg-config не имеет такого ключевого слова «Требуется».

...