[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