aboutsummaryrefslogtreecommitdiffhomepage
path: root/janet-installer.nsi
blob: f3a1a84211d7e102546e205e017895bed6ed4578 (plain) (blame)
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
# This file is invoked by build_win.bat
# Relevant configuration variables are set there.

SetCompressor /FINAL /SOLID lzma
Unicode True

!echo "Program Files: ${PROGRAMFILES}"
!addplugindir "tools\"

# Version
!define PRODUCT_VERSION "${VERSION}.0"
VIProductVersion "${PRODUCT_VERSION}"
VIFileVersion "${PRODUCT_VERSION}"

# Use the modern UI
!define MULTIUSER_EXECUTIONLEVEL Highest
!define MULTIUSER_MUI
!define MULTIUSER_INSTALLMODE_COMMANDLINE
!define MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY "Software\Janet\${VERSION}"
!define MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME ""
!define MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY "Software\Janet\${VERSION}"
!define MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME ""
!define MULTIUSER_INSTALLMODE_INSTDIR "Janet-${VERSION}"

!if ${SIXTYFOUR} == "true"
    !define MULTIUSER_USE_PROGRAMFILES64
    !define PLATNAME "x64"
!else
    !define PLATNAME "x86"
!endif

# Includes
!include "MultiUser.nsh"
!include "MUI2.nsh"
!include "LogicLib.nsh"

# Basics
Name "Janet"

# Do some NSIS-fu to figure out at compile time if we are in appveyor
!define OUTNAME $%APPVEYOR_REPO_TAG_NAME%
!define "CHECK_${OUTNAME}"
!define DOLLAR "$"
!ifdef CHECK_${DOLLAR}%APPVEYOR_REPO_TAG_NAME%
    # We are not in the appveyor environment, use version name
    !define OUTNAME_PART ${VERSION}
!else
    # We are in appveyor, use git tag name for installer
    !define OUTNAME_PART ${OUTNAME}
!endif
OutFile "janet-${OUTNAME_PART}-windows-${PLATNAME}-installer.exe"

# Some Configuration
!define APPNAME "Janet"
!define DESCRIPTION "The Janet Programming Language"
!define HELPURL "http://janet-lang.org"
BrandingText "The Janet Programming Language"

# Macros for setting registry values
!define UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\Janet-${VERSION}"
!macro WriteEnv key value
    ${If} $MultiUser.InstallMode == "AllUsers"
        WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "${key}" "${value}"
    ${Else}
        WriteRegExpandStr HKCU "Environment" "${key}" "${value}"
    ${EndIf}
!macroend
!macro DelEnv key
    ${If} $MultiUser.InstallMode == "AllUsers"
        DeleteRegValue HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "${key}"
    ${Else}
        DeleteRegValue HKCU "Environment" "${key}"
    ${EndIf}
!macroend

# MUI Configuration
!define MUI_ICON "assets\icon.ico"
!define MUI_UNICON "assets\icon.ico"
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "assets\janet-w200.png"
!define MUI_HEADERIMAGE_RIGHT
!define MUI_ABORTWARNING

# Show a welcome page first
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "LICENSE"

# Pick Install Directory
!insertmacro MULTIUSER_PAGE_INSTALLMODE
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES

# Done
!insertmacro MUI_PAGE_FINISH

# Need to set a language.
!insertmacro MUI_LANGUAGE "English"

function .onInit
    !insertmacro MULTIUSER_INIT
functionEnd

