[devel] rpm-build-python 0.30-alt1

Alexey M. Tourbin =?iso-8859-1?q?at_=CE=C1_altlinux=2Eorg?=
Ср Мар 21 12:29:07 MSK 2007


Я подготовил новую сборку rpm-build-python.

    0.30-alt1
    
    - python.req.py:
      + fixed a bug in "import" clause analysis, due to which only
        the first dependency of multiple arguments was produced; i.e.
        Old result: 'import os, re' -> Requires: python2.4(os)
        New result: 'import os, re' -> Requires: python2.4(os), python2.4(re)
      + made it fail on import errors (also python.prov.py)
      + made it print stderr diagnostics when the dependency is being ignored
      + disabled .py suffix check, for the sake of plain python scripts
    - added dependency on python-base, so that python.req.py and python.prov.py
      always work (also explained this change in policy/5-Python_FAQ.txt)
    - added buildreq skiplist and placed LC_ALL=C as needed in order to avoid
      dumb dependency on encoding modules when e.g. evaluating %%__python_version
    - added new files, for possible use with future rpm-build releases:
      + python.req (python.prov) - wrapper for python.req.py (resp. python.prov.py)
      + python.req.files (.prov.files) - will select python files for req/prov
      + /etc/rpm/macros.d/python.env - piece of rpm-build scriplets' preamble
      + also placed rpm-build python macros to /etc/rpm/macros.d/python

$ git-diff origin.. |iconv -f utf8
diff --git a/.exrc b/.exrc
new file mode 100644
index 0000000..1cf99a9
--- /dev/null
+++ b/.exrc
@@ -0,0 +1 @@
+set ts=8 sts=4 sw=4 et
diff --git a/rpm-build-python.spec b/rpm-build-python.spec
index ee5c39d..4c746d9 100644
--- a/rpm-build-python.spec
+++ b/rpm-build-python.spec
@@ -1,6 +1,6 @@
 Name: rpm-build-python
-Version: 0.29
-Release: alt5
+Version: 0.30
+Release: alt1
 
 # redefine python_libdir for 0.29.alt2 is buggy 
 %define python_libdir %_target_libdir/python%__python_version
@@ -14,6 +14,7 @@ BuildArch: noarch
 Packager: Python Development Team <python на packages.altlinux.org>
 
 Requires: rpm-build >= 0:4.0.4-alt39
+Requires: python-base >= 2.4.4-alt8
 BuildRequires: python, rpm-build >= 0:4.0.4-alt39
 AutoReqProv: yes, nopython
 
@@ -37,9 +38,15 @@ subst 's/@PYTHON_VERSION@/%__python_version/g' python
 
 %install
 install -pD -m644 python %buildroot%_sysconfdir/rpm/macros.d/python
