diff options
| author | ruki <[email protected]> | 2019-06-20 22:49:52 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2019-06-20 22:49:52 +0800 |
| commit | 4c355fb52244fe54585fa1f73234fa1b820e0ebb (patch) | |
| tree | 45269da3b8a312b9fb7d71da124d4e59fae81086 /scripts | |
| parent | d579b3548cd467f0e7b0462733b8de882abf6119 (diff) | |
| parent | 5d8c5b6d686b802c48ff52bfe72f188c92509f49 (diff) | |
Merge pull request #462 from OpportunityLiu/dev
UAC on demand for windows installer
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/get.ps1 | 323 | ||||
| -rw-r--r-- | scripts/installer.nsi | 190 |
2 files changed, 319 insertions, 194 deletions
diff --git a/scripts/get.ps1 b/scripts/get.ps1 index 21646bc7d..d3deefc56 100644 --- a/scripts/get.ps1 +++ b/scripts/get.ps1 @@ -10,185 +10,196 @@ param ( [string]$installdir = "" ) -function writeErrorTip($msg) { - Write-Host $msg -BackgroundColor Red -ForegroundColor White -} +& { -if (-not $env:CI) { - $logo = @( - ' _ ' - ' __ ___ __ __ __ _| | ______ ' - ' \ \/ / | \/ |/ _ | |/ / __ \ ' - ' > < | \__/ | /_| | < ___/ ' - ' /_/\_\_|_| |_|\__ \|_|\_\____| getter ' - ' ' - ' ') - Write-Host $([string]::Join("`n", $logo)) -BackgroundColor White -ForegroundColor DarkBlue -} + function writeErrorTip($msg) { + Write-Host $msg -BackgroundColor Red -ForegroundColor White + } -if ($IsLinux -or $IsMacOS) { - writeErrorTip 'Install on *nix is not supported, try ' - writeErrorTip '(Use curl) "bash <(curl -fsSL https://raw.githubusercontent.com/xmake-io/xmake/master/scripts/get.sh)"' - writeErrorTip 'or' - writeErrorTip '(Use wget) "bash <(wget https://raw.githubusercontent.com/xmake-io/xmake/master/scripts/get.sh -O -)"' - throw 'Unsupported platform' -} + if (-not $env:CI) { + $logo = @( + ' _ ' + ' __ ___ __ __ __ _| | ______ ' + ' \ \/ / | \/ |/ _ | |/ / __ \ ' + ' > < | \__/ | /_| | < ___/ ' + ' /_/\_\_|_| |_|\__ \|_|\_\____| getter ' + ' ' + ' ') + Write-Host $([string]::Join("`n", $logo)) -ForegroundColor Green + } -$temppath = ($env:TMP, $env:TEMP, '.' -ne $null)[0] -[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls" + if ($IsLinux -or $IsMacOS) { + writeErrorTip 'Install on *nix is not supported, try ' + writeErrorTip '(Use curl) "bash <(curl -fsSL https://raw.githubusercontent.com/xmake-io/xmake/master/scripts/get.sh)"' + writeErrorTip 'or' + writeErrorTip '(Use wget) "bash <(wget https://raw.githubusercontent.com/xmake-io/xmake/master/scripts/get.sh -O -)"' + throw 'Unsupported platform' + } -if ($null -eq $installdir -or $installdir -match '^\s*$') { - $installdir = & { - # Install to old xmake path - $oldXmake = Get-Command xmake -CommandType Application -ErrorAction SilentlyContinue - if ($oldXmake) { - return Split-Path $oldXmake.Path -Parent - } - if ($HOME) { - return Join-Path $HOME 'xmake' - } - if ($env:APPDATA) { - return Join-Path $env:APPDATA 'xmake' - } - if ($env:ProgramFiles) { - return Join-Path $env:ProgramFiles 'xmake' + $temppath = ($env:TMP, $env:TEMP, "$(Get-Location)" -ne $null)[0] + [Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls" + + if ($null -eq $installdir -or $installdir -match '^\s*$') { + $installdir = & { + # Install to old xmake path + $oldXmake = Get-Command xmake -CommandType Application -ErrorAction SilentlyContinue + if ($oldXmake) { + return Split-Path $oldXmake.Path -Parent + } + if ($HOME) { + return Join-Path $HOME 'xmake' + } + if ($env:APPDATA) { + return Join-Path $env:APPDATA 'xmake' + } + if ($env:ProgramFiles) { + return Join-Path $env:ProgramFiles 'xmake' + } + return 'C:\xmake' } - return 'C:\xmake' } -} + $installdir = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($installdir) -if ($null -eq $version -or $version -match '^\s*$') { - $v = 'master' -} else { - $v = $version.Trim() - if ($v.Contains('.')) { - $v = [version]::Parse($version) - $v = New-Object -TypeName version -ArgumentList $v.Major, $v.Minor, $v.Build + if ($null -eq $version -or $version -match '^\s*$') { + $v = 'master' + } else { + $v = $version.Trim() + if ($v.Contains('.')) { + $v = [version]::Parse($version) + $v = New-Object -TypeName version -ArgumentList $v.Major, $v.Minor, $v.Build + } } -} -function checkTempAccess { - $outfile = Join-Path $temppath "$pid.tmp" - try { - Write-Output $pid | Out-File -FilePath $outfile - Remove-Item $outfile - } catch { - writeErrorTip 'Cannot write to temp path' - writeErrorTip 'Please set environment var "TMP" to another path' - throw + function checkTempAccess { + $outfile = Join-Path $temppath "$pid.tmp" + try { + Write-Output $pid | Out-File -FilePath $outfile + Remove-Item $outfile + } catch { + writeErrorTip 'Cannot write to temp path' + writeErrorTip 'Please set environment var "TMP" to another path' + throw + } } -} -function xmakeInstall { - $outfile = Join-Path $temppath "$pid-xmake-installer.exe" - $x64arch = @('AMD64', 'IA64', 'ARM64') - $arch = if ($env:PROCESSOR_ARCHITECTURE -in $x64arch -or $env:PROCESSOR_ARCHITEW6432 -in $x64arch) { 'x64' } else { 'x86' } - $url = if ($v -is [version]) { - if ($v -gt "2.2.6") { - "https://ci.appveyor.com/api/projects/waruqi/xmake/artifacts/xmake-installer.exe?tag=v$v&pr=false&job=Image%3A+Visual+Studio+2017%3B+Platform%3A+$arch" + function xmakeInstall { + $outfile = Join-Path $temppath "$pid-xmake-installer.exe" + $x64arch = @('AMD64', 'IA64', 'ARM64') + $arch = if ($env:PROCESSOR_ARCHITECTURE -in $x64arch -or $env:PROCESSOR_ARCHITEW6432 -in $x64arch) { 'x64' } else { 'x86' } + $url = if ($v -is [version]) { + if ($v -gt "2.2.6") { + "https://ci.appveyor.com/api/projects/waruqi/xmake/artifacts/xmake-installer.exe?tag=v$v&pr=false&job=Image%3A+Visual+Studio+2017%3B+Platform%3A+$arch" + } else { + "https://github.com/xmake-io/xmake/releases/download/v$v/xmake-v$v.exe" + } } else { - "https://github.com/xmake-io/xmake/releases/download/v$v/xmake-v$v.exe" + "https://ci.appveyor.com/api/projects/waruqi/xmake/artifacts/xmake-installer.exe?branch=$v&pr=false&job=Image%3A+Visual+Studio+2017%3B+Platform%3A+$arch" + } + Write-Host "Start downloading $url .." + try { + Invoke-Webrequest $url -OutFile $outfile -UseBasicParsing + } catch { + writeErrorTip 'Download failed!' + writeErrorTip 'Check your network or... the news of S3 break' + throw + } + Write-Host 'Start installation... Hope your antivirus doesn''t trouble' + Write-Host "Install to $installdir" + try { + $adminflag = "/NOADMIN " + try { + $tempfolder = New-Item "$installdir-$PID-temp" -ItemType Directory + Remove-Item $tempfolder.FullName + } catch { + $adminflag = "" + } + Start-Process -FilePath $outfile -ArgumentList "$adminflag/S /D=$installdir" -Wait + } catch { + writeErrorTip 'Install failed!' + writeErrorTip 'Close your antivirus then try again' + throw + } finally { + Remove-Item $outfile -ErrorAction SilentlyContinue + } + Write-Host 'Adding to PATH... almost done' + $env:Path += ";$installdir" + try { + xmake --version + } catch { + writeErrorTip 'Everything is showing installation has finished' + writeErrorTip 'But xmake could not run... Why?' + throw } - } else { - "https://ci.appveyor.com/api/projects/waruqi/xmake/artifacts/xmake-installer.exe?branch=$v&pr=false&job=Image%3A+Visual+Studio+2017%3B+Platform%3A+$arch" - } - Write-Host "Start downloading $url .." - try { - Invoke-Webrequest $url -OutFile $outfile -UseBasicParsing - } catch { - writeErrorTip 'Download failed!' - writeErrorTip 'Check your network or... the news of S3 break' - throw - } - Write-Host 'Start installation... Hope your antivirus doesn''t trouble' - Write-Host "Install to $installdir" - try { - Start-Process -FilePath $outfile -ArgumentList "/S /D=$installdir" -Wait - } catch { - writeErrorTip 'Install failed!' - writeErrorTip 'Close your antivirus then try again' - throw - } finally { - Remove-Item $outfile -ErrorAction SilentlyContinue - } - Write-Host 'Adding to PATH... almost done' - $env:Path += ";$installdir" - try { - xmake --version - } catch { - writeErrorTip 'Everything is showing installation has finished' - writeErrorTip 'But xmake could not run... Why?' - throw } -} -function registerTabCompletion { + function registerTabCompletion { - function writeDataToFile($file) { - $encoding = [text.encoding]::UTF8 - if (Test-Path $file -PathType Leaf) { - #Create a stream reader to get the file's encoding and contents. - $sr = New-Object System.IO.StreamReader($file, $true) - [char[]] $buffer = new-object char[] 3 - $sr.Read($buffer, 0, 3) | Out-Null - $encoding = $sr.CurrentEncoding - $sr.Close() | Out-Null + function writeDataToFile($file) { + $encoding = [text.encoding]::UTF8 + if (Test-Path $file -PathType Leaf) { + #Create a stream reader to get the file's encoding and contents. + $sr = New-Object System.IO.StreamReader($file, $true) + [char[]] $buffer = new-object char[] 3 + $sr.Read($buffer, 0, 3) | Out-Null + $encoding = $sr.CurrentEncoding + $sr.Close() | Out-Null - if ($(Get-Content $file) -imatch "Register-ArgumentCompleter -Native -CommandName xmake -ScriptBlock") { - Write-Host "Seems the tab completion of xmake has installed here... skipped" - return + if ($(Get-Content $file) -imatch "Register-ArgumentCompleter -Native -CommandName xmake -ScriptBlock") { + Write-Host "Seems the tab completion of xmake has installed here... skipped" + return + } } - } - try { - New-Item $(Split-Path $file -Parent) -ItemType Directory -Force | Out-Null + try { + New-Item $(Split-Path $file -Parent) -ItemType Directory -Force | Out-Null + [IO.File]::AppendAllText($file, "`n", $encoding) + } catch { + writeErrorTip "Failed to append to profile!" + writeErrorTip "Please try again as administrator" + return + } + try { + $content = (Invoke-Webrequest 'https://raw.githubusercontent.com/xmake-io/xmake/master/scripts/register-completions.ps1' -UseBasicParsing).Content + } catch { + writeErrorTip 'Download failed!' + writeErrorTip 'Check your network or... the news of S3 break' + return + } + [IO.File]::AppendAllText($file, $content, $encoding) [IO.File]::AppendAllText($file, "`n", $encoding) - } catch { - writeErrorTip "Failed to append to profile!" - writeErrorTip "Please try again as administrator" - return + . $file + Write-Host "Tab completion installed" } - try { - $content = (Invoke-Webrequest 'https://raw.githubusercontent.com/xmake-io/xmake/master/scripts/register-completions.ps1' -UseBasicParsing).Content - } catch { - writeErrorTip 'Download failed!' - writeErrorTip 'Check your network or... the news of S3 break' - return + $message = 'Tab completion service' + $question = 'Would you like to install tab completion service of xmake to your profile?' + + $choices = @( + (New-Object Management.Automation.Host.ChoiceDescription -ArgumentList @( + 'For &all users', + "Install for all users, writes to $($PROFILE.AllUsersAllHosts), admin privilege is needed.")), + (New-Object Management.Automation.Host.ChoiceDescription -ArgumentList @( + 'Just for &me', + "Install for current user, writes to $($PROFILE.CurrentUserAllHosts).")), + (New-Object Management.Automation.Host.ChoiceDescription -ArgumentList @( + 'Just for this &host', + "Install for current user current host, writes to $($PROFILE.CurrentUserCurrentHost).")), + (New-Object Management.Automation.Host.ChoiceDescription -ArgumentList @( + '&No', + "Do not install xmake's tab completion service.")) + ) + switch ($Host.UI.PromptForChoice($message, $question, $choices, 1)) { + 0 { writeDataToFile($PROFILE.AllUsersAllHosts) } + 1 { writeDataToFile($PROFILE.CurrentUserAllHosts) } + 2 { writeDataToFile($PROFILE.CurrentUserCurrentHost) } } - [IO.File]::AppendAllText($file, $content, $encoding) - [IO.File]::AppendAllText($file, "`n", $encoding) - . $file - Write-Host "Tab completion installed" } - $message = 'Tab completion service' - $question = 'Would you like to install tab completion service of xmake to your profile?' - $choices = @( - (New-Object Management.Automation.Host.ChoiceDescription -ArgumentList @( - 'For &all users', - "Install for all users, writes to $($PROFILE.AllUsersAllHosts), admin privilege is needed.")), - (New-Object Management.Automation.Host.ChoiceDescription -ArgumentList @( - 'Just for &me', - "Install for current user, writes to $($PROFILE.CurrentUserAllHosts).")), - (New-Object Management.Automation.Host.ChoiceDescription -ArgumentList @( - 'Just for this &host', - "Install for current user current host, writes to $($PROFILE.CurrentUserCurrentHost).")), - (New-Object Management.Automation.Host.ChoiceDescription -ArgumentList @( - '&No', - "Do not install xmake's tab completion service.")) - ) - switch ($Host.UI.PromptForChoice($message, $question, $choices, 1)) { - 0 { writeDataToFile($PROFILE.AllUsersAllHosts) } - 1 { writeDataToFile($PROFILE.CurrentUserAllHosts) } - 2 { writeDataToFile($PROFILE.CurrentUserCurrentHost) } - } -} + checkTempAccess + xmakeInstall -checkTempAccess -xmakeInstall + if (-not $env:CI) { + registerTabCompletion + } else { + Write-Host "Tab completion registration has been skipped for CI" + } -if (-not $env:CI) { - registerTabCompletion -} else { - Write-Host "Tab completion registration has been skipped for CI" } - diff --git a/scripts/installer.nsi b/scripts/installer.nsi index 9abeacf17..795ca6d32 100644 --- a/scripts/installer.nsi +++ b/scripts/installer.nsi @@ -10,6 +10,8 @@ !include "MUI2.nsh"
!include "WordFunc.nsh"
!include "WinMessages.nsh"
+!include FileFunc.nsh
+!include UAC.nsh
; xmake version Information
!ifndef MAJOR
@@ -44,13 +46,17 @@ OutFile "xmake.exe" ; The default installation directory
!ifdef x64
- InstallDir $PROGRAMFILES64\XMake
+ InstallDir $PROGRAMFILES64\xmake
+ !define HKLM HKLM64
+ !define HKCU HKCU64
!else
- InstallDir $PROGRAMFILES\XMake
+ InstallDir $PROGRAMFILES\xmake
+ !define HKLM HKLM
+ !define HKCU HKCU
!endif
; Request application privileges for Windows Vista
-RequestExecutionLevel admin
+RequestExecutionLevel user
; Set DPI Aware
ManifestDPIAware true
@@ -63,26 +69,55 @@ ManifestDPIAware true ;--------------------------------
; Icon
!define MUI_ICON "..\core\src\demo\xmake.ico"
+
+;--------------------------------
+; UAC helper
+
+!macro Init thing
+ uac_tryagain:
+ !insertmacro UAC_RunElevated
+ ${Switch} $0
+ ${Case} 0
+ ${IfThen} $1 = 1 ${|} Quit ${|} ;we are the outer process, the inner process has done its work, we are done
+ ${IfThen} $3 <> 0 ${|} ${Break} ${|} ;we are admin, let the show go on
+ ${If} $1 = 3 ;RunAs completed successfully, but with a non-admin user
+ MessageBox mb_YesNo|mb_IconExclamation|mb_TopMost|mb_SetForeground "This ${thing} requires admin privileges, try again" /SD IDNO IDYES uac_tryagain IDNO 0
+ ${EndIf}
+ ;fall-through and die
+ ${Case} 1223
+ MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "This ${thing} requires admin privileges, aborting!"
+ Quit
+ ${Case} 1062
+ MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "Logon service not running, aborting!"
+ Quit
+ ${Default}
+ MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "Unable to elevate, error $0"
+ Quit
+ ${EndSwitch}
+
+ SetShellVarContext all
+!macroend
;--------------------------------
-; Pages
+; Install Pages
+!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "..\LICENSE.md"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
-
-!insertmacro MUI_UNPAGE_CONFIRM
-!insertmacro MUI_UNPAGE_INSTFILES
-
-;--------------------------------
-; Finish Pages
-
!define MUI_FINISHPAGE_LINK "Donate $$5"
!define MUI_FINISHPAGE_LINK_LOCATION "https://xmake.io/pages/donation.html#donate"
!insertmacro MUI_PAGE_FINISH
;--------------------------------
+; Uninstall Pages
+
+!insertmacro MUI_UNPAGE_CONFIRM
+!insertmacro MUI_UNPAGE_INSTFILES
+!insertmacro MUI_UNPAGE_FINISH
+
+;--------------------------------
; Languages
!insertmacro MUI_LANGUAGE "English"
@@ -102,10 +137,29 @@ VIAddVersionKey /LANG=0 OriginalFilename "xmake-${ARCH}.exe" VIAddVersionKey /LANG=0 FileVersion ${VERSION_FULL}
VIAddVersionKey /LANG=0 ProductVersion ${VERSION_FULL}
+
+;--------------------------------
+; Reg pathes
+
+!define RegUninstall "Software\Microsoft\Windows\CurrentVersion\Uninstall\XMake"
+!define RegProduct "Software\XMake"
+
;--------------------------------
+Var NOADMIN
+
; Installer
-Section "xmake (required)" Installer
+Function .onInit
+ ${GetOptions} $CMDLINE "/NOADMIN" $NOADMIN
+ ${If} ${Errors}
+ !insertmacro Init "installer"
+ StrCpy $NOADMIN "false"
+ ${Else}
+ StrCpy $NOADMIN "true"
+ ${EndIf}
+FunctionEnd
+
+Section "XMake (required)" InstallExeutable
SectionIn RO
@@ -120,54 +174,114 @@ Section "xmake (required)" Installer File "..\*.md"
File "..\core\build\xmake.exe"
File /r /x ".DS_Store" "..\winenv"
-
- ; Write the installation path into the registry
- WriteRegStr HKLM SOFTWARE\NSIS_xmake "Install_Dir" "$INSTDIR"
-
- ; Write the uninstall keys for Windows
- WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\xmake" "DisplayName" "NSIS xmake"
- WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\xmake" "UninstallString" '"$INSTDIR\uninstall.exe"'
- WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\xmake" "NoModify" 1
- WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\xmake" "NoRepair" 1
+
WriteUninstaller "uninstall.exe"
- ; Remove the installation path from the $PATH environment variable first
- ReadRegStr $R0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path"
- ${WordReplace} $R0 ";$INSTDIR" "" "+" $R1
+ !macro AddReg RootKey
+ ; Write the installation path into the registry
+ WriteRegStr ${RootKey} ${RegProduct} "Install_Dir" "$INSTDIR"
+ ; Write uac info
+ WriteRegStr ${RootKey} ${RegProduct} "NoAdmin" "$NOADMIN"
+
+ ; Write the uninstall keys for Windows
+ WriteRegStr ${RootKey} ${RegUninstall} "DisplayName" "XMake build utility"
+ WriteRegStr ${RootKey} ${RegUninstall} "DisplayIcon" '"$INSTDIR\xmake.exe"'
+ WriteRegStr ${RootKey} ${RegUninstall} "Comments" "A cross-platform build utility based on Lua"
+ WriteRegStr ${RootKey} ${RegUninstall} "Publisher" "The TBOOX Open Source Group"
+ WriteRegStr ${RootKey} ${RegUninstall} "UninstallString" '"$INSTDIR\uninstall.exe"'
+ WriteRegStr ${RootKey} ${RegUninstall} "QuiteUninstallString" '"$INSTDIR\uninstall.exe" /S'
+ WriteRegStr ${RootKey} ${RegUninstall} "InstallLocation" '"$INSTDIR"'
+ WriteRegStr ${RootKey} ${RegUninstall} "HelpLink" 'https://xmake.io/'
+ WriteRegStr ${RootKey} ${RegUninstall} "URLInfoAbout" 'https://github.com/xmake-io/xmake'
+ WriteRegStr ${RootKey} ${RegUninstall} "URLUpdateInfo" 'https://github.com/xmake-io/xmake/releases'
+ WriteRegDWORD ${RootKey} ${RegUninstall} "VersionMajor" ${MAJOR}
+ WriteRegDWORD ${RootKey} ${RegUninstall} "VersionMinor" ${MINOR}
+ WriteRegStr ${RootKey} ${RegUninstall} "DisplayVersion" ${VERSION_FULL}
+ WriteRegDWORD ${RootKey} ${RegUninstall} "NoModify" 1
+ WriteRegDWORD ${RootKey} ${RegUninstall} "NoRepair" 1
- ; Write the installation path into the $PATH environment variable
- WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" "$R1;$INSTDIR"
+ ;write size to reg
+ ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2
+ IntFmt $0 "0x%08X" $0
+ WriteRegDWORD ${RootKey} ${RegUninstall} "EstimatedSize" "$0"
+ !macroend
+
+ ${If} $NOADMIN == "false"
+ !insertmacro AddReg ${HKLM}
+ ${Else}
+ !insertmacro AddReg ${HKCU}
+ ${EndIf}
SectionEnd
+Section "Add to PATH" InstallPath
+
+ !macro AddRegPATH RootKey
+ ; Remove the installation path from the $PATH environment variable first
+ ReadRegStr $R0 ${RootKey} "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path"
+ ${WordReplace} $R0 ";$INSTDIR" "" "+" $R1
+
+ ; Write the installation path into the $PATH environment variable
+ WriteRegExpandStr ${RootKey} "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" "$R1;$INSTDIR"
+ !macroend
+
+ ${If} $NOADMIN == "false"
+ !insertmacro AddRegPATH ${HKLM}
+ ${Else}
+ !insertmacro AddRegPATH ${HKCU}
+ ${EndIf}
+
+SectionEnd
+
;--------------------------------
; Descriptions
; Language strings
-LangString DESC_Installer ${LANG_ENGLISH} "A cross-platform build utility based on Lua"
+LangString DESC_InstallExeutable ${LANG_ENGLISH} "A cross-platform build utility based on Lua"
+LangString DESC_InstallPath ${LANG_ENGLISH} "Add xmake to PATH"
; Assign language strings to sections
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
-!insertmacro MUI_DESCRIPTION_TEXT ${Installer} $(DESC_Installer)
+!insertmacro MUI_DESCRIPTION_TEXT ${InstallExeutable} $(DESC_InstallExeutable)
+!insertmacro MUI_DESCRIPTION_TEXT ${InstallPath} $(DESC_InstallPath)
!insertmacro MUI_FUNCTION_DESCRIPTION_END
;--------------------------------
; Uninstaller
-Section "Uninstall"
+Function un.onInit
+ ; check if we need uac
+ ReadRegStr $NOADMIN ${HKLM} SOFTWARE\XMake "NoAdmin"
+ IfErrors 0 +2
+ ReadRegStr $NOADMIN ${HKCU} SOFTWARE\XMake "NoAdmin"
- ; Remove registry keys
- DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\xmake"
- DeleteRegKey HKLM SOFTWARE\NSIS_xmake
+ ${IfNot} $NOADMIN == "true"
+ !insertmacro Init "uninstaller"
+ ${EndIf}
+
+FunctionEnd
+
+Section "Uninstall"
+
+ !macro RemoveReg RootKey
+ ; Remove registry keys
+ DeleteRegKey ${RootKey} ${RegUninstall}
+ DeleteRegKey ${RootKey} ${RegProduct}
+
+ ; Remove the installation path from the $PATH environment variable
+ ReadRegStr $R0 ${RootKey} "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path"
+ ${WordReplace} $R0 ";$INSTDIR" "" "+" $R1
+ ; MessageBox MB_OK|MB_USERICON '$R0 - $INSTDIR - $R1 '
+ WriteRegExpandStr ${RootKey} "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" "$R1"
+ !macroend
; Remove directories used
RMDir /r "$INSTDIR"
-
- ; Remove the installation path from the $PATH environment variable
- ReadRegStr $R0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path"
- ${WordReplace} $R0 ";$INSTDIR" "" "+" $R1
- ; MessageBox MB_OK|MB_USERICON '$R0 - $INSTDIR - $R1 '
- WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" "$R1"
+ ${If} $NOADMIN == "false"
+ !insertmacro RemoveReg ${HKLM}
+ ${Else}
+ !insertmacro RemoveReg ${HKCU}
+ ${EndIf}
SectionEnd
|
