[pypy-svn] r57665 - in pypy/branch/cross-compilation/pypy: config tool translator/c translator/tool translator/tool/test

fijal at codespeak.net fijal at codespeak.net
Thu Aug 28 11:51:43 CEST 2008


Author: fijal
Date: Thu Aug 28 11:51:40 2008
New Revision: 57665

Added:
   pypy/branch/cross-compilation/pypy/tool/pyplatform.py   (contents, props changed)
Modified:
   pypy/branch/cross-compilation/pypy/config/translationoption.py
   pypy/branch/cross-compilation/pypy/tool/gcc_cache.py
   pypy/branch/cross-compilation/pypy/translator/c/genc.py
   pypy/branch/cross-compilation/pypy/translator/tool/cbuild.py
   pypy/branch/cross-compilation/pypy/translator/tool/test/test_cbuild.py
Log:
Refactor a bit cross-compilation details to have a single place where
platform info is kept. Not much is there, but it's a good start


Modified: pypy/branch/cross-compilation/pypy/config/translationoption.py
==============================================================================
--- pypy/branch/cross-compilation/pypy/config/translationoption.py	(original)
+++ pypy/branch/cross-compilation/pypy/config/translationoption.py	Thu Aug 28 11:51:40 2008
@@ -348,8 +348,11 @@
 def set_platform(config, platform):
     if platform == 'maemo':
         from pypy.translator.tool.cbuild import ExternalCompilationInfo
+        from pypy.tool.pyplatform import Maemo
         # XXX evil hackery
         func_defs = list(ExternalCompilationInfo.__init__.func_defaults)
-        func_defs[-1] = 'maemo'
+        func_defs[-1] = Maemo()
         ExternalCompilationInfo.__init__.im_func.func_defaults = tuple(func_defs)
+    elif platform != 'host':
+        raise NotImplementedError('Platform = %s' % (platform,))
         

Modified: pypy/branch/cross-compilation/pypy/tool/gcc_cache.py
==============================================================================
--- pypy/branch/cross-compilation/pypy/tool/gcc_cache.py	(original)
+++ pypy/branch/cross-compilation/pypy/tool/gcc_cache.py	Thu Aug 28 11:51:40 2008
@@ -20,8 +20,7 @@
     try:
         return path.read()
     except py.error.Error:
-        result = py.process.cmdexec(eci.get_emulator_for_platform() +
-                                    build_executable(c_files, eci))
+        result = eci.platform.execute(build_executable(c_files, eci))
         path.write(result)
         return result
 

Added: pypy/branch/cross-compilation/pypy/tool/pyplatform.py
==============================================================================
--- (empty file)
+++ pypy/branch/cross-compilation/pypy/tool/pyplatform.py	Thu Aug 28 11:51:40 2008
@@ -0,0 +1,31 @@
+
+""" This file contains various platform-specific profiles for
+pypy's cross compilation
+"""
+
+import py
+
+class Platform(object):
+    def get_compiler(self):
+        return None
+
+    def execute(self, cmd):
+        return py.process.cmdexec(cmd)
+
+    # platform objects are immutable
+
+    def __hash__(self):
+        return hash(self.__class__.__name__)
+
+    def __ne__(self, other):
+        return not self == other
+
+    def __eq__(self, other):
+        return self.__class__.__name__ == other.__class__.__name__
+
+class Maemo(Platform):
+    def get_compiler(self):
+        return '/scratchbox/compilers/cs2005q3.2-glibc-arm/bin/sbox-arm-linux-gcc'
+    
+    def execute(self, cmd):
+        return py.process.cmdexec('/scratchbox/login ' + cmd)

Modified: pypy/branch/cross-compilation/pypy/translator/c/genc.py
==============================================================================
--- pypy/branch/cross-compilation/pypy/translator/c/genc.py	(original)
+++ pypy/branch/cross-compilation/pypy/translator/c/genc.py	Thu Aug 28 11:51:40 2008
@@ -402,7 +402,7 @@
         if self.config.translation.cc:
             cc = self.config.translation.cc
         else:
-            cc = self.eci.get_compiler_for_platform()
+            cc = self.eci.platform.get_compiler()
             if cc is None:
                 cc = 'gcc'
         make_no_prof = ''

Modified: pypy/branch/cross-compilation/pypy/translator/tool/cbuild.py
==============================================================================
--- pypy/branch/cross-compilation/pypy/translator/tool/cbuild.py	(original)
+++ pypy/branch/cross-compilation/pypy/translator/tool/cbuild.py	Thu Aug 28 11:51:40 2008
@@ -9,6 +9,7 @@
 log = py.log.Producer("cbuild")
 py.log.setconsumer("cbuild", ansi_log)
 from pypy.tool.udir import udir
