Autor Beitrag
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 16.08.04 12:07 
Hallo!

Ich persönlich finde es sehr schön, besonders bei größeren Projekten, die aus mehreren Programmen bestehen und evtl. noch komprimiert werden sollen, wenn ich das alles in eine Batch-Datei packen kann. Dann rufe ich diese einmal auf und habe schon alles kompiliert und ggf. auch die Setup-Files erstellt.

Zunächst etwas zur Kompatibilität: Die Batch-Skripte sind größtenteils unter Windows ab 95 lauffähig. Lediglich die automatische Überprüfung, ob alle Dateien erstellt wurden, geht erst unter Windows 2000/XP. (Hinweise, wie das unter 9x/ME geht, also die Anwendung arithmetischer Operationen auf Umgebungsvariablen, bitte per PN an mich...)

Zum Komprimieren meiner Projekte benutze ich UPX, den Ultimate Packer for eXecutables, daher stelle ich auch dessen Integration vor, ihr bekommt UPX hier: upx.sourceforge.net/

Für die Setup-Erstellung nutze ich InnoSetup, weil das die schnellsten Setups erstellt, die ich kenne (skriptgesteuerte meine ich) und trotzdem sehr leistungsfähig ist, außerdem ist es noch kostenlos, wenn das auch nicht mein wichtigstes Kriterium ist. *Lob* :-) Ihr bekommt es hier: www.jrsoftware.org/isinfo.php

In meiner Batch-Datei gibt es also 6 Abschnitte:
  1. Kompilieren der Projekte
  2. Komprimieren der Projekte
  3. Erstellung der Setups
  4. Ggf. Erstellung einer Setup-CD
  5. Überprüfung der erstellten Dateien
  6. Zusammenfassung und Erstellung einer Log-Datei

Wer also "nur" seine Projekte mit der Batch-Datei kompilieren möchte, muss nur den ersten Abschnitt lesen.


1. Kompilieren der Projekte

Der Delphi-Compiler dcc32.exe ist vom Setup automatisch in den Suchpfad eingetragen worden. Er kann also mit dcc32 von der Eingabeaufforderung aus aufgerufen werden. Wer das tut, sieht eine (lange :-) ) Liste mit Aufruf-Optionen. Keine Angst, wichtig sind die nicht alle.

Die wichtigsten sind:
  • -CG für GUI- und
  • -CC für Konsolenprogramme
  • -B falls alle Units neu erzeugt werden sollen --> sinnvoll
  • -U Hier müssen die Pfade angegeben werden, in denen die verwendeten Dateien stehen. Die Standardpfade sind erstmal:
    ausblenden Quelltext
    1:
    "$(DELPHI)\Lib";"$(DELPHI)";"$(DELPHI)\Imports";"$(DELPHI)\Projects\Bpl";"$(DELPHI)\Rave5\Lib"					

    Dazu kommen noch die Pfade, in denen eure Komponenten liegen, aber dazu komme ich gleich.
  • Außerdem muss natürlich noch die Projektdatei angegeben werden.
  • -Q falls keine weiteren Meldungen ausgegeben werden sollen
  • -W- falls ihr auch keine Warnungen sehen wollt
  • -H- falls ihr keine Hinweise sehen wollt
Noch etwas für diejenigen, die noch nicht viel mit der Konsole gearbeitet haben: Alle Datei- und Pfadangaben, die Leerzeichen enthalten, müssen in Anführungszeichen (die doppelten bei der 2) gesetzt werden.

Ein Konsolenprogramm, das keine weiteren Dateien benötigt, könnte also so kompiliert werden (Vorausgesetzt Test.dpr befindet sich im selben Verzeichnis!):
ausblenden Quelltext
1:
dcc32.exe -CC -B -U"$(DELPHI)\Lib";"$(DELPHI)";"$(DELPHI)\Imports";"$(DELPHI)\Projects\Bpl" Test.dpr					


