[Gtk-sharp-list] Problems with Gtk# 0.10 installer for Windows

Mathias Hasselmann mathias.hasselmann@gmx.de
Wed, 02 Jul 2003 16:51:55 +0200


This is a multi-part message in MIME format.
--------------030500070405080002010204
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit

Shane Hyde wrote:

> Hi,
> 
> Just some feedback about the 0.10 Win32 installer.
> 
> 1. Even if Mono is installed, don't install the assemblies to Mono, 
> as it becomes (almost) impossible to use GTK# with .NET as System.* 
> assemblies get picked up with GTK# ones.

Valid point. But the installer allows you to select any installation 
location for the assemblies (at least I designed it that way ;-). Mono's 
directory was choose 'cause I don't know a good way to tell Mono to 
search assemblies outside of it's installation directory. Ok. There is 
the MONO_PATH variable? But how to set this variable on the Windows 
platform? C:\autoexec.bat munging? Behave! Well, maybe there is a hidden 
registry entry to modify the default environment I'm not aware of.

> 2. libglade is installed in the wrong directory, and is wrongly named
> (should be libglade-2.0-0.dll)

D'uh. Same is true for libxml2.dll. Fixed that. New NSIS script attached.

> 3. GTK# should not include GTK runtime.  Nor should it include a 
> preinstalled theme.
 > 4. GTK# should install into an existing GTK Runtime.  This makes the
 > most sense, and allows for all the Mono/.NET stuff to be removed from
 > the installer.

This is a really sensible point. Personally I also prefer a package 
oriented installation scheme - as we know it from Unix. So I that's what 
I did with the first versions of the 0.10 installer. But then I was told 
from different sides that the Gtk+ runtime should be included sind 
"Windows users don't like it to run four  installers (.NET/Mono, Gtk+, 
Gtk#, $APPLICATION) to get a single application running". So what's the 
right way to do this? Gtk# installer with Gtk+ runtime? Gtk# installer 
depending on the Gtk+ runtime installer? Both flavors and let the users 
vote (for instance by measuring download rates)?

For the multiple installer problem I suggested to use a component setup 
approach as I'm using for some software I do at work, or like Microsoft 
did for Visual Studio .NET (see the attached pictures for example). 
Could donate code for that purpose. But isn't this component setup thing 
too much power user centric?

 > Changing the theme should ask the user beforehand.

Maybe. Have choosen the gtkwimp theme as default since IHMO this one 
provides best intgration of Gtk+ into the Windows platform.

 > Doing this also fixes all the path munging.

AFAIK the need for %PATH% munging is not affected by this: The patch for 
Gtk.Application.Init is needed, since Gtk# depends on pinvoking the Gtk+ 
libraries. To do this successfully we must allow all Gtk# applications 
to find the Gtk+ libraries. Possible solutions:

	1) Gtk+ is installed in %SystemRoot%\System32
	2) every Gtk# application adjust HLKM\SOFTWARE\Microsoft\
	   Windows\App Paths\$APPNAME\Path
	3) Gtk+ globally fixes %PATH% on installation

IHMO "solution" 1 and 2 definitly are out of discussion. Solution 3 
doesn't work since appearently nobody in the Gtk+/Gtk# community knows, 
how to cleanly set global environment variables on the Windows platform.

> 5. If Mono is not installed, the default install dir is blank.

Yet another prove for Dijkstra being right, when considering "goto" 
being harmful. ;-)

Ciao,
Mathias

--------------030500070405080002010204
Content-Type: image/png;
 name="ComponentSetup.png"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
 filename="ComponentSetup.png"

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
--------------030500070405080002010204
Content-Type: image/png;
 name="VisualStudio.png"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
 filename="VisualStudio.png"

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
gg==
--------------030500070405080002010204
Content-Type: text/plain;
 name="gtksharp.nsi"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="gtksharp.nsi"

# =====================================================================
# Installation script for Gtk#
# Copyright (C) 2003 Mathias Hasselmann <mathias@taschenorakel.de>
# ---------------------------------------------------------------------
# Author: Mathias Hasselmann
# ---------------------------------------------------------------------
# Plugins: AdvSplash,ModernUI
# Last modified: 2003/06/24
# ---------------------------------------------------------------------
# Globals:
#   $0 - Location of the .NET Framework
# =====================================================================

# *********************************************************************
# INSTALLER SETTINGS
# *********************************************************************

!define Product "Gtk# Runtime and Development Environment"
!define Vendor "http://gtk-sharp.sf.net/"
!define Version "0.10"
!define Build "-5"

