SpecTips/ReqProvFilter: различия между версиями

Материал из ALT Linux Wiki
м (более точная категория)
(rewrite based on devel@)
Строка 1: Строка 1:
[[Category:RPM spec]]
[[Category:RPM spec]]
{{MovedFromFreesourceInfo|AltLinux/Sisyphus/devel/SpecTips/FiltrProvides}}


== Фильтрация Provides/Requires ==
== Фильтрация Provides/Requires ==


Пока нашёл следующие:
Сильнодействующее средство:
%filter_from_requires /^debug.*(libodbc.*\.so)/d


# [http://lists.altlinux.ru/pipermail/devel/2004-May/011087.html [devel] %NotRequires/%NotProvides RPM macros] -- предлагаются (если правильно понял) макросы:
Его можно улучшить:
:<pre>%define NotRequires() %global __find_requires /usr/lib/rpm/filter.sh `echo "%*"` -- %__find_requires
%filter_from_requires /^debug.*(libodbc.*\.so)/s/\.so)/.so.1)/
%define NotProvides() %global __find_provides /usr/lib/rpm/filter.sh `echo "%*"` -- %__find_provides


Примеры использования:
Вот другой рецепт, который может пригодиться:
%filter_from_requires s/^\(lib.*odbc.*\.so\)\((.*\)\? >= \(.*\)/\1\2 \1.1\2 >= \3/


%NotRequires perl(warnings.pm) libz.so.1
Пример проверки:
%NotProvides perl(PerlIO/gzip.pm)</pre>
$ echo 'libodbc.so()(64bit) >= set:xxx' |sed 's/^\(lib.*odbc.*\.so\)\((.*\)\? >= \(.*\)/\1\2 \1.1\2 >= \3/'
:
libodbc.so()(64bit) libodbc.so.1()(64bit) >= set:xxx
:Где <tt>/usr/lib/rpm/filter.sh</tt>:
  $
:<pre>#!/bin/sh -e
 
while :; do
case "$1" in
--) shift; break
;;
*) patterns="$1
$patterns"
shift
;;
esac
done
 
strings=`"$@"`
 
echo "$strings" | while read string; do
if [ -z "$string" ]; then
continue
fi
echo "$patterns" | {
match=
while read pattern; do
if [ -z "$pattern" ]; then
continue
fi
if [ -z "${string##$pattern}" ]; then
match=1
break
fi
if [ -z "${string##$pattern *}" ]; then
match=1
break
fi
done
if [ -z "$match" ]; then
echo "$string"
fi
}
done</pre>
 
''NB: <tt>/usr/lib/rpm/filter.sh</tt> в комплекте не поставляется''
 
 
# [http://lists.altlinux.ru/pipermail/python-devel/2005-June/000112.html [Python-devel] К вопросу о новых фичах в rpm-build-python] -- цитата:
:<pre>Как показали эксперименты, способ вида
 
Provides: $(find_provides /usr/lib/python2.4/site-packages/_xmlplus | sed -e "s/_xmlplus/xml/g" )
не прокатил. К сожалению.
Так как поля означиваются до выполнения операции install.
 
Тем не менее, если это действительно ценно только для PyXML ^), и по крмре на некий переходный
периол (пока не пропатчим соотв. пакеты) можно сделать так:
 
find_povides /usr/lib/python2.4/site-packages/_xmlplus | sed -e "s/_xmlplus/xml/g" >PyXML-X.X.X-provides.lst
 
SourceN: PyXML-X.X.X-provides.lst
Provides: $(cat %SOURCEN)</pre>
 
 
PS: [[altbug:8093]]
 
 
<pre>> Valentin Lavrinenko wrote:
 
> > формулировал, не знаю. Дело в том, что у меня вылазит зависимость,
> > которой вроде бы быть не должно, и от которой я очень хочу избавиться.
> Сам нашел, как это сделать, делюсь опытом:
> $ rpm -bp <spec>
> $ rpm -bc <spec>
> // что должно быть в <buildroot>? Я написал ~/RPM/BUILD/<project>,
> сработало...
> $ export RPM_BUILD_ROOT=<buildroot>
> $ export RPM_FINDREQ_METHOD=all
> $ find ~/RPM/BUILD/<project> | /bin/sh -x /usr/lib/rpm/find-requires
> >~/log 2>&1
> После чего ищем в логе интересующую нас зависимость и
> где-то перед ней видим, какой файл ее породил.
>
 
 
$ RPM_SCRIPTS_DEBUG=1 rpmbuild -bi specfile &>logfile
- включает трассировку скриптов, которые вычисляют зависимости.
//ldv//</pre>

Версия от 22:24, 15 февраля 2011


Фильтрация Provides/Requires

Сильнодействующее средство:

%filter_from_requires /^debug.*(libodbc.*\.so)/d

Его можно улучшить:

%filter_from_requires /^debug.*(libodbc.*\.so)/s/\.so)/.so.1)/

Вот другой рецепт, который может пригодиться:

%filter_from_requires s/^\(lib.*odbc.*\.so\)\((.*\)\? >= \(.*\)/\1\2 \1.1\2 >= \3/

Пример проверки:

$ echo 'libodbc.so()(64bit) >= set:xxx' |sed 's/^\(lib.*odbc.*\.so\)\((.*\)\? >= \(.*\)/\1\2 \1.1\2 >= \3/'
libodbc.so()(64bit) libodbc.so.1()(64bit) >= set:xxx
$