From 755740f3ea9c5005d16a80c07e7fc26e45f11aa1 Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Sun, 7 Feb 2010 19:56:39 +0000 Subject: Forward port a number of OSX bugfixes from the trunk to 3.2 --- Mac/Makefile.in | 1 + Mac/Tools/pythonw.c | 33 ++++++++++++++++++++++++++++----- Modules/posixmodule.c | 4 ++++ configure | 38 ++++++++++++++++++++++++++++++++++++-- configure.in | 30 +++++++++++++++++++++++++++++- pyconfig.h.in | 6 ++++++ 6 files changed, 104 insertions(+), 8 deletions(-) diff --git a/Mac/Makefile.in b/Mac/Makefile.in index b1d4456..31d3b9f 100644 --- a/Mac/Makefile.in +++ b/Mac/Makefile.in @@ -16,6 +16,7 @@ FRAMEWORKUNIXTOOLSPREFIX=@FRAMEWORKUNIXTOOLSPREFIX@ PYTHONFRAMEWORK=@PYTHONFRAMEWORK@ PYTHONFRAMEWORKIDENTIFIER=@PYTHONFRAMEWORKIDENTIFIER@ LIPO_32BIT_FLAGS=@LIPO_32BIT_FLAGS@ +CC=@CC@ # These are normally glimpsed from the previous set diff --git a/Mac/Tools/pythonw.c b/Mac/Tools/pythonw.c index d7a86f2..bd50f5c 100644 --- a/Mac/Tools/pythonw.c +++ b/Mac/Tools/pythonw.c @@ -6,9 +6,21 @@ * * This program uses posix_spawn rather than plain execv because we need * slightly more control over how the "real" interpreter is executed. + * + * On OSX 10.4 (and earlier) this falls back to using exec because the + * posix_spawnv functions aren't available there. */ + +#pragma weak_import posix_spawnattr_init +#pragma weak_import posix_spawnattr_setbinpref_np +#pragma weak_import posix_spawnattr_setflags +#pragma weak_import posix_spawn + +#include #include +#ifdef HAVE_SPAWN_H #include +#endif #include #include #include @@ -74,6 +86,7 @@ static char* get_python_path(void) return g_path; } +#ifdef HAVE_SPAWN_H static void setup_spawnattr(posix_spawnattr_t* spawnattr) { @@ -132,16 +145,26 @@ setup_spawnattr(posix_spawnattr_t* spawnattr) /* NOTREACHTED */ } } +#endif int main(int argc, char **argv) { - posix_spawnattr_t spawnattr = NULL; char* exec_path = get_python_path(); +#ifdef HAVE_SPAWN_H + /* We're weak-linking to posix-spawnv to ensure that + * an executable build on 10.5 can work on 10.4. + */ + if (posix_spawn != NULL) { + posix_spawnattr_t spawnattr = NULL; - setup_spawnattr(&spawnattr); - posix_spawn(NULL, exec_path, NULL, - &spawnattr, argv, environ); - err(1, "posix_spawn: %s", argv[0]); + setup_spawnattr(&spawnattr); + posix_spawn(NULL, exec_path, NULL, + &spawnattr, argv, environ); + err(1, "posix_spawn: %s", argv[0]); + } +#endif + execve(exec_path, argv, environ); + err(1, "execve: %s", argv[0]); /* NOTREACHED */ } diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 66ca101..96d8d4d 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -3785,6 +3785,10 @@ posix_fork(PyObject *self, PyObject *noargs) #else #ifdef HAVE_LIBUTIL_H #include +#else +#ifdef HAVE_UTIL_H +#include +#endif /* HAVE_UTIL_H */ #endif /* HAVE_LIBUTIL_H */ #endif /* HAVE_PTY_H */ #ifdef HAVE_STROPTS_H diff --git a/configure b/configure index e6fcee7..3f33193 100755 --- a/configure +++ b/configure @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.in Revision: 78066 . +# From configure.in Revision: 78073 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61 for python 3.2. # @@ -4640,6 +4640,38 @@ echo "${ECHO_T}$ac_cv_no_strict_aliasing_ok" >&6; } ARCH_RUN_32BIT="" LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" + # You have to use different flags on various versions of + # OSX to extract PPC code from an universal binary, basically + # '-arch ppc' on OSX 10.4 and '-arch ppc7400' on anything + # newer. + # Because '-arch pp7400' works on OSX 10.5 or higher this + # test is only present in the '32-bit' branch, all other + # branches require OSX 10.5 to compile. + + { echo "$as_me:$LINENO: checking lipo flag for extracting ppc code" >&5 +echo $ECHO_N "checking lipo flag for extracting ppc code... $ECHO_C" >&6; } + FN="test.$$" + cat >${FN}.c <<-EOF + int main() { return 0; } +EOF + ${CC} ${CFLAGS} -arch ppc -arch i386 -o ${FN} ${FN}.c -isysroot ${UNIVERSALSDK} + if test $? != 0 ; then + rm ${FN} ${FN}.c + { echo "$as_me:$LINENO: result: failed, assumee -extract ppc7400" >&5 +echo "${ECHO_T}failed, assumee -extract ppc7400" >&6; } + else + lipo "${FN}" -extract ppc7400 -output "${FN}.out" 2>/dev/null + if test $? != 0 ; then + LIPO_32BIT_FLAGS="-extract ppc -extract i386" + { echo "$as_me:$LINENO: result: \"'-extract ppc'\"" >&5 +echo "${ECHO_T}\"'-extract ppc'\"" >&6; } + else + { echo "$as_me:$LINENO: result: \"'-extract ppc7400'\"" >&5 +echo "${ECHO_T}\"'-extract ppc7400'\"" >&6; } + fi + rm -f ${FN} ${FN}.c ${FN}.out + fi + elif test "$UNIVERSAL_ARCHS" = "64-bit" ; then UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64" LIPO_32BIT_FLAGS="" @@ -5589,6 +5621,8 @@ done + + for ac_header in asm/types.h conio.h curses.h direct.h dlfcn.h errno.h \ fcntl.h grp.h \ ieeefp.h io.h langinfo.h libintl.h ncurses.h poll.h process.h pthread.h \ @@ -5600,7 +5634,7 @@ sys/param.h sys/poll.h sys/select.h sys/socket.h sys/statvfs.h sys/stat.h \ sys/termio.h sys/time.h \ sys/times.h sys/types.h sys/un.h sys/utsname.h sys/wait.h pty.h libutil.h \ sys/resource.h netpacket/packet.h sysexits.h bluetooth.h \ -bluetooth/bluetooth.h linux/tipc.h +bluetooth/bluetooth.h linux/tipc.h spawn.h util.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then diff --git a/configure.in b/configure.in index 58ceea6..a0ca8d5 100644 --- a/configure.in +++ b/configure.in @@ -898,6 +898,34 @@ yes) ARCH_RUN_32BIT="" LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" + # You have to use different flags on various versions of + # OSX to extract PPC code from an universal binary, basically + # '-arch ppc' on OSX 10.4 and '-arch ppc7400' on anything + # newer. + # Because '-arch pp7400' works on OSX 10.5 or higher this + # test is only present in the '32-bit' branch, all other + # branches require OSX 10.5 to compile. + + AC_MSG_CHECKING(lipo flag for extracting ppc code) + FN="test.$$" + cat >${FN}.c <<-EOF + int main() { return 0; } +EOF + ${CC} ${CFLAGS} -arch ppc -arch i386 -o ${FN} ${FN}.c -isysroot ${UNIVERSALSDK} + if test $? != 0 ; then + rm ${FN} ${FN}.c + AC_MSG_RESULT([failed, assumee -extract ppc7400]) + else + lipo "${FN}" -extract ppc7400 -output "${FN}.out" 2>/dev/null + if test $? != 0 ; then + LIPO_32BIT_FLAGS="-extract ppc -extract i386" + AC_MSG_RESULT("'-extract ppc'") + else + AC_MSG_RESULT("'-extract ppc7400'") + fi + rm -f ${FN} ${FN}.c ${FN}.out + fi + elif test "$UNIVERSAL_ARCHS" = "64-bit" ; then UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64" LIPO_32BIT_FLAGS="" @@ -1251,7 +1279,7 @@ sys/param.h sys/poll.h sys/select.h sys/socket.h sys/statvfs.h sys/stat.h \ sys/termio.h sys/time.h \ sys/times.h sys/types.h sys/un.h sys/utsname.h sys/wait.h pty.h libutil.h \ sys/resource.h netpacket/packet.h sysexits.h bluetooth.h \ -bluetooth/bluetooth.h linux/tipc.h) +bluetooth/bluetooth.h linux/tipc.h spawn.h util.h) AC_HEADER_DIRENT AC_HEADER_MAJOR diff --git a/pyconfig.h.in b/pyconfig.h.in index aad6c29..7d6f23c 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -632,6 +632,9 @@ /* Define if you have the 'socketpair' function. */ #undef HAVE_SOCKETPAIR +/* Define to 1 if you have the header file. */ +#undef HAVE_SPAWN_H + /* Define if your compiler provides ssize_t */ #undef HAVE_SSIZE_T @@ -850,6 +853,9 @@ Include/unicodeobject.h). */ #undef HAVE_USABLE_WCHAR_T +/* Define to 1 if you have the header file. */ +#undef HAVE_UTIL_H + /* Define to 1 if you have the `utimes' function. */ #undef HAVE_UTIMES -- cgit v0.12