ALT Linux Team development discussions
 help / color / mirror / Atom feed
* [devel] I: Утилита buildreq-src
@ 2016-03-14 16:40 Igor Vlasenko
  2016-03-15  7:23 ` Andrey Cherepanov
  0 siblings, 1 reply; 28+ messages in thread
From: Igor Vlasenko @ 2016-03-14 16:40 UTC (permalink / raw)
  To: devel

Утилита buildreq-src
____________________

Утилита живет сейчас в пакете perl-RPM-Source-Dependency-Analyzer.
Однако так как ранее она уже кочевала из пакета в пакет,
ее лучше устанавливать как
apt-get install /usr/bin/buildreq-src

Утилиту можно использовать как при создании пакета,
так и при сопровождении пакета.

Создание пакета.
_______________

При создании пакета у нас есть только исходники.
Их и передадим утилите.

Это может быть 

* архив исходников
buildreq-src ../SOURCES/lbreakout2-2.6.5.tar.gz

* каталог с распакованными исходниками
buildreq-src ../BUILD/lbreakout2-2.6.5

* или даже отдельные файлы:
buildreq-src ../BUILD/lbreakout2-2.6.5/configure.ac

Запустим, к примеру, buildreq-src с архивом исходников.

$ buildreq-src ../SOURCES/lbreakout2-2.6.5.tar.gz

утилита выведет найденные сборочные зависимости:

# BEGIN SourceDeps(oneline):
BuildRequires: libSDL-devel libSDL_mixer-devel libSDL_net-devel libpng-devel zlib-devel
# END SourceDeps(oneline)

Их можно вручную вставить в spec файл.
Однако утилита и сама может сделать это, если ей дать еще и spec файл.

Сопровождение пакета.
_____________________

Утилита buildreq-src не работает напрямую c src.rpm пакетом.
его надо сначала установить:
rpm -i ../SRPMS/lbreakout2-2.6.5-alt1.src.rpm
В gear git репозитории обычно уже ничего делать не нужно,
и спек файл, и каталог с распакованными исходниками уже 
под рукой.

Опять запустим buildreq-src, дополнительно передав 
ей spec файл опцией --spec <путь>.
С опцией --spec buildreq-src только прочитает spec файл.
Никаких изменений в spec файле не произойдет.

buildreq-src --spec lbreakout2.spec ../SOURCES/lbreakout2-2.6.5.tar.gz 

На этот раз утилита выведет более короткий список:

# BEGIN SourceDeps(oneline):
BuildRequires: libSDL_net-devel zlib-devel
# END SourceDeps(oneline)

Этот список -- разность между сборочными зависимостями
пакета lbreakout2, найденными утилитой buildreq-src,
и сборочными зависимостями пакета, прописанными в его
спек файле.

Список не пустой --- buildreq-src для lbreakout2
нашла две зависимости для lbreakout2, которые не
указаны в спек файле: libSDL_net-devel и zlib-devel.

Отсутствие zlib-devel не имело последствий, так как
в итоге lbreakout2 все равно слинковался с -lz.
Ее в итоге вытянула какая-то из других зависимостей.
Однако поскольку lbreakout2 явно линкуется с zlib,
то zlib-devel лучше добавить в BuildRequires явно.
Сегодня она неявно вытягивается по зависимостям, 
а завтра может и не вытянуться. Тогда сборка сломается,
или, что еще хуже, пакет молча соберется но потеряет
часть функциональности -- не сможет работать 
со сжатыми данными.

С libSDL_net-devel проблема немножко серьезнее.
lbreakout2 собирается и без libSDL_net-devel,
но у lbreakout2 есть режим сетевой игры.
для которого libSDL_net-devel и нужен.

Эту ситуацию я называю недособранным пакетом.
В 99% случаев имеющейся функциональности lbreakout2 достаточно,
но если вдруг пришли бы к ребенку гости и дети захотели бы 
попробовать по сети сыграть, то --enable-network
был бы кстати.

buildreq-src -bp
________________

Имеющиеся патчи могут существенно изменить пакет,
в частности, поменять его сборочные зависимости.
Поэтому имеет смысл запускать утилиту уже на 
правленные исходники. Для удобства, в 
buildreq-src есть опция -bp, которая как раз это 
и делает: вызывает rpmbuild -bp <name>.spec,
затем напускает buildreq-src на %builddir.

$ buildreq-src -bp lbreakout2.spec
Выполняется(%prep): /bin/sh -e /tmp/rpm-tmp.83798
+ umask 022
+ /bin/mkdir -p /home/RPM/BUILD
+ cd /home/RPM/BUILD
+ cd /home/RPM/BUILD
+ rm -rf lbreakout2-2.6.5
+ echo 'Source #0 (lbreakout2-2.6.5.tar):'
Source #0 (lbreakout2-2.6.5.tar):
+ /bin/tar -xf -
+ cd lbreakout2-2.6.5
+ /bin/chmod -c -Rf u+rwX,go-w .
+ exit 0
# BEGIN SourceDeps(oneline):
BuildRequires: libSDL_net-devel zlib-devel
# END SourceDeps(oneline)


Секция BEGIN/END SourceDeps
___________________________

Если все найденные зависимости уже есть в spec файле,
buildreq-src выдаст сообщение 

buildreq-src: c2050.spec already contains all found dependencies

если каких-то зависимостей нет, то они будут выведены в виде

# BEGIN SourceDeps(oneline):
BuildRequires: libSDL_net-devel zlib-devel
# END SourceDeps(oneline)

здесь "# BEGIN SourceDeps(oneline):" и "# END SourceDeps(oneline)" --
волшебные комментарии.

BuildRequires: libSDL_net-devel zlib-devel, 
которые нашла buildreq-src, можно вставить 
в lbreakout2.spec руками. Однако если добавить 
опцию --update (примеры вызова:)

buildreq-src --update --spec lbreakout2.spec ../SOURCES/lbreakout2-2.6.5.tar.gz 
buildreq-src --update -bp lbreakout2.spec

то buildreq-src вставит в lbreakout2.spec фрагмент
# BEGIN SourceDeps(oneline):
BuildRequires: libSDL_net-devel zlib-devel
# END SourceDeps(oneline)
как раз в окружении волшебных комментариев.

Эти комментарии очень важны: они позволяют организовать
полуавтоматическое обновление сборочных зависимостей пакета.

Работает оно следующим образом: без опции --update
buildreq-src вообще не трогает пакет. С опцией --update
buildreq-src правит только то, что находится между
# BEGIN SourceDeps(oneline): 
и 
# END SourceDeps(oneline)
Все, что вне, считается неприкосновенным.

Как это работает: пусть у нас в lbreakout2.spec вручную вписано

BuildRequires: libSDL-devel libSDL_mixer-devel
BuildRequires: libpng-devel zlib-devel

и в новой версии lbreakout2 переехал на libSDL2.
Вызовем buildreq-src --update ...
утилита вставит в спек новые найденные зависимости
# BEGIN SourceDeps(oneline):
BuildRequires: libSDL2-devel libSDL2_mixer-devel libSDL2_net-devel
# END SourceDeps(oneline)
но старые устаревшие 
BuildRequires: libSDL-devel libSDL_mixer-devel
останутся, так как они внесены вручную, а майнтайнер всегда прав.

Если же в спеке было
# BEGIN SourceDeps(oneline):
BuildRequires: libSDL-devel libSDL_mixer-devel libSDL_net-devel
# END SourceDeps(oneline)
то после вызова buildreq-src --update ...
# BEGIN SourceDeps(oneline):
BuildRequires: libSDL2-devel libSDL2_mixer-devel libSDL2_net-devel
# END SourceDeps(oneline)
т.е. новые автонайденные зависимости перезапишут собой старые
автонайденные зависимости и старые устаревшие зависимости
libSDL-devel libSDL_mixer-devel удалятся из спека.

В итоге получается
полуавтоматическое обновление сборочных зависимостей пакета.

Формат найденных зависимостей.
______________________________
По умолчанию,  buildreq-src там, где можно, пытается вывести найденные
зависимости в пакетнонезависимом формате, так, как они упоминаются в тексте:

# BEGIN SourceDeps(oneline):
BuildRequires: /usr/bin/glib-gettextize perl(GD/Text/Wrap.pm) pkgconfig(cairo)
# END SourceDeps(oneline)
Это поведение можно изменить, указав  
 --sourcedep-resolve=all
или, что то же самое
 --sourcedep-resolve=path,perl,pkgconfig
получим более привычные
# BEGIN SourceDeps(oneline):
BuildRequires: glib2-devel perl-GD-Text libcairo-devel
# END SourceDeps(oneline)


В следующем письме алгоритм работы утилиты,
известные баги и фичи. Содержание:

в силу самого своего алгоритма 
buildreq-src сожет зачерпнуть (и зачерпывает) и реально не нужные,
лишние зависимости. Как их распознать и как с этим бороться.
Как помочь утилите, когда она не справляется.
Продолжение следует.



-- 

I V


^ permalink raw reply	[flat|nested] 28+ messages in thread

end of thread, other threads:[~2016-03-17 14:06 UTC | newest]

Thread overview: 28+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-03-14 16:40 [devel] I: Утилита buildreq-src Igor Vlasenko
2016-03-15  7:23 ` Andrey Cherepanov
2016-03-15 13:32   ` Igor Vlasenko
2016-03-16  4:23     ` Hihin Ruslan
2016-03-16  7:55       ` Anton V. Boyarshinov
2016-03-16  8:10         ` Sergey V Turchin
2016-03-16  8:18           ` Sergey V Turchin
2016-03-16  8:21             ` Anton Farygin
2016-03-16 10:17               ` Sergey V Turchin
2016-03-16 10:27                 ` Igor Vlasenko
2016-03-16 10:36                   ` Sergey V Turchin
2016-03-16 10:40                     ` Igor Vlasenko
2016-03-16 10:53                       ` Sergey V Turchin
2016-03-16 22:01                         ` [devel] Утилита buildreq-src и KF5 Igor Vlasenko
2016-03-17  8:13                           ` Sergey V Turchin
2016-03-17 10:28                             ` Igor Vlasenko
2016-03-17 11:00                               ` Sergey V Turchin
2016-03-16 10:18               ` [devel] I: Утилита buildreq-src Igor Vlasenko
2016-03-16 10:24                 ` Sergey V Turchin
2016-03-16 10:36                   ` Igor Vlasenko
2016-03-16 10:42                     ` Sergey V Turchin
2016-03-16  9:46           ` Igor Vlasenko
2016-03-16 10:12             ` Хихин Руслан
2016-03-16 10:22               ` Igor Vlasenko
2016-03-16 13:40                 ` Anton Farygin
2016-03-17 14:06                   ` [devel] ужасные исходники [ I: Утилита buildreq-src] Igor Vlasenko
2016-03-16  8:49       ` [devel] I: Утилита buildreq-src Igor Vlasenko
2016-03-16  9:03         ` Anton V. Boyarshinov

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git