bmount / Python-2.7.3-xcompile.patch
# For 2.7.3 (greater than not available for 2.7, not required in 3.3+) |
# http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tar.xz |
# based on these PPC instructions: http://randomsplat.com/id5-cross-compiling-python-for-embedded-linux.html |
# (thanks Paul Gibson) |
# patch (also checked in here): http://randomsplat.com/wp-content/uploads/2012/10/Python-2.7.3-xcompile.patch |
# in python source dir: |
./configure |
make python Parser/pgen |
mv python hostpython |
mv Parser/pgen Parser/hostpgen |
make distclean |
patch -p1 |
diff -ur Python-2.7.3.orig/configure Python-2.7.3-Source/configure |
— Python-2.7.3.orig/configure 2012-04-09 19:07:36.000000000 -0400 |
+++ Python-2.7.3-Source/configure 2012-10-23 14:10:45.305220393 -0400 |
@@ -13697,7 +13697,7 @@ |
$as_echo_n «(cached) » >&6 |
else |
if test «$cross_compiling» = yes; then : |
— ac_cv_have_long_long_format=no |
+ ac_cv_have_long_long_format=»cross — assuming yes» |
else |
cat confdefs.h — conftest.$ac_ext |
/* end confdefs.h. */ |
@@ -13749,7 +13749,7 @@ |
$as_echo «$ac_cv_have_long_long_format» >&6; > |
fi |
— if test «$ac_cv_have_long_long_format» = yes |
+ if test «$ac_cv_have_long_long_format» != no |
then |
$as_echo «#define PY_FORMAT_LONG_LONG \»ll\»» >>confdefs.h |
diff -ur Python-2.7.3.orig/Makefile.pre.in Python-2.7.3-Source/Makefile.pre.in |
— Python-2.7.3.orig/Makefile.pre.in 2012-04-09 19:07:33.000000000 -0400 |
+++ Python-2.7.3-Source/Makefile.pre.in 2012-10-23 14:10:45.305220393 -0400 |
@@ -182,6 +182,7 @@ |
PYTHON= python$(EXE) |
BUILDPYTHON= python$(BUILDEXE) |
+ HOSTPYTHON= ./$(BUILDPYTHON) |
# The task to run while instrument when building the profile-opt target |
PROFILE_TASK= $(srcdir)/Tools/pybench/pybench.py -n 2 —with-gc —with-syscheck |
@@ -215,6 +216,8 @@ |
# Parser |
PGEN= Parser/pgen$(EXE) |
+ HOSTPGEN= $(PGEN) |
+ |
POBJS= \ |
Parser/acceler.o \ |
Parser/grammar1.o \ |
@@ -408,8 +411,8 @@ |
# Build the shared modules |
sharedmods: $(BUILDPYTHON) |
@case $$MAKEFLAGS in \ |
— *s*) $(RUNSHARED) CC=’$(CC)’ LDSHARED=’$(BLDSHARED)’ OPT=’$(OPT)’ ./$(BUILDPYTHON) -E $(srcdir)/setup.py -q build;; \ |
— *) $(RUNSHARED) CC=’$(CC)’ LDSHARED=’$(BLDSHARED)’ OPT=’$(OPT)’ ./$(BUILDPYTHON) -E $(srcdir)/setup.py build;; \ |
+ *s*) $(RUNSHARED) CC=’$(CC)’ LDSHARED=’$(BLDSHARED)’ OPT=’$(OPT)’ PYTHONXCPREFIX=’$(DESTDIR)$(prefix)’ $(HOSTPYTHON) -E $(srcdir)/setup.py -q build;; \ |
+ *) $(RUNSHARED) CC=’$(CC)’ LDSHARED=’$(BLDSHARED)’ OPT=’$(OPT)’ PYTHONXCPREFIX=’$(DESTDIR)$(prefix)’ $(HOSTPYTHON) -E $(srcdir)/setup.py build;; \ |
esac |
# Build static library |
@@ -543,7 +546,7 @@ |
$(GRAMMAR_H) $(GRAMMAR_C): Parser/pgen.stamp |
Parser/pgen.stamp: $(PGEN) $(GRAMMAR_INPUT) |
-@$(INSTALL) -d Include |
— $(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C) |
+ -$(HOSTPGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C) |
-touch Parser/pgen.stamp |
$(PGEN): $(PGENOBJS) |
@@ -938,26 +941,26 @@ |
$(INSTALL_DATA) $(srcdir)/Modules/xxmodule.c \ |
$(DESTDIR)$(LIBDEST)/distutils/tests ; \ |
fi |
— PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ |
— ./$(BUILDPYTHON) -Wi -tt $(DESTDIR)$(LIBDEST)/compileall.py \ |
+ -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ |
+ ./$(HOSTPYTHON) -Wi -tt $(DESTDIR)$(LIBDEST)/compileall.py \ |
-d $(LIBDEST) -f \ |
-x ‘bad_coding|badsyntax|site-packages|lib2to3/tests/data’ \ |
$(DESTDIR)$(LIBDEST) |
— PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ |
— ./$(BUILDPYTHON) -Wi -tt -O $(DESTDIR)$(LIBDEST)/compileall.py \ |
+ -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ |
+ ./$(HOSTPYTHON) -Wi -tt -O $(DESTDIR)$(LIBDEST)/compileall.py \ |
-d $(LIBDEST) -f \ |
-x ‘bad_coding|badsyntax|site-packages|lib2to3/tests/data’ \ |
$(DESTDIR)$(LIBDEST) |
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ |
— ./$(BUILDPYTHON) -Wi -t $(DESTDIR)$(LIBDEST)/compileall.py \ |
+ ./$(HOSTPYTHON) -Wi -t $(DESTDIR)$(LIBDEST)/compileall.py \ |
-d $(LIBDEST)/site-packages -f \ |
-x badsyntax $(DESTDIR)$(LIBDEST)/site-packages |
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ |
— ./$(BUILDPYTHON) -Wi -t -O $(DESTDIR)$(LIBDEST)/compileall.py \ |
+ ./$(HOSTPYTHON) -Wi -t -O $(DESTDIR)$(LIBDEST)/compileall.py \ |
-d $(LIBDEST)/site-packages -f \ |
-x badsyntax $(DESTDIR)$(LIBDEST)/site-packages |
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ |
— ./$(BUILDPYTHON) -Wi -t -c «import lib2to3.pygram, lib2to3.patcomp;lib2to3.patcomp.PatternCompiler()» |
+ ./$(HOSTPYTHON) -Wi -t -c «import lib2to3.pygram, lib2to3.patcomp;lib2to3.patcomp.PatternCompiler()» |
# Create the PLATDIR source directory, if one wasn’t distributed.. |
$(srcdir)/Lib/$(PLATDIR): |
@@ -1062,7 +1065,9 @@ |
# Install the dynamically loadable modules |
# This goes into $(exec_prefix) |
sharedinstall: sharedmods |
— $(RUNSHARED) ./$(BUILDPYTHON) -E $(srcdir)/setup.py install \ |
+ CC=’$(CC)’ LDSHARED=’$(BLDSHARED)’ OPT=’$(OPT)’ \ |
+ $(RUNSHARED) $(HOSTPYTHON) -E $(srcdir)/setup.py install \ |
+ —skip-build \ |
—prefix=$(prefix) \ |
—install-scripts=$(BINDIR) \ |
—install-platlib=$(DESTSHARED) \ |
diff -ur Python-2.7.3.orig/setup.py Python-2.7.3-Source/setup.py |
— Python-2.7.3.orig/setup.py 2012-04-09 19:07:36.000000000 -0400 |
+++ Python-2.7.3-Source/setup.py 2012-10-23 14:10:56.085220237 -0400 |
@@ -145,6 +145,7 @@ |
def __init__(self, dist): |
build_ext.__init__(self, dist) |
self.failed = [] |
+ self.cross_compile = os.environ.get(‘CROSS_COMPILE_TARGET’) == ‘yes’ |
def build_extensions(self): |
@@ -278,6 +279,14 @@ |
(ext.name, sys.exc_info()[1])) |
self.failed.append(ext.name) |
return |
+ |
+ # Import check will not work when cross-compiling. |
+ if os.environ.has_key(‘PYTHONXCPREFIX’): |
+ self.announce( |
+ ‘WARNING: skipping import check for cross-compiled: «%s»‘ % |
+ ext.name) |
+ return |
+ |
# Workaround for Mac OS X: The Carbon-based modules cannot be |
# reliably imported into a command-line Python |
if ‘Carbon’ in ext.extra_link_args: |
@@ -369,9 +378,10 @@ |
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() |
+ if not self.cross_compile: |
+ 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. |
@@ -408,7 +418,8 @@ |
add_dir_to_list(dir_list, directory) |
if os.path.normpath(sys.prefix) != ‘/usr’ \ |
— and not sysconfig.get_config_var(‘PYTHONFRAMEWORK’): |
+ and not sysconfig.get_config_var(‘PYTHONFRAMEWORK’) \ |
+ and not self.cross_compile: |
# OSX note: Don’t add LIBDIR and INCLUDEDIR to building a framework |
# (PYTHONFRAMEWORK is set) to avoid # linking problems when |
# building a framework with different architectures than |
@@ -426,11 +437,23 @@ |
# lib_dirs and inc_dirs are used to search for files; |
# if a file is found in one of those directories, it can |
# be assumed that no additional -I,-L directives are needed. |
— lib_dirs = self.compiler.library_dirs + [ |
— ‘/lib64’, ‘/usr/lib64’, |
— ‘/lib’, ‘/usr/lib’, |
— ] |
— inc_dirs = self.compiler.include_dirs + [‘/usr/include’] |
+ lib_dirs = self.compiler.library_dirs |
+ inc_dirs = self.compiler.include_dirs |
+ if not self.cross_compile: |
+ lib_dirs += [ |
+ ‘/lib64’, ‘/usr/lib64’, |
+ ‘/lib’, ‘/usr/lib’, |
+ ] |
+ inc_dirs += [‘/usr/include’] |
+ else: |
+ # The common install prefix of 3rd party libraries used during |
+ # cross compilation |
+ mydir = os.environ.get(‘PYTHON_XCOMPILE_DEPENDENCIES_PREFIX’) |
+ if mydir: |
+ inc_dirs += [mydir + ‘/include’ ] |
+ inc_dirs += [mydir + ‘/lib/libffi-3.0.10/include’] |
+ lib_dirs += [mydir + ‘/lib’ ] |
+ |
exts = [] |
missing = [] |
@@ -1004,13 +1027,24 @@ |
# We hunt for #define SQLITE_VERSION «n.n.n» |
# We need to find >= sqlite version 3.0.8 |
sqlite_incdir = sqlite_libdir = None |
— sqlite_inc_paths = [ ‘/usr/include’, |
— ‘/usr/include/sqlite’, |
— ‘/usr/include/sqlite3’, |
— ‘/usr/local/include’, |
— ‘/usr/local/include/sqlite’, |
— ‘/usr/local/include/sqlite3’, |
— ] |
+ |
+ if not self.cross_compile: |
+ sqlite_inc_paths = [ ‘/usr/include’, |
+ ‘/usr/include/sqlite’, |
+ ‘/usr/include/sqlite3’, |
+ ‘/usr/local/include’, |
+ ‘/usr/local/include/sqlite’, |
+ ‘/usr/local/include/sqlite3’, |
+ ] |
+ else: |
+ # The common install prefix of 3rd party headers used during |
+ # cross compilation |
+ mydir = os.environ.get(‘PYTHON_XCOMPILE_DEPENDENCIES_PREFIX’) |
+ if mydir: |
+ sqlite_inc_paths = [mydir + ‘/include’ ] |
+ else: |
+ sqlite_inc_paths = [] |
+ |
MIN_SQLITE_VERSION_NUMBER = (3, 0, 8) |
MIN_SQLITE_VERSION = «.».join([str(x) |
for x in MIN_SQLITE_VERSION_NUMBER]) |
@@ -1050,12 +1084,22 @@ |
print «sqlite: %s had no SQLITE_VERSION»%(f,) |
if sqlite_incdir: |
— sqlite_dirs_to_check = [ |
— os.path.join(sqlite_incdir, ‘..’, ‘lib64’), |
— os.path.join(sqlite_incdir, ‘..’, ‘lib’), |
— os.path.join(sqlite_incdir, ‘..’, ‘..’, ‘lib64’), |
— os.path.join(sqlite_incdir, ‘..’, ‘..’, ‘lib’), |
— ] |
+ if not self.cross_compile: |
+ sqlite_dirs_to_check = [ |
+ os.path.join(sqlite_incdir, ‘..’, ‘lib64’), |
+ os.path.join(sqlite_incdir, ‘..’, ‘lib’), |
+ os.path.join(sqlite_incdir, ‘..’, ‘..’, ‘lib64’), |
+ os.path.join(sqlite_incdir, ‘..’, ‘..’, ‘lib’), |
+ ] |
+ else: |
+ # The common install prefix of 3rd party headers used during |
+ # cross compilation |
+ mydir = os.environ.get(‘PYTHON_XCOMPILE_DEPENDENCIES_PREFIX’) |
+ if mydir: |
+ sqlite_dirs_to_check = [mydir + ‘/lib’ ] |
+ else: |
+ sqlite_dirs_to_check = [] |
+ |
sqlite_libfile = self.compiler.find_library_file( |
sqlite_dirs_to_check + lib_dirs, ‘sqlite3’) |
if sqlite_libfile: |
@@ -1864,8 +1908,15 @@ |
# Pass empty CFLAGS because we’ll just append the resulting |
# CFLAGS to Python’s; -g or -O2 is to be avoided. |
— cmd = «cd %s && env CFLAGS=» ‘%s/configure’ %s» \ |
— % (ffi_builddir, ffi_srcdir, » «.join(config_args)) |
+ if self.cross_compile: |
+ cmd = «cd %s && env CFLAGS=» %s/configure —host=%s —build=%s %s» \ |
+ % (ffi_builddir, ffi_srcdir, |
+ os.environ.get(‘HOSTARCH’), |
+ os.environ.get(‘BUILDARCH’), |
+ » «.join(config_args)) |
+ else: |
+ cmd = «cd %s && env CFLAGS=» ‘%s/configure’ %s» \ |
+ % (ffi_builddir, ffi_srcdir, » «.join(config_args)) |
res = os.system(cmd) |
if res or not os.path.exists(ffi_configfile): |
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Источник