diff options
15 files changed, 948 insertions, 0 deletions
diff --git a/package/Config.in b/package/Config.in index bcd1b47b0..2ab6b6e68 100644 --- a/package/Config.in +++ b/package/Config.in @@ -290,6 +290,7 @@ endif  source "package/microperl/Config.in"  source "package/php/Config.in"  source "package/python/Config.in" +source "package/python3/Config.in"  if BR2_PACKAGE_PYTHON  menu "external python modules"  source "package/python-dpkt/Config.in" diff --git a/package/python3/Config.in b/package/python3/Config.in new file mode 100644 index 000000000..2e1e98b9f --- /dev/null +++ b/package/python3/Config.in @@ -0,0 +1,81 @@ +config BR2_PACKAGE_PYTHON3 +	bool "python3" +	depends on BR2_USE_WCHAR +	select BR2_PACKAGE_LIBFFI +	help +	  The python language interpreter. + +	  http://www.python.org/ + +comment "python3 requires a toolchain with WCHAR support" +	depends on !BR2_USE_WCHAR + +if BR2_PACKAGE_PYTHON3 + +choice +	prompt "python3 module format to install" +	default BR2_PACKAGE_PYTHON3_PYC_ONLY +	help +	  Select Python module format to install on target (py, pyc or both) + +config BR2_PACKAGE_PYTHON3_PY_ONLY +	bool ".py sources only" + +config BR2_PACKAGE_PYTHON3_PYC_ONLY +	bool ".pyc compiled sources only" + +config BR2_PACKAGE_PYTHON3_PY_PYC +	bool ".py sources and .pyc compiled" + +endchoice + +menu "core python3 modules" + +comment "The following modules are unusual or require extra libraries" + +config BR2_PACKAGE_PYTHON3_BZIP2 +	select BR2_PACKAGE_BZIP2 +	bool "bz2 module" +	help +	  bzip2 module for Python3 + +config BR2_PACKAGE_PYTHON3_CURSES +	select BR2_PACKAGE_NCURSES +	bool "curses module" +	help +	  curses module for Python3. + +config BR2_PACKAGE_PYTHON3_PYEXPAT +	select BR2_PACKAGE_EXPAT +	bool "pyexpat" +	help +	  pyexpat module for Python3. + +config BR2_PACKAGE_PYTHON3_READLINE +	select BR2_PACKAGE_READLINE +	bool "readline" +	help +	  readline module for Python3 (required for command-line +	  editing in the Python shell). + +config BR2_PACKAGE_PYTHON3_SSL +	select BR2_PACKAGE_OPENSSL +	bool "ssl" +	help +	  _ssl module for Python3 (required for https in urllib etc). + +config BR2_PACKAGE_PYTHON3_SQLITE +	bool "sqlite module" +	select BR2_PACKAGE_SQLITE +	help +	  SQLite database support + +config BR2_PACKAGE_PYTHON3_ZLIB +	bool "zlib module" +	select BR2_PACKAGE_ZLIB +	help +	  zlib support in Python3 + +endmenu + +endif diff --git a/package/python3/python3-3.3-000-generate-sysconfigdata-buildir.patch b/package/python3/python3-3.3-000-generate-sysconfigdata-buildir.patch new file mode 100644 index 000000000..a29aa0ffc --- /dev/null +++ b/package/python3/python3-3.3-000-generate-sysconfigdata-buildir.patch @@ -0,0 +1,158 @@ +changeset:   79745:f85c3f4d9b98 +parent:      79743:36b2ca7dc893 +parent:      79744:24d52d3060e8 +user:        Trent Nelson <trent@trent.me> +date:        Tue Oct 16 08:17:11 2012 -0400 +summary:     Merge issue #15298: ensure _sysconfigdata is generated in build directory, + +Taken from upstream. + +--- + Lib/sysconfig.py |   11 ++++++++++- + Makefile.pre.in  |   24 +++++++++++++----------- + setup.py         |   14 -------------- + 3 files changed, 23 insertions(+), 26 deletions(-) + +Index: Python-3.3.0/Lib/sysconfig.py +=================================================================== +--- Python-3.3.0.orig/Lib/sysconfig.py ++++ Python-3.3.0/Lib/sysconfig.py +@@ -390,13 +390,22 @@ +     if _PYTHON_BUILD: +         vars['LDSHARED'] = vars['BLDSHARED'] +  +-    destfile = os.path.join(os.path.dirname(__file__), '_sysconfigdata.py') ++    pybuilddir = 'build/lib.%s-%s' % (get_platform(), sys.version[:3]) ++    if hasattr(sys, "gettotalrefcount"): ++        pybuilddir += '-pydebug' ++    os.makedirs(pybuilddir, exist_ok=True) ++    destfile = os.path.join(pybuilddir, '_sysconfigdata.py') ++ +     with open(destfile, 'w', encoding='utf8') as f: +         f.write('# system configuration generated and used by' +                 ' the sysconfig module\n') +         f.write('build_time_vars = ') +         pprint.pprint(vars, stream=f) +  ++    # Create file used for sys.path fixup -- see Modules/getpath.c ++    with open('pybuilddir.txt', 'w', encoding='ascii') as f: ++        f.write(pybuilddir) ++ + def _init_posix(vars): +     """Initialize the module as appropriate for POSIX systems.""" +     # _sysconfigdata is generated at build time, see _generate_posix_vars() +Index: Python-3.3.0/Makefile.pre.in +=================================================================== +--- Python-3.3.0.orig/Makefile.pre.in ++++ Python-3.3.0/Makefile.pre.in +@@ -410,8 +410,6 @@ + 		Objects/unicodectype.o \ + 		Objects/weakrefobject.o +  +-SYSCONFIGDATA=$(srcdir)/Lib/_sysconfigdata.py +- + ########################################################################## + # objects that get linked into the Python library + LIBRARY_OBJS_OMIT_FROZEN=	\ +@@ -432,7 +430,7 @@ +  + # Default target + all:		build_all +-build_all:	$(BUILDPYTHON) $(SYSCONFIGDATA) oldsharedmods sharedmods gdbhooks Modules/_testembed ++build_all:	$(BUILDPYTHON) oldsharedmods sharedmods gdbhooks Modules/_testembed +  + # Compile a binary with gcc profile guided optimization. + profile-opt: +@@ -466,15 +464,17 @@ + $(BUILDPYTHON):	Modules/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY) + 	$(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST) +  +-platform: $(BUILDPYTHON) $(SYSCONFIGDATA) ++platform: $(BUILDPYTHON) + 	$(RUNSHARED) $(PYTHON_FOR_BUILD) -c 'import sys ; from sysconfig import get_platform ; print(get_platform()+"-"+sys.version[0:3])' >platform +  +-# Generate the sysconfig build-time data +-$(SYSCONFIGDATA): $(BUILDPYTHON) ++# Create build directory and generate the sysconfig build-time data there. ++# pybuilddir.txt contains the name of the build dir and is used for ++# sys.path fixup -- see Modules/getpath.c. ++pybuilddir.txt: $(BUILDPYTHON) + 	$(RUNSHARED) $(PYTHON_FOR_BUILD) -S -m sysconfig --generate-posix-vars +  + # Build the shared modules +-sharedmods: $(BUILDPYTHON) $(SYSCONFIGDATA) ++sharedmods: $(BUILDPYTHON) pybuilddir.txt + 	case $$MAKEFLAGS in *s*) quiet=-q; esac; \ + 	$(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \ + 		$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build +@@ -1036,7 +1036,7 @@ + 		else	true; \ + 		fi; \ + 	done +-	@for i in $(srcdir)/Lib/*.py ; \ ++	@for i in $(srcdir)/Lib/*.py `cat pybuilddir.txt`/_sysconfigdata.py; \ + 	do \ + 		if test -x $$i; then \ + 			$(INSTALL_SCRIPT) $$i $(DESTDIR)$(LIBDEST); \ +@@ -1196,6 +1196,8 @@ + 		--install-scripts=$(BINDIR) \ + 		--install-platlib=$(DESTSHARED) \ + 		--root=$(DESTDIR)/ ++	-rm $(DESTDIR)$(DESTSHARED)/_sysconfigdata.py ++	-rm -r $(DESTDIR)$(DESTSHARED)/__pycache__ +  + # Here are a couple of targets for MacOSX again, to install a full + # framework-based Python. frameworkinstall installs everything, the +@@ -1341,9 +1343,10 @@ + 	find . -name '*.s[ol]' -exec rm -f {} ';' + 	find . -name '*.so.[0-9]*.[0-9]*' -exec rm -f {} ';' + 	find build -name 'fficonfig.h' -exec rm -f {} ';' || true +-	find build -name 'fficonfig.py' -exec rm -f {} ';' || true ++	find build -name '*.py' -exec rm -f {} ';' || true ++	find build -name '*.py[co]' -exec rm -f {} ';' || true ++	-rm -f pybuilddir.txt + 	-rm -f Lib/lib2to3/*Grammar*.pickle +-	-rm -f $(SYSCONFIGDATA) + 	-rm -f Modules/_testembed Modules/_freeze_importlib +  + profile-removal: +@@ -1367,7 +1370,6 @@ + 		Modules/Setup Modules/Setup.local Modules/Setup.config \ + 		Modules/ld_so_aix Modules/python.exp Misc/python.pc + 	-rm -f python*-gdb.py +-	-rm -f pybuilddir.txt + 	find $(srcdir) '(' -name '*.fdc' -o -name '*~' \ + 			   -o -name '[@,#]*' -o -name '*.old' \ + 			   -o -name '*.orig' -o -name '*.rej' \ +Index: Python-3.3.0/setup.py +=================================================================== +--- Python-3.3.0.orig/setup.py ++++ Python-3.3.0/setup.py +@@ -33,10 +33,6 @@ + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +  +-# File which contains the directory for shared mods (for sys.path fixup +-# when running from the build dir, see Modules/getpath.c) +-_BUILDDIR_COOKIE = "pybuilddir.txt" +- + def add_dir_to_list(dirlist, dir): +     """Add the directory 'dir' to the list 'dirlist' (after any relative +     directories) if: +@@ -252,16 +248,6 @@ +             args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags +         self.compiler.set_executables(**args) +  +-        # Not only do we write the builddir cookie, but we manually install +-        # the shared modules directory if it isn't already in sys.path. +-        # Otherwise trying to import the extensions after building them +-        # will fail. +-        with open(_BUILDDIR_COOKIE, "wb") as f: +-            f.write(self.build_lib.encode('utf-8', 'surrogateescape')) +-        abs_build_lib = os.path.join(os.getcwd(), self.build_lib) +-        if abs_build_lib not in sys.path: +-            sys.path.append(abs_build_lib) +- +         build_ext.build_extensions(self) +  +         longest = max([len(e.name) for e in self.extensions]) diff --git a/package/python3/python3-3.3-001-support-for-build.patch b/package/python3/python3-3.3-001-support-for-build.patch new file mode 100644 index 000000000..8c57cfb9c --- /dev/null +++ b/package/python3/python3-3.3-001-support-for-build.patch @@ -0,0 +1,68 @@ +Add support in Python build system to specify host pgen + +Python needs a "pgen" program to build itself. Unfortunately, the +Python build system assumes that it can use the pgen program it has +just built to build itself. Obviously, this cannot work in +cross-compilation mode since the pgen program have been built for the +target. + +Therefore, this patch adds support in the Python build system for the +new PGEN_FOR_BUILD variable, so that we can point Python ./configure +script to the pgen program that have been previously built for the +host. + +Patch ported to python2.7 by Maxime Ripard <ripard@archos.com>, and +later significantly reworked by Thomas Petazzoni +<thomas.petazzoni@free-electrons.com>, with some inspiration taken +from the Python patches of the PTXdist project, and then ported to +python3.3 by Maxime Ripard <maxime.ripard@free-electrons.com> + +Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com> +--- + Makefile.pre.in |    5 +++-- + configure.ac    |    5 +++++ + 2 files changed, 8 insertions(+), 2 deletions(-) + +Index: Python-3.3.0/Makefile.pre.in +=================================================================== +--- Python-3.3.0.orig/Makefile.pre.in ++++ Python-3.3.0/Makefile.pre.in +@@ -239,6 +239,7 @@ + ########################################################################## + # Parser + PGEN=		Parser/pgen$(EXE) ++PGEN_FOR_BUILD=@PGEN_FOR_BUILD@ +  + PSRCS=		\ + 		Parser/acceler.c \ +@@ -639,8 +640,8 @@ +  + $(GRAMMAR_H): $(GRAMMAR_INPUT) $(PGENSRCS) + 		@$(MKDIR_P) Include +-		$(MAKE) $(PGEN) +-		$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C) ++		$(MAKE) $(PGEN_FOR_BUILD) ++		$(PGEN_FOR_BUILD) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C) + $(GRAMMAR_C): $(GRAMMAR_H) $(GRAMMAR_INPUT) $(PGENSRCS) + 		$(MAKE) $(GRAMMAR_H) + 		touch $(GRAMMAR_C) +Index: Python-3.3.0/configure.ac +=================================================================== +--- Python-3.3.0.orig/configure.ac ++++ Python-3.3.0/configure.ac +@@ -51,10 +51,15 @@ +         AC_MSG_RESULT($interp) + 	PYTHON_FOR_BUILD="_PYTHON_PROJECT_BASE=$srcdir"' _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(srcdir)/Lib:$(srcdir)/Lib/plat-$(MACHDEP) '$interp +     fi ++    AC_MSG_CHECKING(pgen for build) ++    PGEN_FOR_BUILD="${PGEN_FOR_BUILD}" ++    AC_MSG_RESULT($PGEN_FOR_BUILD) + else +     PYTHON_FOR_BUILD='./$(BUILDPYTHON) -E' ++    PGEN_FOR_BUILD='./$(PGEN)' + fi + AC_SUBST(PYTHON_FOR_BUILD) ++AC_SUBST(PGEN_FOR_BUILD) +  + dnl Ensure that if prefix is specified, it does not end in a slash. If + dnl it does, we get path names containing '//' which is both ugly and diff --git a/package/python3/python3-3.3-002-no-host-headers-libs.patch b/package/python3/python3-3.3-002-no-host-headers-libs.patch new file mode 100644 index 000000000..9783f28ad --- /dev/null +++ b/package/python3/python3-3.3-002-no-host-headers-libs.patch @@ -0,0 +1,72 @@ +Do not look at host headers/libraries in cross-compile mode + +When we are cross-compiling, setup.py should never look in /usr or +/usr/local to find headers or libraries. A later patch adds a +mechanism to tell setup.py to look in a specific directory for headers +and libraries. + +Patch first written by Thomas Petazzoni +<thomas.petazzoni@free-electrons.com> for python2.7, and then ported +to python3.3 by Maxime Ripard <maxime.ripard@free-electrons.com> + +Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com> +--- + setup.py |   23 +++++------------------ + 1 file changed, 5 insertions(+), 18 deletions(-) + +Index: Python-3.3.0/setup.py +=================================================================== +--- Python-3.3.0.orig/setup.py ++++ Python-3.3.0/setup.py +@@ -447,10 +447,8 @@ +         if not cross_compiling: +             add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') +             add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') +-        # only change this for cross builds for 3.3, issues on Mageia +-        if cross_compiling: +             self.add_gcc_paths() +-        self.add_multiarch_paths() ++            self.add_multiarch_paths() +  +         # Add paths specified in the environment variables LDFLAGS and +         # CPPFLAGS for header and library files. +@@ -458,10 +456,7 @@ +         # directly since an inconsistently reproducible issue comes up where +         # the environment variable is not set even though the value were passed +         # into configure and stored in the Makefile (issue found on OS X 10.3). +-        for env_var, arg_name, dir_list in ( +-                ('LDFLAGS', '-R', self.compiler.runtime_library_dirs), +-                ('LDFLAGS', '-L', self.compiler.library_dirs), +-                ('CPPFLAGS', '-I', self.compiler.include_dirs)): ++        for env_var, arg_name, dir_list in (): +             env_val = sysconfig.get_config_var(env_var) +             if env_val: +                 # To prevent optparse from raising an exception about any +@@ -486,17 +481,6 @@ +                     for directory in reversed(options.dirs): +                         add_dir_to_list(dir_list, directory) +  +-        if os.path.normpath(sys.base_prefix) != '/usr' \ +-                and not sysconfig.get_config_var('PYTHONFRAMEWORK'): +-            # 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 +-            # the one that is currently installed (issue #7473) +-            add_dir_to_list(self.compiler.library_dirs, +-                            sysconfig.get_config_var("LIBDIR")) +-            add_dir_to_list(self.compiler.include_dirs, +-                            sysconfig.get_config_var("INCLUDEDIR")) +- +         # 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. +@@ -506,6 +490,9 @@ +                 '/lib', '/usr/lib', +                 ] +             inc_dirs = self.compiler.include_dirs + ['/usr/include'] ++        else: ++            lib_dirs = self.compiler.library_dirs ++            inc_dirs = self.compiler.include_dirs +         exts = [] +         missing = [] +  diff --git a/package/python3/python3-3.3-003-staging-header-libs.patch b/package/python3/python3-3.3-003-staging-header-libs.patch new file mode 100644 index 000000000..b0efe2961 --- /dev/null +++ b/package/python3/python3-3.3-003-staging-header-libs.patch @@ -0,0 +1,41 @@ +Tell setup.py the location of headers/libraries + +Allow the libraries detection routine to look for headers and libs in +other directories than /usr/include or /usr/lib through the +environment variables PYTHON_MODULES_INCLUDE and PYTHON_MODULES_LIB. + +We can then use it to look for libraries in the buildroot staging +directory. + +Ported to python3.3 by Maxime Ripard <maxime.ripard@free-electrons.com> based +on the work by Thomas Petazzoni <thomas.petazzoni@free-electrons.com> + +Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com> +--- + setup.py |   13 +++++++++++++ + 1 file changed, 13 insertions(+) + +Index: Python-3.3.0/setup.py +=================================================================== +--- Python-3.3.0.orig/setup.py ++++ Python-3.3.0/setup.py +@@ -441,6 +441,19 @@ +             os.unlink(tmpfile) +  +     def detect_modules(self): ++        try: ++            modules_include_dirs = os.environ["PYTHON_MODULES_INCLUDE"].split() ++        except KeyError: ++            modules_include_dirs = ['/usr/include'] ++        try: ++            modules_lib_dirs = os.environ["PYTHON_MODULES_LIB"].split() ++        except KeyError: ++            modules_lib_dirs = ['/usr/lib'] ++        for dir in modules_include_dirs: ++            add_dir_to_list(self.compiler.include_dirs, dir) ++        for dir in modules_lib_dirs: ++            add_dir_to_list(self.compiler.library_dirs, dir) ++ +         # Ensure that /usr/local is always used, but the local build +         # directories (i.e. '.' and 'Include') must be first.  See issue +         # 10520. diff --git a/package/python3/python3-3.3-004-no-import-when-cross-compiling.patch b/package/python3/python3-3.3-004-no-import-when-cross-compiling.patch new file mode 100644 index 000000000..cd5a43747 --- /dev/null +++ b/package/python3/python3-3.3-004-no-import-when-cross-compiling.patch @@ -0,0 +1,27 @@ +Disable import check when cross-compiling + +Once Python has compiled an extension (i.e some C code, potentially +linked to a library), it tries to import it. This cannot work in +cross-compilation mode, so we just disable this check. + +Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> +Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com> +--- + setup.py |    4 ++++ + 1 file changed, 4 insertions(+) + +Index: Python-3.3.0/setup.py +=================================================================== +--- Python-3.3.0.orig/setup.py ++++ Python-3.3.0/setup.py +@@ -318,6 +318,10 @@ +             self.announce('WARNING: skipping import check for Cygwin-based "%s"' +                 % ext.name) +             return ++        if os.environ.get('CROSS_COMPILING') == 'yes': ++            self.announce('WARNING: skipping import check for cross compiled "%s"' ++                          % ext.name) ++            return +         ext_filename = os.path.join( +             self.build_lib, +             self.get_ext_filename(self.get_ext_fullname(ext.name))) diff --git a/package/python3/python3-3.3-005-do-not-generate-pyo-files.patch b/package/python3/python3-3.3-005-do-not-generate-pyo-files.patch new file mode 100644 index 000000000..983d54647 --- /dev/null +++ b/package/python3/python3-3.3-005-do-not-generate-pyo-files.patch @@ -0,0 +1,40 @@ +Do not generate .pyo files + +By default, the Python installation byte-compiles all modules in two +forms: the normal bytecode (.pyc) and an optimized bytecode (.pyo). + +According to +http://www.network-theory.co.uk/docs/pytut/CompiledPythonfiles.html, +the optimization do not do anything useful, and generating both the +"non-optimized" and "optimized" bytecode variants takes time. + +Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> +--- + Makefile.pre.in |    9 --------- + 1 file changed, 9 deletions(-) + +Index: Python-3.3.0/Makefile.pre.in +=================================================================== +--- Python-3.3.0.orig/Makefile.pre.in ++++ Python-3.3.0/Makefile.pre.in +@@ -1082,20 +1082,11 @@ + 		-d $(LIBDEST) -f \ + 		-x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \ + 		$(DESTDIR)$(LIBDEST) +-	-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ +-		$(PYTHON_FOR_BUILD) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \ +-		-d $(LIBDEST) -f \ +-		-x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \ +-		$(DESTDIR)$(LIBDEST) + 	-PYTHONPATH=$(DESTDIR)$(LIBDEST)  $(RUNSHARED) \ + 		$(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \ + 		-d $(LIBDEST)/site-packages -f \ + 		-x badsyntax $(DESTDIR)$(LIBDEST)/site-packages + 	-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ +-		$(PYTHON_FOR_BUILD) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \ +-		-d $(LIBDEST)/site-packages -f \ +-		-x badsyntax $(DESTDIR)$(LIBDEST)/site-packages +-	-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ + 		$(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/Grammar.txt + 	-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ + 		$(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/PatternGrammar.txt diff --git a/package/python3/python3-3.3-006-reread-environment.patch b/package/python3/python3-3.3-006-reread-environment.patch new file mode 100644 index 000000000..752b15a4e --- /dev/null +++ b/package/python3/python3-3.3-006-reread-environment.patch @@ -0,0 +1,63 @@ +Make sure setup.py reads the correct CONFIG_ARGS + +The setup.py script that builds and installs all the Python modules +shipped with the interpreter looks at the CONFIG_ARGS variable stored +in the "sysconfig" module to look at the ./configure options and +adjust its behaviour accordingly. + +Unfortunately, when cross-compiling, the value of CONFIG_ARGS returned +by the sysconfig are the one passed to the ./configure script of the +*host* Python and not the one we're currently building for the target. + +In order to avoid that, we re-initialize the values in the sysconfig +module by re-reading the environment at the beginning of the setup.py +script, and we make sure that the CONFIG_ARGS variable is actually +part of the environment of setup.py. + +See the beginning of +http://article.gmane.org/gmane.comp.python.devel/99772 for the +inspiration. + +Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> + +--- + Makefile.pre.in |    4 +++- + setup.py        |    3 +++ + 2 files changed, 6 insertions(+), 1 deletion(-) + +Index: Python-3.3.0/setup.py +=================================================================== +--- Python-3.3.0.orig/setup.py ++++ Python-3.3.0/setup.py +@@ -30,6 +30,9 @@ + # Were we compiled --with-pydebug or with #define Py_DEBUG? + COMPILED_WITH_PYDEBUG = ('--with-pydebug' in sysconfig.get_config_var("CONFIG_ARGS")) +  ++sysconfig.get_config_vars() ++sysconfig._CONFIG_VARS.update(os.environ) ++ + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +  +Index: Python-3.3.0/Makefile.pre.in +=================================================================== +--- Python-3.3.0.orig/Makefile.pre.in ++++ Python-3.3.0/Makefile.pre.in +@@ -478,6 +478,7 @@ + sharedmods: $(BUILDPYTHON) pybuilddir.txt + 	case $$MAKEFLAGS in *s*) quiet=-q; esac; \ + 	$(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \ ++		CONFIG_ARGS="$(CONFIG_ARGS)" \ + 		$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build +  + # Build static library +@@ -1183,7 +1184,8 @@ + # Install the dynamically loadable modules + # This goes into $(exec_prefix) + sharedinstall: sharedmods +-	$(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/setup.py install \ ++	$(RUNSHARED) CONFIG_ARGS="$(CONFIG_ARGS)" \ ++		$(PYTHON_FOR_BUILD) $(srcdir)/setup.py install \ + 	   	--prefix=$(prefix) \ + 		--install-scripts=$(BINDIR) \ + 		--install-platlib=$(DESTSHARED) \ diff --git a/package/python3/python3-3.3-007-change-pyconfig-h-location.patch b/package/python3/python3-3.3-007-change-pyconfig-h-location.patch new file mode 100644 index 000000000..8d45daef4 --- /dev/null +++ b/package/python3/python3-3.3-007-change-pyconfig-h-location.patch @@ -0,0 +1,76 @@ +Change the location of pyconfig.h + +The Python interpreter has a really strange behaviour: at *runtime*, +it reads a Makefile and a header file named pyconfig.h to get some +information about the configuration. + +The Makefile is located in usr/lib/python3.3/config-3.3m, which is fine +since this location is kept on the target. + +However, by default, the pyconfig.h is installed in +usr/include/python3.3m, but we completely remove the usr/include +directory for the target. Since making an exception just for +pyconfig.h is annoying, this patch also installs pyconfig.h to +usr/lib/python3.3/config-3.3m, and modifies the sysconfig module so that it +looks in this location instead of usr/include. + +The pyconfig.h is still kept in usr/include/python3.3m, because it is +needed in the $(STAGING_DIR) when building third-party Python +extensions that contain C code. + +Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> + +--- + Lib/distutils/sysconfig.py |    3 ++- + Lib/sysconfig.py           |    2 +- + Makefile.pre.in            |    3 ++- + 3 files changed, 5 insertions(+), 3 deletions(-) + +Index: Python-3.3.0/Lib/distutils/sysconfig.py +=================================================================== +--- Python-3.3.0.orig/Lib/distutils/sysconfig.py ++++ Python-3.3.0/Lib/distutils/sysconfig.py +@@ -239,7 +239,8 @@ +         else: +             inc_dir = _sys_home or project_base +     else: +-        inc_dir = get_python_inc(plat_specific=1) ++        lib_dir = get_python_lib(plat_specific=1, standard_lib=1) ++        inc_dir = os.path.join(lib_dir, "config") +     if get_python_version() < '2.2': +         config_h = 'config.h' +     else: +Index: Python-3.3.0/Lib/sysconfig.py +=================================================================== +--- Python-3.3.0.orig/Lib/sysconfig.py ++++ Python-3.3.0/Lib/sysconfig.py +@@ -467,7 +467,7 @@ +         else: +             inc_dir = _sys_home or _PROJECT_BASE +     else: +-        inc_dir = get_path('platinclude') ++        inc_dir = os.path.join(get_path('stdlib'), "config") +     return os.path.join(inc_dir, 'pyconfig.h') +  +  +Index: Python-3.3.0/Makefile.pre.in +=================================================================== +--- Python-3.3.0.orig/Makefile.pre.in ++++ Python-3.3.0/Makefile.pre.in +@@ -1123,7 +1123,6 @@ + 		echo $(INSTALL_DATA) $$i $(INCLUDEPY); \ + 		$(INSTALL_DATA) $$i $(DESTDIR)$(INCLUDEPY); \ + 	done +-	$(INSTALL_DATA) pyconfig.h $(DESTDIR)$(CONFINCLUDEPY)/pyconfig.h +  + # Install the library and miscellaneous stuff needed for extending/embedding + # This goes into $(exec_prefix) +@@ -1157,6 +1156,8 @@ + 	$(INSTALL_DATA) Modules/python.o $(DESTDIR)$(LIBPL)/python.o + 	$(INSTALL_DATA) $(srcdir)/Modules/config.c.in $(DESTDIR)$(LIBPL)/config.c.in + 	$(INSTALL_DATA) Makefile $(DESTDIR)$(LIBPL)/Makefile ++	$(INSTALL_DATA) pyconfig.h $(DESTDIR)$(LIBPL)/pyconfig.h ++	$(INSTALL_DATA) pyconfig.h $(DESTDIR)$(CONFINCLUDEPY)/pyconfig.h + 	$(INSTALL_DATA) Modules/Setup $(DESTDIR)$(LIBPL)/Setup + 	$(INSTALL_DATA) Modules/Setup.local $(DESTDIR)$(LIBPL)/Setup.local + 	$(INSTALL_DATA) Modules/Setup.config $(DESTDIR)$(LIBPL)/Setup.config diff --git a/package/python3/python3-3.3-008-no-rpath.patch b/package/python3/python3-3.3-008-no-rpath.patch new file mode 100644 index 000000000..cdeec22ce --- /dev/null +++ b/package/python3/python3-3.3-008-no-rpath.patch @@ -0,0 +1,51 @@ +Remove runtime library paths + +For some extensions (sqlite and dbm), Python setup.py script +hardcode a runtime path (rpath) into the extension. However, this +runtime path is incorrect (because it points to the location of the +library directory on the development machine) and useless (because on +the target, all useful libraries are in a standard directory searched +by the dynamic loader). For those reasons, we just get rid of the +runtime paths in cross-compilation mode. + +Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> +--- + setup.py |   12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +Index: Python-3.3.0/setup.py +=================================================================== +--- Python-3.3.0.orig/setup.py ++++ Python-3.3.0/setup.py +@@ -1134,11 +1134,15 @@ +             # can end up with a bad search path order. +             if sqlite_incdir not in self.compiler.include_dirs: +                 include_dirs.append(sqlite_incdir) ++            if cross_compiling: ++                sqlite_runtime_libdir = None ++            else: ++                sqlite_runtime_libdir = sqlite_libdir +             exts.append(Extension('_sqlite3', sqlite_srcs, +                                   define_macros=sqlite_defines, +                                   include_dirs=include_dirs, +                                   library_dirs=sqlite_libdir, +-                                  runtime_library_dirs=sqlite_libdir, ++                                  runtime_library_dirs=sqlite_runtime_libdir, +                                   extra_link_args=sqlite_extra_link_args, +                                   libraries=["sqlite3",])) +         else: +@@ -1205,9 +1209,13 @@ +                 elif cand == "bdb": +                     if db_incs is not None: +                         if dbm_setup_debug: print("building dbm using bdb") ++                        if cross_compiling: ++                            dblib_runtime_libdir = None ++                        else: ++                            dblib_runtime_libdir = dblib_dir +                         dbmext = Extension('_dbm', ['_dbmmodule.c'], +                                            library_dirs=dblib_dir, +-                                           runtime_library_dirs=dblib_dir, ++                                           runtime_library_dirs=dblib_runtime_libdir, +                                            include_dirs=db_incs, +                                            define_macros=[ +                                                ('HAVE_BERKDB_H', None), diff --git a/package/python3/python3-3.3-009-verbose-module-build.patch b/package/python3/python3-3.3-009-verbose-module-build.patch new file mode 100644 index 000000000..60b6d797d --- /dev/null +++ b/package/python3/python3-3.3-009-verbose-module-build.patch @@ -0,0 +1,26 @@ +Enables verbose output when building modules + +Patch borrowed from OpenBricks. + +Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> + +--- + Makefile.pre.in |    3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +Index: Python-3.3.0/Makefile.pre.in +=================================================================== +--- Python-3.3.0.orig/Makefile.pre.in ++++ Python-3.3.0/Makefile.pre.in +@@ -476,10 +476,9 @@ +  + # Build the shared modules + sharedmods: $(BUILDPYTHON) pybuilddir.txt +-	case $$MAKEFLAGS in *s*) quiet=-q; esac; \ + 	$(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \ + 		CONFIG_ARGS="$(CONFIG_ARGS)" \ +-		$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build ++		$(PYTHON_FOR_BUILD) $(srcdir)/setup.py build +  + # Build static library + # avoid long command lines, same as LIBRARY_OBJS diff --git a/package/python3/python3-3.3-010-distutils-cross-compilation-support.patch b/package/python3/python3-3.3-010-distutils-cross-compilation-support.patch new file mode 100644 index 000000000..0a51400bf --- /dev/null +++ b/package/python3/python3-3.3-010-distutils-cross-compilation-support.patch @@ -0,0 +1,71 @@ +Add some cross-compilation fixes to distutils + +Inspired by work done by Marc Kleine-Budde <mkl@pengutronix.de> in +PTXdist. + +Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> +--- + Lib/distutils/sysconfig.py |   17 +++++++++++++---- + configure.ac               |    8 +++++++- + 2 files changed, 20 insertions(+), 5 deletions(-) + +Index: Python-3.3.0/Lib/distutils/sysconfig.py +=================================================================== +--- Python-3.3.0.orig/Lib/distutils/sysconfig.py ++++ Python-3.3.0/Lib/distutils/sysconfig.py +@@ -16,15 +16,24 @@ + from .errors import DistutilsPlatformError +  + # These are needed in a couple of spots, so just compute them once. +-PREFIX = os.path.normpath(sys.prefix) +-EXEC_PREFIX = os.path.normpath(sys.exec_prefix) ++EXECUTABLE_DIRNAME = os.path.dirname(os.path.realpath(sys.executable)) ++if os.environ.get('CROSS_COMPILING') == 'yes': ++    _sysroot=os.environ.get('_python_sysroot') ++    PREFIX = os.path.normpath(_sysroot + os.environ.get('_python_prefix')) ++    EXEC_PREFIX = os.path.normpath(_sysroot + os.environ.get('_python_exec_prefix')) ++    if '_python_srcdir' in os.environ: ++        EXECUTABLE_DIRNAME = os.path.normpath(os.environ['_python_srcdir']) ++else: ++    PREFIX = os.path.normpath(sys.prefix) ++    EXEC_PREFIX = os.path.normpath(sys.exec_prefix) ++ + BASE_PREFIX = os.path.normpath(sys.base_prefix) + BASE_EXEC_PREFIX = os.path.normpath(sys.base_exec_prefix) +  + # Path to the base directory of the project. On Windows the binary may + # live in project/PCBuild9.  If we're dealing with an x64 Windows build, + # it'll live in project/PCbuild/amd64. +-project_base = os.path.dirname(os.path.abspath(sys.executable)) ++project_base = EXECUTABLE_DIRNAME + if os.name == "nt" and "pcbuild" in project_base[-8:].lower(): +     project_base = os.path.abspath(os.path.join(project_base, os.path.pardir)) + # PC/VS7.1 +@@ -98,7 +107,7 @@ +             # the build directory may not be the source directory, we +             # must use "srcdir" from the makefile to find the "Include" +             # directory. +-            base = _sys_home or os.path.dirname(os.path.abspath(sys.executable)) ++            base = _sys_home or EXECUTABLE_DIRNAME +             if plat_specific: +                 return base +             if _sys_home: +Index: Python-3.3.0/configure.ac +=================================================================== +--- Python-3.3.0.orig/configure.ac ++++ Python-3.3.0/configure.ac +@@ -963,7 +963,13 @@ + fi +  + if test "$cross_compiling" = yes; then +-	RUNSHARED= ++	RUNSHARED=" \ ++		CROSS_COMPILING=yes \ ++		_python_cross_host=${ac_cv_host} \ ++		_python_sysroot=\"\$(sysroot)\" \ ++		_python_srcdir=\"\$(srcdir)\" \ ++		_python_prefix=\"\$(prefix)\" \ ++		_python_exec_prefix=\"\$(exec_prefix)\"" + fi +  + AC_MSG_RESULT($LDLIBRARY) diff --git a/package/python3/python3-3.3-011-cross-compile-getaddrinfo.patch b/package/python3/python3-3.3-011-cross-compile-getaddrinfo.patch new file mode 100644 index 000000000..33286ce39 --- /dev/null +++ b/package/python3/python3-3.3-011-cross-compile-getaddrinfo.patch @@ -0,0 +1,21 @@ +Disable buggy_getaddrinfo configure test when cross-compiling with IPv6 support + +Signed-off-by: Vanya Sergeev <vsergeev at gmail.com> + +--- + configure.ac |    2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: Python-3.3.0/configure.ac +=================================================================== +--- Python-3.3.0.orig/configure.ac ++++ Python-3.3.0/configure.ac +@@ -3204,7 +3204,7 @@ +  + AC_MSG_RESULT($ac_cv_buggy_getaddrinfo) +  +-if test $have_getaddrinfo = no || test "$ac_cv_buggy_getaddrinfo" = yes ++if test $have_getaddrinfo = no || test "$cross_compiling" != "yes" -a "$ac_cv_buggy_getaddrinfo" = yes + then + 	if test $ipv6 = yes + 	then diff --git a/package/python3/python3.mk b/package/python3/python3.mk new file mode 100644 index 000000000..bcd83eaf6 --- /dev/null +++ b/package/python3/python3.mk @@ -0,0 +1,152 @@ +############################################################# +# +# python3 +# +############################################################# +PYTHON3_VERSION_MAJOR = 3.3 +PYTHON3_VERSION       = $(PYTHON3_VERSION_MAJOR).0 +PYTHON3_SOURCE        = Python-$(PYTHON3_VERSION).tar.bz2 +PYTHON3_SITE          = http://python.org/ftp/python/$(PYTHON3_VERSION) + +# Python needs itself and a "pgen" program to build itself, both being +# provided in the Python sources. So in order to cross-compile Python, +# we need to build a host Python first. This host Python is also +# installed in $(HOST_DIR), as it is needed when cross-compiling +# third-party Python modules. + +HOST_PYTHON3_CONF_OPT += 	\ +	--without-cxx-main 	\ +	--disable-sqlite3	\ +	--disable-tk		\ +	--with-expat=system	\ +	--disable-curses	\ +	--disable-codecs-cjk	\ +	--disable-nis		\ +	--disable-unicodedata	\ +	--disable-dbm		\ +	--disable-gdbm		\ +	--disable-bsddb		\ +	--disable-test-modules	\ +	--disable-bz2		\ +	--disable-ssl + +HOST_PYTHON3_MAKE_ENV = \ +	PYTHON_MODULES_INCLUDE=$(HOST_DIR)/usr/include \ +	PYTHON_MODULES_LIB="$(HOST_DIR)/lib $(HOST_DIR)/usr/lib" + +HOST_PYTHON3_AUTORECONF = YES + +define HOST_PYTHON3_CONFIGURE_CMDS +	(cd $(@D) && rm -rf config.cache; \ +	        $(HOST_CONFIGURE_OPTS) \ +		CFLAGS="$(HOST_CFLAGS)" \ +		LDFLAGS="$(HOST_LDFLAGS)" \ +                $(HOST_PYTHON3_CONF_ENV) \ +		./configure \ +		--prefix="$(HOST_DIR)/usr" \ +		--sysconfdir="$(HOST_DIR)/etc" \ +		$(HOST_PYTHON3_CONF_OPT) \ +	) +endef + +PYTHON3_DEPENDENCIES  = host-python3 libffi + +HOST_PYTHON3_DEPENDENCIES = host-expat host-zlib + +PYTHON3_INSTALL_STAGING = YES + +ifeq ($(BR2_PACKAGE_PYTHON3_READLINE),y) +PYTHON3_DEPENDENCIES += readline +endif + +ifeq ($(BR2_PACKAGE_PYTHON3_CURSES),y) +PYTHON3_DEPENDENCIES += ncurses +endif + +ifeq ($(BR2_PACKAGE_PYTHON3_PYEXPAT),y) +PYTHON3_DEPENDENCIES += expat +PYTHON3_CONF_OPT += --with-expat=system +else +PYTHON3_CONF_OPT += --with-expat=none +endif + +ifeq ($(BR2_PACKAGE_PYTHON3_SQLITE),y) +PYTHON3_DEPENDENCIES += sqlite +endif + +ifeq ($(BR2_PACKAGE_PYTHON3_SSL),y) +PYTHON_DEPENDENCIES += openssl +endif + +ifeq ($(BR2_PACKAGE_PYTHON3_BZIP2),y) +PYTHON_DEPENDENCIES += bzip2 +endif + +ifeq ($(BR2_PACKAGE_PYTHON3_ZLIB),y) +PYTHON3_DEPENDENCIES += zlib +endif + +PYTHON3_CONF_ENV += \ +	_PROJECT_BASE=$(PYTHON3_DIR) \ +	_PYTHON_HOST_PLATFORM=$(BR2_HOSTARCH) \ +	PYTHON_FOR_BUILD=$(HOST_PYTHON3_DIR)/python \ +	PGEN_FOR_BUILD=$(HOST_PYTHON3_DIR)/Parser/pgen \ +	ac_cv_have_long_long_format=yes \ +	ac_cv_file__dev_ptmx=yes \ +	ac_cv_file__dev_ptc=yes \ + +PYTHON3_CONF_OPT += \ +	--without-cxx-main 	\ +	--with-system-ffi	\ +	--disable-pydoc		\ +	--disable-test-modules	\ +	--disable-lib2to3	\ +	--disable-gdbm		\ +	--disable-tk		\ +	--disable-nis		\ +	--disable-dbm + +PYTHON3_MAKE_ENV = \ +	_PROJECT_BASE=$(PYTHON3_DIR) \ +	_PYTHON_HOST_PLATFORM=$(BR2_HOSTARCH) \ +	PYTHON_MODULES_INCLUDE=$(STAGING_DIR)/usr/include \ +	PYTHON_MODULES_LIB="$(STAGING_DIR)/lib $(STAGING_DIR)/usr/lib" + +# python distutils adds -L$LIBDIR when linking binary extensions, causing +# trouble for cross compilation +define PYTHON3_FIXUP_LIBDIR +	$(SED) 's|^LIBDIR=.*|LIBDIR= $(STAGING_DIR)/usr/lib|' \ +	   $(STAGING_DIR)/usr/lib/python$(PYTHON3_VERSION_MAJOR)/config-3.3m/Makefile +endef + +PYTHON3_POST_INSTALL_STAGING_HOOKS += PYTHON3_FIXUP_LIBDIR + +# +# Development files removal +# +define PYTHON3_REMOVE_DEVFILES +	rm -f $(TARGET_DIR)/usr/bin/python$(PYTHON3_VERSION_MAJOR)-config +	rm -f $(TARGET_DIR)/usr/bin/python3-config +endef + +ifneq ($(BR2_HAVE_DEVFILES),y) +PYTHON3_POST_INSTALL_TARGET_HOOKS += PYTHON3_REMOVE_DEVFILES +endif + +# +# Remove useless files. In the config/ directory, only the Makefile +# and the pyconfig.h files are needed at runtime. +# +define PYTHON3_REMOVE_USELESS_FILES +	for i in `find $(TARGET_DIR)/usr/lib/python$(PYTHON3_VERSION_MAJOR)/config-3.3m/ \ +		-type f -not -name pyconfig.h -a -not -name Makefile` ; do \ +		rm -f $$i ; \ +	done +endef + +PYTHON3_POST_INSTALL_TARGET_HOOKS += PYTHON3_REMOVE_USELESS_FILES + +PYTHON3_AUTORECONF = YES + +$(eval $(autotools-package)) +$(eval $(host-autotools-package))  | 
