summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorruki <[email protected]>2019-06-20 22:49:52 +0800
committerGitHub <[email protected]>2019-06-20 22:49:52 +0800
commit4c355fb52244fe54585fa1f73234fa1b820e0ebb (patch)
tree45269da3b8a312b9fb7d71da124d4e59fae81086 /scripts
parentd579b3548cd467f0e7b0462733b8de882abf6119 (diff)
parent5d8c5b6d686b802c48ff52bfe72f188c92509f49 (diff)
Merge pull request #462 from OpportunityLiu/dev
UAC on demand for windows installer
Diffstat (limited to 'scripts')
-rw-r--r--scripts/get.ps1323
-rw-r--r--scripts/installer.nsi190
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