!define Package "Gtk#-${Version}"
!define PackageKey "Software\Gtk#\${Version}"
!define UninstallBase "Software\Microsoft\Windows\CurrentVersion\Uninstall"
!define UninstallKey "${UninstallBase}\${Product}"
!define UninstallApp "$INSTDIR\gtk-sharp-${Version}.uninstall.exe"

# =====================================================================
# Output options
# =====================================================================

SetCompressor bzip2
SetCompress force
CRCCheck force

InstallDir "$PROGRAMFILES\${Package}"
LicenseData "gtk-sharp-${Version}\COPYING"
OutFile "gtk-sharp-${Version}-win32${Build}.exe"

# =====================================================================
# Modern UI options
# =====================================================================

!define MUI_VENDOR  "${Vendor}"
!define MUI_PRODUCT "${Product}"
!define MUI_VERSION "${Version}"
#!define MUI_ICON "images\install.ico"
#!define MUI_UNICON "images\uninstall.ico"
!define MUI_ABORTWARNING

# Custom event handlers
# ---------------------------------------------------------------------

# Pages of the installation wizard
# ---------------------------------------------------------------------
!define MUI_CUSTOMPAGECOMMANDS
!define MUI_WELCOMEPAGE
!define MUI_LICENSEPAGE
!define MUI_DIRECTORYPAGE
!define MUI_FINISHPAGE
!define MUI_FINISHPAGE_NOAUTOCLOSE

# Pages of the deinstallation wizard
# ---------------------------------------------------------------------
!define MUI_UNINSTALLER
!define MUI_UNCONFIRMPAGE

# Include modern UI code
# ---------------------------------------------------------------------
!include "MUI.nsh"
!insertmacro MUI_LANGUAGE "English"

!insertmacro MUI_PAGECOMMAND_WELCOME
!insertmacro MUI_PAGECOMMAND_LICENSE
Page custom MonoSelector "" ""
Page custom DotNETSelector "" ""
!insertmacro MUI_PAGECOMMAND_DIRECTORY
!insertmacro MUI_PAGECOMMAND_INSTFILES
!insertmacro MUI_PAGECOMMAND_FINISH

!insertmacro MUI_SECTIONS_FINISHHEADER

# *********************************************************************
# INSTALLER SECTIONS
# *********************************************************************

# =====================================================================
# This section installs the library on the computer
# =====================================================================

!macro InstallAssembly FILENAME
  File ${FILENAME}

  Push $0
  Push ${FILENAME}
  Call InstallAssembly
!macroend

Section "!Gtk+ Runtime Environment"
  SetOutPath $TEMP
    File packages\GtkRuntime.exe

  SetOutPath $INSTDIR
    DetailPrint "Installing Gtk+ Runtime Environment..."
    nsExec::ExecToLog "$TEMP\GtkRuntime.exe -y"
    Pop $R0
    Delete "$TEMP\GtkRuntime.exe"

  SetOutPath $INSTDIR\share\themes\Default\gtk-2.0
    File gtkrc

SectionEnd

Section "!libxml2"
  SetOutPath "$INSTDIR\lib"
    File libxml2.dll
SectionEnd

Section "!libglade"
  SetOutPath "$INSTDIR\lib"
    File /oname=libglade-2.0-0.dll libglade.dll
SectionEnd

Section "!${Product} ${Version}"
  DetailPrint "Installing Gtk# Runtime Environment"

  WriteRegStr HKLM "${PackageKey}" Path $INSTDIR
  WriteRegStr HKLM "${PackageKey}" Version ${Version}

  SetOutPath $INSTDIR
    File gtksharp.snk

  SetOutPath $INSTDIR\lib
    !insertmacro InstallAssembly glib-sharp.dll
    !insertmacro InstallAssembly pango-sharp.dll
    !insertmacro InstallAssembly atk-sharp.dll
    !insertmacro InstallAssembly gdk-sharp.dll
    !insertmacro InstallAssembly gtk-sharp.dll
    !insertmacro InstallAssembly glade-sharp.dll
    File gtksharpglue.dll
SectionEnd

# =====================================================================
# This section creates the uninstall program
# =====================================================================

Section "-UninstallProgram"
  WriteUninstaller "${UninstallApp}"

# Some essential information describing program operation
# ---------------------------------------------------------------------
  WriteRegStr HKLM "${UninstallKey}" UninstallString "${UninstallApp}"
  WriteRegDWORD HKLM "${UninstallKey}" NoModify 1
  WriteRegDWORD HKLM "${UninstallKey}" NoRepair 1

