2012-04-19 3 views
17

Различные разработчики препятствуют использованию PKG_CHECK_MODULES (например, в this answer), но нет четкого, исчерпывающего объяснения их причин, насколько я искал. Итак, я спрашиваю:PKG_CHECK_MODULES считается вредным?

  • Зачем нужно было PKG_CHECK_MODULES?
  • Каковы альтернативы?

Я, например, использовал его в первый раз сегодня. Я нашел, что это неоценимо полезно, специально для работы с довольно сложными наборами библиотеки, такими как GTK +, где у меня есть вся эта зависимость:

-I/usr/lib/i386-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0 
-I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 
-I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 
-I/usr/lib/i386-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 
-I/usr/include/freetype2 -I/usr/include/libpng12 

-lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 
-lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 
-lgthread-2.0 -lrt -lglib-2.0 
+1

Хотя причины, лежащие в основе альтернативы «pkg-config», которые обычно предлагает Уильям Пурселл, заключается в том, что существуют целые платформы, такие как GTK, которые работают «неправильно», и для их исправления потребуются все эти библиотеки для изменения каталога, в который они устанавливаются. Это приведет к серьезному разрушению систем сборки существующих приложений. Поскольку я не думаю, что «неправильный» способ на самом деле наносит какой-либо вред, это не стоит меняться. – ptomato

+1

Кроме того, 'pkg-config' позволяет сохранять несовместимые версии библиотек (например, GTK 2 и GTK 3) параллельно. Хотя я уверен, что Уильям Пурселл подумал об этом и будет рад объяснить, как сделать это по-своему ;-) – ptomato

+0

@ptomato Нет, я строго не-gui человек и никогда не обращался напрямую с gtk. Но я считаю, что вполне возможно сделать такие вещи, как «LDFLAGS = -L $ (pkg-config -libs-only-L gtk + -2.0) CPPFLAGS = $ (pkg-config --cflags gtk + -2.0) LIBS = $ (pkg-config --libs-only-l gtk + -2.0) ", и эти параметры можно поместить в config.site. Чтобы быть ясным, у меня нет возражений против pkg-config, но мне не нравятся PKG_CHECK_MODULES по причинам, изложенным в моем ответе. –

ответ

19

В течение многих лет я использовал PKG_CHECK_MODULES и нашел, что это будет очень полезно. Я видел, как люди жаловались, что использование PKG_CHECK_MODULES вызвало «тонкие ошибки сборки» на разных платформах, но я никогда не обнаружил, что это особенно убедительная причина, чтобы прекратить ее использовать. Тем не менее, я считаю, что обязательство сопровождающего должно отвечать на жалобы пользователей там, где это необходимо, так что это всегда было проблемой. Однако моя основная жалоба с PKG_CHECK_MODULES заключается в том, что она вызывает сбои там, где она не должна. Если пользователь устанавливает libfoo в /p/a/t/h и вызывает сценарий configure с LDFLAGS=-L/p/a/t/h, пользователь оправдывается ожиданием, что конфигурация найдет libfoo. Но пользователь также должен установить PKG_CONFIG_PATH, чтобы сценарий configure мог найти foo.pc, чтобы конфигурация была успешной, и ИМО, которая сломана. Можно было бы вызвать AC_CHECK_LIB, а затем вызвать только PKG_CHECK_MODULES, если библиотека не найдена через стандартный механизм, чтобы избежать этой проблемы. Другая проблема заключается в том, что вполне возможно, что PKG_CHECK_MODULES найдет файл .pc, в котором информация неточна, что приводит к сбою сборки. В этом случае необходимо вызвать AC_CHECK_LIB после PKG_CHECK_MODULES.

Короче говоря, чтобы правильно использовать PKG_CHECK_MODULES, необходимо вызвать AC_CHECK_LIBS первый, а затем условно вызвать PKG_CHECK_MODULES, а затем вызвать AC_CHECK_LIBS еще раз для проверки информации, найденной PKG_CHECK_MODULES. Вся эта дополнительная работа со стороны сопровождающего только для того, чтобы облегчить пользователям установку их библиотек в нестандартном расположении, является IMO, абсурдным. Пользователь должен настроить свою цепочку инструментов для поиска библиотек с помощью стандартных механизмов.

- EDIT -