+from pypy.tool.pyplatform import Platform
 
 debug = 0
 
@@ -40,7 +41,7 @@
                  compile_extra           = [],
                  link_extra              = [],
                  frameworks              = [],
-                 platform                = 'host'):
+                 platform                = Platform()):
         """
         pre_include_bits: list of pieces of text that should be put at the top
         of the generated .c files, before any #include.  They shouldn't
@@ -82,8 +83,7 @@
         link to a framework bundle. Not suitable for unix-like .dylib
         installations.
 
-        platform: an unique identifier of compile platform, useful for
-        caching.
+        platform: an object that can identify the platform
         """
         for name in self._ATTRIBUTES:
             value = locals()[name]
@@ -174,6 +174,7 @@
         for attr in self._ATTRIBUTES:
             val = getattr(self, attr)
             info.append("%s=%s" % (attr, repr(val)))
+        info.append("platform=%s" % self.platform.__class__.__name__)
         return "<ExternalCompilationInfo (%s)>" % ", ".join(info)
 
     def merge(self, *others):
@@ -263,24 +264,6 @@
         d['separate_module_sources'] = ()
         return ExternalCompilationInfo(**d)
 
-    def get_emulator_for_platform(self):
-        if self.platform == 'host':
-            return ''
-        elif self.platform == 'maemo':
-            # XXX how to do it in better way???
-            return '/scratchbox/login '
-        else:
-            raise NotImplementedError("Platform = %s" % (self.platform,))
-
-    def get_compiler_for_platform(self):
-        if self.platform == 'host':
-            return None
-        elif self.platform == 'maemo':
-            # XXX this should be settable somehow, not sure exactly how
-            return '/scratchbox/compilers/cs2005q3.2-glibc-arm/bin/sbox-arm-linux-gcc'
-        else:
-            raise NotImplementedError("Platform = %s" % (self.platform,))
-
 if sys.platform == 'win32':
     so_ext = '.dll'
 else:
@@ -531,7 +514,7 @@
         if compiler_exe is not None:
             self.compiler_exe = compiler_exe
         else:
-            self.compiler_exe = eci.get_compiler_for_platform()
+            self.compiler_exe = eci.platform.get_compiler()
         self.profbased = profbased
         if not sys.platform in ('win32', 'darwin'): # xxx
             if 'm' not in self.libraries:

Modified: pypy/branch/cross-compilation/pypy/translator/tool/test/test_cbuild.py
==============================================================================
--- pypy/branch/cross-compilation/pypy/translator/tool/test/test_cbuild.py	(original)
+++ pypy/branch/cross-compilation/pypy/translator/tool/test/test_cbuild.py	Thu Aug 28 11:51:40 2008
@@ -158,14 +158,38 @@
                        'dxowqbncpqympqhe-config')
 
     def test_platforms(self):
-        eci = ExternalCompilationInfo(platform='xxx')
+        from pypy.tool.pyplatform import Maemo
+        eci = ExternalCompilationInfo(platform=Maemo())
         eci2 = ExternalCompilationInfo()
         assert eci != eci2
         assert hash(eci) != hash(eci2)
+        assert repr(eci) != repr(eci2)
         py.test.raises(Exception, eci2.merge, eci)
-        assert eci.merge(eci).platform == 'xxx'
+        assert eci.merge(eci).platform == Maemo()
+
+    def test_platform(self):
+        from pypy.tool.pyplatform import Platform
+        class Expected(Exception):
+            pass
+        
+        class X(Platform):
+            def get_compiler(self):
+                raise Expected
+
+            def execute(self):
+                return 3
+
+        eci = ExternalCompilationInfo(platform=X())
+        try:
+            build_executable([self.modfile], eci)
+        except Expected:
+            pass
+        else:
+            py.test.fail("Did not raise")
+        assert eci.platform.execute() == 3
 
     def test_standalone_maemo(self):
+        from pypy.tool.pyplatform import Maemo
         # XXX skip if there is no scratchbox
         if not py.path.local('/scratchbox/login').check():
             py.test.skip("No scratchbox detected")
@@ -183,9 +207,9 @@
         if sys.platform == 'win32':
             py.test.skip("No cross-compilation on windows yet")
         else:
-            eci = ExternalCompilationInfo(platform='maemo',
+            eci = ExternalCompilationInfo(platform=Maemo(),
                                           libraries=['m'])
         output = build_executable([c_file], eci)
         py.test.raises(py.process.cmdexec.Error, py.process.cmdexec, output)
-        result = py.process.cmdexec(eci.get_emulator_for_platform() + output)
+        result = eci.platform.execute(output)
         assert result.startswith('4.0')



More information about the Pypy-commit mailing list