# Some support information for the product
# ---------------------------------------------------------------------
  WriteRegStr HKLM "${UninstallKey}" InstallLocation "$INSTDIR"
  WriteRegStr HKLM "${UninstallKey}" DisplayName "${Product} ${Version}"
  WriteRegStr HKLM "${UninstallKey}" DisplayVersion "${Version}"
  WriteRegStr HKLM "${UninstallKey}" Publisher "${Vendor}"
  WriteRegStr HKLM "${UninstallKey}" URLInfoAbout "http://gtk-sharp.sf.net/"
  WriteRegStr HKLM "${UninstallKey}" URLUpdateInfo "http://sf.net/project/showfiles.php?group_id=40240"
  WriteRegStr HKLM "${UninstallKey}" HelpLink "http://gtk-sharp.sf.net/faq.html"
  WriteRegStr HKLM "${UninstallKey}" Readme "http://www.nullenvoid.com/gtksharp/wiki/"
SectionEnd

# =====================================================================
# This section removes the program from your computer
# =====================================================================

Section "Uninstall"
# Cleanup the program folder
# ---------------------------------------------------------------------
MessageBox MB_OK|MB_ICONEXCLAMATION "TODO:$\n - Remove Gtk+ Runtime Files$\n - Remove Assemblies from native and global cache"

  Delete "$INSTDIR\lib\libxml2.dll"
  Delete "$INSTDIR\lib\libglade.dll"
  Delete "$INSTDIR\lib\gtksharpglue.dll"

  Delete "$INSTDIR\lib\glib-sharp.dll"
  Delete "$INSTDIR\lib\pango-sharp.dll"
  Delete "$INSTDIR\lib\atk-sharp.dll"
  Delete "$INSTDIR\lib\gdk-sharp.dll"
  Delete "$INSTDIR\lib\gtk-sharp.dll"
  Delete "$INSTDIR\lib\glade-sharp.dll"
  Delete "${UninstallApp}"

  RMDir  "$INSTDIR\lib"
  RMDir  "$INSTDIR"

# Cleanup the registry
# ---------------------------------------------------------------------
  DeleteRegKey HKLM "${PackageKey}"
  DeleteRegKey HKLM "${UninstallKey}"
SectionEnd

# *********************************************************************
# UTILITY FUNCTIONS
# *********************************************************************

# =====================================================================
# Extract the next item from a string storing a vbar-separated list.
# ---------------------------------------------------------------------
# Arguments:
#   iFirst - Character index of list's current item.
#   strItemList - The vbar-separated item list.
#
# Return Values:
#   iLast - Character index of the next list item.
#   strItem - The current item or the empty string if no more items
#             exist.
# ---------------------------------------------------------------------
# Example:
#
#   StrCpy $R0 0
#   StrCpy $R1 "item1|item2|item3"
#
# Enum:
#   Push $R0 	; iFirst
#   Push $R1	; strItemList
#   Call EnumItems
#   Pop $R1	; strItem
#   Pop $R0	; iLast
#
#   StrCmp $R1 "" Done
#   MessageBox MB_OK "Item: $R1"
#   Goto Enum
#
# Done:
#
# =====================================================================

Function EnumItems		; Stack: [iFirst|strItemList]
  Exch $R0	; strItemList	; Stack: [iFirst|$R0]
  Exch				; Stack: [$R0|iFirst]
  Exch $R1	; iFirst	; Stack: [$R0|$R1]
  Push $R2	; iLast		; Stack: [$R0|$R1|$R2]
  Push $R3	; iCount	; Stack: [$R0|$R1|$R2|$R3]
  Push $R4	; ch		; Stack: [$R0|$R1|$R2|$R3|$R4]

  StrCpy $R2 $R1		; iLast = iFirst
  StrLen $R3 $R0		; iCount = strlen(strItemList)

EnumChars:
  IntCmp $R2 $R3 Done "" Done
  StrCpy $R4 $R0 1 $R2		; ch = strItemList[iLast]
  IntOp $R2 $R2 + 1		; iLast = iLast + 1

  StrCmp $R4 "|" Done EnumChars

Done:
  IntOp $R3 $R2 - $R1		; iCount = iLast - iFirst
  StrCpy $R0 $R0 $R3 $R1	; strItem = SubStr(strItemList, iFirst, iCount)
  StrCpy $R1 $R2		; iFirst = iLast

  IntOp $R3 $R3 - 1		; remove trailing separator
  StrCpy $R4 $R0 1 $R3
  StrCmp $R4 "|" "" Leave
  StrCpy $R0 $R0 $R3

