Donnerstag, 4. November 2010

NSIS Installer für QT Projekte

Hallo,
wie ich in dem letztem Beitrag versprochen habe, gehe ich diesmal intensiv auf das Thema NSIS Installer ein. Der NSIS (Nullsoft Scriptable Install System) ist sehr vielseitig konfigurierbar und deswegen können die Skripte groß werden. Ich habe mich mit diesem Thema jetzt beschäftigt und ein erstes Skript geschrieben, mit Anregungen von vorhandenen Install-Skripten, mit dem das Erstellen von Setup.exe erleichtert werden soll.
Das habe ich versucht zu erreichen in dem ich an dem Anfang dieses Skriptes mit viel Variablen arbeite. Doch jetzt genug der Einführung, hier das Skript mit den zugehörigen Erklärungen.
Der Installer ist wieder für das Adressbuch Beispiel aus Qt.

!define PRODUCT_NAME "AddressBookSample"
Name "${PRODUCT_NAME}"
!define EXE_NAME "part2.exe"
!define PRODUCT_VERSION "0.2"
!define VER_MAJOR 0
!define VER_MINOR 2
!define VER_REVISION 2
!define VER_BUILD 10
!define PRODUCT_PUBLISHER "Jürgen Mülbert"
!define PRODUCT_WEBSITE 
             "http://www.juergen-muelbert.de"
!define PRODUCT_SUPPORT_SITE 
             "http://www.juergen-muelbert.de/support.html"
!define PRODUCT_DIR_REGKEY 
             "Software\Microsoft\Windows\CurrentVersion\
              App Paths\${EXE_NAME}"
!define PRODUCT_UNINST_KEY 
             "Software\Microsoft\Windows\CurrentVersion\
              Uninstall\${PRODUCT_NAME}"
!define REG_KEY "SOFTWARE\$(^NAME)"
!define INSTALL_ROOT_KEY HKLM
Die meisten oben gezeigten Definitionen erklären sich selbst.HKLM ist der RegistryKey für die "lokale Maschine". Ansonsten gleich weiter...

;--------------------------------
;Configuration
Caption "${PRODUCT_NAME} ${PRODUCT_VERSION} Setup"
BrandingText " © Jürgen Mülbert "
!ifdef OUTFILE
OutFile "${OUTFILE}"
!else
OutFile 
   ..\${PRODUCT_NAME}-${PRODUCT_VERSION}-setup.exe
!endif
;Installer attributes
InstallDir $PROGRAMFILES\${PRODUCT_NAME}
InstallDirRegKey 
  ${INSTALL_ROOT_KEY} "${PRODUCT_DIR_REGKEY}" ""
Wie hier in dem oben genannten Text zu sehen ist wird bereits bei der Konfiguration ausgiebig auf definierten Konstanten zugegriffen. Das zieht sich durch die gesamte Datei wie wir am nächsten Beispiel sehen werden.

;--------------------------------
;Installer Sections
Section !$(secmain) secmain

SetDetailsPrint textonly
DetailPrint "Installing ${PRODUCT_NAME} Core Files..."
SetDetailsPrint listonly
SectionIn 1 2 3 RO
SetShellVarContext all
SetOutPath $INSTDIR
SetOverwrite on
File ${EXE_NAME}
File changelog.txt
File libgcc_s_dw2-1.dll
File mingwm10.dll
File QtCore4.dll
File QtGui4.dll
File addressbook_de.qm

WriteRegStr ${INSTALL_ROOT_KEY} "${REG_KEY}\Components" sec_main 1
SectionEnd
Hier ist als letztes Beispiel die Hauptsektion aufgeführt. In diesem Abschnitt werden alle notwendigen Komponenten installiert damit das Programm überhaupt laufen kann. Wie hier schön zu sehen ist taucht als Variable der PRODUCT_NAME auf. Der wird zwar nur für das Detailprotokoll verwendet, aber immerhin. Die INSTALLDIR wurde schließlich auch mit dem PRODUCT_NAME initialisiert und das viel weiter oben. Übrigens der Befehl SetShellVarContext legt mit der Option all fest das diese Installation für alle Benutzer dieses Computer durchgeführt wird. SetOverwrite on bewirkt alle vorhandenen Dateien werden durch die Dateien im Installationsarchiv überschrieben. Die nächste benutzte Variable ist EXE_NAME, die einfach den Namen des ausführbaren Programms enthält. Der Inhalt der Datei changelog.txt wird nach der Installation angezeigt:
!define MUI_FINISHPAGE_SHOWREADME $INSTDIR\changelog.txt
!define MUI_FINISHPAGE_SHOWREADME_TEXT changelog.txt
Die DLL's sind notwendig. Das sind die zwei DLL's mit dem QT kompiliert wurde. Ohne die benutzten Qt-Bibliotheken würde es natürlich auch nicht funktionieren. Am Ende der Dateiliste steht noch die Übersetzungsdatei für die deutschen Texte des Adressbuch Beispiels. Zum Schluß dieses Abschnitts wird noch in die Windows-Registry geschrieben das die Hauptkomponente installiert wurden.
Wie gesagt das zieht sich so durch das gesamte Skript, das mit diesem Link vollständig zu sehen ist. Auf meiner Website gibt es jetzt die Projekte JMNSISHelper und NSIS4Java zu diesem Thema.