diff options
| author | ruki <[email protected]> | 2023-11-10 22:48:19 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2023-11-10 22:48:19 +0800 |
| commit | 28197467e651b9a92d7076a56783eb00b3dfaeb2 (patch) | |
| tree | c22617a60c5ab07d715d453fcd880dd8fd637f4d | |
| parent | a98c3c6027dbfcf93f50044777bb5c0542f16cc5 (diff) | |
add makensis.nsi template
| -rw-r--r-- | xmake/plugins/pack/nsis/main.lua | 14 | ||||
| -rw-r--r-- | xmake/scripts/xpack/nsis/makensis.nsi | 369 |
2 files changed, 378 insertions, 5 deletions
diff --git a/xmake/plugins/pack/nsis/main.lua b/xmake/plugins/pack/nsis/main.lua index 390ac329d..e672ce03f 100644 --- a/xmake/plugins/pack/nsis/main.lua +++ b/xmake/plugins/pack/nsis/main.lua @@ -51,16 +51,20 @@ function _get_makensis() return makensis, oldenvs end +-- pack nsis package +function _pack_nsis(makensis, package, opt) + print("xpack(%s)", package:name()) + print(" description: %s", package:description()) + print(" installcmd: ", package:script("installcmd")) +end + function main(package, opt) -- get makensis local makensis, oldenvs = _get_makensis() - print("makensis", makensis) - -- do pack - print("xpack(%s)", package:name()) - print(" description: %s", package:description()) - print(" installcmd: ", package:script("installcmd")) + -- pack nsis package + _pack_nsis(makensis.program, package, opt) -- done os.setenvs(oldenvs) diff --git a/xmake/scripts/xpack/nsis/makensis.nsi b/xmake/scripts/xpack/nsis/makensis.nsi new file mode 100644 index 000000000..8f3050557 --- /dev/null +++ b/xmake/scripts/xpack/nsis/makensis.nsi @@ -0,0 +1,369 @@ +; xmake.nsi +; +; This script is perhaps one of the simplest NSIs you can make. All of the +; optional settings are left to their default settings. The installer simply +; prompts the user asking them where to install, and drops a copy of xmake.nsi +; there. + +;-------------------------------- +; includes +!include "MUI2.nsh" +!include "WordFunc.nsh" +!include "WinMessages.nsh" +!include FileFunc.nsh +!include UAC.nsh + +; xmake version Information +!ifndef MAJOR + !error 'xmake major version is not defined!' +!endif +!ifndef MINOR + !error 'xmake minor version is not defined!' +!endif +!ifndef ALTER + !error 'xmake alter version is not defined!' +!endif +!ifndef BUILD + !error 'xmake build version is not defined!' +!endif + +!define VERSION ${MAJOR}.${MINOR}.${ALTER} +!define VERSION_FULL ${VERSION}+${BUILD} + +!ifdef x64 + !define ARCH x64 +!else + !define ARCH x86 +!endif + +;-------------------------------- + +; The name of the installer +Name "Xmake - v${VERSION}" + +; The file to write +OutFile "xmake.exe" + +; Use unicode +Unicode true + +; Use best compressor +SetCompressor /FINAL /SOLID lzma +SetCompressorDictSize 64 +SetDatablockOptimize ON + +; The default installation directory +!ifdef x64 + !define PROGRAMFILES $PROGRAMFILES64 + !define HKLM HKLM64 + !define HKCU HKCU64 +!else + !define PROGRAMFILES $PROGRAMFILES + !define HKLM HKLM + !define HKCU HKCU +!endif + +; Request application privileges for Windows Vista +RequestExecutionLevel user + +; Set DPI Aware +ManifestDPIAware true + +;-------------------------------- +; Interface Settings + +!define MUI_ABORTWARNING + +;-------------------------------- +; 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} + + ; The UAC plugin changes the error level even in the inner process, reset it. + ; note fix install exit code 1223 to 0 with slient /S + SetErrorLevel 0 + SetShellVarContext all +!macroend + +;-------------------------------- +; Install Pages + +!insertmacro MUI_PAGE_WELCOME +!insertmacro MUI_PAGE_LICENSE "..\LICENSE.md" +!insertmacro MUI_PAGE_COMPONENTS +!insertmacro MUI_PAGE_DIRECTORY +!insertmacro MUI_PAGE_INSTFILES +!define MUI_FINISHPAGE_LINK "Donate $$5" +!define MUI_FINISHPAGE_LINK_LOCATION "https://xmake.io/#/sponsor" +!insertmacro MUI_PAGE_FINISH + +;-------------------------------- +; Uninstall Pages + +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES +!insertmacro MUI_UNPAGE_FINISH + +;-------------------------------- +; Languages + +!insertmacro MUI_LANGUAGE "English" + +;-------------------------------- +; Version Information + + +VIProductVersion ${VERSION}.0 +VIFileVersion ${VERSION}.0 +VIAddVersionKey /LANG=0 ProductName Xmake +VIAddVersionKey /LANG=0 Comments "A cross-platform build utility based on Lua$\nwebsite: https://xmake.io" +VIAddVersionKey /LANG=0 CompanyName "The TBOOX Open Source Group" +VIAddVersionKey /LANG=0 LegalCopyright "Copyright (C) 2015-present Ruki Wang, tboox.org, xmake.io" +VIAddVersionKey /LANG=0 FileDescription "Xmake Installer - v${VERSION}" +VIAddVersionKey /LANG=0 OriginalFilename "xmake-${ARCH}.exe" +VIAddVersionKey /LANG=0 FileVersion ${VERSION_FULL} +VIAddVersionKey /LANG=0 ProductVersion ${VERSION_FULL} + + +;-------------------------------- +; Reg paths + +!define RegUninstall "Software\Microsoft\Windows\CurrentVersion\Uninstall\XMake" + +;-------------------------------- + +Var NOADMIN + +Function TrimQuote + Exch $R1 ; Original string + Push $R2 + +Loop: + StrCpy $R2 "$R1" 1 + StrCmp "$R2" "'" TrimLeft + StrCmp "$R2" "$\"" TrimLeft + StrCmp "$R2" "$\r" TrimLeft + StrCmp "$R2" "$\n" TrimLeft + StrCmp "$R2" "$\t" TrimLeft + StrCmp "$R2" " " TrimLeft + GoTo Loop2 +TrimLeft: + StrCpy $R1 "$R1" "" 1 + Goto Loop + +Loop2: + StrCpy $R2 "$R1" 1 -1 + StrCmp "$R2" "'" TrimRight + StrCmp "$R2" "$\"" TrimRight + StrCmp "$R2" "$\r" TrimRight + StrCmp "$R2" "$\n" TrimRight + StrCmp "$R2" "$\t" TrimRight + StrCmp "$R2" " " TrimRight + GoTo Done +TrimRight: + StrCpy $R1 "$R1" -1 + Goto Loop2 + +Done: + Pop $R2 + Exch $R1 +FunctionEnd + +; Installer +Function .onInit + ${GetOptions} $CMDLINE "/NOADMIN" $NOADMIN + ${If} ${Errors} + !insertmacro Init "installer" + StrCpy $NOADMIN "false" + ${Else} + StrCpy $NOADMIN "true" + ${EndIf} + + ; load from reg + ${If} $InstDir == "" + ${If} $NOADMIN == "false" + ReadRegStr $R0 ${HKLM} ${RegUninstall} "InstallLocation" + ${Else} + ReadRegStr $R0 ${HKCU} ${RegUninstall} "InstallLocation" + ${EndIf} + ${If} $R0 != "" + Push $R0 + Call TrimQuote + Pop $R0 + StrCpy $InstDir $R0 + ${EndIf} + ${EndIf} + ; use default + ${If} $InstDir == "" + StrCpy $InstDir ${PROGRAMFILES}\xmake + ${EndIf} + +FunctionEnd + +Section "Xmake (required)" InstallExeutable + + SectionIn RO + + ; Set output path to the installation directory. + SetOutPath $InstDir + + ; Remove previous directories used + ; https://github.com/xmake-io/xmake/issues/1888 + IfFileExists "$InstDir\xmake.exe" file_found file_not_found_or_end + file_found: + RMDir /r "$InstDir" + goto file_not_found_or_end + file_not_found_or_end: + + ; Put file there + File /r /x ".DS_Store" /x "*.swp" "..\xmake\*.*" + File "..\*.md" + File "..\core\build\xmake.exe" + File "..\scripts\xrepo.bat" + File "..\scripts\xrepo.ps1" + File /r /x ".DS_Store" "..\winenv" + + WriteUninstaller "uninstall.exe" + + !macro AddReg RootKey + + ; Write uac info + WriteRegStr ${RootKey} ${RegUninstall} "NoAdmin" "$NOADMIN" + + ; Write the uninstall keys for Windows + WriteRegStr ${RootKey} ${RegUninstall} "DisplayName" "Xmake build utility (${ARCH})" + 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 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 "Enable Long Path" LongPath + ${If} $NOADMIN == "false" + ; Enable long path + WriteRegDWORD ${HKLM} "SYSTEM\CurrentControlSet\Control\FileSystem" "LongPathsEnabled" 1 + ${EndIf} +SectionEnd + +Section "Add to PATH" InstallPath + + ${If} $NOADMIN == "false" + ; Remove the installation path from the $PATH environment variable first + ReadRegStr $R0 ${HKLM} "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" + ${WordReplace} $R0 ";$InstDir" "" "+" $R1 + + ; Write the installation path into the $PATH environment variable + WriteRegExpandStr ${HKLM} "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" "$R1;$InstDir" + ${Else} + ; Remove the installation path from the $PATH environment variable first + ReadRegStr $R0 ${HKCU} "Environment" "Path" + ${WordReplace} $R0 ";$InstDir" "" "+" $R1 + + ; Write the installation path into the $PATH environment variable + WriteRegExpandStr ${HKCU} "Environment" "Path" "$R1;$InstDir" + ${EndIf} + + ; make sure windows knows about the change + SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 + +SectionEnd + +;-------------------------------- +; Descriptions + +; Language strings +LangString DESC_InstallExeutable ${LANG_ENGLISH} "A cross-platform build utility based on Lua" +LangString DESC_InstallPath ${LANG_ENGLISH} "Add xmake to PATH" +LangString DESC_LongPath ${LANG_ENGLISH} "Increases the maximum path length limit, up to 32,767 characters (before 256). This can be useful if a project has many recursive subfolders to make sure that the project is compiled without errors. A reboot might be required because some processes may have started before the new value was set" + +; Assign language strings to sections +!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN +!insertmacro MUI_DESCRIPTION_TEXT ${InstallExeutable} $(DESC_InstallExeutable) +!insertmacro MUI_DESCRIPTION_TEXT ${InstallPath} $(DESC_InstallPath) +!insertmacro MUI_DESCRIPTION_TEXT ${LongPath} $(DESC_LongPath) +!insertmacro MUI_FUNCTION_DESCRIPTION_END + +;-------------------------------- + +; Uninstaller + +Function un.onInit + ; check if we need uac + ReadRegStr $NOADMIN ${HKLM} ${RegUninstall} "NoAdmin" + IfErrors 0 +2 + ReadRegStr $NOADMIN ${HKCU} ${RegUninstall} "NoAdmin" + + ${IfNot} $NOADMIN == "true" + !insertmacro Init "uninstaller" + ${EndIf} + +FunctionEnd + +Section "Uninstall" + + ; Remove directories used + RMDir /r "$InstDir" + + ; Clean reg + ${If} $NOADMIN == "false" + DeleteRegKey ${HKLM} ${RegUninstall} + ; Remove the installation path from the $PATH environment variable + ReadRegStr $R0 ${HKLM} "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" + ${WordReplace} $R0 ";$InstDir" "" "+" $R1 + WriteRegExpandStr ${HKLM} "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" "$R1" + ${Else} + DeleteRegKey ${HKCU} ${RegUninstall} + ; Remove the installation path from the $PATH environment variable + ReadRegStr $R0 ${HKCU} "Environment" "Path" + ${WordReplace} $R0 ";$InstDir" "" "+" $R1 + WriteRegExpandStr ${HKCU} "Environment" "Path" "$R1" + ${EndIf} + +SectionEnd |