Чтобы уточнить, я не утверждаю, что пакет, который использует библиотеку, которая поощряет использование PKG_CHECK_MODULES следует избегать использования в их configury. Скорее, я рекомендую, чтобы библиотеки не поощряли его использование и прекращали распространять файлы .pc. Проблема, которая пытается быть решена с помощью файлов .pc, лучше решать на более высоком уровне. Автотестами являются не система управления пакетами, и это проблема, которая должна быть решена с помощью инструмента управления пакетами.

+5

Простая вещь о .pc заключается в том, что она дает вам CFLAGS, необходимые библиотеке, такие как -mms-bitfield. Также необходимы библиотеки для статической компиляции, конфликтующие модули и различные детали времени выполнения, такие как расположение для установки модуля и т. Д. Таким образом, ваше предложение полагаться на «стандартный механизм», похоже, не охватывает эти случаи. Речь идет не только о поиске lib и символа. Хотя я согласен с тем, что добавление дополнительных проверок времени ссылки может быть полезно в некоторых случаях, что также замедлит время конфигурирования. Опираясь на мин. правильности sys аналогичен тому, как полагаться на некоторый кешированный результат. – elmarco

+3

Все это говорит о том, что возврат к стандартным механизмам, которые вы предлагаете, нежизнеспособен, полагаясь на правильную систему с PKG_CONFIG_LIBDIR, делает тривиальным для меня кросс-компиляцию для различных систем без любая боль. – elmarco

+1

@elmarco Вы можете использовать pkg-config для заполнения CFLAGS, CPPFLAGS, LDFLAGS и LIBS без использования PKG_CHECK_MODULES, поэтому вы можете получить все преимущества pkg-config, не полагаясь на PKG_CHECK_MODULES. (См. Мой комментарий к вопросу) –

5

Существует сообщение в блоге здесь идет в немного подробно на плохой стороне PKG_CHECK_MODULES:

http://tirania.org/blog/archive/2012/Oct-20.html

или этого StackOverflow вопрос:

Using the pkg-config macro PKG_CHECK_MODULES failing

Это существенно кипятит до: Это приводит к очень бесполезным ошибкам, если кто-то пытается запустить autoconf и не имеет установленного pkg-config. Вот пример ошибки я получил сегодня работает autoconf && ./configure:

./configure: line 5283: syntax error near unexpected token `FFMPEG,' 
./configure: line 5283: ` PKG_CHECK_MODULES(FFMPEG, libavutil libavformat libavcodec libswscale, HAVE_FFMPEG=yes)' 

Чтобы пользователь/разработчик просто пытается собрать пакет, это не кричит «вам нужно установить PKG-конфигурации».

Если (как статья предполагает) вы просто позвоните PKG-конфигурации напрямую, вы получите более полезные ошибки, например .:

AC_SUBST(MONO_LIBS) 
AC_SUBST(MONO_CFLAGS) 
if pkg-config --atleast-version=2.10 mono; then 
    MONO_CFLAGS=`pkg-config --cflags mono` 
    MONO_LIBS=`pkg-config --libs mono` 
else 
    AC_MSG_ERROR(Get your mono from www.go-mono.com) 
fi 

Другие люди предлагают не использовать PKG-конфигурации на всех; это отдельный вопрос.

+0

Я в замешательстве, почему '' pkg-config' или не повлияет на то, как должен выглядеть './Configure', скрипт'/bin/sh'. Использует ли '/ bin/sh' возможность интерпретировать такие вещи, как' PKG_CHECK_MODULES', когда установлен pkg-config? –

+0

@ sid-kap Это этап «autoconf», где все идет не так - если pkg-config не установлен, макрос PKG_CHECK_MODULES не расширяется (поскольку этот макрос предоставляется pkg-config). autoconf возвращает успех, но генерирует неверный скрипт configure. Проблема заключается не столько в том, что это терпит неудачу, но в том, что запуск configure завершается с действительно бесполезным сообщением об ошибке, которое не заставляет конечного пользователя думать «ах, мне нужно установить pkg-config и повторно запустить autoconf». – JosephH

+0

Обычно разработчик должен запускать 'auto (re) conf' для генерации скриптов' configure'. Если требуется pkg-config, это следует упомянуть в инструкциях предварительной сборки (или вставить в 'autogen.sh' в качестве проверки). – Rufflewind

Смежные вопросы