This builds a one-click install for Vim for MS Windows using the Nullsoft
Installation System (NSIS), available at http://nsis.sourceforge.net/

To build the installable .exe file:

Preparatory stage

1.  Clone using the git tool the Vim repository or download its zip file
    available at:
	https://github.com/vim/vim

2.  Go to the "/src" directory and build the Vim editor, making sure to use the
    following variable values: "GUI=yes"; "OLE=yes"; "VIMDLL=yes". See
    INSTALLpc.txt and Make_mvc.mak for details.

3.  Go to the GvimExt directory and build gvimext.dll (or get it from a binary
    archive).  Both 64- and 32-bit versions are needed and should be placed
    as follows:
	64-bit: src/GvimExt/gvimext64.dll
	32-bit: src/GvimExt/gvimext.dll

4.  Get a "diff.exe" program.  If you skip this the built-in diff will always
    be used (which is fine for most users).
    You can find one in previous Vim versions or in this archive:
	https://www.mediafire.com/file/9edk4g3xvfgzby0/diff4Vim.zip/file
    When will you have "diff.exe" put it in the "../.." directory (above the
    "vim91" directory, it's the same for all Vim versions).  However, you can
    specify a different directory by specifying the appropriate makefile value.
    How to do this is described below.

5.  For the terminal window to work in Vim, the library winpty is required.
    You can get it at the following url:
	https://github.com/rprichard/winpty/releases/download/0.4.3/winpty-0.4.3-msvc2015.zip
    For the 32-bit version, rename "winpty.dll" from ia32/bin to "winpty32.dll",
    and for the 64-bit version — "winpty.dll" from x64/bin to "winpty64.dll".
    Put the renamed file and "winpty-agent.exe" in "../.." (above the "vim91"
    directory).  However, you can specify a different directory by specifying
    the appropriate makefile value. How to do this is described below. 

6.  To use stronger encryption, add the Sodium library.  You can get it here:
	https://github.com/jedisct1/libsodium/releases/download/1.0.19-RELEASE/libsodium-1.0.19-msvc.zip
    Unpack the archive.  Put the "libsodium.dll" from
    path/to/libsodium/Win32/Release/v143/dynamic for the 32‐bit version or
    path/to/libsodium/X64/Release/v143/dynamic for the 64‐bit version in the
    "../.." directory (above the "vim91" directory, where "diff.exe" and
    "winpty{32|64}.dll").

7.  Get gettext and iconv DLLs from the following site:
	https://github.com/mlocati/gettext-iconv-windows/releases
    Both 64- and 32-bit versions are needed.
    Download the files gettextX.X.X.X-iconvX.XX-shared-{32,64}.zip, extract
    DLLs and place them as follows:

	<GETTEXT directory>
	    |
	    + gettext32/
	    |	libintl-8.dll
	    |	libiconv-2.dll
	    |	libgcc_s_sjlj-1.dll
	    |
	    + gettext64/
		libintl-8.dll
		libiconv-2.dll

    The default <GETTEXT directory> is "../..".  However, you can specify a
    different directory by specifying the appropriate makefile value. How to do
    this is described below. 

8.  Install NSIS if you didn't do that already.
    Download Unicode version the ShellExecAsUser plug-in for NSIS from:
	https://nsis.sourceforge.io/ShellExecAsUser_plug-in
    and put "ShellExecAsUser.dll" to path\to\NSIS\Plugins\x86-unicode

Installer assembly stage

    On MS Windows, open the Developer Command Prompt for VS and go to the
    "/nsis" directory and type the command
	    nmake.exe -lf Make_mvc.mak [variables] all

    After the installer is created and you copy it to the desired location, run
    the following command in the "/nsis" directory
	    nmake.exe -lf Make_mvc.mak clean
    
    On UNIX-like systems, go to the "/nsis" directory and type the command
	    make -f Makefile [variables] all

    After the installer is created and you copy it to the desired location, run
    the following command in the "/nsis" directory
	    make -f Makefile clean

Variables and their values available for building the installer (not mandatory):

    "VIMSRC=<dir>"	— directory where location of gvim_ole.exe, vimw32.exe,
			    GvimExt/*, etc.
    "VIMRT=<dir>"	— directory where location of runtime files.
    "VIMTOOLS=<dir>"    — directory where location of extra tools: diff.exe,
			    winpty{32|64}.dll, winpty-agent.exe, libsodium.dll.
    "GETTEXT=<dir>"     — directory where location of gettext libraries.
    "HAVE_UPX=1"	— additional compression of the installer.  UPX program
			    must be installed.
    "HAVE_NLS=0"	— do not add native language support.
    "HAVE_MULTI_LANG=0" — to create an English-only the installer.
    "WIN64=1"		— to create a 64-bit the installer.
    "ARM64=1"		— to create the installer for ARM64. The WIN64 variable
			    must be set to 1.
    "X=<scriptcmd>"	— executes scriptcmd in script.  If multiple scriptcmd
			    are specified, they are separated by a semicolon.
			    Example "X=OutFile MyVim.exe;XPMode on"
    "MKNSIS=<dir>"	— the directory where the "makensis.exe" program is
			    located.
