# # Filename: gramps.nsi # # Description: Nullsoft Installer (NSIS) file to build Windows installer: # Updated: 2006-07-26 13:12:28-0400 # Author: Steve Hall [ digitect dancingpaper com ] # # Requires: NSIS version 2.0 or later. # Notes: # o WARNING: if you make changes to this script, look out for $INSTDIR # to be valid, because this line is very dangerous: RMDir /r $INSTDIR # o WARNING: Except the uninstaller. That re-paths for some reason. # # Installer Attributes # 0. Base Settings {{{1 # version numbers !define GRAMPS_VER_MAJOR $%VERSION% !define GRAMPS_VER_MINOR $%VERSIONSUB% !define GRAMPS_VER_POINT $%VERSIONPT% # adds Native Language Support !define HAVE_NLS # output file Name "GRAMPS" OutFile gramps-${GRAMPS_VER_MAJOR}.${GRAMPS_VER_MINOR}.${GRAMPS_VER_POINT}.exe # self ensure we don't have a corrupted file CRCCheck on # compression SetCompress auto # zlib good, bzip2 better, lzma best (and slowest, whew.) SetCompressor lzma # reference existing store if possible SetDatablockOptimize on # UPX # comment next line if you don't have UPX (http://upx.sourceforge.net) !packhdr temp.dat "upx --best --compress-icons=0 temp.dat" # don't allow installation into C:\ AllowRootDirInstall false # install details color scheme InstallColors /windows # background BGGradient off # adds an XP manifest XPStyle on # default install path InstallDir $PROGRAMFILES\gramps # Remember install folder InstallDirRegKey HKCU "Software\${MUI_PRODUCT}" "" # Remember the installer language !define MUI_LANGDLL_REGISTRY_ROOT "HKCU" !define MUI_LANGDLL_REGISTRY_KEY "Software\${MUI_PRODUCT}" !define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language" # types of installs we can perform InstType Typical InstType Minimal InstType Full SilentInstall normal # 1. Header file (Begin Modern User Interface) {{{1 !include "MUI.nsh" # 2. Interface Configuration {{{1 # installer/uninstaller icons (these must match in size!) #!define MUI_ICON "classic-install.ico" #!define MUI_UNICON "classic-uninstall.ico" # splash, header graphics (same for both!) !define MUI_HEADERIMAGE #!define MUI_HEADERIMAGE_BITMAP "win.bmp" #!define MUI_WELCOMEFINISHPAGE_BITMAP "nsis-splash.bmp" !define MUI_LICENSEPAGE_BUTTON $(^AgreeBtn) !define MUI_LICENSEPAGE_RADIOBUTTONS !define MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT $(^AcceptBtn) !define MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE $(^DontAcceptBtn) #!define MUI_COMPONENTSPAGE_CHECKBITMAP "nsis-checkboxes.bmp" # use small description box below components (not adjacent) !define MUI_COMPONENTSPAGE_SMALLDESC !define MUI_DIRECTORYPAGE_TEXT_TOP $(^DirText) !define MUI_DIRECTORYPAGE_TEXT_DESTINATION $(^DirBrowseText) !define MUI_DIRECTORYPAGE_VERIFYONLEAVE !define MUI_FINISHPAGE_RUN "python" !define MUI_FINISHPAGE_RUN_PARAMETERS "$\"$INSTDIR\gramps.py$\"" !define MUI_ABORTWARNING # 3. Pages {{{1 !insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_LICENSE "..\COPYING" !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH # Uninstaller !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES # 4. Custom functions {{{1 # 5. Language files {{{1 # Languages # TODO: These are pretty badly broken at the moment. # Note: This appears to be due to building on Win95 which does not # support Unicode: # (http://nsis.sf.net/archive/nsisweb.php?page=247&instances=0,235) # # So what happens if we use only ASCII? # #!insertmacro MUI_LANGUAGE "Arabic" #!insertmacro MUI_LANGUAGE "Bulgarian" #!insertmacro MUI_LANGUAGE "Catalan" #!insertmacro MUI_LANGUAGE "Croatian" #!insertmacro MUI_LANGUAGE "Czech" !insertmacro MUI_LANGUAGE "Danish" #!insertmacro MUI_LANGUAGE "Default" !insertmacro MUI_LANGUAGE "Dutch" !insertmacro MUI_LANGUAGE "English" #!insertmacro MUI_LANGUAGE "Estonian" #!insertmacro MUI_LANGUAGE "Farsi" #!insertmacro MUI_LANGUAGE "Finnish" !insertmacro MUI_LANGUAGE "French" !insertmacro MUI_LANGUAGE "German" #!insertmacro MUI_LANGUAGE "Greek" #!insertmacro MUI_LANGUAGE "Hebrew" #!insertmacro MUI_LANGUAGE "Hungarian" #!insertmacro MUI_LANGUAGE "Indonesian" !insertmacro MUI_LANGUAGE "Italian" #!insertmacro MUI_LANGUAGE "Japanese" #!insertmacro MUI_LANGUAGE "Korean" #!insertmacro MUI_LANGUAGE "Latvian" #!insertmacro MUI_LANGUAGE "Lithuanian" #!insertmacro MUI_LANGUAGE "Macedonian" #!insertmacro MUI_LANGUAGE "Norwegian" #!insertmacro MUI_LANGUAGE "Polish" !insertmacro MUI_LANGUAGE "Portuguese" !insertmacro MUI_LANGUAGE "PortugueseBR" #!insertmacro MUI_LANGUAGE "Romanian" #!insertmacro MUI_LANGUAGE "Russian" #!insertmacro MUI_LANGUAGE "Serbian" #!insertmacro MUI_LANGUAGE "SerbianLatin" #!insertmacro MUI_LANGUAGE "SimpChinese" #!insertmacro MUI_LANGUAGE "Slovak" #!insertmacro MUI_LANGUAGE "Slovenian" !insertmacro MUI_LANGUAGE "Spanish" #!insertmacro MUI_LANGUAGE "Swedish" #!insertmacro MUI_LANGUAGE "Thai" #!insertmacro MUI_LANGUAGE "TradChinese" #!insertmacro MUI_LANGUAGE "Turkish" #!insertmacro MUI_LANGUAGE "Ukrainian" # 6. Reserve Files {{{1 # 1}}} # 7a. Sections # Program Files {{{1 ###################################################################### Section "Program files (required)" Main SectionIn 1 2 3 RO Call WarnDirExists SetOutPath $INSTDIR File /r ..\src\*.* #File /r ..\nsis\gramps.ico SectionEnd # Icons, menus and shortcuts {{{1 SubSection "Icons, menus and shortcuts" MenusAndIcons Section "Add GRAMPS to the Start Menu" MenuStart SectionIn 1 3 # determines "Start In" location for shortcuts SetOutPath $INSTDIR CreateDirectory "$SMPROGRAMS\GRAMPS\" CreateShortCut "$SMPROGRAMS\GRAMPS\GRAMPS.lnk" "$3" "$\"$INSTDIR\gramps.py$\"" "$INSTDIR\images\ped24.ico" "0" "" "" "GRAMPS" WriteINIStr "$SMPROGRAMS\GRAMPS\GRAMPS Website.url" "InternetShortcut" "URL" "http://www.gramps-project.org/" CreateShortCut "$SMPROGRAMS\GRAMPS\Uninstall GRAMPS.lnk" "$\"$INSTDIR\uninstall.exe$\"" "" "" "0" "" "" "Uninstall GRAMPS" SectionEnd Section "Add Desktop icon" Desktop #SectionIn 1 3 # determines "Start In" location for shortcuts SetOutPath $INSTDIR CreateShortCut "$DESKTOP\GRAMPS.lnk" "$3" "$\"$INSTDIR\gramps.py$\"" "$INSTDIR\images\ped24.ico" "0" "" "" "GRAMPS" SectionEnd SubSectionEnd # Uninstall {{{1 ###################################################################### Section Uninstall # ask first MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 \ "Completely remove installation? $\n\ (Delete folder $INSTDIR ) " \ IDNO unQuit IDYES unContinue unQuit: Abort unContinue: ClearErrors RMDir /r $INSTDIR Call un.StartMenu Call un.Desktop unEnd: SectionEnd # 1}}} # 7b. Functions # Installer {{{1 ##################################################################### Function .onInit ; test for dependencies MessageBox MB_OK "Testing dependencies..." ; look for python.exe ; NOTE: This is set to $3 if it exists. ; on path SearchPath $3 python.exe #MessageBox MB_OK "DEBUG: Testing python.exe on path...$\n$\nFound: $\"$3$\"" IfFileExists $3 HavePython 0 ; registry keys (these are confirmed possibilities) ; reg key ReadRegStr $3 HKCR 'Applications\python.exe\shell\open\command' "" StrCpy $3 "$3python.exe" ; append "python.exe" IfFileExists $3 HavePython 0 ; reg key ReadRegStr $3 HKLM 'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\python.exe' "" StrCpy $3 "$3python.exe" ; append "python.exe" IfFileExists $3 HavePython 0 ; reg key ReadRegStr $3 HKLM 'SOFTWARE\Python\PythonCore\2.4' "" StrCpy $3 "$3python.exe" ; append "python.exe" IfFileExists $3 HavePython 0 ; reg key ReadRegStr $3 HKLM 'SOFTWARE\Python\PythonCore\2.4\InstallPath' "" StrCpy $3 "$3python.exe" ; append "python.exe" IfFileExists $3 HavePython 0 ; reg key ReadRegStr $3 HKCR 'Python.File\shell\open\command' "" StrCpy $3 "$3python.exe" ; append "python.exe" IfFileExists $3 HavePython 0 ; reg key ReadRegStr $3 HKCU 'Software\Classes\Python.File\shell\open\command' "" StrCpy $3 "$3python.exe" ; append "python.exe" IfFileExists $3 HavePython 0 ; reg key ReadRegStr $3 HKCU 'Software\Microsoft\Windows\Current version\App Paths\Python.exe' "" StrCpy $3 "$3python.exe" ; append "python.exe" IfFileExists $3 HavePython 0 ; reg key ReadRegStr $3 HKCU 'Software\Microsoft\Windows\ShellNoRoam\MUICache (data:python)' "" StrCpy $3 "$3python.exe" ; append "python.exe" IfFileExists $3 HavePython 0 ; reg key ReadRegStr $3 HKCU 'Software\Python\PythonCore\2.4\InstallPath' "" StrCpy $3 "$3python.exe" ; append "python.exe" IfFileExists $3 HavePython 0 ; reg key ReadRegStr $3 HKCU 'Software\Python\PythonCore\2.4\PythonPath' "" StrCpy $3 "$3python.exe" ; append "python.exe" IfFileExists $3 HavePython 0 ; TODO: request path from user/browse (can NSIS do this?) MessageBox MB_OK "Python not found, unable to continue." Abort HavePython: ; extract gcheck SetOutPath $TEMP #MessageBox MB_OK "DEBUG: $$TEMP location found:$\n$\n $TEMP" File gcheck.py ; set INI output location ($1) StrCpy $1 "$TEMP\gramps-install.ini" #MessageBox MB_OK "DEBUG: Attempting to run:$\n$\n $\"$3$\" $TEMP\gcheck.py $1" ; run gcheck Exec '"$3" $TEMP\gcheck.py $1' ; Note The Exec above is a fork, meaning the following file test ; will fail because it happens faster than the Exec can run ; to create it! DetailPrint "pausing..." Sleep 1000 ; verify INI created IfFileExists $1 YesINI 0 MessageBox MB_OK "Dependency test INI creation failed, unable to continue." Abort YesINI: ; verify environment test results ; GTK+ ReadINIStr $0 $1 tests gtk StrCmp $0 "yes" HaveGTK 0 MessageBox MB_OK "GTK+ not installed, unable to continue." Abort HaveGTK: ; pygtk ReadINIStr $0 $1 tests pygtk StrCmp $0 "yes" Havepygtk 0 MessageBox MB_OK "pygtk not installed, unable to continue." Abort Havepygtk: ; glade ReadINIStr $0 $1 tests glade StrCmp $0 "yes" Haveglade 0 MessageBox MB_OK "glade not installed, unable to continue." Abort Haveglade: ; pycairo ReadINIStr $0 $1 tests pycairo StrCmp $0 "yes" Havepycairo 0 MessageBox MB_OK "pycairo not installed, unable to continue." Abort Havepycairo: #!insertmacro MUI_LANGDLL_DISPLAY # default install directory ($INSTDIR) StrCpy $INSTDIR $PROGRAMFILES\gramps FunctionEnd Function .onInstSuccess # write uninstaller WriteUninstaller $INSTDIR\uninstall.exe FunctionEnd Function .onInstFailed MessageBox MB_OK|MB_ICONEXCLAMATION "Installation failed." FunctionEnd Function WarnDirExists # warn if dir already exists IfFileExists $INSTDIR\*.* DirExists DirExistsOK DirExists: MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 \ "Install over existing?" \ IDYES DirExistsOK Quit DirExistsOK: FunctionEnd # Uninstaller {{{1 ##################################################################### Function un.onUnInstSuccess FunctionEnd Function un.StartMenu IfFileExists "$SMPROGRAMS\GRAMPS" 0 unStartMenuFine RMDir /r "$SMPROGRAMS\GRAMPS\" unStartMenuFine: FunctionEnd Function un.Desktop IfFileExists "$DESKTOP\GRAMPS.lnk" 0 unNoDesktop Delete "$DESKTOP\GRAMPS.lnk" unNoDesktop: FunctionEnd # 1}}} # 8. Section Descriptions {{{1 ###################################################################### # (must be last) LangString DESC_Main ${LANG_ENGLISH} "Main program files (required)." LangString DESC_MenusAndIcons ${LANG_ENGLISH} "General Desktop and Start Menu shortcut options." LangString DESC_Desktop ${LANG_ENGLISH} "Add icon to the Desktop." LangString DESC_MenuStart ${LANG_ENGLISH} "Add icons to the Start Menu." LangString DESC_Prog ${LANG_ENGLISH} "GRAMPS..." !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${Main} $(DESC_Main) !insertmacro MUI_DESCRIPTION_TEXT ${MenusAndIcons} $(DESC_MenusAndIcons) !insertmacro MUI_DESCRIPTION_TEXT ${Desktop} $(DESC_Desktop) !insertmacro MUI_DESCRIPTION_TEXT ${MenuStart} $(DESC_MenuStart) !insertmacro MUI_DESCRIPTION_TEXT ${Prog} $(DESC_Prog) !insertmacro MUI_FUNCTION_DESCRIPTION_END # 1}}} # vim:foldmethod=marker:noexpandtab