[devel] renoarch: noarch.rpm -> src.rpm
Michael Shigorin
mike на altlinux.org
Вт Июл 19 14:26:48 MSK 2022
On Sun, Nov 14, 2021 at 12:38:49AM +0300, Dmitry V. Levin wrote:
> > В процессе обновления ruby в sisyphus_e2k (в 2.5.x-alt сильно
> > усложнились межпакетные зависимости и базовая сборочная система
> > с rpm-build-ruby) наконец надоело писать одноразовые спеки
> > руками по шаблону, сделал для такого скриптик; прилагаю,
> > вдруг ещё кому пригодится.
> >
> > Применил так (запускать стоит в доступном на запись каталоге,
> > куда будут отложены спеки):
> > $ rpmbuild -bs --nodeps --sign --define '_sourcedir %homedir/p10/noarch/RPMS' `renoarch ~/p10/noarch/RPMS/bundle-2.1.4-alt1.noarch.rpm ~/p10/noarch/RPMS/irb-2.7.3-alt1.3.noarch.rpm ~/p10/noarch/RPMS/rdoc-6.1.1-alt3.noarch.rpm ~/p10/noarch/RPMS/ri-6.1.1-alt3.noarch.rpm`
Это всё-таки морока -- дописал при очередной надобности пару строк,
чтоб целевые noarch.rpm в %_sourcedir укладывались, если ещё не.
> Если что, совершенно непонятно, какая задача решается.
Перекликается с задумками по команде upload.
В основном такая задача попадается при бутстрапах:
в сизифе наработаны какие-то noarch.rpm, которые,
когда ты до них добрался, уже связаны не всегда
очевидной цепочкой действий (изменения в спеках,
макропакетах, порой транзакционно завязанные
друг за дружку); чтобы снизить потери времени при
воспроизведении, берём эти noarch.rpm "как есть",
но чтобы формально выполнить сборку в girar --
заворачиваем их как Source: в srpm и разворачиваем.
--
---- WBR, Michael Shigorin / http://altlinux.org
------ http://opennet.ru / http://anna-news.info
----------- следующая часть -----------
#!/bin/bash
#
# turn a noarch package into srpm that "builds" into it again,
# but without the actual build process -- effectively to get rid
# of the need for BuildRequires during bootstraps; typical use:
# $ rpm -bs --nodeps $(renoarch this.noarch.rpm)
# (--define '_sourcedir /path/to/noarch/RPMS' might be useful too)
#
# NB: scripts/triggers not carried over [so far]
[ -s "$1" ] || exit 1
# mark those; mandates release bump afterwards (NB: .re > .1)
SUF=".re"
q() { rpm -qp --qf="$1" "$2"; }
repackage() {
rpm -qp "$1" >&/dev/null || exit 2
OUT="$(basename "$1")"
OUT="${OUT%.rpm}.spec"
export LANG=C.UTF-8
read N V R < <(q '%{name}\t%{version}\t%{release}\n' "$1")
read E < <(q '%{epoch}\n' "$1"); E="${E/(none)/}"
read S < <(q '%{summary}\n' "$1")
read L < <(q '%{license}\n' "$1")
#read G < <(q '%{group}\n' "$1") # unused
#read D < <(q '%{description}\n' "$1") # unused
P="$(rpm --eval '%packager')"
P="${P/\%packager/Renoar C.H. <renoarch на localhost>}"
{
cat << EOF
# bootstrap spec generated by $(basename "$0") on $(date +%Y-%m-%d)
Name: $N
Version: $V
Release: $R$SUF
EOF
[ -z "$E" ] ||
cat << EOF
Epoch: $E
EOF
cat << EOF
Summary: piggyback the needed %name version
License: $L
Group: Development/Other
Source: $(basename "$1")
BuildArch: noarch
AutoReqProv: no
EOF
{
rpm -qp --requires "$1" |
grep -v '^rpmlib' |
sed 's,^,Requires: ,'
echo
rpm -qp --provides "$1" |
sed 's,^,Provides: ,'
} | sed 's,:[^ ].*$,,' # drop disttag
[ -z "$SUF" ] ||
cat << EOF
Provides: $N = ${E:+$E:}$V-$R
EOF
cat << EOF
%description
%summary
%prep
%setup -cT
rpm2cpio %SOURCE0 | cpio -id
%build
# any "corrective" action here
%install
cp -a . %buildroot
%files
EOF
rpm -qlp "$1" | grep -v "^("
cat << EOF
%changelog
* $(date '+%a %b %d %Y') $P ${E:+$E:}$V-$R$SUF
- bootstrap package
EOF
} > "$OUT" && echo "$OUT" || rm "$OUT"
SD="$(rpm --define "name $N" --eval '%_sourcedir')"
S="$SD/$(basename "$1")"
[ -f "$S" ] || install -pDm644 "$1" "$S"
} # repackage
for i in "$@"; do repackage "$i"; done
Подробная информация о списке рассылки Devel