diff --git a/packages/Python-2.7.5/Makefile.pre.in b/packages/Python-2.7.5/Makefile.pre.in index 9d55550..b5a1103 100644 --- a/packages/Python-2.7.5/Makefile.pre.in +++ b/packages/Python-2.7.5/Makefile.pre.in @@ -196,6 +196,24 @@ PYTHON_FOR_BUILD=@PYTHON_FOR_BUILD@ _PYTHON_HOST_PLATFORM=@_PYTHON_HOST_PLATFORM@ HOST_GNU_TYPE= @host@ +########################################################################## +# Cross-compile early build requriements and related: X_FOR_BUILD +# +BUILD_FOR_BUILD=@BUILD_FOR_BUILD@ +BUILD_PYTHON_FOR_BUILD=@BUILD_PYTHON_FOR_BUILD@ +SKIP_FOR_BUILD=@SKIP_FOR_BUILD@ +# +########################################################################## +# Values saved aside for later cross-compile toolchain +# +CC_FOR_CROSS_COMPILE=@CC_FOR_CROSS_COMPILE@ +CXX_FOR_CROSS_COMPILE=@CXX_FOR_CROSS_COMPILE@ +AR_FOR_CROSS_COMPILE=@AR_FOR_CROSS_COMPILE@ +RANLIB_FOR_CROSS_COMPILE=@RANLIB_FOR_CROSS_COMPILE@ +# +########################################################################## + + # 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 #PROFILE_TASK= $(srcdir)/Lib/test/regrtest.py @@ -227,6 +245,7 @@ LIBFFI_INCLUDEDIR= @LIBFFI_INCLUDEDIR@ ########################################################################## # Parser PGEN= Parser/pgen$(EXE) +PGEN_FOR_BUILD= @PGEN_FOR_BUILD@ PSRCS= \ Parser/acceler.c \ @@ -432,7 +451,14 @@ coverage: # Build the interpreter -$(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY) +$(BUILDPYTHON): $(BUILD_FOR_BUILD) Modules/python.o $(LIBRARY) $(LDLIBRARY) + $(LINKCC) $(LDFLAGS) $(LINKFORSHARED) -o $@ \ + Modules/python.o \ + $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST) + +# Build the native interpreter for cross-compile only with missing corresponding Python installation +python_for_build$(EXE): Modules/python.o $(LIBRARY) $(LDLIBRARY) + @echo -e "Building Python for build = python_for_build$(EXE) ...\n" $(LINKCC) $(LDFLAGS) $(LINKFORSHARED) -o $@ \ Modules/python.o \ $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST) @@ -593,14 +630,30 @@ Modules/pwdmodule.o: $(srcdir)/Modules/pwdmodule.c $(srcdir)/Modules/posixmodule $(GRAMMAR_H): $(GRAMMAR_INPUT) $(PGENSRCS) @$(MKDIR_P) Include $(MAKE) $(PGEN) - $(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C) + $(PGEN_FOR_BUILD) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C) $(GRAMMAR_C): $(GRAMMAR_H) $(GRAMMAR_INPUT) $(PGENSRCS) $(MAKE) $(GRAMMAR_H) touch $(GRAMMAR_C) -$(PGEN): $(PGENOBJS) +$(PGEN): $(BUILD_FOR_BUILD) $(PGENOBJS) + @echo -e "Building PGEN=$(PGEN) ...\n" $(CC) $(OPT) $(LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN) +# Build Parser/pgen_for build to run on build-host during cross-compile only. +$(PGEN_FOR_BUILD): $(BUILD_PYTHON_FOR_BUILD) $(PGENOBJS) + @echo -e "(I) Building PGEN_FOR_BUILD=$(PGEN_FOR_BUILD) ...\n" + $(CC) $(OPT) $(LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN_FOR_BUILD) + @echo -e "(I) Completed building native files necessary for cross-compile. Cleaning native build-host files ...\n" + $(MAKE) clean + @# Restore cross-compile tool-chain + CC=$(CC_FOR_CROSS_COMPILE) + CXX=$(CXX_FOR_CROSS_COMPILE) + AR=$(AR_FOR_CROSS_COMPILE) + RANLIB=$(RANLIB_FOR_CROSS_COMPILE) + MAINCC=$(CC) + LINKCC=$(PURIFY) $(MAINCC) + @# Cross-comp(I) ile object files that were expected to be here + @$(MAKE) $(PGENOBJS) + Parser/grammar.o: $(srcdir)/Parser/grammar.c \ $(srcdir)/Include/token.h \ $(srcdir)/Include/grammar.h @@ -1133,11 +1198,13 @@ libainstall: all python-config # Install the dynamically loadable modules # This goes into $(exec_prefix) sharedinstall: sharedmods + CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \ $(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/setup.py install \ + $(SKIP_FOR_BUILD) \ --prefix=$(prefix) \ - --install-scripts=$(BINDIR) \ - --install-platlib=$(DESTSHARED) \ - --root=$(DESTDIR)/ + --install-scripts=$(DESTDIR)$(BINDIR) \ + --install-platlib=$(DESTDIR)$(DESTSHARED) \ + --root=/ -rm $(DESTDIR)$(DESTSHARED)/_sysconfigdata.py* # Here are a couple of targets for MacOSX again, to install a full diff --git a/packages/Python-2.7.5/configure.ac b/packages/Python-2.7.5/configure.ac index 30f5bf4..f216cd5 100644 --- a/packages/Python-2.7.5/configure.ac +++ b/packages/Python-2.7.5/configure.ac @@ -16,28 +16,57 @@ AC_CANONICAL_HOST AC_SUBST(build) AC_SUBST(host) +# Require compatible python interpreter (2.7.0 <= version < 3.0) and +# Parser/pgen installed on build-box for cross-compile. if test "$cross_compiling" = yes; then + # Build python interpreter to be used in cross-compiling, if missing on build-host, and pgen. AC_MSG_CHECKING([for python interpreter for cross build]) if test -z "$PYTHON_FOR_BUILD"; then for interp in python$PACKAGE_VERSION python2 python; do - which $interp >/dev/null 2>&1 || continue - if $interp -c 'import sys;sys.exit(not (sys.version_info@<:@:2@:>@ >= (2,7) and sys.version_info@<:@0@:>@ < 3))'; then - break - fi + which $interp >/dev/null 2>&1 || continue + if $interp -c 'import sys;sys.exit(not (sys.version_info@<:@:2@:>@ >= (2,7) and sys.version_info@<:@0@:>@ < 3))'; then + break + fi interp= - done + done if test x$interp = x; then - AC_MSG_ERROR([python$PACKAGE_VERSION interpreter not found]) - fi + # Use native interpreter built during early make + interp='$(srcdir)/build-host-python' + BUILD_FOR_BUILD='python_for_build$(EXE)' + else + BUILD_FOR_BUILD='' + fi AC_MSG_RESULT($interp) - PYTHON_FOR_BUILD='_PYTHON_PROJECT_BASE=$(abs_builddir) _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(shell test -f pybuilddir.txt && echo $(abs_builddir)/`cat pybuilddir.txt`:)$(srcdir)/Lib:$(srcdir)/Lib/plat-$(MACHDEP) '$interp + BUILD_PYTHON_FOR_BUILD="${BUILD_FOR_BUILD}" + PYTHON_FOR_BUILD='_PYTHON_PROJECT_BASE=$(abs_builddir) _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(shell test -f pybuilddir.txt && echo $(abs_builddir)/`cat pybuilddir.txt`:)$(srcdir)/Lib:$(srcdir)/Lib/plat-$(MACHDEP) '$interp + if test "$build_python_for_build" = yes; then + AC_MSG_WARN('Corresponding python interpreter on build-host was not found. Scheduling for build before cross-compile ...') + fi + fi + # Unless specified on cmd-line, always build native Parser/pgen to be used during cross-compile. + AC_MSG_CHECKING([for Parser/pgen for cross build]) + if test -z "$PGEN_FOR_BUILD"; then + PGEN_FOR_BUILD='Parser/pgen_for_build$(EXE)' + AC_MSG_RESULT($PGEN_FOR_BUILD) + BUILD_FOR_BUILD="${BUILD_FOR_BUILD} ${PGEN_FOR_BUILD}" + AC_MSG_WARN('No Parser/pgen was provided for build. Scheduling for build before cross-compile ...') + else + AC_MSG_RESULT($PGEN_FOR_BUILD) fi + SKIP_MODS_BUILD='--skip-build' elif test "$cross_compiling" = maybe; then AC_MSG_ERROR([Cross compiling required --host=HOST-TUPLE and --build=ARCH]) else PYTHON_FOR_BUILD='./$(BUILDPYTHON) -E' + PGEN_FOR_BUILD='$(PGEN)' + BUILD_FOR_BUILD='' + SKIP_MODS_BUILD='' fi AC_SUBST(PYTHON_FOR_BUILD) +AC_SUBST(PGEN_FOR_BUILD) +AC_SUBST(BUILD_FOR_BUILD) +AC_SUBST(BUILD_PYTHON_FOR_BUILD) +AC_SUBST(SKIP_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 @@ -4499,6 +4528,30 @@ for dir in $SRCDIRS; do done AC_MSG_RESULT(done) +# Saving cross-compile tool-chaing, because need to at least build Parser/pgen +# to run natively on build system. +if test "$cross_compiling" = yes; then + # save discovered values ... + CC_FOR_CROSS_COMPILE="${CC}" + CXX_FOR_CROSS_COMPILE="${CXX}" + AR_FOR_CROSS_COMPILE="${AR}" + RANLIB_FOR_CROSS_COMPILE="${RANLIB}" + # reset to defaults for native toolchain for early pgen and python builds + CC='cc' + CXX='c++' + AR='ar' + RANLIB='ranlib' +fi +AC_SUBST(CC) +AC_SUBST(CXX) +AC_SUBST(AR) +AC_SUBST(RANLIB) +AC_SUBST(CC_FOR_CROSS_COMPILE) +AC_SUBST(CXX_FOR_CROSS_COMPILE) +AC_SUBST(AR_FOR_CROSS_COMPILE) +AC_SUBST(RANLIB_FOR_CROSS_COMPILE) + + # generate output files AC_CONFIG_FILES(Makefile.pre Modules/Setup.config Misc/python.pc) AC_CONFIG_FILES([Modules/ld_so_aix], [chmod +x Modules/ld_so_aix])