Leave:	 			; Stack: [$R0|$R1|$R2|$R3|$R4]
  Pop $R4			; Stack: [$R0|$R1|$R2|$R3]
  Pop $R3			; Stack: [$R0|$R1|$R2]
  Pop $R2			; Stack: [$R0|$R1]
  Exch $R1			; Stack: [$R0|iLast]
  Exch				; Stack: [iLast|$R0]
  Exch $R0			; Stack: [iLast|strItem]
FunctionEnd

# =====================================================================
# Install an assembly in the .NET Framework's native image and
# global assembly cache.
# ---------------------------------------------------------------------
# Arguments:
#   strFrameworkList - Vbar-separated list of .NET framework paths.
#   strAssemblyPath - Path of the file storing the assembly.
# =====================================================================

Function InstallAssembly
  Exch $R0	; strAssemblyPath
  Exch
  Exch $R1	; strFrameworkList
  Push $R2	; iFirst
  Push $R3	; strFrameWorkPath
  Push $R4	; waste

  StrCpy $R2 0	; iFirst = 0

EnumFrameworks:
  Push $R2	; iFirst
  Push $R1	; strFrameworkList
  Call EnumItems
  Pop $R3	; strFrameworkPath
  Pop $R2	; iLast

  StrCmp $R3 "" Done NativeImageCache

NativeImageCache:
  IfFileExists '$R3\ngen.exe' +1 Next
    DetailPrint 'Registering $R0 in native image cache...'
    nsExec::ExecToLog '"$R3\ngen.exe" /nologo "$R0"'
    Pop $R4

Next:  
  Goto EnumFrameworks

Done:
  nsExec::ExecToLog '"$TEMP\mygacutil.exe" install "$R0"'
  Pop $R4

  Pop $R4
  Pop $R3
  Pop $R2
  Pop $R1
  Pop $R0
FunctionEnd

# *********************************************************************
# CALLBACK FUNCTIONS
# *********************************************************************

# =====================================================================
# This callback is called on initialization of the installer.
# Here it displays a splash screen and it initializes $0 with the
# short product name.
# =====================================================================

Function .onInit
  Push $R0

  ReserveFile splash.bmp MonoSelector.ini MonoSelector.ini mygacutil.exe

# Display the splash screen
# ---------------------------------------------------------------------
  GetTempFileName $R0
  File "/oname=$R0" splash.bmp
  AdvSplash::Show 5000 600 400 -1 $R0
  Delete "$R0"

# Extract GUI descriptions
# ---------------------------------------------------------------------
  !insertmacro MUI_INSTALLOPTIONS_EXTRACT MonoSelector.ini
  !insertmacro MUI_INSTALLOPTIONS_EXTRACT DOTNetSelector.ini

# Extract mygacutil
# ---------------------------------------------------------------------
  File "/oname=$TEMP\mygacutil.exe" mygacutil.exe

  Pop $R0
FunctionEnd

# =====================================================================
# This callback is called to create the MonoSelector page. This page
# allows selection of a Mono SDK as installation location. If no copy
# of Mono is found, no page is displayed and "$PROGRAMFILES\${Package}" 
# is used as installation location. If exactly one copy is found, also
# no page is displayed, but the SDK's location is used as installation 
# location. If multiply installations of Mono have been found a page
# allowing the selection of one of them.
# =====================================================================

Function MonoSelector
  Push $R0 ; strListItems
  Push $R1 ; iMonoKey
  Push $R2 ; iMonoCount
  Push $R3 ; strMonoVersion/strMonoPath
  Push $R4 ; strDefaultCLR

# Make a default selection for the case Mono is not found
# ---------------------------------------------------------------------
  !insertmacro MUI_INSTALLOPTIONS_WRITE "MonoSelector.ini" \
    "MonoLocations" "Path0" "$PROGRAMFILES\${Package}"

# Figure out default CLR
# ---------------------------------------------------------------------
  ReadRegStr $R4 HKLM "SOFTWARE\Mono" "DefaultCLR"

# Enumerate the Mono installations
# ---------------------------------------------------------------------
  StrCpy $R0 ""
  StrCpy $R1 0
  StrCpy $R2 0

EnumVersions:
  EnumRegKey $R3 HKLM "SOFTWARE\Mono" $R1
  IntOp $R1 $R1 + 1
  StrCmp $R3 "" EndOfVersions

  ClearErrors
  ReadRegStr $R3 HKLM "SOFTWARE\Mono\$R3" "SdkInstallRoot"
  IfErrors EnumVersions
  IfFileExists "$R3\*.*" MonoFound EnumVersions