Nun zu Pfadangaben, die zu weiteren Komponenten führen: Ich werde das am Beispiel für meine Komponentensammlung SJPack machen. Die liegt bei mir beispielsweise im Verzeichnis C:\Komponenten\SJPack Komponenten. Nun könnte ich natürlich einfach diesen Pfad angeben, und so kompilieren:
ausblenden Quelltext
1:
dcc32.exe -CC -B -U"$(DELPHI)\Lib";"$(DELPHI)";"$(DELPHI)\Imports";"$(DELPHI)\Projects\Bpl";"C:\Komponenten\SJPack Komponenten" Test2.dpr					


Das Problem: Bei anderen, denen ihr den Quelltext weitergebt, liegen die Komponenten meistens nicht in dem Verzeichnis, ihr müsstet also irgendwo in der Batch-Datei Anpassungen machen lassen.

Besser geht es so: Ihr definiert eine Variable am Anfang der Datei und benutzt die für den Aufruf, dann muss nur diese geändert werden. Variablen definiert man in Batch-Dateien mit set Name=Wert. Benutzen könnt ihr die Variable Name dann mit %Name%.

Also:
ausblenden Quelltext
1:
2:
3:
set sjpack="C:\Komponenten\SJPack Komponenten"

dcc32.exe -CC -B -U"$(DELPHI)\Lib";"$(DELPHI)";"$(DELPHI)\Imports";"$(DELPHI)\Projects\Bpl";%sjpack% Test.dpr


Natürlich müsst ihr alle Pfade in die Liste schreiben, in denen Dateien vom Projekt oder dessen Komponenten stehen.


2. Komprimieren der Projekte

Wie eingangs erwähnt benutze ich OPX für die Komprimierung.

Dessen Aufruf ist sehr einfach:
ausblenden Quelltext
1:
upx.exe -9 Test.exe					


-9 benutzt die höchste Komprimierungsstufe, manchmal ist aber auch eine niedrigere besser, einfach mal probieren.

Es wird dann im selben Verzeichnis wie die ursprüngliche Exe die komprimierte Exe erstellt.


3. Erstellung der Setups

Wie bereits erwähnt benutze ich für die Setup-Erstellung InnoSetup.

Zunächst brauchen wir dessen Pfad:
ausblenden Quelltext
1:
set innopfad="C:\Programme\Inno Setup 3					


Der Aufruf ist wiederum einfach: Es muss nur der Compiler iscc.exe mit dem Installationsskript als Parameter aufgerufen werden.
ausblenden Quelltext
1:
%innopfad%\iscc.exe" Test.iss					


Wo die Setup-Datei erstellt wird, wird innerhalb des Skripts festgelegt.

Noch etwas zu den Anführungszeichen: Diese werden bei Pfadangaben benötigt, nicht aber beim set-Befehl. Dieser benutzt alles bis zum Zeilenende, weshalb das erste Anführungszeichen in der Variablen steht, das zweite jedoch erst in %innopfad%\iscc.exe.


4. Ggf. Erstellung einer Setup-CD

Ich erstelle bei größeren Projekten Installations-CDs mit Autorun und komplexerer Verzeichnisstruktur, deshalb möchte ich auch dazu noch etwas sagen. Ich gehe hier davon aus, dass das Verzeichnis Auslieferungs-CD heißt und ein direktes Unterverzeichnis zum Verzeichnis der Batch-Datei ist.

Der erste Schritt ist sinnvollerweise die Entfernung der alten Dateien, um feststellen zu können, ob die Dateien neu erstellt wurden:
ausblenden Quelltext
1:
rmdir Auslieferungs-CD /s /q					


Vorsicht: Die Optionen bedeuten, dass alle Unterverzeichnisse in Auslieferungs-CD inklusive des Verzeichnisses selbst mit allen Dateien gelöscht werden, und dass nicht nachgefragt werden soll.

