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