[devel] I: autoreqs in %_python3_path vs %_python3_compile_include

Ivan Zakharyaschev imz на altlinux.org
Вс Май 8 18:23:50 MSK 2016


On Sun, 8 May 2016, Ivan Zakharyaschev wrote:

> Кортко мои рекомендайии сейчас такие:
>
> Чтобы включить Python3 в нестандартных местах, добавляйте его в 
> %_python3_path .
>
> Чтобы отключить автокомпиляцию, добавляйте путь в %_python3_compile_exclude .
>
> Чтобы отключить автопоиск зависимостей (или Provides), есть (соответственно) 
> %_findreq_skiplist (или %_findprov_skiplist).
>
> А %_python3_compile_include более внутренняя вещь, использовать не 
> рекомендуется. Разница по сравнению с %_python3_path будет теперь в том, что 
> питоновские автозависимости там не будут искаться. (Если нет других причин 
> для этого, например, это не %_python3_path.)

%_python3_compile_exclude из _include исключается (например, при 
обнаружении Provides, которых не жалко лишних досыпать, или зависимости на 
python3-ABI). Спасибо aris@ за сообщение об ошибке в этом коде, которая 
проявилась при сборке gedit. (Мало кто из пакетов пользуется 
%_python3_compile_include.)

> На примере gedit:
>
> (Ещё одно пояснение: множества рядом с питоновскими завсимостями -- это 
> множество нестандартных путей, по которым разрешено удовлетворять 
> зависимость; т.е. чем больше множество, тем в большем кол-ве мест разрешено 
> её искать; если только стандартные пути разрешены, то < 0 . Если у Provides 
> нет множество, оно сможет удовлетворить любую зависимость. Это модуль по 
> стандартному пути. Если есть множество -- здесь, в случае Provides, на самом 
> деле, из одного элемента -- то удовлетворить соотвтетствующий Requires с < 0 
> не сможет, а сможет, если только поппадёт в множество нестандартных 
> разрешёёных у соотв. Requires путей.)

Так что в отличие от версий тут непривычно то, что меньшее множество у 
Provides круче -- может удовлетворить больше требований. (Обычно большая 
версия круче и может удовлетворить больше требований.) Развернуть знаки и 
всю эту булеву алебру, конечно, возможно теоретически, но не очень 
понятно, как бы мы тогда записывали самый крутой элемент. Сейчас просто по 
смыслу это минимальное, т.е. пустое, множество. И его изобразить по смыслу 
в Requires, не меняя форму большинства стандартных Provides, было просто.

> Теперь можно использовать %%_python3_path вместо %%_python3_compile_include 
> -- 
> http://git.altlinux.org/people/imz/packages/gedit.git?p=gedit.git;a=commitdiff;h=85f11c9e317be5f12f067a6c07b0978f94764bad 
> (при попытке навести порядок с autoreqs/provs сделал отличие, что в 
> %%_python3_path питоновские зависимости ищутся, а в 
> %%_python3_compile_include -- нет. Раньше по ошибке была такая ситуация, что 
> они искались абы как: какие-то файлы считались Python3, какие-то нет, 
> довольно случайно. Т.е. у кого-то чего-то не хватало, и это устраивало. А эти 
> две переменные имели одинаковый эффект. Теперь, когда файлов выбирается 
> больше, предусмотрел вариант такой ручки для тех, у кого раньше что-то не 
> находилось и так устраивало.) С gedit всё нормально с полным поиском, я 
> проверил сборку и так, и так. Ещё там адаптации spec-а, чтобы gear мог 
> собирать -- 
> http://git.altlinux.org/people/imz/packages/gedit.git?p=gedit.git;a=log , 
> если интересно.

> С изменением на %_python3_path -- по-старому:
>
> [imz на basalt RPMS.hasher]$ for f in gedit-3.20.1-alt1.1.x86_64.rpm; do 
> TERM=dumb compare_packages -a --requires  -- 
> /ALT/Sisyphus/x86_64/RPMS.classic/"$f" -- "$f" ; done
> WARNING: terminal is not fully functional
> --- /tmp/.private/imz/compare_packages.sldjeD9soJ/1     2016-05-08 
> 17:18:14.995541561 +0300
> +++ /tmp/.private/imz/compare_packages.sldjeD9soJ/2     2016-05-08 
> 17:18:15.005541511 +0300
> @@ -28,26 +28,25 @@
>  libpthread.so.0(GLIBC_2.2.5)(64bit)
>  libxml2.so.2()(64bit) >= 
> set:okF4idxwhMYlKufqO128vgLfSEGptPVPyDTbElmLK1puQ
> libxml2.so.2(LIBXML2_2.4.30)(64bit)
> -python3(codecs)
> -python3(fcntl)
> -python3(fnmatch)
> -python3(functools)
> -python3(hashlib)
> -python3(inspect)
> -python3(locale)
> -python3(platform)
> -python3(re)
> -python3(shutil)
> -python3(signal)
> -python3(string)
> -python3(subprocess)
> -python3(tempfile)
> -python3(traceback)
> -python3(weakref)
> -python3(xml)
> +python3(codecs) <= set:fea00
> +python3(fcntl) <= set:fea00
> +python3(fnmatch) <= set:fea00
> +python3(functools) <= set:fea00
> +python3(hashlib) <= set:fea00
> +python3(inspect) <= set:fea00
> +python3(locale) <= set:fea00
> +python3(platform) <= set:fea00
> +python3(re) <= set:fea00
> +python3(shutil) <= set:fea00
> +python3(signal) <= set:fea00
> +python3(string) <= set:fea00
> +python3(subprocess) <= set:fea00
> +python3(tempfile) <= set:fea00
> +python3(traceback) <= set:fea00
> +python3(weakref) <= set:fea00
> +python3(xml) <= set:fea00
>  python3.5-ABI(64bit)
>  rpmlib(PayloadIsLzma)
> -rpmlib(SetVersions)
>  rtld(GNU_HASH)
>  typelib(GLib)
>  typelib(GObject)
> [imz на basalt RPMS.hasher]$

