aboutsummaryrefslogtreecommitdiff
path: root/ports/python2/002-build-msvc.patch
blob: 85748fc8fa245bc45ffb225a519e5902f99065c5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
From e6a1f39d2d876bbfc8b02e628dfd1d0fef4a0651 Mon Sep 17 00:00:00 2001
From: Jean-Christophe Fillion-Robin <jchris.fillionr@kitware.com>
Date: Tue, 1 Aug 2017 15:40:29 -0400
Subject: [PATCH 2/3] VS2015 Support: Backport "Issue #22919: Windows build
 updated to support VC 14.0 (Visual Studio 2015), which will be used for the
 official 3.5 release."

This commit is a partial backport of python/cpython@65e4cb1. It was
originally designed to work with python-cmake-buildsystem.

This patch do not backport the define "timezone" as "_timezone" as it was done in Python 3.x.
Keeping "timezone" is required in Python 2.7.x to avoid the following build issue
``error C2032: '__timezone': function cannot be member of struct '__timeb64'``
associated with `sys/timeb.h`. The need for `sys/timeb.h` was removed in Python 3.x in python/cpython@6fc4ade and python/cpython@0011124
but is still used in Python 2.7.x.

The following modules have NOT been backported:

* Lib/distutils/sysconfig
* Modules/socketmodule.c .... : Not required since changes related to WSA have been introduced in Python 3.x (see python/cpython@6b4883d)
* Tools/buildbot
* PCBuild
---
 Lib/ctypes/util.py                 |  6 +++++-
 Lib/distutils/command/build_ext.py |  2 +-
 Lib/distutils/msvc9compiler.py     |  3 +++
 Lib/distutils/msvccompiler.py      |  3 +++
 Modules/posixmodule.c              | 22 ++++++++++++++++++++--
 Modules/timemodule.c               |  4 ++--
 PC/bdist_wininst/install.c         | 29 ++++++-----------------------
 PC/pyconfig.h                      |  7 +++++++
 8 files changed, 47 insertions(+), 29 deletions(-)

diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py
index ab10ec5..a163239 100644
--- a/Lib/ctypes/util.py
+++ b/Lib/ctypes/util.py
@@ -19,6 +19,8 @@ if os.name == "nt":
         i = i + len(prefix)
         s, rest = sys.version[i:].split(" ", 1)
         majorVersion = int(s[:-2]) - 6
+        if majorVersion >= 13:
+           majorVersion += 1
         minorVersion = int(s[2:3]) / 10.0
         # I don't think paths are affected by minor version in version 6
         if majorVersion == 6:
@@ -36,8 +38,10 @@ if os.name == "nt":
             return None
         if version <= 6:
             clibname = 'msvcrt'
-        else:
+        elif version <= 13:
             clibname = 'msvcr%d' % (version * 10)
+        else:
+            clibname = 'appcrt%d' % (version * 10)
 
         # If python was built with in debug mode
         import imp
diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py
index f1d184b..0851690 100644
--- a/Lib/distutils/command/build_ext.py
+++ b/Lib/distutils/command/build_ext.py
@@ -196,7 +196,7 @@ class build_ext (Command):
             if MSVC_VERSION >= 9:
                 # Use the .lib files for the correct architecture
                 if self.plat_name == 'win32':
-                    suffix = ''
+                    suffix = 'win32'
                 else:
                     # win-amd64 or win-ia64
                     suffix = self.plat_name[4:]
diff --git a/Lib/distutils/msvc9compiler.py b/Lib/distutils/msvc9compiler.py
index f6de11c..ee61ac2 100644
--- a/Lib/distutils/msvc9compiler.py
+++ b/Lib/distutils/msvc9compiler.py
@@ -182,6 +182,9 @@ def get_build_version():
     i = i + len(prefix)
     s, rest = sys.version[i:].split(" ", 1)
     majorVersion = int(s[:-2]) - 6
+    if majorVersion >= 13:
+        # v13 was skipped and should be v14
+        majorVersion += 1
     minorVersion = int(s[2:3]) / 10.0
     # I don't think paths are affected by minor version in version 6
     if majorVersion == 6:
diff --git a/Lib/distutils/msvccompiler.py b/Lib/distutils/msvccompiler.py
index 0e69fd3..77025c6 100644
--- a/Lib/distutils/msvccompiler.py
+++ b/Lib/distutils/msvccompiler.py
@@ -164,6 +164,9 @@ def get_build_version():
     i = i + len(prefix)
     s, rest = sys.version[i:].split(" ", 1)
     majorVersion = int(s[:-2]) - 6
+    if majorVersion >= 13:
+        # v13 was skipped and should be v14
+        majorVersion += 1
     minorVersion = int(s[2:3]) / 10.0
     # I don't think paths are affected by minor version in version 6
     if majorVersion == 6:
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index e73805f..90d5318 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -558,15 +558,33 @@ _PyInt_FromDev(PY_LONG_LONG v)
 /* The actual size of the structure is determined at runtime.
  * Only the first items must be present.
  */
+
+#if _MSC_VER >= 1900
+
+typedef struct {
+    CRITICAL_SECTION lock;
+    intptr_t osfhnd;
+    __int64 startpos;
+    char osfile;
+} my_ioinfo;
+
+#define IOINFO_L2E 6
+#define IOINFO_ARRAYS 128
+
+#else
+
 typedef struct {
     intptr_t osfhnd;
     char osfile;
 } my_ioinfo;
 
-extern __declspec(dllimport) char * __pioinfo[];
 #define IOINFO_L2E 5
