diff --git a/installer.nsi b/installer.nsi new file mode 100644 index 0000000000..ec13774f92 --- /dev/null +++ b/installer.nsi @@ -0,0 +1,199 @@ +; [1] PACK_SOURCE_DIR = compile-time only (e.g. .\build\Snapmaker_Orca). [2] INSTALL_DIR_RUNTIME = runtime install dir (default .\ = $EXEDIR). +!include "MUI2.nsh" +!include "FileFunc.nsh" +!include "LogicLib.nsh" + +!define PRODUCT_NAME "Snapmaker Orca" +!define PRODUCT_PUBLISHER "Snapmaker" +!define PRODUCT_WEB_SITE "https://github.com/Snapmaker/OrcaSlicer" +!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" +!define PRODUCT_UNINST_ROOT_KEY "HKLM" +!define PRODUCT_INSTALL_KEY "Software\${PRODUCT_PUBLISHER}\${PRODUCT_NAME}" + +!ifndef VERSION + !define VERSION "2.2.3" +!endif + +!ifndef SOURCE_DIR + !define SOURCE_DIR ".\build\Snapmaker_Orca" +!endif +!define PACK_SOURCE_DIR "${SOURCE_DIR}" + +; 64-bit app: use PROGRAMFILES64 so default path is C:\Program Files\Snapmaker_Orca, not (x86) +!define INSTALL_DIR_RUNTIME "$PROGRAMFILES64\Snapmaker_Orca" +InstallDir "${INSTALL_DIR_RUNTIME}" + +!ifndef OUTPUT_FILE + !define OUTPUT_FILE "Snapmaker_Orca_Windows_Installer_V${VERSION}.exe" +!endif + +RequestExecutionLevel admin + +; No /SOLID to avoid "Internal compiler error #12345: error mmapping datablock" +SetCompressor lzma + +VIProductVersion "${VERSION}.0" +VIAddVersionKey "ProductName" "${PRODUCT_NAME}" +VIAddVersionKey "Comments" "Snapmaker Orca is an open source slicer for FDM printers" +VIAddVersionKey "CompanyName" "${PRODUCT_PUBLISHER}" +VIAddVersionKey "LegalCopyright" "Copyright (C) ${PRODUCT_PUBLISHER}" +VIAddVersionKey "FileDescription" "${PRODUCT_NAME} ${VERSION} Installer" +VIAddVersionKey "FileVersion" "${VERSION}" +VIAddVersionKey "ProductVersion" "${VERSION}" +VIAddVersionKey "InternalName" "${PRODUCT_NAME}" +VIAddVersionKey "LegalTrademarks" "" +VIAddVersionKey "OriginalFilename" "${OUTPUT_FILE}" + +; Installer and uninstaller icon: set by build_and_pack.bat via /DICON_FILE=path (e.g. Snapmaker_Orca.ico or snapmaker.ico) +!ifdef ICON_FILE + !define MUI_ICON "${ICON_FILE}" + !define MUI_UNICON "${ICON_FILE}" +!else + !define MUI_ICON ".\resources\images\Snapmaker_Orca.ico" + !define MUI_UNICON ".\resources\images\Snapmaker_Orca.ico" +!endif + +!define MUI_WELCOMEPAGE_TITLE "Welcome to ${PRODUCT_NAME} Setup" +!define MUI_WELCOMEPAGE_TEXT "This wizard will guide you through the installation of ${PRODUCT_NAME} ${VERSION}.$\r$\n$\r$\nClick Next to continue." +!insertmacro MUI_PAGE_WELCOME + +!ifdef LICENSE_FILE + !define MUI_LICENSEPAGE_CHECKBOX + !insertmacro MUI_PAGE_LICENSE "${LICENSE_FILE}" +!endif + +!insertmacro MUI_PAGE_COMPONENTS + +!define MUI_DIRECTORYPAGE_TEXT_TOP "Choose the folder in which to install ${PRODUCT_NAME}." +!insertmacro MUI_PAGE_DIRECTORY + +!insertmacro MUI_PAGE_INSTFILES + +!define MUI_FINISHPAGE_RUN +!define MUI_FINISHPAGE_RUN_TEXT "Run ${PRODUCT_NAME}" +!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchApp" +!define MUI_FINISHPAGE_LINK "Visit ${PRODUCT_NAME} website" +!define MUI_FINISHPAGE_LINK_LOCATION "${PRODUCT_WEB_SITE}" +!insertmacro MUI_PAGE_FINISH + +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES + +!insertmacro MUI_LANGUAGE "SimpChinese" +!insertmacro MUI_LANGUAGE "English" + +Name "${PRODUCT_NAME} ${VERSION}" +OutFile "${OUTPUT_FILE}" + +Section "Main program" SecMain + SectionIn RO + + SetOutPath "$INSTDIR" + + DetailPrint "Installing ${PRODUCT_NAME}..." + DetailPrint "Target dir: $INSTDIR" + + DetailPrint "Copying files..." + + ; PACK_SOURCE_DIR = compile time only. At runtime this File extracts from embedded payload to $INSTDIR. Exclude include and lib dirs. + File /r /x "*.pdb" /x "*.ilk" /x "*.exp" /x "*.lib" /x "*.obj" /x "*.idb" /x "*.tlog" /x "*.h" /x "*.hpp" /x "*.c" /x "*.cpp" /x "*.cxx" /x "*.cc" /x "*.vcxproj" /x "*.vcxproj.filters" /x "*.sln" /x "*.cmake" /x "*.py" /x "*.md" /x "*.vcxproj.user" /x "CMakeFiles" /x "RelWithDebInfo" /x "Debug" /x "MinSizeRel" /x ".vs" /x "vcpkg_installed" /x "*.dir" /x "include\*" /x "lib\*" "${PACK_SOURCE_DIR}\*.*" + + IfFileExists "$INSTDIR\snapmaker-orca.exe" 0 extract_error + + DetailPrint "Creating uninstaller..." + WriteUninstaller "$INSTDIR\Uninstall.exe" + + DetailPrint "Writing registry..." + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "${PRODUCT_NAME}" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\Uninstall.exe" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "InstallLocation" "$INSTDIR" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\snapmaker-orca.exe" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${VERSION}" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "HelpLink" "${PRODUCT_WEB_SITE}" + WriteRegDWORD ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "NoModify" 1 + WriteRegDWORD ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "NoRepair" 1 + + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_INSTALL_KEY}" "Version" "${VERSION}" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_INSTALL_KEY}" "InstallPath" "$INSTDIR" + + DetailPrint "Installation complete!" + Goto end_section + + extract_error: + MessageBox MB_OK|MB_ICONSTOP "Installation failed: snapmaker-orca.exe was not found in the package. The installer may be corrupted." + Abort + + end_section: +SectionEnd + +Section "Desktop shortcut" SecDesktop + DetailPrint "Creating desktop shortcut..." + CreateShortcut "$DESKTOP\Snapmaker Orca.lnk" "$INSTDIR\snapmaker-orca.exe" "" "$INSTDIR\snapmaker-orca.exe" 0 +SectionEnd + +Section "Start menu shortcut" SecStartMenu + DetailPrint "Creating start menu shortcut..." + CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}" + CreateShortcut "$SMPROGRAMS\${PRODUCT_NAME}\Snapmaker Orca.lnk" "$INSTDIR\snapmaker-orca.exe" "" "$INSTDIR\snapmaker-orca.exe" 0 + CreateShortcut "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall.lnk" "$INSTDIR\Uninstall.exe" "" "$INSTDIR\Uninstall.exe" 0 +SectionEnd + +!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${SecMain} "Install ${PRODUCT_NAME} and all required files." + !insertmacro MUI_DESCRIPTION_TEXT ${SecDesktop} "Create a desktop shortcut for ${PRODUCT_NAME}." + !insertmacro MUI_DESCRIPTION_TEXT ${SecStartMenu} "Create a start menu shortcut for ${PRODUCT_NAME}." +!insertmacro MUI_FUNCTION_DESCRIPTION_END + +Section "Uninstall" + + DetailPrint "Uninstalling ${PRODUCT_NAME}..." + + DetailPrint "Checking for running processes..." + nsExec::ExecToLog 'taskkill /F /IM snapmaker-orca.exe /T' + Sleep 500 + + DetailPrint "Removing desktop shortcut..." + Delete "$DESKTOP\Snapmaker Orca.lnk" + Delete "$DESKTOP\${PRODUCT_NAME}.lnk" + + DetailPrint "Removing start menu shortcut..." + RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}" + + DetailPrint "Removing install directory..." + RMDir /r /REBOOTOK "$INSTDIR" + + RMDir "$INSTDIR" + + DetailPrint "Removing registry entries..." + DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" + DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_INSTALL_KEY}" + DeleteRegKey HKCU "${PRODUCT_INSTALL_KEY}" + + DetailPrint "Uninstall complete!" +SectionEnd + +Function LaunchApp + ExecShell "open" "$INSTDIR\snapmaker-orca.exe" +FunctionEnd + +Function .onInit + + ReadRegStr $R0 ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" + StrCmp $R0 "" done + + MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION \ + "${PRODUCT_NAME} is already installed.$\n$\nClick OK to uninstall the old version, or Cancel to abort." \ + IDOK uninst + Abort + + uninst: + ClearErrors + ExecWait '$R0 _?=$INSTDIR' + + IfErrors no_remove_uninstaller done + no_remove_uninstaller: + + done: +FunctionEnd