MonoFound:
  IntOp $R2 $R2 + 1
  StrCpy $R0 "$R0$R3|"

# Select ListItem, if current CLR is DefaultCLR
# ---------------------------------------------------------------------
  StrCmp $R2 $R4 EnumVersions
  !insertmacro MUI_INSTALLOPTIONS_WRITE \
    "MonoSelector.ini" "Field 2" "State" $R3

  Goto EnumVersions

EndOfVersions:

# Fill the listbox
# ---------------------------------------------------------------------
  StrCpy $R0 $R0 -1

  !insertmacro MUI_INSTALLOPTIONS_WRITE \
    "MonoSelector.ini" "Field 2" "ListItems" "$R0"

# Display the page only, if more than one version has been found
# ---------------------------------------------------------------------
  IntCmp $R2 0 RestoreStack
  IntCmp $R2 1 SetInstdir

  !insertmacro MUI_HEADER_TEXT "Select Mono Runtime" \
    "Choose the Mono Runtime into which to integrate ${Product}."
  !insertmacro MUI_INSTALLOPTIONS_INITDIALOG "MonoSelector.ini"
  !insertmacro MUI_INSTALLOPTIONS_SHOW

# Adjust installation directory
# ---------------------------------------------------------------------
SetInstdir:
  !insertmacro MUI_INSTALLOPTIONS_READ $R0 \
    "MonoSelector.ini" "Field 2" "State"
  StrCpy $INSTDIR $R0

# Restore stack
# ---------------------------------------------------------------------
RestoreStack:
  Pop $R4
  Pop $R3
  Pop $R2
  Pop $R1
  Pop $R0
FunctionEnd

# =====================================================================
# This callback is called to create the DotNETSelector page.
# =====================================================================

Function DotNETSelector
  Push $R0 ; strInstallRoot
  Push $R1 ; iDotNETCount
  Push $R2 ; strListItems
  Push $R3 ; iVersionKey
  Push $R4 ; strVersion
  Push $R5 ; iPolicy
  Push $R6 ; strPolicy

# Figure out the .NET installation root
# ---------------------------------------------------------------------
  StrCpy $0 ""
  ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\.NETFramework" InstallRoot
  IfFileExists "$R0\*.*" "" Done

# Normalize InstallRoot
# ---------------------------------------------------------------------
  Push $R0
  Exch $EXEDIR
  Exch $EXEDIR
  Pop $R0

# Enumerate the .NET Frameworks installed
# ---------------------------------------------------------------------
  StrCpy $R1 0
  StrCpy $R2 ""
  StrCpy $R3 0

EnumVersions:
  EnumRegKey $R4 HKLM "SOFTWARE\Microsoft\.NETFramework\policy" $R3
  IntOp $R3 $R3 + 1
  StrCmp $R4 "" EndOfVersions
  StrCpy $R5 0

EnumPolicies:
  EnumRegValue $R6 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\$R4" $R5
  IntOp $R5 $R5 + 1
  StrCmp $R6 "" EnumVersions

  IfFileExists "$R0\$R4.$R6\*.*" DotNETFound EnumPolicies

DotNETFound:
  IntOp $R1 $R1 + 1
  StrCpy $R2 "$R2$R0\$R4.$R6|"
  Goto EnumPolicies

EndOfVersions:

# Fill the listbox
# ---------------------------------------------------------------------
  StrCpy $R0 $R0 -1

  !insertmacro MUI_INSTALLOPTIONS_WRITE \
    "DotNETSelector.ini" "Field 2" "ListItems" $R2
  !insertmacro MUI_INSTALLOPTIONS_WRITE \
    "DotNETSelector.ini" "Field 2" "State" $R2

# Display the page only, if more than one version has been found
# ---------------------------------------------------------------------
  IntCmp $R1 2 "" Done

  !insertmacro MUI_HEADER_TEXT "Select .NET Frameworks" \
    "Choose the .NET Frameworks into which to integrate ${Product}."
  !insertmacro MUI_INSTALLOPTIONS_INITDIALOG "DotNETSelector.ini"
  !insertmacro MUI_INSTALLOPTIONS_SHOW

Done:
# Adjust installation directory
# ---------------------------------------------------------------------
  !insertmacro MUI_INSTALLOPTIONS_READ $0 \
    "DotNETSelector.ini" "Field 2" "State"

# Restore stack
# ---------------------------------------------------------------------
  Pop $R4
  Pop $R3
  Pop $R2
  Pop $R1
  Pop $R0
FunctionEnd

--------------030500070405080002010204--