diff Mac/Tools/pythonw.c @ 58397:0c8cbdbafaad legacy-trunk

- Issue #7658: Ensure that the new pythonw executable works on OSX 10.4 - Issue #7714: Use ``gcc -dumpversion`` to detect the version of GCC on MacOSX. - Make configure look for util.h as well as libutil.h. The former is the header file that on OSX contains the defition of openpty. (Needed to compile for OSX 10.4 on OSX 10.6) - Use the correct definition of CC to compile the pythonw executable
author Ronald Oussoren <ronaldoussoren@mac.com>
date Sun, 17 Jan 2010 16:25:57 +0000
parents aaeb65bab3c0
children 2990bd3ae883
line wrap: on
line diff
--- a/Mac/Tools/pythonw.c	Sun Jan 17 15:55:45 2010 +0000
+++ b/Mac/Tools/pythonw.c	Sun Jan 17 16:25:57 2010 +0000
@@ -6,16 +6,26 @@
  *
  * 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 <Python.h>
 #include <unistd.h>
+#ifdef HAVE_SPAWN_H
 #include <spawn.h>
+#endif
 #include <stdio.h>
 #include <string.h>
 #include <errno.h>
 #include <err.h>
 #include <dlfcn.h>
 #include <stdlib.h>
-#include <Python.h>
 
 
 extern char** environ;
@@ -74,6 +84,7 @@
 	return g_path;
 }
 
+#ifdef HAVE_SPAWN_H
 static void
 setup_spawnattr(posix_spawnattr_t* spawnattr)
 {
@@ -132,16 +143,28 @@
 		/* 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 */
 }