From 03c4d57f1d9e2b0f516afdd7e7b3f082694d3c0a Mon Sep 17 00:00:00 2001 From: Maxime Ripard Date: Wed, 7 Nov 2012 05:01:21 +0000 Subject: [PATCH] Add python3 package [Peter: s/python/python3/] Signed-off-by: Maxime Ripard Signed-off-by: Peter Korsgaard --- package/Config.in | 1 + package/python3/Config.in | 81 +++++++++ ...3-000-generate-sysconfigdata-buildir.patch | 158 ++++++++++++++++++ .../python3-3.3-001-support-for-build.patch | 68 ++++++++ ...python3-3.3-002-no-host-headers-libs.patch | 72 ++++++++ .../python3-3.3-003-staging-header-libs.patch | 41 +++++ ...3-004-no-import-when-cross-compiling.patch | 27 +++ ...n3-3.3-005-do-not-generate-pyo-files.patch | 40 +++++ .../python3-3.3-006-reread-environment.patch | 63 +++++++ ...3-3.3-007-change-pyconfig-h-location.patch | 76 +++++++++ .../python3/python3-3.3-008-no-rpath.patch | 51 ++++++ ...python3-3.3-009-verbose-module-build.patch | 26 +++ ...-distutils-cross-compilation-support.patch | 71 ++++++++ ...n3-3.3-011-cross-compile-getaddrinfo.patch | 21 +++ package/python3/python3.mk | 152 +++++++++++++++++ 15 files changed, 948 insertions(+) create mode 100644 package/python3/Config.in create mode 100644 package/python3/python3-3.3-000-generate-sysconfigdata-buildir.patch create mode 100644 package/python3/python3-3.3-001-support-for-build.patch create mode 100644 package/python3/python3-3.3-002-no-host-headers-libs.patch create mode 100644 package/python3/python3-3.3-003-staging-header-libs.patch create mode 100644 package/python3/python3-3.3-004-no-import-when-cross-compiling.patch create mode 100644 package/python3/python3-3.3-005-do-not-generate-pyo-files.patch create mode 100644 package/python3/python3-3.3-006-reread-environment.patch create mode 100644 package/python3/python3-3.3-007-change-pyconfig-h-location.patch create mode 100644 package/python3/python3-3.3-008-no-rpath.patch create mode 100644 package/python3/python3-3.3-009-verbose-module-build.patch create mode 100644 package/python3/python3-3.3-010-distutils-cross-compilation-support.patch create mode 100644 package/python3/python3-3.3-011-cross-compile-getaddrinfo.patch create mode 100644 package/python3/python3.mk diff --git a/package/Config.in b/package/Config.in index bcd1b47b0c..2ab6b6e681 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 0000000000..2e1e98b9f7 --- /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 0000000000..a29aa0ffc8 --- /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 +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 0000000000..8c57cfb9cc --- /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 , and +later significantly reworked by Thomas Petazzoni +, with some inspiration taken +from the Python patches of the PTXdist project, and then ported to +python3.3 by Maxime Ripard + +Signed-off-by: Maxime Ripard +--- + 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 0000000000..9783f28ade --- /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 + for python2.7, and then ported +to python3.3 by Maxime Ripard + +Signed-off-by: Maxime Ripard +--- + 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 0000000000..b0efe29614 --- /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 based +on the work by Thomas Petazzoni + +Signed-off-by: Maxime Ripard +--- + 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 0000000000..cd5a437472 --- /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 +Signed-off-by: Maxime Ripard +--- + 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 0000000000..983d546473 --- /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 +--- + 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 0000000000..752b15a4e2 --- /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 + +--- + 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 0000000000..8d45daef4d --- /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 + +--- + 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 0000000000..cdeec22ce9 --- /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 +--- + 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 0000000000..60b6d797d3 --- /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 + +--- + 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 0000000000..0a51400bf5 --- /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 in +PTXdist. + +Signed-off-by: Thomas Petazzoni +--- + 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 0000000000..33286ce391 --- /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 + +--- + 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 0000000000..bcd83eaf69 --- /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)) -- 2.30.2