diff --git a/pythonbrew/installer/pythoninstaller.py b/pythonbrew/installer/pythoninstaller.py index 2b52b76..4e2e7cb 100644 --- a/pythonbrew/installer/pythoninstaller.py +++ b/pythonbrew/installer/pythoninstaller.py @@ -6,7 +6,7 @@ from pythonbrew.util import makedirs, symlink, Package, is_url, Link,\ unlink, is_html, Subprocess, rm_r,\ is_python25, is_python24, is_python26, is_python27,\ unpack_downloadfile, is_archive_file, path_to_fileurl, is_file,\ - fileurl_to_path + fileurl_to_path, is_python30, is_python31, is_python32 from pythonbrew.define import PATH_BUILD, PATH_DISTS, PATH_PYTHONS,\ ROOT, PATH_LOG, DISTRIBUTE_SETUP_DLSITE,\ PATH_PATCHES_MACOSX_PYTHON25, PATH_PATCHES_MACOSX_PYTHON24,\ @@ -113,12 +113,28 @@ class PythonInstaller(object): def patch(self): version = self.pkg.version + # ubuntu 11.04(Natty) if is_python25(version): patch_dir = os.path.join(PATH_PATCHES_ALL, "python25") self._add_patches_to_list(patch_dir, ['patch-setup.py.diff']) - else: + elif is_python26(version): patch_dir = os.path.join(PATH_PATCHES_ALL, "common") self._add_patches_to_list(patch_dir, ['patch-setup.py.diff']) + elif is_python27(version): + if version < '2.7.2': + patch_dir = os.path.join(PATH_PATCHES_ALL, "common") + self._add_patches_to_list(patch_dir, ['patch-setup.py.diff']) + elif is_python30(version): + patch_dir = os.path.join(PATH_PATCHES_ALL, "python30") + self._add_patches_to_list(patch_dir, ['patch-setup.py.diff']) + elif is_python31(version): + if version < '3.1.4': + patch_dir = os.path.join(PATH_PATCHES_ALL, "common") + self._add_patches_to_list(patch_dir, ['patch-setup.py.diff']) + elif is_python32(version): + if version == '3.2': + patch_dir = os.path.join(PATH_PATCHES_ALL, "python32") + self._add_patches_to_list(patch_dir, ['patch-setup.py.diff']) self._do_patch() def _do_patch(self): diff --git a/pythonbrew/patches/all/python30/patch-setup.py.diff b/pythonbrew/patches/all/python30/patch-setup.py.diff new file mode 100644 index 0000000..8f1a177 --- /dev/null +++ b/pythonbrew/patches/all/python30/patch-setup.py.diff @@ -0,0 +1,44 @@ +--- setup.py.orig 2011-07-07 19:41:48.610196111 +0900 ++++ setup.py 2011-07-07 19:46:44.986310031 +0900 +@@ -14,6 +14,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -308,10 +309,33 @@ + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ with open(tmpfile) as fp: ++ multiarch_path_component = fp.readline().strip() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. diff --git a/pythonbrew/patches/all/python32/patch-setup.py.diff b/pythonbrew/patches/all/python32/patch-setup.py.diff new file mode 100644 index 0000000..f4c361e --- /dev/null +++ b/pythonbrew/patches/all/python32/patch-setup.py.diff @@ -0,0 +1,38 @@ +--- setup.py.orig 2011-07-07 20:26:15.000000000 +0900 ++++ setup.py 2011-07-07 20:29:28.735543350 +0900 +@@ -370,12 +370,35 @@ + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ with open(tmpfile) as fp: ++ multiarch_path_component = fp.readline().strip() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used, but the local build + # directories (i.e. '.' and 'Include') must be first. See issue + # 10520. + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. diff --git a/pythonbrew/util.py b/pythonbrew/util.py index 50e7ed3..79780d3 100644 --- a/pythonbrew/util.py +++ b/pythonbrew/util.py @@ -77,6 +77,15 @@ def is_python26(version): def is_python27(version): return version >= '2.7' and version < '2.8' +def is_python30(version): + return version >= '3.0' and version < '3.1' + +def is_python31(version): + return version >= '3.1' and version < '3.2' + +def is_python32(version): + return version >= '3.2' and version < '3.3' + def makedirs(path): try: os.makedirs(path)