[devel] Сборка ffmpeg в p8
Vitaly Lipatov
lav на altlinux.ru
Пт Июл 21 23:58:17 MSK 2017
Всем добрый день!
Вопрос о сборке ffmpeg в p8 очень интересный, потому что попытки его
решения выявляют ряд проблем и ограничений, многие из которых не носят
технического характера.
Так получилось, что так или иначе тему ffmpeg я обсуждал с разными
специалистами, но они не всегда знали мнение друг друга, поэтому я хотел
бы их увидеть в этой цепочке обсуждения.
На самом деле я очень мало разбираюсь в проблеме. Я не собирал ffmpeg, и
не проводил ту большую работу, которую провёл rider@ в Сизифе, благодаря
которой мы не только получили актуальную версию ffmpeg, но и знаем
теперь о том, что переход возможен.
Итак. Как обычно, всё начинается с того, что почти все программы,
хотящие воспроизводить видео, хотят использовать ffmpeg. Которого —
неожиданно — в p8 нет.
Среди них такие базовые в наше время программы, как chromium и firefox.
Кстати, у них интересное отличие. Если chromium просто несёт ffmpeg
внутри себя и собирает его в библиотеку, которую носит с собой, то
firefox носит с собой некоторые огрызки и headers, а потом при
исполнении перебирает по списку, что он может загрузить из
"libavcodec-ffmpeg.so.57",
"libavcodec-ffmpeg.so.56",
"libavcodec.so.57",
"libavcodec.so.56",
"libavcodec.so.55",
"libavcodec.so.54",
"libavcodec.so.53",
Что интересно с chromium. Многие библиотеки, которые он несёт с собой,
он собирает динамически и кладёт в свой каталог:
/usr/lib64/chromium/libffmpeg.so
/usr/lib64/chromium/libicui18n.so
/usr/lib64/chromium/libicuuc.so
/usr/lib64/chromium/libv8.so
Кто даёт гарантии, что какие-то библиотеки, используемые chromium, не
слинкуются с какими-то системными вариантами этих библиотек и chromium
не начнёт падать?
В тоже время один из аргументов против моего робкого предложения собрать
ffmpeg в %_libdir/ffmpeg, чтобы он никому не мешал кроме тех, кто решит
явно с ним линковаться, заключается как раз в попытке избежать такой
ситуации.
Далее. Сейчас очень популярным является создание desktop-программ на
движке Electon (всё началось с редактора Atom, потом MS Visual Studio
Code, клиенты Skype, VK Messenger, разные там Franz, WebTorrent,
PopcornTime, Sia UI и пр).
Если посмотреть на то, как electron собран, видно, с какими библиотеками
он собран или носит с собой.
$ rpm -ql electron
/usr/lib64/electron/electron
/usr/lib64/electron/icudtl.dat
/usr/lib64/electron/libffmpeg.so
/usr/lib64/electron/libnode.so
Возможность собрать крупный проект, используя системные библиотеки
дистрибутива — это свойство не только проекта, но ещё и показатель
зрелости дистрибутива. Это же простой вопрос — можно ли построить на
платформе что-то стабильное, или всё надо принести с собой.
Вот у нас (а может только у меня в системе) есть 3 библиотеки libpng
одновременно:
$ ls /usr/lib64/libpng*.so.*.0 -1
/usr/lib64/libpng12.so.0.50.0
/usr/lib64/libpng15.so.15.28.0
/usr/lib64/libpng16.so.16.29.0
и этого не пугает никого.
В тоже время появление альтернативных библиотек ffmpeg выглядит страшно.
Я слышал простое предложение носить линковаться с ffmpeg статически.
Конечно, я никогда не стану собирать незаметно ffmpeg внутри пакета и
линковаться с ней. Я бы собрал некий ffmpeg-devel-static со статическими
библиотеками и собирался с ней. Но если мы на простой проблеме так легко
отказываемся от динамической линковки, зачем в других случаях
рассказывать, как важно иметь возможность в случае необходимости
пересобирать библиотеку с security fixes, не пересобирая все проекты, её
использующие.
Я уж молчу о разделении памяти и совсем отдельная тема, что смена
способа линковки может вызывать лицензионные столкновения.
Затрудняюсь привести все аргументы против сборки в p8, которые я услышал
от уважаемых коллег. Мне показалось, что частично они защищают
репозиторий от недальновидных мантейнеров, а частично выглядят немного
смешно. И почти не носят технический характер. Поэтому я прошу, если
аргументы против остались в силе, процитировать их здесь самостоятельно.
Закончу фразой, что репозиторий, в который нельзя собрать пакет,
становится не интересен.
P.S.
А mplayer в Сизифе слинкован с десятками сумасшедших библиотек проекта
samba. Видимо, со всем содержимым
/usr/lib64/samba/:
...
libutil-tdb-samba4.so => /usr/lib64/samba/libutil-tdb-samba4.so
(0x00007f3138760000)
libsamba-sockets-samba4.so =>
/usr/lib64/samba/libsamba-sockets-samba4.so (0x00007f3138548000)
...
$ ldd /usr/bin/mplayer | grep samba | wc -l
54
--
С уважением,
Виталий Липатов,
Etersoft
Подробная информация о списке рассылки Devel