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 

2 ответа

Решение

Одна существенная проблема с 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, Вся эта дополнительная работа со стороны сопровождающего просто для того, чтобы пользователям было проще устанавливать свои библиотеки в нестандартном месте, абсурдна. Пользователь должен настроить свою цепочку инструментов для поиска библиотек с помощью стандартных механизмов.

-- РЕДАКТИРОВАТЬ --

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

Здесь есть запись в блоге, в которой подробно рассказывается о плохой стороне 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 напрямую. Это нарушает кросс-компиляцию. Используйте AC_PATH_TOOL(PKG_CONFIG,pkg-config) или лучше PKG_PROG_PKG_CONFIG, чтобы узнать, какой $PKG_CONFIG использовать.

Я бы предположил, что это правильно, и вы должны следовать его предложению, но я лично не пробовал.

Другие люди предлагают вообще не использовать pkg-config; это отдельная проблема.

Другие вопросы по тегам