SpecTips/ReqProvFilter

Материал из ALT Linux Wiki

(Различия между версиями)
Перейти к: навигация, поиск
м (переименовал «SpecTips/FiltrProvides» в «SpecTips/ReqProvFilter»: re{adability,write})
м (Отмена правки 17921 участника MichaelShigorin (обсуждение))
Строка 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] -- предлагаются (если правильно понял) макросы:
-
%filter_from_requires /^debug.*(libodbc.*\.so)/s/\.so)/.so.1)/
+
:<pre>%define NotRequires() %global __find_requires /usr/lib/rpm/filter.sh `echo "%*"` -- %__find_requires
 +
%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
-
$ echo 'libodbc.so()(64bit) >= set:xxx' |sed 's/^\(lib.*odbc.*\.so\)\((.*\)\? >= \(.*\)/\1\2 \1.1\2 >= \3/'
+
%NotProvides perl(PerlIO/gzip.pm)</pre>
-
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>

Версия 19:31, 15 февраля 2011

Freesource-logo.png Blue Glass Arrow.svg MediaWiki logo.png
Эта страница была перемещена с freesource.info.
Эта страница наверняка требует чистки и улучшения — смело правьте разметку и ссылки.
Просьба по окончанию убрать этот шаблон со страницы.


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

Пока нашёл следующие:

  1. [devel %NotRequires/%NotProvides RPM macros] -- предлагаются (если правильно понял) макросы:
%define NotRequires() %global __find_requires /usr/lib/rpm/filter.sh `echo "%*"` -- %__find_requires 

%define NotProvides() %global __find_provides /usr/lib/rpm/filter.sh `echo "%*"` -- %__find_provides

Примеры использования:

%NotRequires perl(warnings.pm) libz.so.1

%NotProvides perl(PerlIO/gzip.pm)
Где /usr/lib/rpm/filter.sh:
#!/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

NB: /usr/lib/rpm/filter.sh в комплекте не поставляется


  1. [Python-devel К вопросу о новых фичах в rpm-build-python] -- цитата:
Как показали эксперименты, способ вида 

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)


PS: altbug:8093


> 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//
 
Личные инструменты