-#define IOINFO_ARRAY_ELTS   (1 << IOINFO_L2E)
 #define IOINFO_ARRAYS 64
+
+#endif
+
+extern __declspec(dllimport) char * __pioinfo[];
+#define IOINFO_ARRAY_ELTS   (1 << IOINFO_L2E)
 #define _NHANDLE_           (IOINFO_ARRAYS * IOINFO_ARRAY_ELTS)
 #define FOPEN 0x01
 #define _NO_CONSOLE_FILENO (intptr_t)-2
diff --git a/Modules/timemodule.c b/Modules/timemodule.c
index 12c43b0..db190b8 100644
--- a/Modules/timemodule.c
+++ b/Modules/timemodule.c
@@ -808,7 +808,7 @@ inittimezone(PyObject *m) {
 #ifdef PYOS_OS2
     PyModule_AddIntConstant(m, "timezone", _timezone);
 #else /* !PYOS_OS2 */
-    PyModule_AddIntConstant(m, "timezone", timezone);
+    PyModule_AddIntConstant(m, "timezone", _timezone);
 #endif /* PYOS_OS2 */
 #ifdef HAVE_ALTZONE
     PyModule_AddIntConstant(m, "altzone", altzone);
@@ -816,7 +816,7 @@ inittimezone(PyObject *m) {
 #ifdef PYOS_OS2
     PyModule_AddIntConstant(m, "altzone", _timezone-3600);
 #else /* !PYOS_OS2 */
-    PyModule_AddIntConstant(m, "altzone", timezone-3600);
+    PyModule_AddIntConstant(m, "altzone", _timezone-3600);
 #endif /* PYOS_OS2 */
 #endif
     PyModule_AddIntConstant(m, "daylight", daylight);
diff --git a/PC/bdist_wininst/install.c b/PC/bdist_wininst/install.c
index f1cc7fe..5b11dcc 100644
--- a/PC/bdist_wininst/install.c
+++ b/PC/bdist_wininst/install.c
@@ -1184,7 +1184,7 @@ static void CenterWindow(HWND hwnd)
 
 #include <prsht.h>
 
-BOOL CALLBACK
+INT_PTR CALLBACK
 IntroDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
     LPNMHDR lpnm;
@@ -1533,7 +1533,7 @@ SCHEME *GetScheme(int major, int minor)
     return old_scheme;
 }
 
-BOOL CALLBACK
+INT_PTR CALLBACK
 SelectPythonDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
     LPNMHDR lpnm;
@@ -1835,7 +1835,7 @@ static void CloseLogfile(void)
         fclose(logfile);
 }
 
-BOOL CALLBACK
+INT_PTR CALLBACK
 InstallFilesDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
     LPNMHDR lpnm;
@@ -1990,7 +1990,7 @@ InstallFilesDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 }
 
 
-BOOL CALLBACK
+INT_PTR CALLBACK
 FinishedDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
     LPNMHDR lpnm;
@@ -2166,23 +2166,6 @@ BOOL NeedAutoUAC()
     return TRUE;
 }
 
-// Returns TRUE if the platform supports UAC.
-BOOL PlatformSupportsUAC()
-{
-    // Note that win2k does seem to support ShellExecute with 'runas',
-    // but does *not* support IsUserAnAdmin - so we just pretend things
-    // only work on XP and later.
-    BOOL bIsWindowsXPorLater;
-    OSVERSIONINFO winverinfo;
-    winverinfo.dwOSVersionInfoSize = sizeof(winverinfo);
-    if (!GetVersionEx(&winverinfo))
-        return FALSE; // something bad has gone wrong
-    bIsWindowsXPorLater =
-       ( (winverinfo.dwMajorVersion > 5) ||
-       ( (winverinfo.dwMajorVersion == 5) && (winverinfo.dwMinorVersion >= 1) ));
-    return bIsWindowsXPorLater;
-}
-
 // Spawn ourself as an elevated application.  On failure, a message is
 // displayed to the user - but this app will always terminate, even
 // on error.
@@ -2238,7 +2221,7 @@ int DoInstall(void)
 
     // See if we need to do the Vista UAC magic.
     if (strcmp(user_access_control, "force")==0) {
-        if (PlatformSupportsUAC() && !MyIsUserAnAdmin()) {
+        if (!MyIsUserAnAdmin()) {
             SpawnUAC();
             return 0;
         }
@@ -2246,7 +2229,7 @@ int DoInstall(void)
     } else if (strcmp(user_access_control, "auto")==0) {
         // Check if it looks like we need UAC control, based
         // on how Python itself was installed.
-        if (PlatformSupportsUAC() && !MyIsUserAnAdmin() && NeedAutoUAC()) {
+        if (!MyIsUserAnAdmin() && NeedAutoUAC()) {
             SpawnUAC();
             return 0;
         }
diff --git a/PC/pyconfig.h b/PC/pyconfig.h
index b60af1e..b517146 100644
--- a/PC/pyconfig.h
+++ b/PC/pyconfig.h
@@ -231,6 +231,13 @@ typedef int pid_t;
 #define hypot _hypot
 #endif
 
+/* VS 2015 defines these names with a leading underscore */
+#if _MSC_VER >= 1900
+// #define timezone _timezone
+#define daylight _daylight
+#define tzname _tzname
+#endif
+
 /* Side by Side assemblies supported in VS 2005 and VS 2008 but not 2010*/
 #if _MSC_VER >= 1400 && _MSC_VER < 1600
 #define HAVE_SXS 1
-- 
2.5.0