Подтвердить что ты не робот

PKG_CHECK_MODULES считается вредным?

Различные разработчики препятствуют использованию 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 
4b9b3361

Ответ 1

В течение многих лет я использовал PKG_CHECK_MODULES и нашел, что это очень полезно. Я видел, как люди жаловались, что использование PKG_CHECK_MODULES вызвало "тонкие ошибки сборки" на разных платформах, но я никогда не обнаружил, что это особенно убедительная причина, чтобы прекратить его использовать. Однако я считаю, что обязательство исполнителя должно отвечать на жалобы пользователей там, где это необходимо, так что это всегда было проблемой. Однако моя основная жалоба с PKG_CHECK_MODULES заключается в том, что она вызывает сбои там, где она не должна. Если пользователь устанавливает libfoo в /p/a/t/h и вызывает configure script с LDFLAGS=-L/p/a/t/h, пользователь оправдывается ожиданием, что конфигурация найдет libfoo. Но пользователь также должен установить PKG_CONFIG_PATH, чтобы configure script мог найти foo.pc, чтобы конфигурация была успешной, и IMO, которая сломана. Можно было бы вызвать 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, должен избегать использования ее в своей конфигурации. Скорее, я рекомендую, чтобы библиотеки не поощряли его использование и перестали распространять файлы .pc. Проблема, которую пытается решить файл .pc, лучше решать на более высоком уровне. Autotools не являются системой управления пакетами, и это проблема, которая должна быть решена с помощью инструмента управления пакетами.

Ответ 2

Здесь есть запись в блоге, в которой подробно описывается плохая сторона PKG_CHECK_MODULES:

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

или этот вопрос в стеке:

Использование макроса pkg-config PKG_CHECK_MODULES с ошибкой

В основном это сводится к: он вызывает очень бесполезные ошибки, если кто-то пытается запустить 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-config".

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

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-config вообще; что отдельная проблема.