|
1 | 1 | # Makefile for Vim on Win32 (Windows XP/2003/Vista/7/8/10) and Win64, |
2 | 2 | # using the Microsoft Visual C++ compilers. Known to work with VC5, VC6 (VS98), |
3 | 3 | # VC7.0 (VS2002), VC7.1 (VS2003), VC8 (VS2005), VC9 (VS2008), VC10 (VS2010), |
4 | | -# VC11 (VS2012), VC12 (VS2013) and VC14 (VS2015) |
| 4 | +# VC11 (VS2012), VC12 (VS2013), VC14 (VS2015) and VC15 (VS2017) |
5 | 5 | # |
6 | 6 | # To build using other Windows compilers, see INSTALLpc.txt |
7 | 7 | # |
|
108 | 108 | # |
109 | 109 | # Optimization: OPTIMIZE=[SPACE, SPEED, MAXSPEED] (default is MAXSPEED) |
110 | 110 | # |
111 | | -# Processor Version: CPUNR=[i386, i486, i586, i686, pentium4] (default is |
112 | | -# i386) |
| 111 | +# Processor Version: CPUNR=[any, i586, i686, sse, sse2, avx, avx2] (default is |
| 112 | +# any) |
| 113 | +# avx is available on Visual C++ 2010 and after. |
| 114 | +# avx2 is available on Visual C++ 2013 Update 2 and after. |
113 | 115 | # |
114 | | -# Version Support: WINVER=[0x0501, 0x0600] (default is 0x0501) |
| 116 | +# Version Support: WINVER=[0x0501, 0x0502, 0x0600, 0x0601, 0x0602, |
| 117 | +# 0x0603, 0x0A00] (default is 0x0501) |
| 118 | +# Supported versions depends on your target SDK, check SDKDDKVer.h |
| 119 | +# See https://docs.microsoft.com/en-us/cpp/porting/modifying-winver-and-win32-winnt |
115 | 120 | # |
116 | 121 | # Debug version: DEBUG=yes |
117 | 122 | # Mapfile: MAP=[no, yes or lines] (default is yes) |
@@ -270,11 +275,31 @@ MAKEFLAGS_GVIMEXT = DEBUG=yes |
270 | 275 | !if $(MSVCVER) < 1900 |
271 | 276 | MSVC_MAJOR = ($(MSVCVER) / 100 - 6) |
272 | 277 | MSVCRT_VER = ($(MSVCVER) / 10 - 60) |
| 278 | +# Visual C++ 2017 needs special handling |
| 279 | +# it has an _MSC_VER of 1910->14.1, but is actually v15 with runtime v140 |
| 280 | +!elseif $(MSVCVER) == 1910 |
| 281 | +MSVC_MAJOR = 15 |
| 282 | +MSVCRT_VER = 140 |
273 | 283 | !else |
274 | 284 | MSVC_MAJOR = ($(MSVCVER) / 100 - 5) |
275 | 285 | MSVCRT_VER = ($(MSVCVER) / 10 - 50) |
276 | 286 | !endif |
277 | 287 |
|
| 288 | +# Calculate MSVC_FULL for Visual C++ 8 and up. |
| 289 | +!if $(MSVC_MAJOR) >= 8 |
| 290 | +! if [echo MSVC_FULL=_MSC_FULL_VER> msvcfullver.c && $(CC) /EP msvcfullver.c > msvcfullver.~ 2> nul] |
| 291 | +! message *** ERROR |
| 292 | +! message Cannot run Visual C to determine its version. Make sure cl.exe is in your PATH. |
| 293 | +! message This can usually be done by running "vcvarsall.bat", located in the bin directory where Visual Studio was installed. |
| 294 | +! error Make aborted. |
| 295 | +! else |
| 296 | +! include msvcfullver.~ |
| 297 | +! if [del msvcfullver.c msvcfullver.~] |
| 298 | +! endif |
| 299 | +! endif |
| 300 | +!endif |
| 301 | + |
| 302 | + |
278 | 303 | # Calculate MSVCRT_VER |
279 | 304 | !if [(set /a MSVCRT_VER="$(MSVCRT_VER)" > nul) && set MSVCRT_VER > msvcrtver.~] == 0 |
280 | 305 | !include msvcrtver.~ |
@@ -446,27 +471,95 @@ DEL_TREE = rmdir /s /q |
446 | 471 | INTDIR=$(OBJDIR) |
447 | 472 | OUTDIR=$(OBJDIR) |
448 | 473 |
|
| 474 | +### Validate CPUNR |
| 475 | +!ifndef CPUNR |
| 476 | +# default to untargeted code |
| 477 | +CPUNR = any |
| 478 | +!elseif "$(CPUNR)" == "i386" || "$(CPUNR)" == "i486" |
| 479 | +# alias i386 and i486 to i586 |
| 480 | +! message *** WARNING CPUNR=$(CPUNR) is not a valid target architecture. |
| 481 | +! message Windows XP is the minimum target OS, with a minimum target |
| 482 | +! message architecture of i586. |
| 483 | +! message Retargeting to i586 |
| 484 | +CPUNR = i586 |
| 485 | +!elseif "$(CPUNR)" == "pentium4" |
| 486 | +# alias pentium4 to sse2 |
| 487 | +! message *** WARNING CPUNR=pentium4 is deprecated in favour of sse2. |
| 488 | +! message Retargeting to sse2. |
| 489 | +CPUNR = sse2 |
| 490 | +!elseif "$(CPUNR)" != "any" && "$(CPUNR)" != "i586" && "$(CPUNR)" != "i686" && "$(CPUNR)" != "sse" && "$(CPUNR)" != "sse2" && "$(CPUNR)" != "avx" && "$(CPUNR)" != "avx2" |
| 491 | +! error *** ERROR Unknown target architecture "$(CPUNR)". Make aborted. |
| 492 | +!endif |
| 493 | + |
449 | 494 | # Convert processor ID to MVC-compatible number |
450 | 495 | !if $(MSVC_MAJOR) < 8 |
451 | | -!if "$(CPUNR)" == "i386" |
452 | | -CPUARG = /G3 |
453 | | -!elseif "$(CPUNR)" == "i486" |
454 | | -CPUARG = /G4 |
455 | | -!elseif "$(CPUNR)" == "i586" |
| 496 | +! if "$(CPUNR)" == "i586" |
456 | 497 | CPUARG = /G5 |
457 | | -!elseif "$(CPUNR)" == "i686" |
| 498 | +! elseif "$(CPUNR)" == "i686" |
458 | 499 | CPUARG = /G6 |
459 | | -!elseif "$(CPUNR)" == "pentium4" |
| 500 | +! elseif "$(CPUNR)" == "sse" |
| 501 | +CPUARG = /G6 /arch:SSE |
| 502 | +! elseif "$(CPUNR)" == "sse2" |
460 | 503 | CPUARG = /G7 /arch:SSE2 |
461 | | -!else |
| 504 | +! elseif "$(CPUNR)" == "avx" || "$(CPUNR)" == "avx2" |
| 505 | +! message AVX/AVX2 Instruction Sets are not supported by Visual C++ v$(MSVC_MAJOR) |
| 506 | +! message Falling back to SSE2 |
| 507 | +CPUARG = /G7 /arch:SSE2 |
| 508 | +! elseif "$(CPUNR)" == "any" |
462 | 509 | CPUARG = |
463 | | -!endif |
| 510 | +! endif |
464 | 511 | !else |
465 | | -# VC8/9/10 only allows specifying SSE architecture but only for 32bit |
466 | | -!if "$(ASSEMBLY_ARCHITECTURE)" == "i386" && "$(CPUNR)" == "pentium4" |
| 512 | +# IA32/SSE/SSE2 are only supported on x86 |
| 513 | +! if "$(ASSEMBLY_ARCHITECTURE)" == "i386" && ("$(CPUNR)" == "i586" || "$(CPUNR)" == "i686" || "$(CPUNR)" == "any") |
| 514 | +# VC<11 generates fp87 code by default |
| 515 | +! if $(MSVC_MAJOR) < 11 |
| 516 | +CPUARG = |
| 517 | +# VC>=11 needs explicit insturctions to generate fp87 code |
| 518 | +! else |
| 519 | +CPUARG = /arch:IA32 |
| 520 | +! endif |
| 521 | +! elseif "$(ASSEMBLY_ARCHITECTURE)" == "i386" && "$(CPUNR)" == "sse" |
| 522 | +CPUARG = /arch:SSE |
| 523 | +! elseif "$(ASSEMBLY_ARCHITECTURE)" == "i386" && "$(CPUNR)" == "sse2" |
467 | 524 | CPUARG = /arch:SSE2 |
| 525 | +! elseif "$(CPUNR)" == "avx" |
| 526 | +# AVX is only supported by VC 10 and up |
| 527 | +! if $(MSVC_MAJOR) < 10 |
| 528 | +! message AVX Instruction Set is not supported by Visual C++ v$(MSVC_MAJOR) |
| 529 | +! if "$(ASSEMBLY_ARCHITECTURE)" == "i386" |
| 530 | +! message Falling back to SSE2 |
| 531 | +CPUARG = /arch:SSE2 |
| 532 | +! else |
| 533 | +CPUARG = |
| 534 | +! endif |
| 535 | +! else |
| 536 | +CPUARG = /arch:AVX |
| 537 | +! endif |
| 538 | +! elseif "$(CPUNR)" == "avx2" |
| 539 | +# AVX is only supported by VC 10 and up |
| 540 | +! if $(MSVC_MAJOR) < 10 |
| 541 | +! message AVX2 Instruction Set is not supported by Visual C++ v$(MSVC_MAJOR) |
| 542 | +! if "$(ASSEMBLY_ARCHITECTURE)" == "i386" |
| 543 | +! message Falling back to SSE2 |
| 544 | +CPUARG = /arch:SSE2 |
| 545 | +! else |
| 546 | +CPUARG = |
| 547 | +! endif |
| 548 | +# AVX2 is only supported by VC 12U2 and up |
| 549 | +# 180030501 is the full version number for Visual Studio 2013/VC 12 Update 2 |
| 550 | +! elseif $(MSVC_FULL) < 180030501 |
| 551 | +! message AVX2 Instruction Set is not supported by Visual C++ v$(MSVC_MAJOR)-$(MSVC_FULL) |
| 552 | +! message Falling back to AVX |
| 553 | +CPUARG = /arch:AVX |
| 554 | +! else |
| 555 | +CPUARG = /arch:AVX2 |
| 556 | +! endif |
| 557 | +! endif |
468 | 558 | !endif |
469 | | -!endif |
| 559 | + |
| 560 | +# Pass CPUARG to GVimExt, to avoid using version-dependent defaults |
| 561 | +MAKEFLAGS_GVIMEXT = $(MAKEFLAGS_GVIMEXT) CPUARG="$(CPUARG)" |
| 562 | + |
470 | 563 |
|
471 | 564 | LIBC = |
472 | 565 | DEBUGINFO = /Zi |
|
0 commit comments