Обращает на себя внимание несовпадение вида ограничений у Requires и того, 
что у Provides. Стал проверять -- работает-то правильно, это равные 
множества:

$ /usr/lib/rpm/setcmp ed50 fea00
0
[imz на ovicaa ~]$ /usr/lib/rpm/setcmp fea00 ed50
0
$ echo /usr/lib64/gedit/plugins | /usr/lib/rpm/mkset 11
set:ed50
$ echo /usr/lib64/gedit/plugins | /usr/lib/rpm/mkset 12
set:fea00
$

Возможно, когда подсчитывается необходимое кол-во бит (по примеру 
lib.req), я не удаляю дубликаты в пути в одном из этих случаев. (Стоит 
поправить, но не критично.)

> Про Provides в нестандартных путях:
>
> [imz на basalt RPMS.hasher]$ fgrep non-std  ~/wip/gedit/gear-hsh.excl.log.1
> /usr/src/tmp/gedit-buildroot/usr/lib64/gedit/plugins/externaltools/__init__.py 
> provides python3(externaltools) (under non-std path /usr/lib64/gedit/plugins)

> [imz на basalt RPMS.hasher]$ for f in gedit-3.20.1-alt1.1.x86_64.rpm; do 
> TERM=dumb compare_packages -a --provides  -- 
> /ALT/Sisyphus/x86_64/RPMS.classic/"$f" -- "$f" ; done
> WARNING: terminal is not fully functional
> --- /tmp/.private/imz/compare_packages.gyI8myKUIW/1     2016-05-08 
> 17:46:45.020000970 +0300
> +++ /tmp/.private/imz/compare_packages.gyI8myKUIW/2     2016-05-08 
> 17:46:45.027000936 +0300
> @@ -1,3 +1,43 @@
> gedit = 3.20.1-alt1.1
> +python3(externaltools) = set:ed50
> +python3(externaltools.appactivatable) = set:ed50
> +python3(externaltools.capture) = set:ed50
> +python3(externaltools.filelookup) = set:ed50
> +python3(externaltools.functions) = set:ed50
> +python3(externaltools.library) = set:ed50
> +python3(externaltools.linkparsing) = set:ed50
> +python3(externaltools.manager) = set:ed50
> +python3(externaltools.outputpanel) = set:ed50
> +python3(externaltools.windowactivatable) = set:ed50
> python3(gedit)
> +python3(libdocinfo) = set:ed50
> +python3(libfilebrowser) = set:ed50
> +python3(libmodelines) = set:ed50
> +python3(libsort) = set:ed50
> +python3(libspell) = set:ed50
> +python3(libtime) = set:ed50
> +python3(pythonconsole) = set:ed50
> +python3(pythonconsole.config) = set:ed50
> +python3(pythonconsole.console) = set:ed50
> +python3(quickopen) = set:ed50
> +python3(quickopen.popup) = set:ed50
> +python3(quickopen.virtualdirs) = set:ed50
> +python3(snippets) = set:ed50
> +python3(snippets.appactivatable) = set:ed50
> +python3(snippets.completion) = set:ed50
> +python3(snippets.document) = set:ed50
> +python3(snippets.exporter) = set:ed50
> +python3(snippets.helper) = set:ed50
> +python3(snippets.importer) = set:ed50
> +python3(snippets.languagemanager) = set:ed50
> +python3(snippets.library) = set:ed50
> +python3(snippets.manager) = set:ed50
> +python3(snippets.parser) = set:ed50
> +python3(snippets.placeholder) = set:ed50
> +python3(snippets.shareddata) = set:ed50
> +python3(snippets.signals) = set:ed50
> +python3(snippets.singleton) = set:ed50
> +python3(snippets.snippet) = set:ed50
> +python3(snippets.substitutionparser) = set:ed50
> +python3(snippets.windowactivatable) = set:ed50
> python3.3(gedit)
> [imz на basalt RPMS.hasher]$
>
> Может пригодиться. (Возникло на самом деле не столько из желания иметь такую 
> фичу, а из необходимости навести порядок со списком файлов, в которых ищутся 
> авто-Provides/Requires. Как я говорил, оно было абы как: большая часть файлов 
> не попадала, потому что считалась Python2, при этом часть из нестандартных 
> путей всё равно могла попасть. Так что если их оставлять при более тщательном 
> обширном составлении списка, то их надо было как-то специально оформить, 
> чтобы они не обманывали тех, что использует только стандартные пути.)
>
> -- 
> Best regards,
> Ivan
>


Подробная информация о списке рассылки Devel