annotate Mac/Tools/pythonw.c @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents b79d276041a8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1 /*
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
2 * This wrapper program executes a python executable hidden inside an
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
3 * application bundle inside the Python framework. This is needed to run
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
4 * GUI code: some GUI API's don't work unless the program is inside an
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
5 * application bundle.
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
6 *
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
7 * This program uses posix_spawn rather than plain execv because we need
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
8 * slightly more control over how the "real" interpreter is executed.
58819
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
9 *
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
10 * On OSX 10.4 (and earlier) this falls back to using exec because the
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
11 * posix_spawnv functions aren't available there.
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
12 */
58819
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
13
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
14 #pragma weak_import posix_spawnattr_init
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
15 #pragma weak_import posix_spawnattr_setbinpref_np
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
16 #pragma weak_import posix_spawnattr_setflags
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
17 #pragma weak_import posix_spawn
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
18
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
19 #include <Python.h>
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
20 #include <unistd.h>
58819
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
21 #ifdef HAVE_SPAWN_H
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
22 #include <spawn.h>
58819
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
23 #endif
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
24 #include <stdio.h>
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
25 #include <string.h>
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
26 #include <errno.h>
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
27 #include <err.h>
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
28 #include <dlfcn.h>
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
29 #include <stdlib.h>
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
30 #include <Python.h>
78160
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
31 #include <mach-o/dyld.h>
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
32
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
33
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
34 extern char** environ;
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
35
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
36 /*
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
37 * Locate the python framework by looking for the
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
38 * library that contains Py_Initialize.
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
39 *
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
40 * In a regular framework the structure is:
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
41 *
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
42 * Python.framework/Versions/2.7
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
43 * /Python
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
44 * /Resources/Python.app/Contents/MacOS/Python
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
45 *
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
46 * In a virtualenv style structure the expected
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
47 * structure is:
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
48 *
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
49 * ROOT
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
50 * /bin/pythonw
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
51 * /.Python <- the dylib
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
52 * /.Resources/Python.app/Contents/MacOS/Python
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
53 *
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
54 * NOTE: virtualenv's are not an officially supported
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
55 * feature, support for that structure is provided as
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
56 * a convenience.
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
57 */
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
58 static char* get_python_path(void)
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
59 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
60 size_t len;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
61 Dl_info info;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
62 char* end;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
63 char* g_path;
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
64
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
65 if (dladdr(Py_Initialize, &info) == 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
66 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
67 }
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
68
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
69 len = strlen(info.dli_fname);
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
70
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
71 g_path = malloc(len+60);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
72 if (g_path == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
73 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
74 }
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
75
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
76 strcpy(g_path, info.dli_fname);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
77 end = g_path + len - 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
78 while (end != g_path && *end != '/') {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
79 end --;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
80 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
81 end++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
82 if (*end == '.') {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
83 end++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
84 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
85 strcpy(end, "Resources/Python.app/Contents/MacOS/" PYTHONFRAMEWORK);
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
86
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
87 return g_path;
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
88 }
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
89
58819
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
90 #ifdef HAVE_SPAWN_H
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
91 static void
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
92 setup_spawnattr(posix_spawnattr_t* spawnattr)
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
93 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
94 size_t ocount;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
95 size_t count;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
96 cpu_type_t cpu_types[1];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
97 short flags = 0;
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
98 #ifdef __LP64__
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
99 int ch;
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
100 #endif
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
101
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
102 if ((errno = posix_spawnattr_init(spawnattr)) != 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
103 err(2, "posix_spawnattr_int");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
104 /* NOTREACHTED */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
105 }
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
106
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
107 count = 1;
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
108
68489
81d7f78a633a #11515: Merge with 3.1.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 62027
diff changeset
109 /* Run the real python executable using the same architecture as this
81d7f78a633a #11515: Merge with 3.1.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 62027
diff changeset
110 * executable, this allows users to control the architecture using
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
111 * "arch -ppc python"
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
112 */
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
113
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
114 #if defined(__ppc64__)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
115 cpu_types[0] = CPU_TYPE_POWERPC64;
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
116
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
117 #elif defined(__x86_64__)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
118 cpu_types[0] = CPU_TYPE_X86_64;
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
119
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
120 #elif defined(__ppc__)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
121 cpu_types[0] = CPU_TYPE_POWERPC;
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
122 #elif defined(__i386__)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
123 cpu_types[0] = CPU_TYPE_X86;
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
124 #else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
125 # error "Unknown CPU"
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
126 #endif
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
127
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
128 if (posix_spawnattr_setbinpref_np(spawnattr, count,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
129 cpu_types, &ocount) == -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
130 err(1, "posix_spawnattr_setbinpref");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
131 /* NOTREACHTED */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
132 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
133 if (count != ocount) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
134 fprintf(stderr, "posix_spawnattr_setbinpref failed to copy\n");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
135 exit(1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
136 /* NOTREACHTED */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
137 }
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
138
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
139
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
140 /*
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
141 * Set flag that causes posix_spawn to behave like execv
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
142 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
143 flags |= POSIX_SPAWN_SETEXEC;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
144 if ((errno = posix_spawnattr_setflags(spawnattr, flags)) != 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
145 err(1, "posix_spawnattr_setflags");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
146 /* NOTREACHTED */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
147 }
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
148 }
58819
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
149 #endif
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
150
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
151 int
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
152 main(int argc, char **argv) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
153 char* exec_path = get_python_path();
77154
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 68489
diff changeset
154 static char path[PATH_MAX * 2];
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 68489
diff changeset
155 static char real_path[PATH_MAX * 2];
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 68489
diff changeset
156 int status;
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 68489
diff changeset
157 uint32_t size = PATH_MAX * 2;
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 68489
diff changeset
158
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 68489
diff changeset
159 /* Set the original executable path in the environment. */
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 68489
diff changeset
160 status = _NSGetExecutablePath(path, &size);
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 68489
diff changeset
161 if (status == 0) {
78160
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
162 /*
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
163 * Note: don't call 'realpath', that will
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
164 * erase symlink information, and that
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
165 * breaks "pyvenv --symlink"
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
166 *
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
167 * It is nice to have the directory name
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
168 * as a cleaned up absolute path though,
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
169 * therefore call realpath on dirname(path)
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
170 */
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
171 char* slash = strrchr(path, '/');
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
172 if (slash) {
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
173 char replaced;
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
174 replaced = slash[1];
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
175 slash[1] = 0;
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
176 if (realpath(path, real_path) == NULL) {
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
177 err(1, "realpath: %s", path);
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
178 }
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
179 slash[1] = replaced;
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
180 if (strlcat(real_path, slash, sizeof(real_path)) > sizeof(real_path)) {
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
181 errno = EINVAL;
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
182 err(1, "realpath: %s", path);
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
183 }
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
184
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
185 } else {
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
186 if (realpath(".", real_path) == NULL) {
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
187 err(1, "realpath: %s", path);
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
188 }
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
189 if (strlcat(real_path, "/", sizeof(real_path)) > sizeof(real_path)) {
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
190 errno = EINVAL;
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
191 err(1, "realpath: %s", path);
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
192 }
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
193 if (strlcat(real_path, path, sizeof(real_path)) > sizeof(real_path)) {
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
194 errno = EINVAL;
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
195 err(1, "realpath: %s", path);
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
196 }
77154
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 68489
diff changeset
197 }
78160
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
198
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
199 setenv("__PYVENV_LAUNCHER__", real_path, 1);
77154
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 68489
diff changeset
200 }
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
201
62027
34a637bfd4be Merged revisions 81649 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 61466
diff changeset
202 /*
34a637bfd4be Merged revisions 81649 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 61466
diff changeset
203 * Let argv[0] refer to the new interpreter. This is needed to
34a637bfd4be Merged revisions 81649 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 61466
diff changeset
204 * get the effect we want on OSX 10.5 or earlier. That is, without
34a637bfd4be Merged revisions 81649 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 61466
diff changeset
205 * changing argv[0] the real interpreter won't have access to
34a637bfd4be Merged revisions 81649 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 61466
diff changeset
206 * the Window Server.
34a637bfd4be Merged revisions 81649 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 61466
diff changeset
207 */
34a637bfd4be Merged revisions 81649 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 61466
diff changeset
208 argv[0] = exec_path;
34a637bfd4be Merged revisions 81649 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 61466
diff changeset
209
58819
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
210 #ifdef HAVE_SPAWN_H
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
211 /* We're weak-linking to posix-spawnv to ensure that
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
212 * an executable build on 10.5 can work on 10.4.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
213 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
214 if (posix_spawn != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
215 posix_spawnattr_t spawnattr = NULL;
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
216
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
217 setup_spawnattr(&spawnattr);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
218 posix_spawn(NULL, exec_path, NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
219 &spawnattr, argv, environ);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
220 err(1, "posix_spawn: %s", exec_path);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
221 }
58819
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
222 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
223 execve(exec_path, argv, environ);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
224 err(1, "execve: %s", argv[0]);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
225 /* NOTREACHED */
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
226 }