blob: a2940eb1e911fbf7f48766dcd6d0c2b325423541 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001# NSIS file to create a self-installing exe for Vim.
2# It requires NSIS version 2.0 or later.
Bram Moolenaar8b682772010-07-30 21:49:40 +02003# Last Change: 2010 Jul 30
Bram Moolenaar071d4272004-06-13 20:20:40 +00004
5# WARNING: if you make changes to this script, look out for $0 to be valid,
6# because uninstall deletes most files in $0.
7
8# Location of gvim_ole.exe, vimd32.exe, GvimExt/*, etc.
9!define VIMSRC "..\src"
10
11# Location of runtime files
12!define VIMRT ".."
13
14# Location of extra tools: diff.exe
15!define VIMTOOLS ..\..
16
17# Comment the next line if you don't have UPX.
18# Get it at http://upx.sourceforge.net
19!define HAVE_UPX
20
21# comment the next line if you do not want to add Native Language Support
22!define HAVE_NLS
23
24!define VER_MAJOR 7
Bram Moolenaar7f036442010-08-15 15:24:20 +020025!define VER_MINOR 3
Bram Moolenaar071d4272004-06-13 20:20:40 +000026
27# ----------- No configurable settings below this line -----------
28
29!include UpgradeDLL.nsh # for VisVim.dll
Bram Moolenaar442b4222010-05-24 21:34:22 +020030!include LogicLib.nsh
31!include x64.nsh
Bram Moolenaar071d4272004-06-13 20:20:40 +000032
33Name "Vim ${VER_MAJOR}.${VER_MINOR}"
34OutFile gvim${VER_MAJOR}${VER_MINOR}.exe
35CRCCheck force
36SetCompressor lzma
37SetDatablockOptimize on
Bram Moolenaar442b4222010-05-24 21:34:22 +020038RequestExecutionLevel highest
Bram Moolenaar071d4272004-06-13 20:20:40 +000039
40ComponentText "This will install Vim ${VER_MAJOR}.${VER_MINOR} on your computer."
41DirText "Choose a directory to install Vim (must end in 'vim')"
42Icon icons\vim_16c.ico
43# NSIS2 uses a different strategy with six diferent images in a strip...
44#EnabledBitmap icons\enabled.bmp
45#DisabledBitmap icons\disabled.bmp
46UninstallText "This will uninstall Vim ${VER_MAJOR}.${VER_MINOR} from your system."
47UninstallIcon icons\vim_uninst_16c.ico
48
49# On NSIS 2 using the BGGradient causes trouble on Windows 98, in combination
50# with the BringToFront.
51# BGGradient 004000 008200 FFFFFF
52LicenseText "You should read the following before installing:"
53LicenseData ${VIMRT}\doc\uganda.nsis.txt
54
55!ifdef HAVE_UPX
56 !packhdr temp.dat "upx --best --compress-icons=1 temp.dat"
57!endif
58
59# This adds '\vim' to the user choice automagically. The actual value is
60# obtained below with ReadINIStr.
61InstallDir "$PROGRAMFILES\Vim"
62
63# Types of installs we can perform:
64InstType Typical
65InstType Minimal
66InstType Full
67
68SilentInstall normal
69
70# These are the pages we use
71Page license
72Page components
73Page directory "" "" CheckInstallDir
74Page instfiles
75UninstPage uninstConfirm
76UninstPage instfiles
77
78##########################################################
79# Functions
80
81Function .onInit
82 MessageBox MB_YESNO|MB_ICONQUESTION \
83 "This will install Vim ${VER_MAJOR}.${VER_MINOR} on your computer.$\n Continue?" \
84 IDYES NoAbort
85 Abort ; causes installer to quit.
86 NoAbort:
87
88 # run the install program to check for already installed versions
89 SetOutPath $TEMP
90 File /oname=install.exe ${VIMSRC}\installw32.exe
91 ExecWait "$TEMP\install.exe -uninstall-check"
92 Delete $TEMP\install.exe
93
94 # We may have been put to the background when uninstall did something.
95 BringToFront
96
97 # Install will have created a file for us that contains the directory where
98 # we should install. This is $VIM if it's set. This appears to be the only
99 # way to get the value of $VIM here!?
100 ReadINIStr $INSTDIR $TEMP\vimini.ini vimini dir
101 Delete $TEMP\vimini.ini
102
103 # If ReadINIStr failed or did not find a path: use the default dir.
104 StrCmp $INSTDIR "" 0 IniOK
105 StrCpy $INSTDIR "$PROGRAMFILES\Vim"
106 IniOK:
107
108 # Should check for the value of $VIM and use it. Unfortunately I don't know
109 # how to obtain the value of $VIM
110 # IfFileExists "$VIM" 0 No_Vim
111 # StrCpy $INSTDIR "$VIM"
112 # No_Vim:
113
114 # User variables:
115 # $0 - holds the directory the executables are installed to
116 # $1 - holds the parameters to be passed to install.exe. Starts with OLE
117 # registration (since a non-OLE gvim will not complain, and we want to
118 # always register an OLE gvim).
119 # $2 - holds the names to create batch files for
120 StrCpy $0 "$INSTDIR\vim${VER_MAJOR}${VER_MINOR}"
121 StrCpy $1 "-register-OLE"
Bram Moolenaar7fcab2a2006-03-25 21:46:12 +0000122 StrCpy $2 "gvim evim gview gvimdiff vimtutor"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000123
124FunctionEnd
125
126Function .onUserAbort
127 MessageBox MB_YESNO|MB_ICONQUESTION "Abort install?" IDYES NoCancelAbort
128 Abort ; causes installer to not quit.
129 NoCancelAbort:
130FunctionEnd
131
132# We only accept the directory if it ends in "vim". Using .onVerifyInstDir has
133# the disadvantage that the browse dialog is difficult to use.
134Function CheckInstallDir
135 StrCpy $0 $INSTDIR 3 -3
136 StrCmp $0 "vim" PathGood
137 MessageBox MB_OK "The path must end in 'vim'."
138 Abort
139 PathGood:
140FunctionEnd
141
142Function .onInstSuccess
143 WriteUninstaller vim${VER_MAJOR}${VER_MINOR}\uninstall-gui.exe
144 MessageBox MB_YESNO|MB_ICONQUESTION \
Bram Moolenaarf2330482008-06-24 20:19:36 +0000145 "The installation process has been successful. Happy Vimming! \
Bram Moolenaar071d4272004-06-13 20:20:40 +0000146 $\n$\n Do you want to see the README file now?" IDNO NoReadme
147 Exec '$0\gvim.exe -R "$0\README.txt"'
148 NoReadme:
149FunctionEnd
150
151Function .onInstFailed
152 MessageBox MB_OK|MB_ICONEXCLAMATION "Installation failed. Better luck next time."
153FunctionEnd
154
155Function un.onUnInstSuccess
156 MessageBox MB_OK|MB_ICONINFORMATION \
157 "Vim ${VER_MAJOR}.${VER_MINOR} has been (partly) removed from your system"
158FunctionEnd
159
160Function un.GetParent
161 Exch $0 ; old $0 is on top of stack
162 Push $1
163 Push $2
164 StrCpy $1 -1
165 loop:
166 StrCpy $2 $0 1 $1
167 StrCmp $2 "" exit
168 StrCmp $2 "\" exit
169 IntOp $1 $1 - 1
170 Goto loop
171 exit:
172 StrCpy $0 $0 $1
173 Pop $2
174 Pop $1
175 Exch $0 ; put $0 on top of stack, restore $0 to original value
176FunctionEnd
177
178##########################################################
179Section "Vim executables and runtime files"
180 SectionIn 1 2 3
181
182 # we need also this here if the user changes the instdir
183 StrCpy $0 "$INSTDIR\vim${VER_MAJOR}${VER_MINOR}"
184
185 SetOutPath $0
186 File /oname=gvim.exe ${VIMSRC}\gvim_ole.exe
187 File /oname=install.exe ${VIMSRC}\installw32.exe
188 File /oname=uninstal.exe ${VIMSRC}\uninstalw32.exe
189 File ${VIMSRC}\vimrun.exe
190 File /oname=xxd.exe ${VIMSRC}\xxdw32.exe
191 File ${VIMTOOLS}\diff.exe
192 File ${VIMRT}\vimtutor.bat
193 File ${VIMRT}\README.txt
194 File ..\uninstal.txt
195 File ${VIMRT}\*.vim
196 File ${VIMRT}\rgb.txt
197
198 SetOutPath $0\colors
199 File ${VIMRT}\colors\*.*
200
201 SetOutPath $0\compiler
202 File ${VIMRT}\compiler\*.*
203
204 SetOutPath $0\doc
205 File ${VIMRT}\doc\*.txt
206 File ${VIMRT}\doc\tags
207
208 SetOutPath $0\ftplugin
209 File ${VIMRT}\ftplugin\*.*
210
211 SetOutPath $0\indent
212 File ${VIMRT}\indent\*.*
213
214 SetOutPath $0\macros
215 File ${VIMRT}\macros\*.*
216
217 SetOutPath $0\plugin
218 File ${VIMRT}\plugin\*.*
219
Bram Moolenaar7fcab2a2006-03-25 21:46:12 +0000220 SetOutPath $0\autoload
221 File ${VIMRT}\autoload\*.*
222
Bram Moolenaar18144c82006-04-12 21:52:12 +0000223 SetOutPath $0\autoload\xml
224 File ${VIMRT}\autoload\xml\*.*
225
Bram Moolenaar071d4272004-06-13 20:20:40 +0000226 SetOutPath $0\syntax
227 File ${VIMRT}\syntax\*.*
228
Bram Moolenaarc01140a2006-03-24 22:21:52 +0000229 SetOutPath $0\spell
230 File ${VIMRT}\spell\*.txt
231 File ${VIMRT}\spell\*.vim
232 File ${VIMRT}\spell\*.spl
233 File ${VIMRT}\spell\*.sug
234
Bram Moolenaar071d4272004-06-13 20:20:40 +0000235 SetOutPath $0\tools
236 File ${VIMRT}\tools\*.*
237
238 SetOutPath $0\tutor
239 File ${VIMRT}\tutor\*.*
240SectionEnd
241
242##########################################################
243Section "Vim console program (vim.exe)"
244 SectionIn 1 3
245
246 SetOutPath $0
247 ReadRegStr $R0 HKLM \
248 "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
249 IfErrors 0 lbl_winnt
250 # Windows 95/98/ME
251 File /oname=vim.exe ${VIMSRC}\vimd32.exe
252 Goto lbl_done
253 lbl_winnt:
254 # Windows NT/2000/XT
255 File /oname=vim.exe ${VIMSRC}\vimw32.exe
256 lbl_done:
257 StrCpy $2 "$2 vim view vimdiff"
258SectionEnd
259
260##########################################################
261Section "Create .bat files for command line use"
262 SectionIn 3
263
264 StrCpy $1 "$1 -create-batfiles $2"
265SectionEnd
266
267##########################################################
268Section "Create icons on the Desktop"
269 SectionIn 1 3
270
271 StrCpy $1 "$1 -install-icons"
272SectionEnd
273
274##########################################################
275Section "Add Vim to the Start Menu"
276 SectionIn 1 3
277
278 StrCpy $1 "$1 -add-start-menu"
279SectionEnd
280
281##########################################################
282Section "Add an Edit-with-Vim context menu entry"
283 SectionIn 1 3
284
285 # Be aware of this sequence of events:
286 # - user uninstalls Vim, gvimext.dll can't be removed (it's in use) and
287 # is scheduled to be removed at next reboot.
288 # - user installs Vim in same directory, gvimext.dll still exists.
289 # If we now skip installing gvimext.dll, it will disappear at the next
290 # reboot. Thus when copying gvimext.dll fails always schedule it to be
291 # installed at the next reboot. Can't use UpgradeDLL!
292 # We don't ask the user to reboot, the old dll will keep on working.
293 SetOutPath $0
294 ClearErrors
295 SetOverwrite try
Bram Moolenaar442b4222010-05-24 21:34:22 +0200296 ${If} ${RunningX64}
297 File /oname=gvimext.dll ${VIMSRC}\GvimExt\gvimext64.dll
298 ${Else}
299 File /oname=gvimext.dll ${VIMSRC}\GvimExt\gvimext.dll
300 ${EndIf}
Bram Moolenaar071d4272004-06-13 20:20:40 +0000301 IfErrors 0 GvimExtDone
302
303 # Can't copy gvimext.dll, create it under another name and rename it on
304 # next reboot.
305 GetTempFileName $3 $0
Bram Moolenaar442b4222010-05-24 21:34:22 +0200306 ${If} ${RunningX64}
307 File /oname=$3 ${VIMSRC}\GvimExt\gvimext64.dll
308 ${Else}
309 File /oname=$3 ${VIMSRC}\GvimExt\gvimext.dll
310 ${EndIf}
Bram Moolenaar071d4272004-06-13 20:20:40 +0000311 Rename /REBOOTOK $3 $0\gvimext.dll
312
313 GvimExtDone:
314 SetOverwrite lastused
315
316 # We don't have a separate entry for the "Open With..." menu, assume
317 # the user wants either both or none.
318 StrCpy $1 "$1 -install-popup -install-openwith"
319SectionEnd
320
321##########################################################
322Section "Create a _vimrc if it doesn't exist"
323 SectionIn 1 3
324
325 StrCpy $1 "$1 -create-vimrc"
326SectionEnd
327
328##########################################################
329Section "Create plugin directories in HOME or VIM"
330 SectionIn 1 3
331
332 StrCpy $1 "$1 -create-directories home"
333SectionEnd
334
335##########################################################
336Section "Create plugin directories in VIM"
337 SectionIn 3
338
339 StrCpy $1 "$1 -create-directories vim"
340SectionEnd
341
342##########################################################
343Section "VisVim Extension for MS Visual Studio"
344 SectionIn 3
345
346 SetOutPath $0
347 !insertmacro UpgradeDLL "${VIMSRC}\VisVim\VisVim.dll" "$0\VisVim.dll" "$0"
348 File ${VIMSRC}\VisVim\README_VisVim.txt
349SectionEnd
350
351##########################################################
352!ifdef HAVE_NLS
353 Section "Native Language Support"
354 SectionIn 1 3
355
356 SetOutPath $0\lang
357 File /r ${VIMRT}\lang\*.*
358 SetOutPath $0\keymap
359 File ${VIMRT}\keymap\README.txt
360 File ${VIMRT}\keymap\*.vim
361 SetOutPath $0
362 File ${VIMRT}\libintl.dll
363 SectionEnd
364!endif
365
366##########################################################
367Section -call_install_exe
368 SetOutPath $0
369 ExecWait "$0\install.exe $1"
370SectionEnd
371
372##########################################################
373Section -post
374 BringToFront
375SectionEnd
376
377##########################################################
378Section Uninstall
379 # Apparently $INSTDIR is set to the directory where the uninstaller is
380 # created. Thus the "vim61" directory is included in it.
381 StrCpy $0 "$INSTDIR"
382
383 # If VisVim was installed, unregister the DLL.
384 IfFileExists "$0\VisVim.dll" Has_VisVim No_VisVim
385 Has_VisVim:
386 ExecWait "regsvr32.exe /u /s $0\VisVim.dll"
387
388 No_VisVim:
389
390 # delete the context menu entry and batch files
391 ExecWait "$0\uninstal.exe -nsis"
392
393 # We may have been put to the background when uninstall did something.
394 BringToFront
395
396 # ask the user if the Vim version dir must be removed
397 MessageBox MB_YESNO|MB_ICONQUESTION \
398 "Would you like to delete $0?$\n \
399 $\nIt contains the Vim executables and runtime files." IDNO NoRemoveExes
400
401 Delete /REBOOTOK $0\*.dll
402 ClearErrors
403 # Remove everything but *.dll files. Avoids that
404 # a lot remains when gvimext.dll cannot be deleted.
Bram Moolenaar408b5852006-05-13 10:44:07 +0000405 RMDir /r $0\autoload
Bram Moolenaar071d4272004-06-13 20:20:40 +0000406 RMDir /r $0\colors
407 RMDir /r $0\compiler
408 RMDir /r $0\doc
409 RMDir /r $0\ftplugin
410 RMDir /r $0\indent
411 RMDir /r $0\macros
412 RMDir /r $0\plugin
Bram Moolenaar408b5852006-05-13 10:44:07 +0000413 RMDir /r $0\spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000414 RMDir /r $0\syntax
415 RMDir /r $0\tools
416 RMDir /r $0\tutor
417 RMDir /r $0\VisVim
418 RMDir /r $0\lang
419 RMDir /r $0\keymap
420 Delete $0\*.exe
421 Delete $0\*.bat
422 Delete $0\*.vim
423 Delete $0\*.txt
424
425 IfErrors ErrorMess NoErrorMess
426 ErrorMess:
427 MessageBox MB_OK|MB_ICONEXCLAMATION \
428 "Some files in $0 have not been deleted!$\nYou must do it manually."
429 NoErrorMess:
430
431 # No error message if the "vim62" directory can't be removed, the
432 # gvimext.dll may still be there.
433 RMDir $0
434
435 NoRemoveExes:
436 # get the parent dir of the installation
437 Push $INSTDIR
438 Call un.GetParent
439 Pop $0
440 StrCpy $1 $0
441
442 # if a plugin dir was created at installation ask the user to remove it
443 # first look in the root of the installation then in HOME
444 IfFileExists $1\vimfiles AskRemove 0
445 ReadEnvStr $1 "HOME"
446 StrCmp $1 "" NoRemove 0
447
448 IfFileExists $1\vimfiles 0 NoRemove
449
450 AskRemove:
451 MessageBox MB_YESNO|MB_ICONQUESTION \
Bram Moolenaare04abda2010-08-01 22:35:43 +0200452 "Remove all files in your $1\vimfiles directory?$\n \
Bram Moolenaar760d14a2010-07-31 22:03:44 +0200453 $\nCAREFUL: If you have created something there that you want to keep, click No" IDNO Fin
Bram Moolenaar071d4272004-06-13 20:20:40 +0000454 RMDir /r $1\vimfiles
455 NoRemove:
456
457 # ask the user if the Vim root dir must be removed
458 MessageBox MB_YESNO|MB_ICONQUESTION \
459 "Would you like to remove $0?$\n \
460 $\nIt contains your Vim configuration files!" IDNO NoDelete
461 RMDir /r $0 ; skipped if no
462 NoDelete:
463
464 Fin:
465 Call un.onUnInstSuccess
466
467SectionEnd