-install -pD -m755 python.prov.py %buildroot%_target_libdir/rpm/python.prov.py
-install -pD -m755 python.req.py %buildroot%_target_libdir/rpm/python.req.py
-install -pD -m755 python.compileall.py %buildroot%_target_libdir/rpm/python.compileall.py
+install -pD -m644 python.env %buildroot%_sysconfdir/rpm/macros.d/python.env
+install -pD -m644 python.buildreq %buildroot%_sysconfdir/buildreqs/files/ignore.d/%name
+install -pD -m755 python.prov %buildroot%_rpmlibdir/python.prov
+install -pD -m755 python.prov.py %buildroot%_rpmlibdir/python.prov.py
+install -pD -m755 python.prov.files %buildroot%_rpmlibdir/python.prov.files
+install -pD -m755 python.req %buildroot%_rpmlibdir/python.req
+install -pD -m755 python.req.py %buildroot%_rpmlibdir/python.req.py
+install -pD -m755 python.req.files %buildroot%_rpmlibdir/python.req.files
+install -pD -m755 python.compileall.py %buildroot%_rpmlibdir/python.compileall.py
 install -pd -m755 %buildroot%python_tooldir/rpm-build
 install -pD -m644 bdist_altrpm.py %buildroot%_libdir/python%__python_version/distutils/command/bdist_altrpm.py
 install -pD -m755 tools/*py %buildroot%python_tooldir/rpm-build
@@ -55,9 +62,15 @@ unset RPM_PYTHON
 
 %files
 %_sysconfdir/rpm/macros.d/python
-%_target_libdir/rpm/python.compileall.py
-%_target_libdir/rpm/python.req.py
-%_target_libdir/rpm/python.prov.py
+%_sysconfdir/rpm/macros.d/python.env
+%_sysconfdir/buildreqs/files/ignore.d/%name
+%_rpmlibdir/python.compileall.py
+%_rpmlibdir/python.req
+%_rpmlibdir/python.req.py
+%_rpmlibdir/python.req.files
+%_rpmlibdir/python.prov
+%_rpmlibdir/python.prov.py
+%_rpmlibdir/python.prov.files
 %_libdir/python%__python_version/distutils/command/bdist_altrpm.py
 %doc python-module-SAMPLE.spec policy notes doc
 
@@ -66,6 +79,25 @@ unset RPM_PYTHON
 %python_tooldir/rpm-build
 
 %changelog
+* Wed Mar 21 2007 Alexey Tourbin <at на altlinux.ru> 0.30-alt1
+- python.req.py:
+  + fixed a bug in "import" clause analysis, due to which only
+    the first dependency of multiple arguments was produced; i.e.
+    Old result: 'import os, re' -> Requires: python2.4(os)
+    New result: 'import os, re' -> Requires: python2.4(os), python2.4(re)
+  + made it fail on import errors (also python.prov.py)
+  + made it print stderr diagnostics when the dependency is being ignored
+  + disabled .py suffix check, for the sake of plain python scripts
+- added dependency on python-base, so that python.req.py and python.prov.py
+  always work (also explained this change in policy/5-Python_FAQ.txt)
+- added buildreq skiplist and placed LC_ALL=C as needed in order to avoid
+  dumb dependency on encoding modules when e.g. evaluating %%__python_version
+- added new files, for possible use with future rpm-build releases:
+  + python.req (python.prov) - wrapper for python.req.py (resp. python.prov.py)
+  + python.req.files (.prov.files) - will select python files for req/prov
+  + /etc/rpm/macros.d/python.env - piece of rpm-build scriplets' preamble
+  + also placed rpm-build python macros to /etc/rpm/macros.d/python
+
 * Sat Jan 13 2007 Fr. Br. George <george на altlinux.ru> 0.29-alt5
 - (avm@) Search for .pth files in lib64, too
 - Minor policy fix
diff --git a/rpm-build-python/policy/5-Python_FAQ.txt b/rpm-build-python/policy/5-Python_FAQ.txt
index 27afd3d..591b4f5 100644
--- a/rpm-build-python/policy/5-Python_FAQ.txt
+++ b/rpm-build-python/policy/5-Python_FAQ.txt
@@ -306,7 +306,12 @@
                 регулярного обновление перла для сборочной среды, который
                 мне на хрен не нужен - я не нем не пишу так давно, что даже
                 его забыл.
-            
+
+            Замечание [Алексей Турбин, 2007-03-18]: вообще-то в базовой
+            сборочной среде присутствует только пакет perl-base, в развернутом
+            виде занимающий 3.5M.  Кроме того, зависимость на perl-base
+            присутствует в пакете basesystem.
+
         И, понимая то, что такие тендеции нарастают, я с ужасом думаю о
         сборочной среде содержащей все, от перла до tcl и от фортрана до
         ады. Я считаю правильным другой путь и им воспользовался.
@@ -319,7 +324,23 @@
             2.  В отсутствие каких-либо компонент python, необходимых для
                 работы, скрипты из пакета rpm-build-python завершаются
                 коррекно, но ничего не делают.
-                
+
+            Замечание [Алексей Турбин, 2007-03-18]: второй подход чреват
+            неприятными последствиями.  Поиск питоновских зависимостей
+            становится чувствительным к [ -x /usr/bin/python ] и наличию
+            необходимых модулей.  Можно даже представить себе ситуацию,
+            когда вследствие этого отключается поиск provides, а это уже
+            чревато unmet'ами в репозитарии.  В целом второй подход слишком
+            ненадежен, тогда как первый подход, действительно, требует внесения
+            лишних пакетов в базовую сборочную среду.  Я предлагаю следующее
+            решение: нарастить python-base модулями, достаточными для работы
+            python.req.py и python.prov.py (на самом деле не хватает всего трех
+            файлов - parser.so, token.py и symbol.py); и добавить зависимость
+            на такой python-base в rpm-build-python.  Наличие python-base
+            в базовой сборочной среде не должно никого сильно расстроить,
+            поскольку python-base в развернутом виде занимает чуть больше 2M.
+            Зато rpm-build-python будет работать надежно.
+
         Собственно исправление ошибки свелось к обеспечению выполнения
         условия-2. Я это проверил, на паре пакетов - они действительно
         раньше падали при сборке, тогда как теперь не падают.
diff --git a/rpm-build-python/python b/rpm-build-python/python
index 81db52c..af9a622 100644
--- a/rpm-build-python/python
+++ b/rpm-build-python/python
@@ -2,8 +2,25 @@
 # -*- coding: utf-8 -*-
 
 # Override __python_version macro provided by rpm-build 
-%__python_version	%(%__python -c 'import sys; print "%%u.%%u" %% sys.version_info[0:2]' 2>/dev/null || echo @PYTHON_VERSION@)
-
+%__python_version	%(LC_ALL=C %__python -c 'import sys; print "%%u.%%u" %% sys.version_info[0:2]' 2>/dev/null || echo @PYTHON_VERSION@)
+
+%_python_lib_path	""
+%_python_req_method	slight
+%_python_req_skip	""
+%_python_compile_method	ALL
+%_python_compile_exclude	/usr/share/doc
+%_python_compile_include	/usr/%_lib
+%_python_compile_deep	20
+%_python_compile_skip_x	1
+%_python_compile_clean	1
+
+%set_python_req_method()	%global _python_req_method %1
+%set_python_compile_method()	%global _python_compile_method %1
+
+%add_python_req_skip()	%global _python_req_skip %_python_req_skip %*
+%add_python_lib_path()	%global _python_lib_path %_python_lib_path %*
+%add_python_compile_exclude() %global _python_compile_exclude %_python_compile_exclude %*
+%add_python_compile_include() %global _python_compile_include %_python_compile_include %*
 
 # _check_python_version_internal <версия_с_точкой> <версия_без_точки>
 #
diff --git a/rpm-build-python/python.buildreq b/rpm-build-python/python.buildreq
new file mode 100644
index 0000000..4e323a7
--- /dev/null
+++ b/rpm-build-python/python.buildreq
@@ -0,0 +1,3 @@
+^/usr/.*/python.*/encodings/__init__\.py
+^/usr/.*/python.*/encodings/aliases\.py
+^/usr/.*/python.*/encodings/ascii\.py
diff --git a/rpm-build-python/python.env b/rpm-build-python/python.env
new file mode 100644
index 0000000..a046544
--- /dev/null
+++ b/rpm-build-python/python.env
@@ -0,0 +1,12 @@
+%{?_python_lib_path:export RPM_PYTHON_LIB_PATH="%_python_lib_path"}
+%{?_python_module_declared:export RPM_PYTHON_MODULE_DECLARED="%_python_module_declared"}
+%{?_python_req_hier:export RPM_PYTHON_REQ_HIER="%_python_req_hier"}
+%{?_python_req_method:export RPM_PYTHON_REQ_METHOD="%_python_req_method"}
+%{?_python_req_skip:export RPM_PYTHON_REQ_SKIP="%_python_req_skip"}
+%{?_python_compile_method:export RPM_PYTHON_COMPILE_METHOD="%_python_compile_method"}
+%{?_python_compile_exclude:export RPM_PYTHON_COMPILE_EXCLUDE="%_python_compile_exclude"}
+%{?_python_compile_include:export RPM_PYTHON_COMPILE_INCLUDE="%_python_compile_include"}
+%{?_python_compile_deep:export RPM_PYTHON_COMPILE_DEEP="%_python_compile_deep"}
+%{?_python_compile_skip_x:export RPM_PYTHON_COMPILE_SKIP_X="%_python_compile_skip_x"}
+%{?_python_compile_clean:export RPM_PYTHON_COMPILE_CLEAN="%_python_compile_clean"}
+%{?__python:export RPM_PYTHON="%__python"}
diff --git a/rpm-build-python/python.prov b/rpm-build-python/python.prov
new file mode 100755
index 0000000..309a1fd
--- /dev/null
+++ b/rpm-build-python/python.prov
@@ -0,0 +1,2 @@
+#!/bin/sh
+LC_ALL=C exec "${RPM_PYTHON:-python}" "$0".py ${1+"$@"}
diff --git a/rpm-build-python/python.prov.files b/rpm-build-python/python.prov.files
new file mode 100755
index 0000000..96db153
--- /dev/null
+++ b/rpm-build-python/python.prov.files
@@ -0,0 +1,11 @@
+#!/bin/sh -efu
+while IFS=$'\t' read -r f t; do
+	case "$f" in
+		*.py|*.pyo|*.pyc|*.pth)
+			echo "$f"
+			continue ;;
+		${RPM_BUILD_ROOT-}*/python*/*.so)
+			echo "$f"
+			continue ;;
+	esac
+done
diff --git a/rpm-build-python/python.prov.py b/rpm-build-python/python.prov.py
index 049506b..23dd79e 100755
--- a/rpm-build-python/python.prov.py
+++ b/rpm-build-python/python.prov.py
@@ -52,7 +52,7 @@ def paths_from_pthfiles(prefix, buildroot, filenames):
 try :
     import sys, os
 except :
-    pass
+    raise
 else :    
     prefix = "python%u.%u" % sys.version_info[0:2]
 
diff --git a/rpm-build-python/python.req b/rpm-build-python/python.req
new file mode 100755
index 0000000..309a1fd
--- /dev/null
+++ b/rpm-build-python/python.req
@@ -0,0 +1,2 @@
+#!/bin/sh
+LC_ALL=C exec "${RPM_PYTHON:-python}" "$0".py ${1+"$@"}
diff --git a/rpm-build-python/python.req.files b/rpm-build-python/python.req.files
new file mode 100755
index 0000000..bbbb4a6
--- /dev/null
+++ b/rpm-build-python/python.req.files
@@ -0,0 +1,15 @@
+#!/bin/sh -efu
+while IFS=$'\t' read -r f t; do
+	case "$t" in
+		*"python script text"*)
+			echo "$f"
+			continue ;;
+		*"symbolic link to "*)
+			continue ;;
+	esac
+	case "$f" in
+		*.py)
+			echo "$f"
+			continue ;;
+	esac
+done
diff --git a/rpm-build-python/python.req.py b/rpm-build-python/python.req.py
index c0ace61..43682d0 100755
--- a/rpm-build-python/python.req.py
+++ b/rpm-build-python/python.req.py
@@ -36,7 +36,7 @@ try :
     import sys, os
     import parser, symbol, token, types
 except :
-    pass    
+    raise
 else :    
     def _(s) : return s
     prefix = "python%u.%u" % sys.version_info[0:2]
@@ -50,38 +50,51 @@ else :
     if sys.version_info[0:2] < (2,4) :
         def pro(x) :
             return x
+        def namelist(import_node) :
+            return [x for x in import_node[2:] if x[0] != 12 ]
     else :
         def pro(x) :
             return x[1]
-                
+        def namelist(import_node) :
+            return [x for x in import_node[2][1:] if x[0] != 12 ]
+
     ignore = dict([ (x,1) for x in 
         list(os.getenv('RPM_PYTHON_REQ_SKIP',"").split())
         + list(sys.builtin_module_names)]).has_key
 
     REQ=os.getenv('RPM_PYTHON_REQ_METHOD','relaxed')
     IS_HIER = os.getenv('RPM_PYTHON_REQ_HIER',None)
+    src = None
     def match(tree,deep=0) :
         if tree[0] not in  symbol_skip :
             deep += 1
         for node in tree :
             if type(node) in [types.ListType, types.TupleType] :
                 if node[0] == symbol.import_stmt :
-                    if REQ not in ['slight','relaxed'] or deep == 4 :
-                        node = pro(node)
-                        if node[1][1] == 'import' :
-                            for name in [x for x in node[2:] if x[0] != 12  ] :
-                                name = pro(name)
-                                    
-                                if IS_HIER is None :
-                                    yield name[1][1][1]
-                                else :
-                                    yield ".".join( [ i for t,i in  name[1][1:] if t==1 ])
-                        elif node[1][1] == 'from' :
+                    line = 0
+                    deps = []
+                    node = pro(node)
+                    if node[1][1] == 'import' :
+                        line = node[1][2]
+                        for name in namelist(node) :
                             if IS_HIER is None :
-                                yield node[2][1][1]
+                                deps.append(name[1][1][1])
                             else :
-                                yield ".".join( [ i for t,i in  node[2][1:] if t==1 ])
-             
+                                deps.append(".".join( [ i for t,i in  name[1][1:] if t==1 ]))
+                    elif node[1][1] == 'from' :
+                        line = node[1][2]
+                        if IS_HIER is None :
+                            deps.append(node[2][1][1])
+                        else :
+                            deps.append(".".join( [ i for t,i in  node[2][1:] if t==1 ]))
+
+                    if REQ not in ['slight','relaxed'] or deep == 4 :
+                        for dep in deps :
+                            yield dep
+                    else :
+                        for dep in deps:
+                            print >> sys.stderr, "%s: %s: line=%d IGNORE module=%s" % (sys.argv[0], src, line, dep)
+
                 for item in match(node,deep) :
                     yield item
                 
@@ -115,9 +128,9 @@ else :
         #        print "\t",req
             
         for src in files :
-            if '.py' == os.path.splitext(os.path.basename(src))[1] :
+            #if '.py' == os.path.splitext(os.path.basename(src))[1] :
                 try :
-                    lis = parser.suite(open(src).read().replace("\r\n","\n")).tolist()
+                    lis = parser.suite(open(src).read().replace("\r\n","\n")).tolist(line_info=1)
                 except SyntaxError,msg :
                     continue
                 except :
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20070321/de3600f7/attachment-0001.bin>


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