Imported Upstream version 8.0.586
[platform/upstream/vim.git] / src / Make_mvc.mak
1 # Makefile for Vim on Win32 (Windows XP/2003/Vista/7/8/10) and Win64,
2 # using the Microsoft Visual C++ compilers. Known to work with VC5, VC6 (VS98),
3 # VC7.0 (VS2002), VC7.1 (VS2003), VC8 (VS2005), VC9 (VS2008), VC10 (VS2010),
4 # VC11 (VS2012), VC12 (VS2013) and VC14 (VS2015)
5 #
6 # To build using other Windows compilers, see INSTALLpc.txt
7 #
8 # This makefile can build the console, GUI, OLE-enable, Perl-enabled and
9 # Python-enabled versions of Vim for Win32 platforms.
10 #
11 # The basic command line to build Vim is:
12 #
13 #       nmake -f Make_mvc.mak
14 #
15 # This will build the console version of Vim with no additional interfaces.
16 # To add features, define any of the following:
17 #
18 #       For MSVC 11 you need to specify where the Win32.mak file is, e.g.:
19 #          SDK_INCLUDE_DIR="C:\Program Files\Microsoft SDKs\Windows\v7.1\Include"
20 #
21 #       !!!!  After changing features do "nmake clean" first  !!!!
22 #
23 #       Feature Set: FEATURES=[TINY, SMALL, NORMAL, BIG, HUGE] (default is HUGE)
24 #
25 #       GUI interface: GUI=yes (default is no)
26 #
27 #       GUI with DirectWrite(DirectX): DIRECTX=yes
28 #         (default is no, requires GUI=yes)
29 #
30 #       OLE interface: OLE=yes (usually with GUI=yes)
31 #
32 #       Multibyte support: MBYTE=yes (default is no)
33 #
34 #       IME support: IME=yes    (requires GUI=yes)
35 #         DYNAMIC_IME=[yes or no]  (to load the imm32.dll dynamically, default
36 #         is yes)
37 #       Global IME support: GIME=yes (requires GUI=yes)
38 #
39 #       Lua interface:
40 #         LUA=[Path to Lua directory]
41 #         DYNAMIC_LUA=yes (to load the Lua DLL dynamically)
42 #         LUA_VER=[Lua version]  (default is 53)
43 #
44 #       MzScheme interface:
45 #         MZSCHEME=[Path to MzScheme directory]
46 #         DYNAMIC_MZSCHEME=yes (to load the MzScheme DLLs dynamically)
47 #         MZSCHEME_VER=[version, 205_000, ...] (default is 3m_a0solc (6.6))
48 #         MZSCHEME_DEBUG=no
49 #
50 #       Perl interface:
51 #         PERL=[Path to Perl directory]
52 #         DYNAMIC_PERL=yes (to load the Perl DLL dynamically)
53 #         PERL_VER=[Perl version, in the form 55 (5.005), 56 (5.6.x),
54 #                   510 (5.10.x), etc]
55 #         (default is 524)
56 #
57 #       Python interface:
58 #         PYTHON=[Path to Python directory]
59 #         DYNAMIC_PYTHON=yes (to load the Python DLL dynamically)
60 #         PYTHON_VER=[Python version, eg 22, 23, ..., 27]  (default is 27)
61 #
62 #       Python3 interface:
63 #         PYTHON3=[Path to Python3 directory]
64 #         DYNAMIC_PYTHON3=yes (to load the Python3 DLL dynamically)
65 #         PYTHON3_VER=[Python3 version, eg 30, 31]  (default is 35)
66 #
67 #       Ruby interface:
68 #         RUBY=[Path to Ruby directory]
69 #         DYNAMIC_RUBY=yes (to load the Ruby DLL dynamically)
70 #         RUBY_VER=[Ruby version, eg 19, 22] (default is 22)
71 #         RUBY_API_VER_LONG=[Ruby API version, eg 1.8, 1.9.1, 2.2.0]
72 #                           (default is 2.2.0)
73 #           You must set RUBY_API_VER_LONG when change RUBY_VER.
74 #           Note: If you use Ruby 1.9.3, set as follows:
75 #             RUBY_VER=19
76 #             RUBY_API_VER_LONG=1.9.1 (not 1.9.3, because the API version is 1.9.1.)
77 #
78 #       Tcl interface:
79 #         TCL=[Path to Tcl directory]
80 #         DYNAMIC_TCL=yes (to load the Tcl DLL dynamically)
81 #         TCL_VER=[Tcl version, e.g. 80, 83]  (default is 86)
82 #         TCL_VER_LONG=[Tcl version, eg 8.3] (default is 8.6)
83 #           You must set TCL_VER_LONG when you set TCL_VER.
84 #
85 #       Cscope support: CSCOPE=yes
86 #
87 #       Iconv library support (always dynamically loaded):
88 #         ICONV=[yes or no]  (default is yes)
89 #
90 #       Intl library support (always dynamically loaded):
91 #         GETTEXT=[yes or no]  (default is yes)
92 #       See http://sourceforge.net/projects/gettext/
93 #
94 #       PostScript printing: POSTSCRIPT=yes (default is no)
95 #
96 #       Netbeans Support: NETBEANS=[yes or no] (default is yes if GUI is yes)
97 #       Requires CHANNEL.
98 #
99 #       Netbeans Debugging Support: NBDEBUG=[yes or no] (should be no, yes
100 #       doesn't work)
101 #
102 #       Inter process communication: CHANNEL=[yes or no] (default is yes if GUI
103 #       is yes)
104 #
105 #       XPM Image Support: XPM=[path to XPM directory]
106 #       Default is "xpm", using the files included in the distribution.
107 #       Use "no" to disable this feature.
108 #
109 #       Optimization: OPTIMIZE=[SPACE, SPEED, MAXSPEED] (default is MAXSPEED)
110 #
111 #       Processor Version: CPUNR=[i386, i486, i586, i686, pentium4] (default is
112 #       i386)
113 #
114 #       Version Support: WINVER=[0x0501, 0x0600] (default is 0x0501)
115 #
116 #       Debug version: DEBUG=yes
117 #       Mapfile: MAP=[no, yes or lines] (default is yes)
118 #         no:    Don't write a mapfile.
119 #         yes:   Write a normal mapfile.
120 #         lines: Write a mapfile with line numbers (only for VC6 and later)
121 #
122 #       Static Code Analysis: ANALYZE=yes (works with VS2012 or later)
123 #
124 # You can combine any of these interfaces
125 #
126 # Example: To build the non-debug, GUI version with Perl interface:
127 #       nmake -f Make_mvc.mak GUI=yes PERL=C:\Perl
128 #
129 # DEBUG with Make_mvc.mak and Make_dvc.mak:
130 #       This makefile gives a fineness of control which is not supported in
131 #       Visual C++ configuration files.  Therefore, debugging requires a bit of
132 #       extra work.
133 #       Make_dvc.mak is a Visual C++ project to access that support.  It may be
134 #       badly out of date for the Visual C++ you are using...
135 #       To use Make_dvc.mak:
136 #       1) Build Vim with Make_mvc.mak.
137 #            Use a "DEBUG=yes" argument to build Vim with debug support.
138 #            E.g. the following builds gvimd.exe:
139 #               nmake -f Make_mvc.mak debug=yes gui=yes
140 #       2) Use MS Devstudio and set it up to allow that file to be debugged:
141 #           i) Pass Make_dvc.mak to the IDE.
142 #                Use the "open workspace" menu entry to load Make_dvc.mak.
143 #                Alternatively, from the command line:
144 #                       msdev /nologo Make_dvc.mak
145 #               Note: Make_dvc.mak is in VC4.0 format. Later VC versions see
146 #               this and offer to convert it to their own format. Accept that.
147 #               It creates a file called Make_dvc.dsw which can then be used
148 #               for further operations.  E.g.
149 #                   msdev /nologo Make_dvc.dsw
150 #           ii) Set the built executable for debugging:
151 #               a) Alt+F7/Debug takes you to the Debug dialog.
152 #               b) Fill "Executable for debug session". e.g. gvimd.exe
153 #               c) Fill "Program arguments". e.g. -R dosinst.c
154 #               d) Complete the dialog
155 #       3) You can now debug the executable you built with Make_mvc.mak
156 #
157 #       Note: Make_dvc.mak builds vimrun.exe, because it must build something
158 #       to be a valid makefile..
159
160 ### See feature.h for a list of optionals.
161 # If you want to build some optional features without modifying the source,
162 # you can set DEFINES on the command line, e.g.,
163 #       nmake -f Make_mvc.mvc "DEFINES=-DEMACS_TAGS"
164
165 # Build on Windows NT/XP
166
167 TARGETOS = WINNT
168
169 # Select one of eight object code directories, depends on GUI, OLE, DEBUG and
170 # interfaces.
171 # If you change something else, do "make clean" first!
172 !if "$(GUI)" == "yes"
173 OBJDIR = .\ObjG
174 !else
175 OBJDIR = .\ObjC
176 !endif
177 !if "$(DIRECTX)" == "yes"
178 OBJDIR = $(OBJDIR)X
179 !endif
180 !if "$(OLE)" == "yes"
181 OBJDIR = $(OBJDIR)O
182 !endif
183 !ifdef LUA
184 OBJDIR = $(OBJDIR)U
185 !endif
186 !ifdef PERL
187 OBJDIR = $(OBJDIR)L
188 !endif
189 !ifdef PYTHON
190 OBJDIR = $(OBJDIR)Y
191 !endif
192 !ifdef PYTHON3
193 OBJDIR = $(OBJDIR)H
194 !endif
195 !ifdef TCL
196 OBJDIR = $(OBJDIR)T
197 !endif
198 !ifdef RUBY
199 OBJDIR = $(OBJDIR)R
200 !endif
201 !ifdef MZSCHEME
202 OBJDIR = $(OBJDIR)Z
203 !endif
204 !if "$(DEBUG)" == "yes"
205 OBJDIR = $(OBJDIR)d
206 !endif
207
208 # Win32.mak requires that CPU be set appropriately.
209 # To cross-compile for Win64, set CPU=AMD64 or CPU=IA64.
210
211 !ifdef PROCESSOR_ARCHITECTURE
212 # We're on Windows NT or using VC 6+
213 ! ifdef CPU
214 ASSEMBLY_ARCHITECTURE=$(CPU)
215 # Using I386 for $ASSEMBLY_ARCHITECTURE doesn't work for VC7.
216 !  if "$(CPU)" == "I386"
217 CPU = i386
218 !  endif
219 ! else  # !CPU
220 CPU = i386
221 !  if !defined(PLATFORM) && defined(TARGET_CPU)
222 PLATFORM = $(TARGET_CPU)
223 !  endif
224 !  ifdef PLATFORM
225 !   if ("$(PLATFORM)" == "x64") || ("$(PLATFORM)" == "X64")
226 CPU = AMD64
227 !   elseif ("$(PLATFORM)" != "x86") && ("$(PLATFORM)" != "X86")
228 !    error *** ERROR Unknown target platform "$(PLATFORM)". Make aborted.
229 !   endif
230 !  endif  # !PLATFORM
231 ! endif
232 !else  # !PROCESSOR_ARCHITECTURE
233 # We're on Windows 95
234 CPU = i386
235 !endif # !PROCESSOR_ARCHITECTURE
236 ASSEMBLY_ARCHITECTURE=$(CPU)
237 OBJDIR = $(OBJDIR)$(CPU)
238
239 # Build a retail version by default
240
241 !if "$(DEBUG)" != "yes"
242 NODEBUG = 1
243 !else
244 !undef NODEBUG
245 MAKEFLAGS_GVIMEXT = DEBUG=yes
246 !endif
247
248
249 # Get all sorts of useful, standard macros from the Platform SDK.
250
251 !ifdef SDK_INCLUDE_DIR
252 !include $(SDK_INCLUDE_DIR)\Win32.mak
253 !else
254 !include <Win32.mak>
255 !endif
256
257
258 # Check VC version.
259 !if [echo MSVCVER=_MSC_VER> msvcver.c && $(CC) /EP msvcver.c > msvcver.~ 2> nul]
260 !message *** ERROR
261 !message Cannot run Visual C to determine its version. Make sure cl.exe is in your PATH.
262 !message This can usually be done by running "vcvarsall.bat", located in the bin directory where Visual Studio was installed.
263 !error Make aborted.
264 !else
265 !include msvcver.~
266 !if [del msvcver.c msvcver.~]
267 !endif
268 !endif
269
270 !if $(MSVCVER) < 1900
271 MSVC_MAJOR = ($(MSVCVER) / 100 - 6)
272 MSVCRT_VER = ($(MSVCVER) / 10 - 60)
273 !else
274 MSVC_MAJOR = ($(MSVCVER) / 100 - 5)
275 MSVCRT_VER = ($(MSVCVER) / 10 - 50)
276 !endif
277
278 # Calculate MSVCRT_VER
279 !if [(set /a MSVCRT_VER="$(MSVCRT_VER)" > nul) && set MSVCRT_VER > msvcrtver.~] == 0
280 !include msvcrtver.~
281 !if [del msvcrtver.~]
282 !endif
283 !endif
284
285 # Base name of the msvcrXX.dll
286 !if $(MSVCRT_VER) <= 60
287 MSVCRT_NAME = msvcrt
288 !elseif $(MSVCRT_VER) <= 130
289 MSVCRT_NAME = msvcr$(MSVCRT_VER)
290 !else
291 MSVCRT_NAME = vcruntime$(MSVCRT_VER)
292 !endif
293
294 !if $(MSVC_MAJOR) == 6
295 CPU = ix86
296 !endif
297
298
299 # Flag to turn on Win64 compatibility warnings for VC7.x and VC8.
300 WP64CHECK = /Wp64
301
302 # Use multiprocess build
303 USE_MP = yes
304
305 #>>>>> path of the compiler and linker; name of include and lib directories
306 # PATH = c:\msvc20\bin;$(PATH)
307 # INCLUDE = c:\msvc20\include
308 # LIB = c:\msvc20\lib
309
310 !if "$(FEATURES)"==""
311 FEATURES = HUGE
312 !endif
313
314 !ifndef CTAGS
315 CTAGS = ctags
316 !endif
317
318 !ifndef CSCOPE
319 CSCOPE = yes
320 !endif
321
322 !if "$(CSCOPE)" == "yes"
323 # CSCOPE - Include support for Cscope
324 CSCOPE_INCL  = if_cscope.h
325 CSCOPE_OBJ   = $(OBJDIR)/if_cscope.obj
326 CSCOPE_DEFS  = -DFEAT_CSCOPE
327 !endif
328
329 !ifndef NETBEANS
330 NETBEANS = $(GUI)
331 !endif
332
333 !ifndef CHANNEL
334 !if "$(FEATURES)"=="HUGE"
335 CHANNEL = yes
336 !else
337 CHANNEL = $(GUI)
338 !endif
339 !endif
340
341 # GUI sepcific features.
342 !if "$(GUI)" == "yes"
343 # Only allow NETBEANS for a GUI build and CHANNEL.
344 !if "$(NETBEANS)" == "yes" && "$(CHANNEL)" == "yes"
345 # NETBEANS - Include support for Netbeans integration
346 NETBEANS_PRO    = proto/netbeans.pro
347 NETBEANS_OBJ    = $(OBJDIR)/netbeans.obj
348 NETBEANS_DEFS   = -DFEAT_NETBEANS_INTG
349
350 !if "$(NBDEBUG)" == "yes"
351 NBDEBUG_DEFS    = -DNBDEBUG
352 NBDEBUG_INCL    = nbdebug.h
353 NBDEBUG_SRC     = nbdebug.c
354 !endif
355 NETBEANS_LIB    = WSock32.lib
356 !endif
357
358 # DirectWrite(DirectX)
359 !if "$(DIRECTX)" == "yes"
360 DIRECTX_DEFS    = -DFEAT_DIRECTX -DDYNAMIC_DIRECTX
361 DIRECTX_INCL    = gui_dwrite.h
362 DIRECTX_OBJ     = $(OUTDIR)\gui_dwrite.obj
363 !endif
364
365 # Only allow XPM for a GUI build.
366 !ifndef XPM
367 !ifndef USE_MSVCRT
368 # Both XPM and USE_MSVCRT are not set, use the included xpm files, depending
369 # on the architecture.
370 !if "$(CPU)" == "AMD64"
371 XPM = xpm\x64
372 !elseif "$(CPU)" == "i386"
373 XPM = xpm\x86
374 !else
375 XPM = no
376 !endif
377 !else # USE_MSVCRT
378 XPM = no
379 !endif # USE_MSVCRT
380 !endif # XPM
381 !if "$(XPM)" != "no"
382 # XPM - Include support for XPM signs
383 # See the xpm directory for more information.
384 XPM_OBJ   = $(OBJDIR)/xpm_w32.obj
385 XPM_DEFS  = -DFEAT_XPM_W32
386 !if $(MSVC_MAJOR) >= 14
387 # VC14 cannot use a library built by VC12 or eariler, because VC14 uses
388 # Universal CRT.
389 XPM_LIB   = $(XPM)\lib-vc14\libXpm.lib
390 !else
391 XPM_LIB   = $(XPM)\lib\libXpm.lib
392 !endif
393 XPM_INC   = -I $(XPM)\include -I $(XPM)\..\include
394 !endif
395 !endif
396
397 !if "$(CHANNEL)" == "yes"
398 CHANNEL_PRO     = proto/channel.pro
399 CHANNEL_OBJ     = $(OBJDIR)/channel.obj
400 CHANNEL_DEFS    = -DFEAT_JOB_CHANNEL
401
402 NETBEANS_LIB    = WSock32.lib
403 !endif
404
405 # Set which version of the CRT to use
406 !if defined(USE_MSVCRT)
407 # CVARS = $(cvarsdll)
408 # !elseif defined(MULTITHREADED)
409 # CVARS = $(cvarsmt)
410 !else
411 # CVARS = $(cvars)
412 # CVARS = $(cvarsmt)
413 !endif
414
415 # need advapi32.lib for GetUserName()
416 # need shell32.lib for ExtractIcon()
417 # gdi32.lib and comdlg32.lib for printing support
418 # ole32.lib and uuid.lib are needed for FEAT_SHORTCUT
419 CON_LIB = oldnames.lib kernel32.lib advapi32.lib shell32.lib gdi32.lib \
420           comdlg32.lib ole32.lib uuid.lib /machine:$(CPU)
421 !if "$(DELAYLOAD)" == "yes"
422 CON_LIB = $(CON_LIB) /DELAYLOAD:comdlg32.dll /DELAYLOAD:ole32.dll DelayImp.lib
423 !endif
424
425 ### Set the default $(WINVER) to make it work with VC++7.0 (VS.NET)
426 !ifndef WINVER
427 WINVER = 0x0501
428 !endif
429
430 # If you have a fixed directory for $VIM or $VIMRUNTIME, other than the normal
431 # default, use these lines.
432 #VIMRCLOC = somewhere
433 #VIMRUNTIMEDIR = somewhere
434
435 CFLAGS = -c /W3 /nologo $(CVARS) -I. -Iproto -DHAVE_PATHDEF -DWIN32 \
436                 $(CSCOPE_DEFS) $(NETBEANS_DEFS) $(CHANNEL_DEFS) \
437                 $(NBDEBUG_DEFS) $(XPM_DEFS) \
438                 $(DEFINES) -DWINVER=$(WINVER) -D_WIN32_WINNT=$(WINVER) \
439                 /Fo$(OUTDIR)/ 
440
441 #>>>>> end of choices
442 ###########################################################################
443
444 DEL_TREE = rmdir /s /q
445
446 INTDIR=$(OBJDIR)
447 OUTDIR=$(OBJDIR)
448
449 # Convert processor ID to MVC-compatible number
450 !if $(MSVC_MAJOR) < 8
451 !if "$(CPUNR)" == "i386"
452 CPUARG = /G3
453 !elseif "$(CPUNR)" == "i486"
454 CPUARG = /G4
455 !elseif "$(CPUNR)" == "i586"
456 CPUARG = /G5
457 !elseif "$(CPUNR)" == "i686"
458 CPUARG = /G6
459 !elseif "$(CPUNR)" == "pentium4"
460 CPUARG = /G7 /arch:SSE2
461 !else
462 CPUARG =
463 !endif
464 !else
465 # VC8/9/10 only allows specifying SSE architecture but only for 32bit
466 !if "$(ASSEMBLY_ARCHITECTURE)" == "i386" && "$(CPUNR)" == "pentium4"
467 CPUARG = /arch:SSE2
468 !endif
469 !endif
470
471 LIBC =
472 DEBUGINFO = /Zi
473
474 # Don't use /nodefaultlib on MSVC 14
475 !if $(MSVC_MAJOR) >= 14
476 NODEFAULTLIB =
477 !else
478 NODEFAULTLIB = /nodefaultlib
479 !endif
480
481 # Use multiprocess build on MSVC 10
482 !if "$(USE_MP)"=="yes"
483 !if $(MSVC_MAJOR) >= 10
484 CFLAGS = $(CFLAGS) /MP
485 !endif
486 !endif
487
488
489 !ifdef NODEBUG
490 VIM = vim
491 !if "$(OPTIMIZE)" == "SPACE"
492 OPTFLAG = /O1
493 !elseif "$(OPTIMIZE)" == "SPEED"
494 OPTFLAG = /O2
495 !else # MAXSPEED
496 OPTFLAG = /Ox
497 !endif
498
499 !if $(MSVC_MAJOR) >= 8
500 # Use link time code generation if not worried about size
501 !if "$(OPTIMIZE)" != "SPACE"
502 OPTFLAG = $(OPTFLAG) /GL
503 !endif
504 !endif
505
506 # (/Wp64 is deprecated in VC9 and generates an obnoxious warning.)
507 !if ($(MSVC_MAJOR) == 7) || ($(MSVC_MAJOR) == 8)
508 CFLAGS=$(CFLAGS) $(WP64CHECK)
509 !endif
510
511 # VC10 or later has stdint.h.
512 !if $(MSVC_MAJOR) >= 10
513 CFLAGS = $(CFLAGS) -DHAVE_STDINT_H
514 !endif
515
516 # Static code analysis generally available starting with VS2012 (VC11) or
517 # Windows SDK 7.1 (VC10)
518 !if ("$(ANALYZE)" == "yes") && ($(MSVC_MAJOR) >= 10)
519 CFLAGS=$(CFLAGS) /analyze
520 !endif
521
522 CFLAGS = $(CFLAGS) $(OPTFLAG) -DNDEBUG $(CPUARG)
523 RCFLAGS = $(rcflags) $(rcvars) -DNDEBUG
524 ! ifdef USE_MSVCRT
525 CFLAGS = $(CFLAGS) /MD
526 LIBC = msvcrt.lib
527 ! else
528 LIBC = libcmt.lib
529 CFLAGS = $(CFLAGS) /Zl /MT
530 ! endif
531 !else  # DEBUG
532 VIM = vimd
533 ! if ("$(CPU)" == "i386") || ("$(CPU)" == "ix86")
534 DEBUGINFO = /ZI
535 ! endif
536 CFLAGS = $(CFLAGS) -D_DEBUG -DDEBUG /Od
537 RCFLAGS = $(rcflags) $(rcvars) -D_DEBUG -DDEBUG
538 # The /fixed:no is needed for Quantify. Assume not 4.? as unsupported in VC4.0.
539 ! if $(MSVC_MAJOR) == 4
540 LIBC =
541 ! else
542 LIBC = /fixed:no
543 ! endif
544 ! ifdef USE_MSVCRT
545 CFLAGS = $(CFLAGS) /MDd
546 LIBC = $(LIBC) msvcrtd.lib
547 ! else
548 LIBC = $(LIBC) libcmtd.lib
549 CFLAGS = $(CFLAGS) /Zl /MTd
550 ! endif
551 !endif # DEBUG
552
553 INCL =  vim.h os_win32.h ascii.h feature.h globals.h keymap.h macros.h \
554         proto.h option.h structs.h term.h $(CSCOPE_INCL) \
555         $(NBDEBUG_INCL)
556
557 OBJ = \
558         $(OUTDIR)\arabic.obj \
559         $(OUTDIR)\blowfish.obj \
560         $(OUTDIR)\buffer.obj \
561         $(OUTDIR)\charset.obj \
562         $(OUTDIR)\crypt.obj \
563         $(OUTDIR)\crypt_zip.obj \
564         $(OUTDIR)\dict.obj \
565         $(OUTDIR)\diff.obj \
566         $(OUTDIR)\digraph.obj \
567         $(OUTDIR)\edit.obj \
568         $(OUTDIR)\eval.obj \
569         $(OUTDIR)\evalfunc.obj \
570         $(OUTDIR)\ex_cmds.obj \
571         $(OUTDIR)\ex_cmds2.obj \
572         $(OUTDIR)\ex_docmd.obj \
573         $(OUTDIR)\ex_eval.obj \
574         $(OUTDIR)\ex_getln.obj \
575         $(OUTDIR)\farsi.obj \
576         $(OUTDIR)\fileio.obj \
577         $(OUTDIR)\fold.obj \
578         $(OUTDIR)\getchar.obj \
579         $(OUTDIR)\hardcopy.obj \
580         $(OUTDIR)\hashtab.obj \
581         $(OUTDIR)\json.obj \
582         $(OUTDIR)\list.obj \
583         $(OUTDIR)\main.obj \
584         $(OUTDIR)\mark.obj \
585         $(OUTDIR)\mbyte.obj \
586         $(OUTDIR)\memfile.obj \
587         $(OUTDIR)\memline.obj \
588         $(OUTDIR)\menu.obj \
589         $(OUTDIR)\message.obj \
590         $(OUTDIR)\misc1.obj \
591         $(OUTDIR)\misc2.obj \
592         $(OUTDIR)\move.obj \
593         $(OUTDIR)\normal.obj \
594         $(OUTDIR)\ops.obj \
595         $(OUTDIR)\option.obj \
596         $(OUTDIR)\os_mswin.obj \
597         $(OUTDIR)\winclip.obj \
598         $(OUTDIR)\os_win32.obj \
599         $(OUTDIR)\pathdef.obj \
600         $(OUTDIR)\popupmnu.obj \
601         $(OUTDIR)\quickfix.obj \
602         $(OUTDIR)\regexp.obj \
603         $(OUTDIR)\screen.obj \
604         $(OUTDIR)\search.obj \
605         $(OUTDIR)\sha256.obj \
606         $(OUTDIR)\spell.obj \
607         $(OUTDIR)\spellfile.obj \
608         $(OUTDIR)\syntax.obj \
609         $(OUTDIR)\tag.obj \
610         $(OUTDIR)\term.obj \
611         $(OUTDIR)\ui.obj \
612         $(OUTDIR)\undo.obj \
613         $(OUTDIR)\userfunc.obj \
614         $(OUTDIR)\window.obj \
615         $(OUTDIR)\vim.res
616
617 !if "$(OLE)" == "yes"
618 CFLAGS = $(CFLAGS) -DFEAT_OLE
619 RCFLAGS = $(RCFLAGS) -DFEAT_OLE
620 OLE_OBJ = $(OUTDIR)\if_ole.obj
621 OLE_IDL = if_ole.idl
622 OLE_LIB = oleaut32.lib
623 !endif
624
625 !if "$(IME)" == "yes"
626 CFLAGS = $(CFLAGS) -DFEAT_MBYTE_IME
627 !ifndef DYNAMIC_IME
628 DYNAMIC_IME = yes
629 !endif
630 !if "$(DYNAMIC_IME)" == "yes"
631 CFLAGS = $(CFLAGS) -DDYNAMIC_IME
632 !else
633 IME_LIB = imm32.lib
634 !endif
635 !endif
636
637 !if "$(GIME)" == "yes"
638 CFLAGS = $(CFLAGS) -DGLOBAL_IME
639 OBJ = $(OBJ) $(OUTDIR)\dimm_i.obj $(OUTDIR)\glbl_ime.obj
640 MBYTE = yes
641 !endif
642
643 !if "$(MBYTE)" == "yes"
644 CFLAGS = $(CFLAGS) -DFEAT_MBYTE
645 !endif
646
647 !if "$(GUI)" == "yes"
648 SUBSYSTEM = windows
649 CFLAGS = $(CFLAGS) -DFEAT_GUI_W32
650 RCFLAGS = $(RCFLAGS) -DFEAT_GUI_W32
651 VIM = g$(VIM)
652 GUI_INCL = \
653         gui.h \
654         regexp.h \
655         ascii.h \
656         ex_cmds.h \
657         farsi.h \
658         feature.h \
659         globals.h \
660         gui_beval.h \
661         keymap.h \
662         macros.h \
663         option.h \
664         os_dos.h \
665         os_win32.h
666 GUI_OBJ = \
667         $(OUTDIR)\gui.obj \
668         $(OUTDIR)\gui_beval.obj \
669         $(OUTDIR)\gui_w32.obj \
670         $(OUTDIR)\os_w32exe.obj
671 GUI_LIB = \
672         gdi32.lib version.lib $(IME_LIB) \
673         winspool.lib comctl32.lib advapi32.lib shell32.lib \
674         /machine:$(CPU)
675 !else
676 SUBSYSTEM = console
677 CUI_INCL = iscygpty.h
678 CUI_OBJ = $(OUTDIR)\iscygpty.obj
679 !endif
680
681 !if "$(SUBSYSTEM_VER)" != ""
682 SUBSYSTEM = $(SUBSYSTEM),$(SUBSYSTEM_VER)
683 !endif
684
685 !if "$(GUI)" == "yes" && "$(DIRECTX)" == "yes"
686 CFLAGS = $(CFLAGS) $(DIRECTX_DEFS)
687 GUI_INCL = $(GUI_INCL) $(DIRECTX_INCL)
688 GUI_OBJ = $(GUI_OBJ) $(DIRECTX_OBJ)
689 !endif
690
691 # iconv.dll library (dynamically loaded)
692 !ifndef ICONV
693 ICONV = yes
694 !endif
695 !if "$(ICONV)" == "yes"
696 CFLAGS = $(CFLAGS) -DDYNAMIC_ICONV
697 !endif
698
699 # libintl.dll library
700 !ifndef GETTEXT
701 GETTEXT = yes
702 !endif
703 !if "$(GETTEXT)" == "yes"
704 CFLAGS = $(CFLAGS) -DDYNAMIC_GETTEXT
705 !endif
706
707 # TCL interface
708 !ifdef TCL
709 !ifndef TCL_VER
710 TCL_VER = 86
711 TCL_VER_LONG = 8.6
712 !endif
713 !message Tcl requested (version $(TCL_VER)) - root dir is "$(TCL)"
714 !if "$(DYNAMIC_TCL)" == "yes"
715 !message Tcl DLL will be loaded dynamically
716 TCL_DLL = tcl$(TCL_VER).dll
717 CFLAGS  = $(CFLAGS) -DFEAT_TCL -DDYNAMIC_TCL -DDYNAMIC_TCL_DLL=\"$(TCL_DLL)\" \
718                 -DDYNAMIC_TCL_VER=\"$(TCL_VER_LONG)\"
719 TCL_OBJ = $(OUTDIR)\if_tcl.obj
720 TCL_INC = /I "$(TCL)\Include" /I "$(TCL)"
721 TCL_LIB = "$(TCL)\lib\tclstub$(TCL_VER).lib"
722 !else
723 CFLAGS  = $(CFLAGS) -DFEAT_TCL
724 TCL_OBJ = $(OUTDIR)\if_tcl.obj
725 TCL_INC = /I "$(TCL)\Include" /I "$(TCL)"
726 TCL_LIB = $(TCL)\lib\tcl$(TCL_VER)vc.lib
727 !endif
728 !endif
729
730 # Lua interface
731 !ifdef LUA
732 !ifndef LUA_VER
733 LUA_VER = 53
734 !endif
735 !message Lua requested (version $(LUA_VER)) - root dir is "$(LUA)"
736 !if "$(DYNAMIC_LUA)" == "yes"
737 !message Lua DLL will be loaded dynamically
738 !endif
739 CFLAGS = $(CFLAGS) -DFEAT_LUA
740 LUA_OBJ = $(OUTDIR)\if_lua.obj
741 LUA_INC = /I "$(LUA)\include" /I "$(LUA)"
742 !if "$(DYNAMIC_LUA)" == "yes"
743 CFLAGS = $(CFLAGS) -DDYNAMIC_LUA \
744                 -DDYNAMIC_LUA_DLL=\"lua$(LUA_VER).dll\"
745 LUA_LIB = /nodefaultlib:lua$(LUA_VER).lib
746 !else
747 LUA_LIB = "$(LUA)\lib\lua$(LUA_VER).lib"
748 !endif
749 !endif
750
751 !ifdef PYTHON
752 !ifdef PYTHON3
753 DYNAMIC_PYTHON=yes
754 DYNAMIC_PYTHON3=yes
755 !endif
756 !endif
757
758 # PYTHON interface
759 !ifdef PYTHON
760 !ifndef PYTHON_VER
761 PYTHON_VER = 27
762 !endif
763 !message Python requested (version $(PYTHON_VER)) - root dir is "$(PYTHON)"
764 !if "$(DYNAMIC_PYTHON)" == "yes"
765 !message Python DLL will be loaded dynamically
766 !endif
767 CFLAGS = $(CFLAGS) -DFEAT_PYTHON
768 PYTHON_OBJ = $(OUTDIR)\if_python.obj
769 PYTHON_INC = /I "$(PYTHON)\Include" /I "$(PYTHON)\PC"
770 !if "$(DYNAMIC_PYTHON)" == "yes"
771 CFLAGS = $(CFLAGS) -DDYNAMIC_PYTHON \
772                 -DDYNAMIC_PYTHON_DLL=\"python$(PYTHON_VER).dll\"
773 PYTHON_LIB = /nodefaultlib:python$(PYTHON_VER).lib
774 !else
775 PYTHON_LIB = $(PYTHON)\libs\python$(PYTHON_VER).lib
776 !endif
777 !endif
778
779 # PYTHON3 interface
780 !ifdef PYTHON3
781 !ifndef PYTHON3_VER
782 PYTHON3_VER = 35
783 !endif
784 !message Python3 requested (version $(PYTHON3_VER)) - root dir is "$(PYTHON3)"
785 !if "$(DYNAMIC_PYTHON3)" == "yes"
786 !message Python3 DLL will be loaded dynamically
787 !endif
788 CFLAGS = $(CFLAGS) -DFEAT_PYTHON3
789 PYTHON3_OBJ = $(OUTDIR)\if_python3.obj
790 PYTHON3_INC = /I "$(PYTHON3)\Include" /I "$(PYTHON3)\PC"
791 !if "$(DYNAMIC_PYTHON3)" == "yes"
792 CFLAGS = $(CFLAGS) -DDYNAMIC_PYTHON3 \
793                 -DDYNAMIC_PYTHON3_DLL=\"python$(PYTHON3_VER).dll\"
794 PYTHON3_LIB = /nodefaultlib:python$(PYTHON3_VER).lib
795 !else
796 PYTHON3_LIB = $(PYTHON3)\libs\python$(PYTHON3_VER).lib
797 !endif
798 !endif
799
800 # MzScheme interface
801 !ifdef MZSCHEME
802 !message MzScheme requested - root dir is "$(MZSCHEME)"
803 !ifndef MZSCHEME_VER
804 MZSCHEME_VER = 3m_a0solc
805 !endif
806 !ifndef MZSCHEME_COLLECTS
807 MZSCHEME_COLLECTS=$(MZSCHEME)\collects
808 !endif
809 CFLAGS = $(CFLAGS) -DFEAT_MZSCHEME -I "$(MZSCHEME)\include"
810 !if EXIST("$(MZSCHEME)\lib\msvc\libmzsch$(MZSCHEME_VER).lib")
811 MZSCHEME_MAIN_LIB=mzsch
812 !else
813 MZSCHEME_MAIN_LIB=racket
814 !endif
815 !if (EXIST("$(MZSCHEME)\lib\lib$(MZSCHEME_MAIN_LIB)$(MZSCHEME_VER).dll") \
816      && !EXIST("$(MZSCHEME)\lib\libmzgc$(MZSCHEME_VER).dll")) \
817     || (EXIST("$(MZSCHEME)\lib\msvc\lib$(MZSCHEME_MAIN_LIB)$(MZSCHEME_VER).lib") \
818         && !EXIST("$(MZSCHEME)\lib\msvc\libmzgc$(MZSCHEME_VER).lib"))
819 !message Building with Precise GC
820 MZSCHEME_PRECISE_GC = yes
821 CFLAGS = $(CFLAGS) -DMZ_PRECISE_GC
822 !endif
823 !if "$(DYNAMIC_MZSCHEME)" == "yes"
824 !message MzScheme DLLs will be loaded dynamically
825 CFLAGS = $(CFLAGS) -DDYNAMIC_MZSCHEME
826 !if "$(MZSCHEME_PRECISE_GC)" == "yes"
827 # Precise GC does not use separate dll
828 CFLAGS = $(CFLAGS) \
829          -DDYNAMIC_MZSCH_DLL=\"lib$(MZSCHEME_MAIN_LIB)$(MZSCHEME_VER).dll\" \
830          -DDYNAMIC_MZGC_DLL=\"lib$(MZSCHEME_MAIN_LIB)$(MZSCHEME_VER).dll\"
831 !else
832 CFLAGS = $(CFLAGS) \
833          -DDYNAMIC_MZSCH_DLL=\"lib$(MZSCHEME_MAIN_LIB)$(MZSCHEME_VER).dll\" \
834          -DDYNAMIC_MZGC_DLL=\"libmzgc$(MZSCHEME_VER).dll\"
835 !endif
836 !else
837 !if "$(MZSCHEME_DEBUG)" == "yes"
838 CFLAGS = $(CFLAGS) -DMZSCHEME_FORCE_GC
839 !endif
840 !if "$(MZSCHEME_PRECISE_GC)" == "yes"
841 # Precise GC does not use separate dll
842 !if EXIST("$(MZSCHEME)\lib\lib$(MZSCHEME_MAIN_LIB)$(MZSCHEME_VER).def")
843 # create .lib from .def
844 MZSCHEME_LIB = lib$(MZSCHEME_MAIN_LIB)$(MZSCHEME_VER).lib
845 MZSCHEME_EXTRA_DEP = lib$(MZSCHEME_MAIN_LIB)$(MZSCHEME_VER).lib
846 !else
847 MZSCHEME_LIB = "$(MZSCHEME)\lib\msvc\lib$(MZSCHEME_MAIN_LIB)$(MZSCHEME_VER).lib"
848 !endif
849 !else
850 MZSCHEME_LIB = "$(MZSCHEME)\lib\msvc\libmzgc$(MZSCHEME_VER).lib" \
851                 "$(MZSCHEME)\lib\msvc\lib$(MZSCHEME_MAIN_LIB)$(MZSCHEME_VER).lib"
852 !endif
853 !endif
854 MZSCHEME_OBJ = $(OUTDIR)\if_mzsch.obj
855 # increase stack size
856 MZSCHEME_LIB = $(MZSCHEME_LIB) /STACK:8388608
857 !endif
858
859 # Perl interface
860 !ifdef PERL
861 !ifndef PERL_VER
862 PERL_VER = 524
863 !endif
864 !message Perl requested (version $(PERL_VER)) - root dir is "$(PERL)"
865 !if "$(DYNAMIC_PERL)" == "yes"
866 !if $(PERL_VER) >= 56
867 !message Perl DLL will be loaded dynamically
868 !else
869 !message Dynamic loading is not supported for Perl versions earlier than 5.6.0
870 !message Reverting to static loading...
871 !undef DYNAMIC_PERL
872 !endif
873 !endif
874
875 # Is Perl installed in architecture-specific directories?
876 !if exist($(PERL)\Bin\MSWin32-x86)
877 PERL_ARCH = \MSWin32-x86
878 !endif
879
880 PERL_INCDIR = $(PERL)\Lib$(PERL_ARCH)\Core
881
882 # Version-dependent stuff
883 !if $(PERL_VER) == 55
884 PERL_LIB = $(PERL_INCDIR)\perl.lib
885 !else
886 PERL_DLL = perl$(PERL_VER).dll
887 !if exist($(PERL_INCDIR)\perl$(PERL_VER).lib)
888 PERL_LIB = $(PERL_INCDIR)\perl$(PERL_VER).lib
889 !else
890 # For ActivePerl 5.18 and later
891 PERL_LIB = $(PERL_INCDIR)\libperl$(PERL_VER).a
892 !endif
893 !endif
894
895 CFLAGS = $(CFLAGS) -DFEAT_PERL -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS
896
897 # Do we want to load Perl dynamically?
898 !if "$(DYNAMIC_PERL)" == "yes"
899 CFLAGS = $(CFLAGS) -DDYNAMIC_PERL -DDYNAMIC_PERL_DLL=\"$(PERL_DLL)\"
900 !undef PERL_LIB
901 !endif
902
903 PERL_EXE = $(PERL)\Bin$(PERL_ARCH)\perl
904 PERL_INC = /I $(PERL_INCDIR)
905 !if $(MSVC_MAJOR) <= 11
906 # ActivePerl 5.20+ requires stdbool.h but VC2012 or earlier doesn't have it.
907 # Use a stub stdbool.h.
908 PERL_INC = $(PERL_INC) /I if_perl_msvc
909 !endif
910 PERL_OBJ = $(OUTDIR)\if_perl.obj $(OUTDIR)\if_perlsfio.obj
911 XSUBPP = $(PERL)\lib\ExtUtils\xsubpp
912 !if exist($(XSUBPP))
913 XSUBPP = $(PERL_EXE) $(XSUBPP)
914 !else
915 XSUBPP = xsubpp
916 !endif
917 XSUBPP_TYPEMAP = $(PERL)\lib\ExtUtils\typemap
918
919 !endif
920
921 #
922 # Support Ruby interface
923 #
924 !ifdef RUBY
925 #  Set default value
926 !ifndef RUBY_VER
927 RUBY_VER = 22
928 !endif
929 !ifndef RUBY_VER_LONG
930 RUBY_VER_LONG = 2.2.0
931 !endif
932 !ifndef RUBY_API_VER_LONG
933 RUBY_API_VER_LONG = $(RUBY_VER_LONG)
934 !endif
935 !ifndef RUBY_API_VER
936 RUBY_API_VER = $(RUBY_API_VER_LONG:.=)
937 !endif
938
939 !if $(RUBY_VER) >= 18
940
941 !ifndef RUBY_PLATFORM
942 !if "$(CPU)" == "i386"
943 RUBY_PLATFORM = i386-mswin32
944 !else # CPU
945 RUBY_PLATFORM = x64-mswin64
946 !endif # CPU
947 !if $(MSVCRT_VER) >= 70 && $(RUBY_VER) > 19
948 RUBY_PLATFORM = $(RUBY_PLATFORM)_$(MSVCRT_VER)
949 !endif # MSVCRT_VER
950 !endif # RUBY_PLATFORM
951
952 !ifndef RUBY_INSTALL_NAME
953 !ifndef RUBY_MSVCRT_NAME
954 # Base name of msvcrXX.dll which is used by ruby's dll.
955 RUBY_MSVCRT_NAME = $(MSVCRT_NAME)
956 !endif # RUBY_MSVCRT_NAME
957 !if "$(CPU)" == "i386"
958 RUBY_INSTALL_NAME = $(RUBY_MSVCRT_NAME)-ruby$(RUBY_API_VER)
959 !else # CPU
960 RUBY_INSTALL_NAME = x64-$(RUBY_MSVCRT_NAME)-ruby$(RUBY_API_VER)
961 !endif # CPU
962 !endif # RUBY_INSTALL_NAME
963
964 !else # $(RUBY_VER) >= 18
965
966 !ifndef RUBY_PLATFORM
967 RUBY_PLATFORM = i586-mswin32
968 !endif
969 !ifndef RUBY_INSTALL_NAME
970 RUBY_INSTALL_NAME = mswin32-ruby$(RUBY_API_VER)
971 !endif
972
973 !endif # $(RUBY_VER) >= 18
974
975 !message Ruby requested (version $(RUBY_VER)) - root dir is "$(RUBY)"
976 CFLAGS = $(CFLAGS) -DFEAT_RUBY
977 RUBY_OBJ = $(OUTDIR)\if_ruby.obj
978 !if $(RUBY_VER) >= 19
979 RUBY_INC = /I "$(RUBY)\lib\ruby\$(RUBY_API_VER_LONG)\$(RUBY_PLATFORM)" /I "$(RUBY)\include\ruby-$(RUBY_API_VER_LONG)" /I "$(RUBY)\include\ruby-$(RUBY_API_VER_LONG)\$(RUBY_PLATFORM)"
980 !else
981 RUBY_INC = /I "$(RUBY)\lib\ruby\$(RUBY_API_VER_LONG)\$(RUBY_PLATFORM)"
982 !endif
983 RUBY_LIB = $(RUBY)\lib\$(RUBY_INSTALL_NAME).lib
984 # Do we want to load Ruby dynamically?
985 !if "$(DYNAMIC_RUBY)" == "yes"
986 !message Ruby DLL will be loaded dynamically
987 CFLAGS = $(CFLAGS) -DDYNAMIC_RUBY -DDYNAMIC_RUBY_VER=$(RUBY_VER) \
988                 -DDYNAMIC_RUBY_DLL=\"$(RUBY_INSTALL_NAME).dll\" 
989 !undef RUBY_LIB
990 !endif
991 !endif # RUBY
992
993 #
994 # Support PostScript printing
995 #
996 !if "$(POSTSCRIPT)" == "yes"
997 CFLAGS = $(CFLAGS) -DMSWINPS
998 !endif # POSTSCRIPT
999
1000 #
1001 # FEATURES: TINY, SMALL, NORMAL, BIG or HUGE
1002 #
1003 CFLAGS = $(CFLAGS) -DFEAT_$(FEATURES)
1004
1005 #
1006 # Always generate the .pdb file, so that we get debug symbols that can be used
1007 # on a crash (doesn't add overhead to the executable).
1008 # Generate edit-and-continue debug info when no optimization - allows to
1009 # debug more conveniently (able to look at variables which are in registers)
1010 #
1011 CFLAGS = $(CFLAGS) /Fd$(OUTDIR)/ $(DEBUGINFO)
1012 LINK_PDB = /PDB:$(VIM).pdb -debug
1013
1014 #
1015 # End extra feature include
1016 #
1017 !message
1018
1019 conflags = /nologo /subsystem:$(SUBSYSTEM)
1020
1021 PATHDEF_SRC = $(OUTDIR)\pathdef.c
1022
1023 !IF "$(MAP)" == "yes"
1024 # "/map" is for debugging
1025 conflags = $(conflags) /map
1026 !ELSEIF "$(MAP)" == "lines"
1027 # "/mapinfo:lines" is for debugging, only works for VC6 and later
1028 conflags = $(conflags) /map /mapinfo:lines
1029 !ENDIF
1030
1031 LINKARGS1 = $(linkdebug) $(conflags)
1032 LINKARGS2 = $(CON_LIB) $(GUI_LIB) $(NODEFAULTLIB) $(LIBC) $(OLE_LIB) user32.lib \
1033                 $(LUA_LIB) $(MZSCHEME_LIB) $(PERL_LIB) $(PYTHON_LIB) $(PYTHON3_LIB) $(RUBY_LIB) \
1034                 $(TCL_LIB) $(NETBEANS_LIB) $(XPM_LIB) $(LINK_PDB)
1035
1036 # Report link time code generation progress if used. 
1037 !ifdef NODEBUG
1038 !if $(MSVC_MAJOR) >= 8
1039 !if "$(OPTIMIZE)" != "SPACE"
1040 LINKARGS1 = $(LINKARGS1) /LTCG:STATUS
1041 !endif
1042 !endif
1043 !endif
1044
1045 all:    $(VIM).exe \
1046         vimrun.exe \
1047         install.exe \
1048         uninstal.exe \
1049         xxd/xxd.exe \
1050         tee/tee.exe \
1051         GvimExt/gvimext.dll
1052
1053 $(VIM).exe: $(OUTDIR) $(OBJ) $(GUI_OBJ) $(CUI_OBJ) $(OLE_OBJ) $(OLE_IDL) $(MZSCHEME_OBJ) \
1054                 $(LUA_OBJ) $(PERL_OBJ) $(PYTHON_OBJ) $(PYTHON3_OBJ) $(RUBY_OBJ) $(TCL_OBJ) \
1055                 $(CSCOPE_OBJ) $(NETBEANS_OBJ) $(CHANNEL_OBJ) $(XPM_OBJ) \
1056                 version.c version.h
1057         $(CC) $(CFLAGS) version.c
1058         $(link) $(LINKARGS1) -out:$(VIM).exe $(OBJ) $(GUI_OBJ) $(CUI_OBJ) $(OLE_OBJ) \
1059                 $(LUA_OBJ) $(MZSCHEME_OBJ) $(PERL_OBJ) $(PYTHON_OBJ) $(PYTHON3_OBJ) $(RUBY_OBJ) \
1060                 $(TCL_OBJ) $(CSCOPE_OBJ) $(NETBEANS_OBJ) $(CHANNEL_OBJ) \
1061                 $(XPM_OBJ) $(OUTDIR)\version.obj $(LINKARGS2)
1062         if exist $(VIM).exe.manifest mt.exe -nologo -manifest $(VIM).exe.manifest -updateresource:$(VIM).exe;1
1063
1064 $(VIM): $(VIM).exe
1065
1066 $(OUTDIR):
1067         if not exist $(OUTDIR)/nul  mkdir $(OUTDIR)
1068
1069 install.exe: dosinst.c
1070         $(CC) /nologo -DNDEBUG -DWIN32 dosinst.c kernel32.lib shell32.lib \
1071                 user32.lib ole32.lib advapi32.lib uuid.lib
1072         - if exist install.exe del install.exe
1073         ren dosinst.exe install.exe
1074
1075 uninstal.exe: uninstal.c
1076         $(CC) /nologo -DNDEBUG -DWIN32 uninstal.c shell32.lib advapi32.lib
1077
1078 vimrun.exe: vimrun.c
1079         $(CC) /nologo -DNDEBUG vimrun.c
1080
1081 xxd/xxd.exe: xxd/xxd.c
1082         cd xxd
1083         $(MAKE) /NOLOGO -f Make_mvc.mak
1084         cd ..
1085
1086 tee/tee.exe: tee/tee.c
1087         cd tee
1088         $(MAKE) /NOLOGO -f Make_mvc.mak
1089         cd ..
1090
1091 GvimExt/gvimext.dll: GvimExt/gvimext.cpp GvimExt/gvimext.rc GvimExt/gvimext.h
1092         cd GvimExt
1093         $(MAKE) /NOLOGO -f Makefile $(MAKEFLAGS_GVIMEXT)
1094         cd ..
1095
1096
1097 tags: notags
1098         $(CTAGS) *.c *.cpp *.h if_perl.xs proto\*.pro
1099
1100 notags:
1101         - if exist tags del tags
1102
1103 clean:
1104         - if exist $(OUTDIR)/nul $(DEL_TREE) $(OUTDIR)
1105         - if exist *.obj del *.obj
1106         - if exist $(VIM).exe del $(VIM).exe
1107         - if exist $(VIM).ilk del $(VIM).ilk
1108         - if exist $(VIM).pdb del $(VIM).pdb
1109         - if exist $(VIM).map del $(VIM).map
1110         - if exist $(VIM).ncb del $(VIM).ncb
1111         - if exist vimrun.exe del vimrun.exe
1112         - if exist install.exe del install.exe
1113         - if exist uninstal.exe del uninstal.exe
1114         - if exist if_perl.c del if_perl.c
1115         - if exist dimm.h del dimm.h
1116         - if exist dimm_i.c del dimm_i.c
1117         - if exist dimm.tlb del dimm.tlb
1118         - if exist dosinst.exe del dosinst.exe
1119         cd xxd
1120         $(MAKE) /NOLOGO -f Make_mvc.mak clean
1121         cd ..
1122         cd tee
1123         $(MAKE) /NOLOGO -f Make_mvc.mak clean
1124         cd ..
1125         cd GvimExt
1126         $(MAKE) /NOLOGO -f Makefile clean
1127         cd ..
1128         - if exist testdir\*.out del testdir\*.out
1129
1130 test:
1131         cd testdir
1132         $(MAKE) /NOLOGO -f Make_dos.mak win32
1133         cd ..
1134
1135 testgvim:
1136         cd testdir
1137         $(MAKE) /NOLOGO -f Make_dos.mak VIMPROG=..\gvim win32
1138         cd ..
1139
1140 testclean:
1141         cd testdir
1142         $(MAKE) /NOLOGO -f Make_dos.mak clean
1143         cd ..
1144
1145 ###########################################################################
1146
1147 # Create a default rule for transforming .c files to .obj files in $(OUTDIR)
1148 # Batch compilation is supported by nmake 1.62 (part of VS 5.0) and later)
1149 !IF "$(_NMAKE_VER)" == ""
1150 .c{$(OUTDIR)/}.obj:
1151 !ELSE
1152 .c{$(OUTDIR)/}.obj::
1153 !ENDIF
1154         $(CC) $(CFLAGS) $<
1155
1156 # Create a default rule for transforming .cpp files to .obj files in $(OUTDIR)
1157 # Batch compilation is supported by nmake 1.62 (part of VS 5.0) and later)
1158 !IF "$(_NMAKE_VER)" == ""
1159 .cpp{$(OUTDIR)/}.obj:
1160 !ELSE
1161 .cpp{$(OUTDIR)/}.obj::
1162 !ENDIF
1163         $(CC) $(CFLAGS) $<
1164
1165 $(OUTDIR)/arabic.obj:   $(OUTDIR) arabic.c  $(INCL)
1166
1167 $(OUTDIR)/blowfish.obj: $(OUTDIR) blowfish.c  $(INCL)
1168
1169 $(OUTDIR)/buffer.obj:   $(OUTDIR) buffer.c  $(INCL)
1170
1171 $(OUTDIR)/charset.obj:  $(OUTDIR) charset.c  $(INCL)
1172
1173 $(OUTDIR)/crypt.obj:    $(OUTDIR) crypt.c  $(INCL)
1174
1175 $(OUTDIR)/crypt_zip.obj: $(OUTDIR) crypt_zip.c  $(INCL)
1176
1177 $(OUTDIR)/dict.obj:     $(OUTDIR) dict.c  $(INCL)
1178
1179 $(OUTDIR)/diff.obj:     $(OUTDIR) diff.c  $(INCL)
1180
1181 $(OUTDIR)/digraph.obj:  $(OUTDIR) digraph.c  $(INCL)
1182
1183 $(OUTDIR)/edit.obj:     $(OUTDIR) edit.c  $(INCL)
1184
1185 $(OUTDIR)/eval.obj:     $(OUTDIR) eval.c  $(INCL)
1186
1187 $(OUTDIR)/evalfunc.obj: $(OUTDIR) evalfunc.c  $(INCL)
1188
1189 $(OUTDIR)/ex_cmds.obj:  $(OUTDIR) ex_cmds.c  $(INCL)
1190
1191 $(OUTDIR)/ex_cmds2.obj: $(OUTDIR) ex_cmds2.c  $(INCL)
1192
1193 $(OUTDIR)/ex_docmd.obj: $(OUTDIR) ex_docmd.c  $(INCL) ex_cmds.h
1194
1195 $(OUTDIR)/ex_eval.obj:  $(OUTDIR) ex_eval.c  $(INCL) ex_cmds.h
1196
1197 $(OUTDIR)/ex_getln.obj: $(OUTDIR) ex_getln.c  $(INCL)
1198
1199 $(OUTDIR)/farsi.obj:    $(OUTDIR) farsi.c  $(INCL)
1200
1201 $(OUTDIR)/fileio.obj:   $(OUTDIR) fileio.c  $(INCL)
1202
1203 $(OUTDIR)/fold.obj:     $(OUTDIR) fold.c  $(INCL)
1204
1205 $(OUTDIR)/getchar.obj:  $(OUTDIR) getchar.c  $(INCL)
1206
1207 $(OUTDIR)/hardcopy.obj: $(OUTDIR) hardcopy.c  $(INCL)
1208
1209 $(OUTDIR)/hashtab.obj:  $(OUTDIR) hashtab.c  $(INCL)
1210
1211 $(OUTDIR)/gui.obj:      $(OUTDIR) gui.c  $(INCL) $(GUI_INCL)
1212
1213 $(OUTDIR)/gui_beval.obj:        $(OUTDIR) gui_beval.c $(INCL) $(GUI_INCL)
1214
1215 $(OUTDIR)/gui_w32.obj:  $(OUTDIR) gui_w32.c $(INCL) $(GUI_INCL)
1216
1217 $(OUTDIR)/gui_dwrite.obj:       $(OUTDIR) gui_dwrite.cpp $(INCL) $(GUI_INCL)
1218
1219 $(OUTDIR)/if_cscope.obj: $(OUTDIR) if_cscope.c  $(INCL)
1220
1221 $(OUTDIR)/if_lua.obj: $(OUTDIR) if_lua.c  $(INCL)
1222         $(CC) $(CFLAGS) $(LUA_INC) if_lua.c
1223
1224 if_perl.c : if_perl.xs typemap
1225         $(XSUBPP) -prototypes -typemap $(XSUBPP_TYPEMAP) \
1226                 -typemap typemap if_perl.xs > if_perl.c
1227
1228 $(OUTDIR)/if_perl.obj: $(OUTDIR) if_perl.c  $(INCL)
1229         $(CC) $(CFLAGS) $(PERL_INC) if_perl.c
1230
1231 $(OUTDIR)/if_perlsfio.obj: $(OUTDIR) if_perlsfio.c  $(INCL)
1232         $(CC) $(CFLAGS) $(PERL_INC) if_perlsfio.c
1233
1234 $(OUTDIR)/if_mzsch.obj: $(OUTDIR) if_mzsch.c if_mzsch.h $(INCL) $(MZSCHEME_EXTRA_DEP)
1235         $(CC) $(CFLAGS) if_mzsch.c \
1236                 -DMZSCHEME_COLLECTS="\"$(MZSCHEME_COLLECTS:\=\\)\""
1237
1238 lib$(MZSCHEME_MAIN_LIB)$(MZSCHEME_VER).lib:
1239         lib /DEF:"$(MZSCHEME)\lib\lib$(MZSCHEME_MAIN_LIB)$(MZSCHEME_VER).def"
1240
1241 $(OUTDIR)/if_python.obj: $(OUTDIR) if_python.c if_py_both.h $(INCL)
1242         $(CC) $(CFLAGS) $(PYTHON_INC) if_python.c
1243
1244 $(OUTDIR)/if_python3.obj: $(OUTDIR) if_python3.c if_py_both.h $(INCL)
1245         $(CC) $(CFLAGS) $(PYTHON3_INC) if_python3.c
1246
1247 $(OUTDIR)/if_ole.obj: $(OUTDIR) if_ole.cpp  $(INCL) if_ole.h
1248
1249 $(OUTDIR)/if_ruby.obj: $(OUTDIR) if_ruby.c  $(INCL)
1250         $(CC) $(CFLAGS) $(RUBY_INC) if_ruby.c
1251
1252 $(OUTDIR)/if_tcl.obj: $(OUTDIR) if_tcl.c  $(INCL)
1253         $(CC) $(CFLAGS) $(TCL_INC) if_tcl.c
1254
1255 $(OUTDIR)/iscygpty.obj: $(OUTDIR) iscygpty.c $(CUI_INCL)
1256         $(CC) $(CFLAGS) iscygpty.c -D_WIN32_WINNT=0x0600 -DUSE_DYNFILEID -DENABLE_STUB_IMPL
1257
1258 $(OUTDIR)/json.obj:     $(OUTDIR) json.c  $(INCL)
1259
1260 $(OUTDIR)/list.obj:     $(OUTDIR) list.c  $(INCL)
1261
1262 $(OUTDIR)/main.obj:     $(OUTDIR) main.c  $(INCL) $(CUI_INCL)
1263
1264 $(OUTDIR)/mark.obj:     $(OUTDIR) mark.c  $(INCL)
1265
1266 $(OUTDIR)/memfile.obj:  $(OUTDIR) memfile.c  $(INCL)
1267
1268 $(OUTDIR)/memline.obj:  $(OUTDIR) memline.c  $(INCL)
1269
1270 $(OUTDIR)/menu.obj:     $(OUTDIR) menu.c  $(INCL)
1271
1272 $(OUTDIR)/message.obj:  $(OUTDIR) message.c  $(INCL)
1273
1274 $(OUTDIR)/misc1.obj:    $(OUTDIR) misc1.c  $(INCL)
1275
1276 $(OUTDIR)/misc2.obj:    $(OUTDIR) misc2.c  $(INCL)
1277
1278 $(OUTDIR)/move.obj:     $(OUTDIR) move.c  $(INCL)
1279
1280 $(OUTDIR)/mbyte.obj: $(OUTDIR) mbyte.c  $(INCL)
1281
1282 $(OUTDIR)/netbeans.obj: $(OUTDIR) netbeans.c $(NBDEBUG_SRC) $(INCL)
1283
1284 $(OUTDIR)/channel.obj: $(OUTDIR) channel.c $(INCL)
1285
1286 $(OUTDIR)/normal.obj:   $(OUTDIR) normal.c  $(INCL)
1287
1288 $(OUTDIR)/option.obj:   $(OUTDIR) option.c  $(INCL)
1289
1290 $(OUTDIR)/ops.obj:      $(OUTDIR) ops.c  $(INCL)
1291
1292 $(OUTDIR)/os_mswin.obj: $(OUTDIR) os_mswin.c  $(INCL)
1293
1294 $(OUTDIR)/winclip.obj:  $(OUTDIR) winclip.c  $(INCL)
1295
1296 $(OUTDIR)/os_win32.obj: $(OUTDIR) os_win32.c  $(INCL) os_win32.h
1297
1298 $(OUTDIR)/os_w32exe.obj:        $(OUTDIR) os_w32exe.c  $(INCL)
1299
1300 $(OUTDIR)/pathdef.obj:  $(OUTDIR) $(PATHDEF_SRC) $(INCL)
1301         $(CC) $(CFLAGS) $(PATHDEF_SRC)
1302
1303 $(OUTDIR)/popupmnu.obj: $(OUTDIR) popupmnu.c  $(INCL)
1304
1305 $(OUTDIR)/quickfix.obj: $(OUTDIR) quickfix.c  $(INCL)
1306
1307 $(OUTDIR)/regexp.obj:   $(OUTDIR) regexp.c regexp_nfa.c  $(INCL)
1308
1309 $(OUTDIR)/screen.obj:   $(OUTDIR) screen.c  $(INCL)
1310
1311 $(OUTDIR)/search.obj:   $(OUTDIR) search.c  $(INCL)
1312
1313 $(OUTDIR)/sha256.obj:   $(OUTDIR) sha256.c  $(INCL)
1314
1315 $(OUTDIR)/spell.obj:    $(OUTDIR) spell.c  $(INCL)
1316
1317 $(OUTDIR)/spellfile.obj:        $(OUTDIR) spellfile.c  $(INCL)
1318
1319 $(OUTDIR)/syntax.obj:   $(OUTDIR) syntax.c  $(INCL)
1320
1321 $(OUTDIR)/tag.obj:      $(OUTDIR) tag.c  $(INCL)
1322
1323 $(OUTDIR)/term.obj:     $(OUTDIR) term.c  $(INCL)
1324
1325 $(OUTDIR)/ui.obj:       $(OUTDIR) ui.c  $(INCL)
1326
1327 $(OUTDIR)/undo.obj:     $(OUTDIR) undo.c  $(INCL)
1328
1329 $(OUTDIR)/userfunc.obj: $(OUTDIR) userfunc.c  $(INCL)
1330
1331 $(OUTDIR)/window.obj:   $(OUTDIR) window.c  $(INCL)
1332
1333 $(OUTDIR)/xpm_w32.obj: $(OUTDIR) xpm_w32.c
1334         $(CC) $(CFLAGS) $(XPM_INC) xpm_w32.c
1335
1336 $(OUTDIR)/vim.res:      $(OUTDIR) vim.rc gvim.exe.mnf version.h tools.bmp \
1337                                 tearoff.bmp vim.ico vim_error.ico \
1338                                 vim_alert.ico vim_info.ico vim_quest.ico
1339         $(RC) /nologo /l 0x409 /Fo$(OUTDIR)/vim.res $(RCFLAGS) vim.rc
1340
1341 iid_ole.c if_ole.h vim.tlb: if_ole.idl
1342         midl /nologo /error none /proxy nul /iid iid_ole.c /tlb vim.tlb \
1343                 /header if_ole.h if_ole.idl
1344
1345 dimm.h dimm_i.c: dimm.idl
1346         midl /nologo /error none /proxy nul dimm.idl
1347
1348 $(OUTDIR)/dimm_i.obj: $(OUTDIR) dimm_i.c $(INCL)
1349
1350 $(OUTDIR)/glbl_ime.obj: $(OUTDIR) glbl_ime.cpp  dimm.h $(INCL)
1351
1352 # $CFLAGS may contain backslashes and double quotes, escape them both.
1353 E0_CFLAGS = $(CFLAGS:\=\\)
1354 E_CFLAGS = $(E0_CFLAGS:"=\")
1355 # ") stop the string
1356 # $LINKARGS2 may contain backslashes and double quotes, escape them both.
1357 E0_LINKARGS2 = $(LINKARGS2:\=\\)
1358 E_LINKARGS2 = $(E0_LINKARGS2:"=\")
1359 # ") stop the string
1360
1361 $(PATHDEF_SRC): auto
1362         @echo creating $(PATHDEF_SRC)
1363         @echo /* pathdef.c */ > $(PATHDEF_SRC)
1364         @echo #include "vim.h" >> $(PATHDEF_SRC)
1365         @echo char_u *default_vim_dir = (char_u *)"$(VIMRCLOC:\=\\)"; >> $(PATHDEF_SRC)
1366         @echo char_u *default_vimruntime_dir = (char_u *)"$(VIMRUNTIMEDIR:\=\\)"; >> $(PATHDEF_SRC)
1367         @echo char_u *all_cflags = (char_u *)"$(CC:\=\\) $(E_CFLAGS)"; >> $(PATHDEF_SRC)
1368         @echo char_u *all_lflags = (char_u *)"$(link:\=\\) $(LINKARGS1:\=\\) $(E_LINKARGS2)"; >> $(PATHDEF_SRC)
1369         @echo char_u *compiled_user = (char_u *)"$(USERNAME)"; >> $(PATHDEF_SRC)
1370         @echo char_u *compiled_sys = (char_u *)"$(USERDOMAIN)"; >> $(PATHDEF_SRC)
1371
1372 auto:
1373         if not exist auto/nul mkdir auto
1374
1375 # End Custom Build
1376 proto.h: \
1377         proto/arabic.pro \
1378         proto/blowfish.pro \
1379         proto/buffer.pro \
1380         proto/charset.pro \
1381         proto/crypt.pro \
1382         proto/crypt_zip.pro \
1383         proto/dict.pro \
1384         proto/diff.pro \
1385         proto/digraph.pro \
1386         proto/edit.pro \
1387         proto/eval.pro \
1388         proto/evalfunc.pro \
1389         proto/ex_cmds.pro \
1390         proto/ex_cmds2.pro \
1391         proto/ex_docmd.pro \
1392         proto/ex_eval.pro \
1393         proto/ex_getln.pro \
1394         proto/farsi.pro \
1395         proto/fileio.pro \
1396         proto/getchar.pro \
1397         proto/hardcopy.pro \
1398         proto/hashtab.pro \
1399         proto/json.pro \
1400         proto/list.pro \
1401         proto/main.pro \
1402         proto/mark.pro \
1403         proto/memfile.pro \
1404         proto/memline.pro \
1405         proto/menu.pro \
1406         proto/message.pro \
1407         proto/misc1.pro \
1408         proto/misc2.pro \
1409         proto/move.pro \
1410         proto/mbyte.pro \
1411         proto/normal.pro \
1412         proto/ops.pro \
1413         proto/option.pro \
1414         proto/os_mswin.pro \
1415         proto/winclip.pro \
1416         proto/os_win32.pro \
1417         proto/popupmnu.pro \
1418         proto/quickfix.pro \
1419         proto/regexp.pro \
1420         proto/screen.pro \
1421         proto/search.pro \
1422         proto/sha256.pro \
1423         proto/spell.pro \
1424         proto/spellfile.pro \
1425         proto/syntax.pro \
1426         proto/tag.pro \
1427         proto/term.pro \
1428         proto/ui.pro \
1429         proto/undo.pro \
1430         proto/userfunc.pro \
1431         proto/window.pro \
1432         $(NETBEANS_PRO) \
1433         $(CHANNEL_PRO)
1434
1435 .SUFFIXES: .cod .i
1436
1437 # Generate foo.cod (mixed source and assembly listing) from foo.c via "nmake
1438 # foo.cod"
1439 .c.cod:
1440         $(CC) $(CFLAGS) /FAcs $<
1441
1442 # Generate foo.i (preprocessor listing) from foo.c via "nmake foo.i"
1443 .c.i:
1444         $(CC) $(CFLAGS) /P /C $<
1445
1446
1447 # vim: set noet sw=8 ts=8 sts=0 wm=0 tw=0: