=== Windows Installer ===
authorNathan Letwory <nathan@letworyinteractive.com>
Tue, 6 Jul 2010 09:13:10 +0000 (09:13 +0000)
committerNathan Letwory <nathan@letworyinteractive.com>
Tue, 6 Jul 2010 09:13:10 +0000 (09:13 +0000)
* Proper deletion of install dir - everything under it will be gone
* Ask if config/userdata can be removed and act accordingly. If selected, everything under user/config dir (BLENDERHOME) will be gone.
* The installer now will automatically update vc runtime

To be able to properly create an installer, you need:
- NSIS, and the MoreInfo plugin for NSIS. Make sure NSIS is in your path
- Set in your user-config.py BF_VCREDIST full path to the redist you have.

Note: this works only with SCons.

release/windows/installer/00.sconsblender.nsi
tools/btools.py

index 356972de702e638aa97baf874f3cca8a076b4115..9be43fda949b6392d3b00c3bad37dbca8f31f503 100644 (file)
@@ -32,8 +32,6 @@ Name "Blender [VERSION]"
     \r
 !insertmacro MUI_PAGE_DIRECTORY\r
 Page custom DataLocation DataLocationOnLeave\r
-Page custom AppDataChoice AppDataChoiceOnLeave\r
-Page custom PreMigrateUserSettings MigrateUserSettings\r
 !insertmacro MUI_PAGE_INSTFILES\r
 !insertmacro MUI_PAGE_FINISH\r
   \r
@@ -70,64 +68,16 @@ Caption "Blender [VERSION] Installer"
 OutFile "[DISTDIR]\..\blender-[VERSION]-windows.exe"\r
 InstallDir "$PROGRAMFILES\Blender Foundation\Blender"\r
 \r
-BrandingText "http://www.blender.org"\r
+BrandingText "Blender Foundation | http://www.blender.org"\r
 ComponentText "This will install Blender [VERSION] on your computer."\r
 \r
 DirText "Use the field below to specify the folder where you want Blender to be copied to. To specify a different folder, type a new name or use the Browse button to select an existing folder."\r
 \r
 SilentUnInstall normal\r
 \r
-# Uses $0\r
-Function openLinkNewWindow\r
-  Push $3 \r
-  Push $2\r
-  Push $1\r
-  Push $0\r
-  ReadRegStr $0 HKCR "http\shell\open\command" ""\r
-# Get browser path\r
-    DetailPrint $0\r
-  StrCpy $2 '"'\r
-  StrCpy $1 $0 1\r
-  StrCmp $1 $2 +2 # if path is not enclosed in " look for space as final char\r
-    StrCpy $2 ' '\r
-  StrCpy $3 1\r
-  loop:\r
-    StrCpy $1 $0 1 $3\r
-    DetailPrint $1\r
-    StrCmp $1 $2 found\r
-    StrCmp $1 "" found\r
-    IntOp $3 $3 + 1\r
-    Goto loop\r
\r
-  found:\r
-    StrCpy $1 $0 $3\r
-    StrCmp $2 " " +2\r
-      StrCpy $1 '$1"'\r
\r
-  Pop $0\r
-  Exec '$1 $0'\r
-  Pop $1\r
-  Pop $2\r
-  Pop $3\r
-FunctionEnd\r
-\r
 Var BLENDERHOME\r
+Var SHORTVERSION ; This is blender_version_decimal() from path_util.c\r
 Var DLL_found\r
-Var PREVHOME\r
-\r
-Function SetWinXPPathCurrentUser\r
-  SetShellVarContext current\r
-  StrCpy $BLENDERHOME "$APPDATA\Blender Foundation\Blender"\r
-FunctionEnd\r
-\r
-Function SetWinXPPathAllUsers\r
-  SetShellVarContext all\r
-  StrCpy $BLENDERHOME "$APPDATA\Blender Foundation\Blender"\r
-FunctionEnd\r
-\r
-Function SetWin9xPath\r
-  StrCpy $BLENDERHOME $INSTDIR\r
-FunctionEnd\r
 \r
 ; custom controls\r
 Var HWND\r
@@ -136,100 +86,8 @@ Var HWND_APPDATA
 Var HWND_INSTDIR\r
 Var HWND_HOMEDIR\r
 \r
-Var HWND_BUTTON_YES\r
-Var HWND_BUTTON_NO\r
-\r
-Var SETUSERCONTEXT\r
-\r
-Function PreMigrateUserSettings\r
-  StrCpy $PREVHOME "$PROFILE\Application Data\Blender Foundation\Blender"\r
-  StrCpy $0 "$PROFILE\Application Data\Blender Foundation\Blender\.blender"\r
-  \r
-  IfFileExists $0 0 nochange\r
-  \r
-  StrCmp $BLENDERHOME $PREVHOME nochange\r
-  \r
-  nsDialogs::Create /NOUNLOAD 1018\r
-  Pop $HWND\r
-  \r
-  ${If} $HWND == error\r
-  Abort\r
-  ${EndIf}\r
-  \r
-  ${NSD_CreateLabel} 0 0 100% 12u "You have existing settings at:"\r
-  ${NSD_CreateLabel} 0 20 100% 12u $PREVHOME\r
-  ${NSD_CreateLabel} 0 40 100% 12u "Do you wish to migrate this data to:"\r
-  ${NSD_CreateLabel} 0 60 100% 12u $BLENDERHOME\r
-  ${NSD_CreateLabel} 0 80 100% 12u "Please note: If you choose no, Blender will not be able to use these files!"\r
-  ${NSD_CreateRadioButton} 0 100 100% 12u "Yes"\r
-  Pop $HWND_BUTTON_YES\r
-  ${NSD_CreateRadioButton} 0 120 100% 12u "No"\r
-  Pop $HWND_BUTTON_NO\r
-  \r
-  SendMessage $HWND_BUTTON_YES ${BM_SETCHECK} 1 0\r
-  \r
-  nsDialogs::Show\r
-  nochange:\r
-  \r
-FunctionEnd\r
-\r
-Function MigrateUserSettings\r
-  ${NSD_GetState} $HWND_BUTTON_YES $R0\r
-  ${If} $R0 == "1"\r
-    CreateDirectory $BLENDERHOME\r
-    CopyFiles $PREVHOME\*.* $BLENDERHOME\r
-    ;RMDir /r $PREVHOME\r
-  ${EndIf}  \r
-FunctionEnd\r
-\r
-!define DLL_VER "8.00.50727.42"\r
-!define DLL_VER2 "7.10.3052.4"\r
-\r
-Function LocateCallback_80\r
-  MoreInfo::GetProductVersion "$R9"\r
-  Pop $0\r
-\r
-        ${VersionCompare} "$0" "${DLL_VER}" $R1\r
-\r
-        StrCmp $R1 0 0 new\r
-      new:\r
-        StrCmp $R1 1 0 old\r
-      old:\r
-        StrCmp $R1 2 0 end\r
-  ; Found DLL is older\r
-        Call DownloadDLL\r
-\r
-     end:\r
-  StrCpy "$0" StopLocate\r
-  StrCpy $DLL_found "true"\r
-  Push "$0"\r
-\r
-FunctionEnd\r
-\r
-Function LocateCallback_71\r
-  MoreInfo::GetProductVersion "$R9"\r
-  Pop $0\r
-\r
-        ${VersionCompare} "$0" "${DLL_VER2}" $R1\r
-\r
-        StrCmp $R1 0 0 new\r
-      new:\r
-        StrCmp $R1 1 0 old\r
-      old:\r
-        StrCmp $R1 2 0 end\r
-  ; Found DLL is older\r
-\r
-     end:\r
-  StrCpy "$0" StopLocate\r
-  StrCpy $DLL_found "true"\r
-  Push "$0"\r
-\r
-FunctionEnd\r
-\r
-Function DownloadDLL\r
-    MessageBox MB_OK "You will need to download the Microsoft Visual C++ 2005 Redistributable Package in order to run Blender. Pressing OK will take you to the download page, please follow the instructions on the page that appears."\r
-    StrCpy $0 "http://www.microsoft.com/downloads/details.aspx?familyid=32BC1BEE-A3F9-4C13-9C99-220B62A191EE&displaylang=en"\r
-    Call openLinkNewWindow\r
+Function .onInit\r
+  StrCpy $SHORTVERSION "[SHORTVERSION]"\r
 FunctionEnd\r
 \r
 Function DataLocation\r
@@ -261,14 +119,13 @@ Function DataLocation
 FunctionEnd\r
 \r
 Function DataLocationOnLeave\r
-  StrCpy $SETUSERCONTEXT "false"\r
   ${NSD_GetState} $HWND_APPDATA $R0\r
   ${If} $R0 == "1"\r
-    StrCpy $SETUSERCONTEXT "true"\r
+    StrCpy $BLENDERHOME "$APPDATA\Blender Foundation\Blender"\r
   ${Else}\r
     ${NSD_GetState} $HWND_INSTDIR $R0\r
     ${If} $R0 == "1"\r
-      Call SetWin9xPath\r
+      StrCpy $BLENDERHOME $INSTDIR\r
     ${Else}\r
       ${NSD_GetState} $HWND_HOMEDIR $R0\r
       ${If} $R0 == "1"\r
@@ -278,74 +135,31 @@ Function DataLocationOnLeave
   ${EndIf}\r
 FunctionEnd\r
 \r
-Var HWND_APPDATA_CURRENT\r
-Var HWND_APPDATA_ALLUSERS\r
-\r
-Function AppDataChoice\r
-  StrCmp $SETUSERCONTEXT "false" skip\r
-  \r
-  nsDialogs::Create /NOUNLOAD 1018\r
-  Pop $HWND\r
-  \r
-  ${NSD_CreateLabel} 0 0 100% 12u "Please choose which Application Data directory to use."\r
-  ${NSD_CreateRadioButton} 0 40 100% 12u "Current User"\r
-  Pop $HWND_APPDATA_CURRENT\r
-  ${NSD_CreateRadioButton} 0 70 100% 12u "All Users"\r
-  Pop $HWND_APPDATA_ALLUSERS\r
-  \r
-  SendMessage $HWND_APPDATA_CURRENT ${BM_SETCHECK} 1 0\r
-  \r
-  StrCmp $SETUSERCONTEXT "true" 0 skip ; show dialog if we need to set context, otherwise skip it\r
-  nsDialogs::Show\r
-  \r
-skip:\r
-\r
-FunctionEnd\r
-\r
-Function AppDataChoiceOnLeave\r
-  StrCmp $SETUSERCONTEXT "false" skip\r
-  ${NSD_GetState} $HWND_APPDATA_CURRENT $R0\r
-  ${If} $R0 == "1"\r
-     Call SetWinXPPathCurrentUser\r
-  ${Else}\r
-     Call SetWinXPPathAllUsers\r
-  ${EndIf}\r
-skip:\r
-\r
-FunctionEnd\r
-\r
 Section "Blender-[VERSION] (required)" SecCopyUI\r
   SectionIn RO\r
 \r
   ; Set output path to the installation directory.\r
   SetOutPath $INSTDIR\r
-  ; Put file there\r
+  ; the contents of Blender installation root dir\r
   [ROOTDIRCONTS]\r
   \r
-  ;SetOutPath $BLENDERHOME\$BLENDERVERSION\r
-  ;[DATAFILES] ; and we write datafiles to user accessable dir\r
+  ; all datafiles (python, scripts, config)\r
   [DODATAFILES]\r
   \r
   SetOutPath $INSTDIR\r
   ; Write the installation path into the registry\r
-  WriteRegStr HKLM SOFTWARE\BlenderFoundation "Install_Dir" "$INSTDIR"\r
+  WriteRegStr HKLM "SOFTWARE\BlenderFoundation" "Install_Dir" "$INSTDIR"\r
+  WriteRegStr HKLM "SOFTWARE\BlenderFoundation" "ConfigData_Dir" "$BLENDERHOME"\r
+  WriteRegStr HKLM "SOFTWARE\BlenderFoundation" "ShortVersion" "[SHORTVERSION]"\r
   ; Write the uninstall keys for Windows\r
   WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender" "DisplayName" "Blender (remove only)"\r
   WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender" "UninstallString" '"$INSTDIR\uninstall.exe"'\r
   WriteUninstaller "uninstall.exe"\r
 \r
-  ; Check for msvcr80.dll - give notice to download if not found\r
-  MessageBox MB_OK "The installer will now check your system for the required system dlls."\r
-  StrCpy $1 $WINDIR\r
-  StrCpy $DLL_found "false"\r
-  ${Locate} "$1" "/L=F /M=MSVCR80.DLL /S=0B" "LocateCallback_80"\r
-  StrCmp $DLL_found "false" 0 +2\r
-    Call DownloadDLL\r
-  StrCpy $1 $WINDIR\r
-  StrCpy $DLL_found "false"\r
-  ${Locate} "$1" "/L=F /M=MSVCR71.DLL /S=0B" "LocateCallback_71"\r
-  StrCmp $DLL_found "false" 0 +2\r
-  \r
+  ; Let's now run silent vcredist installer\r
+  SetOutPath $TEMP\r
+  [VCREDIST]\r
+\r
 SectionEnd\r
 \r
 Section "Add Start Menu shortcuts" Section2\r
@@ -378,35 +192,29 @@ Section "Open .blend files with Blender-[VERSION]" Section4
   \r
 SectionEnd\r
 \r
-UninstallText "This will uninstall Blender [VERSION]. Hit next to continue."\r
+UninstallText "This will uninstall Blender [VERSION], and all datafiles from the installation dir. Hit next to continue."\r
 \r
 Section "Uninstall"\r
   ; remove registry keys\r
+  ReadRegStr $BLENDERHOME HKLM "SOFTWARE\BlenderFoundation" "ConfigData_Dir"\r
+  ReadRegStr $SHORTVERSION HKLM "SOFTWARE\BlenderFoundation" "ShortVersion"\r
   DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender"\r
-  DeleteRegKey HKLM SOFTWARE\BlenderFoundation\r
+  DeleteRegKey HKLM "SOFTWARE\BlenderFoundation"\r
   ; remove files\r
   [DELROOTDIRCONTS]\r
-  \r
-  Delete $INSTDIR\.blender\.bfont.ttf\r
-  Delete $INSTDIR\.blender\.Blanguages\r
+\r
+  Delete "$INSTDIR\uninstall.exe"\r
+\r
+  MessageBox MB_YESNO "Erase $BLENDERHOME? This includes all installed scripts and configuration files and any file you may have created there." IDNO Next\r
+  RMDir /r "$BLENDERHOME"\r
+Next:\r
   ; remove shortcuts, if any.\r
   Delete "$SMPROGRAMS\Blender Foundation\Blender\*.*"\r
   Delete "$DESKTOP\Blender.lnk"\r
-  ; remove directories used.\r
-  RMDir /r $INSTDIR\.blender\locale\r
-  MessageBox MB_YESNO "Erase .blender\scripts folder? (ALL contents will be erased!)" IDNO Next\r
-  RMDir /r $INSTDIR\.blender\scripts\r
-  RMDir /r $INSTDIR\.blender\scripts\bpymodules\r
-  RMDir /r $INSTDIR\.blender\scripts\bpydata\r
-  RMDir /r $INSTDIR\.blender\scripts\bpydata\config\r
-Next:\r
-  RMDir /r $INSTDIR\plugins\include\r
-  RMDir /r $INSTDIR\plugins\r
-  RMDir $INSTDIR\.blender\r
-  RMDir "$SMPROGRAMS\Blender Foundation\Blender"\r
-  RMDir "$SMPROGRAMS\Blender Foundation"\r
-  RMDir "$INSTDIR"\r
-  RMDir "$INSTDIR\.."\r
+  ; remove all link related directories and files\r
+  RMDir /r "$SMPROGRAMS\Blender Foundation"\r
+  ; remove entire installation directory, including any file created by the user\r
+  RMDir /r "$INSTDIR"\r
 SectionEnd\r
 \r
 !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN\r
index 9add22d8270405a0f5c81638970f86c34d0d1da2..8a609ba31ba0096c5ca4db7a6c0e7e098e2b62d0 100644 (file)
@@ -83,7 +83,8 @@ def validate_arguments(args, bc):
             'BF_GHOST_DEBUG',
             'WITH_BF_RAYOPTIMIZATION',
             'BF_RAYOPTIMIZATION_SSE_FLAGS',
-            'BF_NO_ELBEEM'
+            'BF_NO_ELBEEM',
+            'BF_VCREDIST' # Windows-only, and useful only when creating installer
             ]
     
     # Have options here that scons expects to be lists
@@ -441,20 +442,22 @@ def read_opts(env, cfg, args):
         (BoolVariable('BF_GHOST_DEBUG', 'Make GHOST print events and info to stdout. (very verbose)', False)),
         
         (BoolVariable('WITH_BF_RAYOPTIMIZATION', 'Enable raytracer SSE/SIMD optimization.', False)),
-        ('BF_RAYOPTIMIZATION_SSE_FLAGS', 'SSE flags', '')
+        ('BF_RAYOPTIMIZATION_SSE_FLAGS', 'SSE flags', ''),
+        ('BF_VCREDIST', 'Full path to vcredist', '')
     ) # end of opts.AddOptions()
 
     return localopts
 
 def NSIS_print(target, source, env):
-    return "Creating NSIS installer for Blender 3D"
+    return "Creating NSIS installer for Blender"
 
 def NSIS_Installer(target=None, source=None, env=None):
+    print "="*35
 
     if env['OURPLATFORM'] not in ('win32-vc', 'win32-mingw', 'win64-vc'):
         print "NSIS installer is only available on Windows."
         Exit()
-        
+
     start_dir = os.getcwd()
     rel_dir = os.path.join(start_dir,'release','windows','installer')
     install_base_dir = start_dir + os.sep
@@ -466,18 +469,23 @@ def NSIS_Installer(target=None, source=None, env=None):
     rootdirconts = []
     datafiles = ''
     l = len(bf_installdir)
+    
     for dp,dn,df in os.walk(bf_installdir):
         if not doneroot:
             for f in df:
                 rootdirconts.append(os.path.join(dp,f))
             doneroot = True
         else:
-            datafiles += "\n"+r'SetOutPath $BLENDERHOME'+dp[l:]+"\n\n"
-
-            for f in df:
-                outfile = os.path.join(dp,f)
-                datafiles += '  File '+outfile + "\n"
-
+            if len(df)>0:
+                dp_tmp = dp[l:]
+                if dp_tmp.find('python\\lib') > -1:
+                    datafiles += "\n" +r'SetOutPath $INSTDIR'+dp[l:]+"\n\n"
+                else:
+                    datafiles += "\n"+r'SetOutPath $BLENDERHOME'+dp[l:]+"\n\n"
+
+                for f in df:
+                    outfile = os.path.join(dp,f)
+                    datafiles += '  File '+outfile + "\n"
     
     os.chdir("release")
     v = open("VERSION")
@@ -491,13 +499,13 @@ def NSIS_Installer(target=None, source=None, env=None):
 
     ns = open("00.sconsblender.nsi","r")
 
-
     ns_cnt = str(ns.read())
     ns.close()
 
     # var replacements
-    ns_cnt = string.replace(ns_cnt, "[DISTDIR]", os.path.normpath(inst_dir+"\\"))
+    ns_cnt = string.replace(ns_cnt, "[DISTDIR]", os.path.normpath(inst_dir+os.sep))
     ns_cnt = string.replace(ns_cnt, "[VERSION]", version)
+    ns_cnt = string.replace(ns_cnt, "[SHORTVERSION]", VERSION)
     ns_cnt = string.replace(ns_cnt, "[RELDIR]", os.path.normpath(rel_dir))
 
     # do root
@@ -509,9 +517,6 @@ def NSIS_Installer(target=None, source=None, env=None):
     rootstring += "\n\n"
     ns_cnt = string.replace(ns_cnt, "[ROOTDIRCONTS]", rootstring)
 
-    #print rootstring
-    #print datafiles
-    print "="*50
 
     # do delete items
     delrootlist = []
@@ -523,15 +528,20 @@ def NSIS_Installer(target=None, source=None, env=None):
 
     ns_cnt = string.replace(ns_cnt, "[DODATAFILES]", datafiles)
 
+    # Setup vcredist part
+    vcredist = "File \""+env['BF_VCREDIST'] + "\"\n"
+    vcredist += "  ExecWait '\"$TEMP\\" + os.path.basename(env['BF_VCREDIST']) + "\" /q'\n"
+    vcredist += "  Delete \"$TEMP\\" + os.path.basename(env['BF_VCREDIST'])+"\""
+    ns_cnt = string.replace(ns_cnt, "[VCREDIST]", vcredist)
 
     tmpnsi = os.path.normpath(install_base_dir+os.sep+env['BF_BUILDDIR']+os.sep+"00.blender_tmp.nsi")
     new_nsis = open(tmpnsi, 'w')
     new_nsis.write(ns_cnt)
     new_nsis.close()
-    print "Preparing nsis file looks ok\n"
+    print "NSIS Installer script created"
 
     os.chdir(start_dir)
-    print "try to launch 'makensis' ...make sure it is on the path \n"
+    print "Launching 'makensis'"
 
     cmdline = "makensis " + "\""+tmpnsi+"\""