[Python-checkins] distutils2: merge with Andr?

tarek.ziade python-checkins at python.org
Sun Jan 30 10:43:58 CET 2011


tarek.ziade pushed 6c98c1c2bd67 to distutils2:

http://hg.python.org/distutils2/rev/6c98c1c2bd67
changeset:   954:6c98c1c2bd67
parent:      952:1e23203b0675
parent:      953:f8657bc04959
user:        Alexis Metaireau <alexis at notmyidea.org>
date:        Sat Jan 29 18:41:32 2011 +0100
summary:
  merge with Andr?

files:
  distutils2/config.py

diff --git a/distutils2/config.py b/distutils2/config.py
--- a/distutils2/config.py
+++ b/distutils2/config.py
@@ -3,15 +3,32 @@
     Know how to read all config files Distutils2 uses.
 """
 import os
+import re
 import sys
 from ConfigParser import RawConfigParser
 
 from distutils2 import logger
 from distutils2.errors import DistutilsOptionError
+from distutils2.compiler.extension import Extension
 from distutils2.util import check_environ, resolve_name, strtobool
 from distutils2.compiler import set_compiler
 from distutils2.command import set_command
 
+def pop_values(values_dct, key):
+    """Remove values from the dictionary and convert them as a list"""
+    vals_str = values_dct.pop(key, None)
+    if not vals_str:
+        return
+    # Get bash options like `gcc -print-file-name=libgcc.a`
+    vals = re.search('(`.*?`)', vals_str) or []
+    if vals:
+        vals = list(vals.groups())
+        vals_str = re.sub('`.*?`', '', vals_str)
+    vals.extend(vals_str.split())
+    if vals:
+        return vals
+
+
 class Config(object):
     """Reads configuration files and work with the Distribution instance
     """
@@ -182,6 +199,34 @@
             # manifest template
             self.dist.extra_files = files.get('extra_files', [])
 
+        ext_modules = self.dist.ext_modules
+        for section_key in content:
+            labels = section_key.split('=')
+            if (len(labels) == 2) and (labels[0] == 'extension'):
+                # labels[1] not used from now but should be implemented
+                # for extension build dependency
+                values_dct = content[section_key]
+                ext_modules.append(Extension(
+                    values_dct.pop('name'),
+                    pop_values(values_dct, 'sources'),
+                    pop_values(values_dct, 'include_dirs'),
+                    pop_values(values_dct, 'define_macros'),
+                    pop_values(values_dct, 'undef_macros'),
+                    pop_values(values_dct, 'library_dirs'),
+                    pop_values(values_dct, 'libraries'),
+                    pop_values(values_dct, 'runtime_library_dirs'),
+                    pop_values(values_dct, 'extra_objects'),
+                    pop_values(values_dct, 'extra_compile_args'),
+                    pop_values(values_dct, 'extra_link_args'),
+                    pop_values(values_dct, 'export_symbols'),
+                    pop_values(values_dct, 'swig_opts'),
+                    pop_values(values_dct, 'depends'),
+                    values_dct.pop('language', None),
+                    values_dct.pop('optional', None),
+                    **values_dct
+                ))
+
+
     def parse_config_files(self, filenames=None):
         if filenames is None:
             filenames = self.find_config_files()
diff --git a/distutils2/tests/test_config.py b/distutils2/tests/test_config.py
--- a/distutils2/tests/test_config.py
+++ b/distutils2/tests/test_config.py
@@ -93,6 +93,30 @@
 sub_commands = foo
 """
 
+# Can not be merged with SETUP_CFG else install_dist
+# command will fail when trying to compile C sources
+EXT_SETUP_CFG = """
+[files]
+packages = one
+           two
+
+[extension=speed_coconuts]
+name = one.speed_coconuts
+sources = c_src/speed_coconuts.c
+extra_link_args = `gcc -print-file-name=libgcc.a` -shared
+define_macros = HAVE_CAIRO HAVE_GTK2
+
+[extension=fast_taunt]
+name = three.fast_taunt
+sources = cxx_src/utils_taunt.cxx
+          cxx_src/python_module.cxx
+include_dirs = /usr/include/gecode
+    /usr/include/blitz
+extra_compile_args = -fPIC -O2
+language = cxx
+
+"""
+
 
 class DCompiler(object):
     name = 'd'
