Naast de compiler zoals die in de IDE is ingebouwd heeft Delphi ook een command line compiler DCC32.EXE, die kan worden uitgevoerd vanaf de DOS prompt of vanuit een Batch bestand kan worden aangeroepen. DCC32.EXE beschikt over alle functies van de IDE compiler. Wij zullen onderzoeken in welke gevallen het gebruik van de command line compiler nuttig kan zijn.
De syntax voor het gebruik van de command line compiler is als volgt:
DCC32 [opties] filename [opties]
Waarbij optieseen of meer parameters kunnen zijn die informatie aan de compiler verschaffen over hoe een en ander moet worden gecompileerd. filename is het te compileren bestand. Wie DCC32 zonder iets er achter typt krijgt de volgende uitvoer te zien, die informatie verschaft over de beschikbare mogelijkheden:
Delphi for Win32 Version 10.0 Copyright (c) 1983,97 Borland International
Syntax: DCC32 [options] filename [options]
-A= = Set unit alias -K = Set image base addr
-B = Build all units -LU = Use package
-CC = Console target -M = Make modified units
-CG = GUI target -N = DCU output directory
-D = Define conditionals -O = Object directories
-E = EXE output directory -P = look for 8.3 file names also
-F = Find error -Q = Quiet compile
-GD = Detailed map file -R = Resource directories
-GP = Map file with publics -U = Unit directories
-GS = Map file with segments -V = Debug information in EXE
-H = Output hint messages -W = Output warning messages
-I = Include directories -Z = Output 'never build' DCPs
-J = Generate .obj file -$ = Compiler directive
-JP = Generate C++ .obj file
Compiler switches: -$ (defaults are shown below)
A+ Aligned record fields P+ Open string params
B- Full boolean Evaluation Q- Integer overflow checking
C+ Evaluate assertions at runtime R- Range checking
D+ Debug information T- Typed @ operator
G+ Use imported data references U- Pentium(tm)-safe divide
H+ Use long strings by default V+ Strict var-strings
I+ I/O checking W- Generate stack frames
J+ Writeable structured consts X+ Extended syntax
L+ Local debug symbols Y- Symbol reference info
M- Runtime type info Z1 Minimum size of enum types
O+ Optimization
Stack size: -$M (default 16384,1048576)
Het dus mogelijk om een flink aantal opties voor de command line compiler op te geven. Een optie bestaat uit een slash (/) onmiddelijk gevolgd door de letter van de optie. In somige gevallen word deze informatie gevolgd door extra informatie, zoals een nummer, een symbool, een directory naam enz. Deze schakelopties kunnen in elke willekeurige volgorde worden opgegeven en mogen voor of na de bestandsnaam worden gezet.
In de IDE worden verschillende instellingen via verscheidene menu's gezet. Deze zelfde mogelijkheden zijn bij de command line compiler toegankelijk via de schakeloptie. Ook is het mogelijk om de schakelopties vooraf te laten gaan door een afbreekstreepje (-) in plaats van een breukstreep, maar dat is niet altijd handig omdat er ook schakelopties zijn die zelf met een min-teken beginnen.De volgende opdrachten zijn gelijk en geldig:
DCC -IC:\DELPHI -DDEBUG SORTEER -$R- -$U+
DCC /IC:\DELPHI/DDEBUG SORTEER /$R-/$U+
Let op de extra spatie bij het gebruik van het afbreekstreepje als schakeloptieindicatie!
Een configuratiebestand
Het is ook mogelijk om een lijst van opties in een configuratiebestand op te slaan met de naam DCC32.CFG, die dan zal worden gebruikt als toevoeging op de schakelopties op de commandoregel. Elke regel in dit bestand correspondeert met een extra command-line argument dat wordt toegevoegd voor de eigenlijke argumenten. Hierdoor is het eenvoudig mogelijk om je standaard instellingen in een configuratiebestand bij te houden en de commandoregel lekker kort te houden.
Het is mogelijk om de command line compiler meer als een keer de zelfde schakeloptie mee te geven. In dat geval zal alleen de laatste door DCC32 worden uitgevoerd. Dit houdt dus ook in, dat je standaardinstellingen in DCC32.CFG kunt overriden vanaf de commandoregel.
Als DCC32 start kijkt hij eerst naar DCC32.CFG in de huidige directory. Wordt het bestand daar niet gevonden, dan wordt gekeken in de directory waarin DCC32.EXE zelf staat. Als DCC32.CFG een regel bevat die niet met een breukstreep of een afbreekstreepje begint dan betekent dit dat daar een default bestand staat wat gecompileerd moet worden. In dat geval zal bovenstaand helpscherm dus niet verschijnen als DCC32.EXE zonder parameters wordt aangeroepen, maar wordt het default bestand gewoon gecompileerd.
Hieronder vind je een voorbeeld van deen DCC32.CFG bestand, dat wat default directories definieert als include, object en unit bestanden en wat de verstekwaarde van de $F en $S compiler directivers wijzigd.
/IC:\DELPHI\INC;C:\DELPHI\SRC
/OC:\DELPHI\ASM
/UC:\DELPHI\UNITS
/$F+
/$S-
Als je nu de volgende opdracht vanaf de opdrachtregel zou geven
DCC32 MijnRommel
Dan wordt dit door de compiler gelezen als:
DCC32 /IC:\DELPHI\INC;C:\DELPHI\SRC /OC:\DELPHI\ASM /UC:\DELPHI\UNITS /$F+ /$S- MijnRommel
Waarom?!
Ja waarom zouden we eigenlijk DCC32 willen gebruiken in plaats van de IDE compiler?
Een van de grootste voordelen is dat we niet alle componenten hoeven te hebben die in een project worden gebruikt in het Component Palette. Als we verschillende projecten hebben die met verschillend versies van onze favoriete 3rd party leveranciers gemaakt zijn, dan ontbreekt de noodzaak om eerst de ene versie te de-installeren om vervolgens de benodigde versie te installeren voordat we het project opnieuw kunnen compileren.
Ook als er vaak twee versies van een project worden ontwikkeld, een voor testen en debuggen en een voor de productie. Naast andere instellingen zullen we dan debug informatie aanzetten en optimalisatie uit in het ene geval en debug uit en optimalisatie aan in het andere geval. In principe zijn beide programma's gelijk behalve de informatie zoals die in het DOF bestand van het project staat. De command line compiler stelt ons in staat om deze instellingen in verschillende configuraties te bewaren.
Informatie over instellingen is eenvoudig uit een project DOF bestand te halen, want het DOf bestand heeft gewoon een INI bestandsformaat. Maak dus gewoon je instellingen in de IDE en lees daarna het DOF bestand uit. Je kunt op die manier relatief eenvoudig twee configuratiebestanden maken, een voor debuggen en een voor productie, die je dan met bijvoorbeeld een batch bestand kunt oproepen:
REM DCOMP.BAT
IF *%1==*O GOTO ONTWIKKEL
IF *%1==*o GOTO ONTWIKKEL
IF *%1==*P GOTO PRODUCTIE
IF *%1==*p GOTO PRODUCTIE
GOTO EINDE
:ONTWIKKEL
COPY common.cfg+compdbug.cfg dcc32.cfg /Y
C:\Progra~1\Borland\Delphi~1\bin\DCC32 MijnRommel /Q >COMPILE.LOG
GOTO EINDE
:PRODUCTIE
COPY common.cfg+complive.cfg dcc32.cfg /Y
C:\Progra~1\Borland\Delphi~1\bin\DCC32 MijnRommel /Q >COMPILE.LOG
:EINDE
De relatie tussen DOF en CFG wordt hieronder nog even weergegeven
| DOF settings |
CFG settings
|
| [Compiler] |
| A=0 |
/$A- |
| B=0 |
/$B- |
| C=1 |
/$C+ |
| D=1 |
/$D+ |
| G=1 |
/$G+ |
| H=1 |
/$H+ |
| I=1 |
/$I+ |
| J=1 |
/$J+ |
| L=1 |
/$L+ |
| M=0 |
/$M- |
| O=0 |
/$O- |
| P=1 |
/$P+ |
| Q=0 |
/$Q- |
| R=0 |
/$R- |
| T=0 |
/$T- |
| U=0 |
/$U- |
| V=1 |
/$V+ |
| W=0 |
/$W- |
| X=1 |
/$X+ |
| Y=1 |
/$Y+ |
| Z=1 |
/$Z+ |
| ShowHints=1 |
/H+ |
| ShowWarnings=1 |
/W+ |
| UnitAliases=WinTypes=Windows; |
/AWinTypes=Windows; |
|
| [Linker] |
| MapFile=0 |
(1=/GS, 2=/GP, 3=/GD) |
| OutputObjs=0 |
(1=/J, 2=/JP) |
| ConsoleApp=1 |
/CG (0=/CC) |
| DebugInfo=0 |
(1=/V) |
| RemoteSymbols=0 |
(1=/VN) |
| MinStackSize=16384 |
( |
| MaxStackSize=1048576 |
( /$M$00004000,$00100000 |
| ImageBase=4194304 |
/K$00400000 |
|
| [Directories] |
| OutputDir= |
/E |
| UnitOutputDir= |
/N |
| SearchPath= |
/I, /R, /U |
| Packages=VCL40;VCLX40;VCLDB40; |
/LUVCL40;VCLX40;VCLDB40; |
| Conditionals= |
/D |
| UsePackages=0 |
/LU.. (zie Packages) |
Ook bij diverse 3rd party producten wordt vaak gebruik gemaakt van de command line compiler. Een van de voorbeelden hiervan is Rave (Voorheen ReportPrinter Pro) van Nevrona, een product waar je de source code bij krijgt en waar je zelf dingen aan kunt toevoegen. In een dergelijk geval is het erg handig als de bedenkers van het hoofdproduct reeds een methode hebben gemaakt om in ieder geval hun eigen deel foutloos te compileren.
Verder kunnen voormalige clipperaars hun command-line-ontwenningsverschijnselen hier misschien nog een beetje op botvieren.
Joop Muis
Naar een artikel op www.designkey.co.uk