section "Janet" BfWSection

    createDirectory "$INSTDIR\Library"
    createDirectory "$INSTDIR\C"
    createDirectory "$INSTDIR\bin"
    createDirectory "$INSTDIR\docs"
    setOutPath "$INSTDIR"

    # Bin files
    file /oname=bin\janet.exe dist\janet.exe
    file /oname=logo.ico assets\icon.ico
    file /oname=bin\jpm.janet .\jpm
    file /oname=bin\jpm.bat tools\jpm.bat

    # C headers and library files
    file /oname=C\janet.h dist\janet.h
    file /oname=C\janetconf.h dist\janetconf.h
    file /oname=C\janet.lib dist\janet.lib
    file /oname=C\janet.exp dist\janet.exp
    file /oname=C\janet.c dist\janet.c
    file /oname=C\libjanet.lib dist\libjanet.lib

    # Documentation
    file /oname=docs\docs.html dist\doc.html

    # Other
    file README.md
    file LICENSE

    # Uninstaller - See function un.onInit and section "uninstall" for configuration
    writeUninstaller "$INSTDIR\uninstall.exe"

    # Start Menu
    createShortCut "$SMPROGRAMS\Janet.lnk" "$INSTDIR\bin\janet.exe" "" "$INSTDIR\logo.ico"

    # Update path
    ${If} $MultiUser.InstallMode == "AllUsers"
        EnVar::SetHKLM
    ${Else}
        EnVar::SetHKCU
    ${EndIf}
    EnVar::AddValue "PATH" "$INSTDIR\bin"
    Pop $0

    # Set up Environment variables
    !insertmacro WriteEnv JANET_PATH "$INSTDIR\Library"
    !insertmacro WriteEnv JANET_HEADERPATH "$INSTDIR\C"
    !insertmacro WriteEnv JANET_LIBPATH "$INSTDIR\C"
    !insertmacro WriteEnv JANET_BINPATH "$INSTDIR\bin"

    SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000

    # Registry information for add/remove programs
    WriteRegStr SHCTX "${UNINST_KEY}" "DisplayName" "Janet"
    WriteRegStr SHCTX "${UNINST_KEY}" "InstallLocation" "$INSTDIR"
    WriteRegStr SHCTX "${UNINST_KEY}" "DisplayIcon" "$INSTDIR\logo.ico"
    WriteRegStr SHCTX "${UNINST_KEY}" "Publisher" "Janet-Lang.org"
    WriteRegStr SHCTX "${UNINST_KEY}" "HelpLink" "${HELPURL}"
    WriteRegStr SHCTX "${UNINST_KEY}" "URLUpdateInfo" "${HELPURL}"
    WriteRegStr SHCTX "${UNINST_KEY}" "URLInfoAbout" "${HELPURL}"
    WriteRegStr SHCTX "${UNINST_KEY}" "DisplayVersion" "${VERSION}"
    WriteRegDWORD SHCTX "${UNINST_KEY}" "NoModify" 1
    WriteRegDWORD SHCTX "${UNINST_KEY}" "NoRepair" 1
    WriteRegDWORD SHCTX "${UNINST_KEY}" "EstimatedSize" 1000
    # Add uninstall
    WriteRegStr SHCTX "${UNINST_KEY}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\" /$MultiUser.InstallMode"
    WriteRegStr SHCTX "${UNINST_KEY}" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /$MultiUser.InstallMode /S"

sectionEnd

# Uninstaller

function un.onInit
    !insertmacro MULTIUSER_UNINIT
functionEnd

section "uninstall"

    # Remove Start Menu launcher
    delete "$SMPROGRAMS\Janet.lnk"

    # Remove files
    delete "$INSTDIR\logo.ico"
    delete "$INSTDIR\README.md"
    delete "$INSTDIR\LICENSE"
    rmdir /r "$INSTDIR\Library"
    rmdir /r "$INSTDIR\bin"
    rmdir /r "$INSTDIR\C"
    rmdir /r "$INSTDIR\docs"

    # Remove env vars
    !insertmacro DelEnv JANET_PATH
    !insertmacro DelEnv JANET_HEADERPATH
    !insertmacro DelEnv JANET_LIBPATH
    !insertmacro DelEnv JANET_BINPATH

    # Unset PATH
    ${If} $MultiUser.InstallMode == "AllUsers"
        EnVar::SetHKLM
    ${Else}
        EnVar::SetHKCU
    ${EndIf}
    EnVar::DeleteValue "PATH" "$INSTDIR\bin"
    Pop $0

    # make sure windows knows about the change
    SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000

    # Always delete uninstaller as the last action
    delete "$INSTDIR\uninstall.exe"

    # Remove uninstaller information from the registry
    DeleteRegKey SHCTX "${UNINST_KEY}"

sectionEnd