@@ -134,7 +158,14 @@
         super(ConfigTestCase, self).setUp()
         self.addCleanup(setattr, sys, 'stdout', sys.stdout)
         self.addCleanup(setattr, sys, 'stderr', sys.stderr)
+        sys.stdout = sys.stderr = StringIO()
+
         self.addCleanup(os.chdir, os.getcwd())
+        tempdir = self.mkdtemp()
+        os.chdir(tempdir)
+        self.tempdir = tempdir
+
+        self.addCleanup(setattr, sys, 'argv', sys.argv)
 
     def write_setup(self, kwargs=None):
         opts = {'description-file': 'README', 'extra-files':''}
@@ -156,8 +187,6 @@
         return dist
 
     def test_config(self):
-        tempdir = self.mkdtemp()
-        os.chdir(tempdir)
         self.write_setup()
         self.write_file('README', 'yeah')
 
@@ -232,9 +261,6 @@
 
 
     def test_multiple_description_file(self):
-        tempdir = self.mkdtemp()
-        os.chdir(tempdir)
-
         self.write_setup({'description-file': 'README  CHANGES'})
         self.write_file('README', 'yeah')
         self.write_file('CHANGES', 'changelog2')
@@ -242,9 +268,6 @@
         self.assertEqual(dist.metadata.requires_files, ['README', 'CHANGES'])
 
     def test_multiline_description_file(self):
-        tempdir = self.mkdtemp()
-        os.chdir(tempdir)
-
         self.write_setup({'description-file': 'README\n  CHANGES'})
         self.write_file('README', 'yeah')
         self.write_file('CHANGES', 'changelog')
@@ -252,9 +275,28 @@
         self.assertEqual(dist.metadata['description'], 'yeah\nchangelog')
         self.assertEqual(dist.metadata.requires_files, ['README', 'CHANGES'])
 
+    def test_parse_extensions_in_config(self):
+        self.write_file('setup.cfg', EXT_SETUP_CFG)
+        dist = self.run_setup('--version')
+
+        ext_modules = dict((mod.name, mod) for mod in dist.ext_modules)
+        self.assertEqual(len(ext_modules), 2)
+        ext = ext_modules.get('one.speed_coconuts')
+        self.assertEqual(ext.sources, ['c_src/speed_coconuts.c'])
+        self.assertEqual(ext.define_macros, ['HAVE_CAIRO', 'HAVE_GTK2'])
+        self.assertEqual(ext.extra_link_args,
+            ['`gcc -print-file-name=libgcc.a`', '-shared'])
+
+        ext = ext_modules.get('three.fast_taunt')
+        self.assertEqual(ext.sources,
+            ['cxx_src/utils_taunt.cxx', 'cxx_src/python_module.cxx'])
+        self.assertEqual(ext.include_dirs,
+            ['/usr/include/gecode', '/usr/include/blitz'])
+        self.assertEqual(ext.extra_compile_args, ['-fPIC', '-O2'])
+        self.assertEqual(ext.language, 'cxx')
+
+
     def test_metadata_requires_description_files_missing(self):
-        tempdir = self.mkdtemp()
-        os.chdir(tempdir)
         self.write_setup({'description-file': 'README\n  README2'})
         self.write_file('README', 'yeah')
         self.write_file('README2', 'yeah')
@@ -278,8 +320,6 @@
         self.assertRaises(DistutilsFileError, cmd.make_distribution)
 
     def test_metadata_requires_description_files(self):
-        tempdir = self.mkdtemp()
-        os.chdir(tempdir)
         self.write_setup({'description-file': 'README\n  README2',
                           'extra-files':'\n  README2'})
         self.write_file('README', 'yeah')
@@ -315,8 +355,6 @@
         self.assertIn('README\nREADME2\n', open('MANIFEST').read())
 
     def test_sub_commands(self):
-        tempdir = self.mkdtemp()
-        os.chdir(tempdir)
         self.write_setup()
         self.write_file('README', 'yeah')
         self.write_file('haven.py', '#')

--
Repository URL: http://hg.python.org/distutils2


More information about the Python-checkins mailing list