Using Delphi command lines compiler DCC32 to compile programs allow us to set some switches to get various kind of output. The most common usage is compile a debugged or non-debugged release.
For example, we may use
dcc32 -B -$O-,D+,L+,YD
to compile dcu/dcp with debug information and
dcc32 -B -$O-,D-,L-,Y-
to compile dcu/dcp without debug information.
However, you may notice that using such switches has no effect on DPK (Delphi package) files.
The reason is simple but yet difficult to discover. If you study DPK files, you may see the following:
package MyPackage;
{$R *.res}
{$ALIGN 8}
{$ASSERTIONS ON}
{$BOOLEVAL OFF}
{$DEBUGINFO ON}
{$EXTENDEDSYNTAX ON}
{$IMPORTEDDATA ON}
{$IOCHECKS ON}
{$LOCALSYMBOLS ON}
{$LONGSTRINGS ON}
{$OPENSTRINGS ON}
{$OPTIMIZATION OFF}
{$OVERFLOWCHECKS OFF}
{$RANGECHECKS OFF}
{$REFERENCEINFO ON}
{$SAFEDIVIDE OFF}
{$STACKFRAMES OFF}
{$TYPEDADDRESS OFF}
{$VARSTRINGCHECKS ON}
{$WRITEABLECONST OFF}
{$MINENUMSIZE 1}
{$IMAGEBASE $400000}
{$DESCRIPTION 'E Stream Software - Runtime Library'}
{$LIBPREFIX 'SQL.'}
{$RUNONLY}
{$IMPLICITBUILD OFF}
{$DEFINE DEBUG}
The DPK files already has built in compiler directives. It has priority over the switches you specified in command lines. As stated by Allen Bauer in the
post:
The IDE supports a very little know feature where you can continue to
control these options while in the IDE, yet allow the command-line be able
to also control the options. In a package file, all the options listed
there are propagated to all the contained units. This is different than a
normal .dpr program/library file. In order to do this, all you need to do
is replace the '$' with a ' ' (that's a ). Then when you open the
dpk in the IDE, you can toggle those options as much as you like, but when
you compile on the command-line, you can still control them.
This is how we build all our packages for the product itself. All of the
Borland built packages have DEBUGINFO, STACKFRAMES, ASSERTIONS,
OPTIMIZATION, LOCALSYMBOLS setup this way because like you, we wan't to be
able to control those options from the command-line. The developers will
typically do a complete "debug" build, whereas the integration team will
not.
$DEFINES will sort of work the same way, in that if you replace the '$' with
a ' ', the IDE will still recognize the defines and apply them, but any
other modifications to the dpk source will re-insert the '$' character.
The solution is replace $ with a space character (' ') for all compiler directives only:
package MyPackage;
{$R *.res}
{$ALIGN 8}
{ ASSERTIONS ON}
{ BOOLEVAL OFF}
{ DEBUGINFO ON}
{ EXTENDEDSYNTAX ON}
{ IMPORTEDDATA ON}
{ IOCHECKS ON}
{ LOCALSYMBOLS ON}
{ LONGSTRINGS ON}
{ OPENSTRINGS ON}
{ OPTIMIZATION OFF}
{ OVERFLOWCHECKS OFF}
{ RANGECHECKS OFF}
{ REFERENCEINFO ON}
{ SAFEDIVIDE OFF}
{ STACKFRAMES OFF}
{ TYPEDADDRESS OFF}
{ VARSTRINGCHECKS ON}
{ WRITEABLECONST OFF}
{ MINENUMSIZE 1}
{$IMAGEBASE $400000}
{$DESCRIPTION 'E Stream Software - Runtime Library'}
{$LIBPREFIX 'SQL.'}
{$RUNONLY}
{$IMPLICITBUILD OFF}
{$DEFINE DEBUG}
By doing so, both the IDE and DCC32 will respect the switches and yield expected results and.
The output files (DLL, BPL or EXE) do not contain any debugging information even if you turn on the debugging switches. Those debugging information are stored in DCU or DCP files.
To keep the debug information in DLL, BPL or EXE, turn on the Include TD32 debug info or use -V switch with DCC32.