Dann müssen die Verzeichnisse der CD erstellt werden:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
md Auslieferungs-CD
md Auslieferungs-CD\Client
md Auslieferungs-CD\Client\9x
md Auslieferungs-CD\Client\ME
md Auslieferungs-CD\Client\2000
md Auslieferungs-CD\Client\XP
md Auslieferungs-CD\Server
...


Nun müssen noch die Dateien kopiert werden (Es wird aus dem Unterverzeichnis Autorun der Batch-Datei kopiert):
ausblenden Quelltext
1:
2:
3:
copy Autorun\Autorun.exe Auslieferungs-CD\Autorun.exe
copy Autorun\Autorun.inf Auslieferungs-CD\Autorun.inf
...


Na ja, aber das sollte wohl kein Problem darstellen.


5. Überprüfung der erstellten Dateien

Das war für mich das größte Problem, weil ich die neuen Optionen von 2000/XP nicht kannte (wie gesagt: wer Ideen dazu zu älteren Windows-Versionen, also 9x/ME, hat, immer her damit.)

Zunächst brauchen wir eine Variable, die die Fehler, also die fehlenden Dateien, zählt. Natürlich könnt ihr das auch umgekehrt machen und die erstellten Dateien zählen. Außerdem benötigen wir noch die Anzahl der Dateien, die erstellt werden sollen.
ausblenden Quelltext
1:
2:
set fehler=0
set numfiles=2


Nun müssen alle Dateien durchgegangen werden, und die fehlenden gezählt werden:
ausblenden Quelltext
1:
If not exist Auslieferungs-CD\Autorun.exe set /A fehler=fehler+1					


Im Klartext: Wenn die angegebene Datei nicht existiert, soll der Ausdruck fehler=fehler+1 ausgewertet werden, also fehler um eins erhöht werden.

Nun muss das Ergebnis noch angezeigt werden:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
echo.
IF %fehler%==0 (
    echo Es sind alle %numfiles% Dateien erfolgreich erstellt worden
) ELSE IF %fehler%==1 (
    echo Es fehlt eine Datei von %numfiles%
) ELSE (
    echo Es fehlen %fehler% Dateien von %numfiles%
)
echo.


Mit echo. gibt man übrigens eine Leerzeile aus.


6. Zusammenfassung und Erstellung einer Log-Datei

Nun jetzt kommt ein Beispiel mit der Erweiterung um eine optional angezeigte Log-Datei. Dazu braucht ihr die Datei Choice.com, die damals bei DOS dabei war. Ihr bekommt sie hier (Original Microsoft):
delphi.css-berlin.co...build_bat/choice.com
oder vom Mirror
user.cs.tu-berlin.de...build_bat/choice.com
Keine Angst: So klein (2 KB) krieg ich keinen Virus hin... ;-)

Zunächst mal: Das Erstellen einer Log-Datei ist ganz einfach. Es muss nur hinter jede Zeile, dessen Ausgabe in die Log-Datei geschrieben werden soll > Log.txt bzw. >> Log.txt geschrieben werden. Mit > wird die Datei, falls sie bereits existiert, vorher geleert, mit >> an den Inhalt angehängt. Heißt: Ihr müsst einmal > und dann immer >> benutzen.

Am Ende sollte noch optional die Log-Datei angezeigt werden können, dafür benötigt ihr die Choice.com:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
Choice Soll die Logdatei angezeigt werden? 
rem Choice gibt es nicht mehr, deshalb muss die Datei Choice.com da sein!

if errorlevel 2 goto ende
notepad.exe Log.txt
:ende


Wenn ihr bei der Frage j eingebt wird notepad mit der Log-Datei aufgerufen, sonst einfach die Batch-Ausführung beendet.

Na ja und kosmetischer Natur ist, dass ihr mit title xxx den Titel des Fensters setzen könnt.

Die ganze Beispiel-Batch-Datei sieht also so aus: (Die Batch-Datei steht im Hauptverzeichnis des Programms, die Formulare befinden sich im Forms-Verzeichnis. InnoSetup befindet sich in "C:\Programme\Inno Setup 3", mein Package SJPack in "C:\Komponenten\SJPack Komponenten". Upx.exe ist im Bin-Ordner.)

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
@echo off
cls

rem *************************
rem Umgebungsvariablen
rem *************************

set sjpack="C:\Komponenten\SJPack Komponenten"
set innopfad="C:\Programme\Inno Setup 3

rem *************************
rem Titel des Fensters
rem *************************

title Das Projekt X wird erstellt

rem *************************
rem Erstellung
rem *************************


echo Bitte warten...
echo.

echo Kompiliere...
echo Kompiliere... > Log.txt
dcc32.exe -CC -B -Q -U"$(DELPHI)\Lib";"$(DELPHI)";"$(DELPHI)\Imports";"$(DELPHI)\Projects\Bpl";%sjpack%;\Forms Test.dpr >> Log.txt
echo Fertig!
echo Fertig! >> Log.txt
echo.
echo. >> Log.txt

echo Komprimiere...
echo Komprimiere... >> Log.txt
cd Bin
upx.exe -9 ..\Test.exe >> ..\Log.txt
cd..
echo Fertig!
echo Fertig! >> Log.txt
echo.
echo. >> Log.txt

echo Erstelle Setup...
echo Erstelle Setup... >> Log.txt
%innopfad%\iscc.exe" Test.iss >> Log.txt
echo Fertig!
echo Fertig! >> Log.txt
echo.
echo. >> Log.txt

echo Erstelle CD...
echo Erstelle CD... >> Log.txt
rmdir Auslieferungs-CD /s /q >> Log.txt
md Auslieferungs-CD >> Log.txt
copy Setup\Setup.exe Auslieferungs-CD\Setup.exe >> Log.txt
copy Autorun.inf Auslieferungs-CD\Autorun.inf >> Log.txt
echo Fertig!
echo Fertig! >> Log.txt
echo.
echo. >> Log.txt

rem ****************
rem Hier ist das Erstellen abgeschlossen, es wird nun eine automatische Analyse 
rem der Ergebnisse gemacht
rem ****************

set fehler=0
set numfiles=2

If not exist Auslieferungs-CD\Autorun.inf set /A fehler=fehler+1
If not exist Auslieferungs-CD\Setup.exe set /A fehler=fehler+1

rem ****************
rem Hier ist die Auswertung fertig, es wird nur noch das Ergebnis angezeigt
rem ****************

echo.
IF %fehler%==0 (
    echo Es sind alle %numfiles% Dateien erfolgreich erstellt worden
) ELSE IF %fehler%==1 (
    echo Es fehlt eine Datei von %numfiles%
) ELSE (
    echo Es fehlen %fehler% Dateien von %numfiles%
)
echo.

Bin\Choice Soll die Logdatei angezeigt werden? 
rem Choice gibt es nicht mehr, deshalb muss die Datei Choice.com da sein!

if errorlevel 2 goto ende
notepad.exe Log.txt
:ende


Das ganze könnt ihr euch auch inklusive Beispiel von mir herunterladen (das Beispiel benötigt mein SJPack allerdings NICHT, obwohl das die Batch-Datei impliziert; das ist nur ein Beispiel.): user.cs.tu-berlin.de...uild_bat/example.zip.

Dafür benötigt ihr aber auch InnoSetup, das erhaltet ihr kostenlos hier: www.jrsoftware.org/isinfo.php. Die Exe von UPX ist im Zip mit drin, das gesamte UPX-Paket inklusive Quelltext gibt es hier: upx.sourceforge.net/.

Viel Spaß,
Sebastian Jänicke


Moderiert von user profile iconjasocul: Ungültige Links entfernt.