Browse Source

+ Added all dirctives

michael 26 years ago
parent
commit
c9d6c06e60
1 changed files with 224 additions and 8 deletions
  1. 224 8
      docs/prog.tex

+ 224 - 8
docs/prog.tex

@@ -277,6 +277,25 @@ will display an error message when the compiler encounters it, and trigger
 and increase the error count of the compiler.
 and increase the error count of the compiler.
 The compiler will immediatly stop the compilation process.
 The compiler will immediatly stop the compilation process.
 
 
+\subsection{\var{\$GOTO} : Support \var{Goto} and \var{Label}}
+
+If \var{\{\$GOTO ON\}} is specified, the compiler will support \var{Goto}
+statements and \var{Label} declarations. By default, \var{\$GOTO OFF} is
+assumed. This directive corresponds to the \var{-Sg} command-line option.
+
+As an example, the following code can be compiled:
+\begin{verbatim}
+{$GOTO ON}
+
+label Theend;
+
+begin
+  If ParamCount=0 then
+    GoTo TheEnd;
+  Writeln ('You spcified command-line options');
+TheEnd:  
+end.
+\end{verbatim}
 
 
 \subsection{\var{\$H} or \var{\$LONGSTRINGS} : Use AnsiStrings}
 \subsection{\var{\$H} or \var{\$LONGSTRINGS} : Use AnsiStrings}
 
 
@@ -356,9 +375,21 @@ option, then
 \end{verbatim}
 \end{verbatim}
 will display an info message when the compiler encounters it.
 will display an info message when the compiler encounters it.
 
 
-
-\subsection{\var{\$I} or \var{\$IOCHECK} : Input/Output checking}
-The \var{\{\$I-\}} or \var{\{\$IOCHECK OFF\}} directive tells the compiler
+\subsection{\var{\$INLINE} : Allow inline code.} 
+The \var{\{\$INLINE ON\}} directive tells the compiler that the \var{Inline}
+procedure modifier should be allowed. Procedures that are declared inline
+are copied to the places where they are called. This has the effect that
+there is no actual procedure call, the code of the procedure iis just copied
+to where the procedure is needed. By default, \var{Inline} procedures are
+not allowed. You need to specify this directive if you want to use inlined
+code. This directive is equivalent to the command-line switch \var{-Si}.
+
+Inline code is NOT exported from a unit. This means that if you call an
+inline procedure from another unit, a normal procedure call will be
+performed. Only inside units, \var{Inline} procedures are really inline.
+
+\subsection{\var{\$I} or \var{\$IOCHECKS} : Input/Output checking}
+The \var{\{\$I-\}} or \var{\{\$IOCHECKS OFF\}} directive tells the compiler
 not to generate input/output checking code in your program. By default, the
 not to generate input/output checking code in your program. By default, the
 compiler does not generate this code, you must switch it on using the
 compiler does not generate this code, you must switch it on using the
 \var{-Ci} command-lne switch.
 \var{-Ci} command-lne switch.
@@ -436,7 +467,7 @@ Program InfoDemo;
 
 
 Const User = {$I %USER%};
 Const User = {$I %USER%};
 
 
-begin
+joe begin
   Write ('This program was comilped at ',{$I %TIME%});
   Write ('This program was comilped at ',{$I %TIME%});
   Writeln (' on ',{$I %DATE%});
   Writeln (' on ',{$I %DATE%});
   Writeln ('By ',User);
   Writeln ('By ',User);
@@ -521,9 +552,27 @@ ppc386 -k-lc foo.pp
 
 
 \subsection{\var{\$M} or \var{\$TYPEINFO} : Generate type info}
 \subsection{\var{\$M} or \var{\$TYPEINFO} : Generate type info}
 
 
-This switch is recognized for Delphi compatibility only since the generation
-of type information isn't fully implemented yet.
-
+For classes that are compiled in the \var{\{\$M+ \}} or \var{\{\$TYPEINFO ON\}}
+state, the compiler will generate Run-Time Type Information (RTTI). All
+descendent objects of an object that was compiled in the \var{$M+} state
+will get RTTI information too, as well as any published classes.
+By default, no Run-Time Type Information is generated. The \var{TPersistent}
+object that is present in the FCL (Free Component Library) is generated in
+the \var{\{\$M+\}} state. The generation of RTTI allows programmers to
+stream objects, and to access published properties of objects, without
+knowing the actual class of the object.
+
+The run-time type information is accessible through the \var{TypInfo} unit,
+which is part of the \fpc Run-Time Library.
+
+\subsection{\var{\$MACRO} : Allow use of macros.}
+
+In the \var{\{\$MACRO ON\}} state, the compiler allows you to use C-style
+(although not as elaborate) macros. Macros provide a means for simple text
+substitution. More information on using macros can be found in the 
+\sees{Macros} section. This directive is equivalent to the command-line
+switch \var{-Sm}.
+ 
 \subsection{\var{\$MESSAGE} : Generate info message}
 \subsection{\var{\$MESSAGE} : Generate info message}
 
 
 If the generation of info is turned on, through the \var{-vi} command-line
 If the generation of info is turned on, through the \var{-vi} command-line
@@ -718,6 +767,41 @@ This works only on the intel compiler, and MMX support must be on
 saturation support (\sees{SaturationSupport}) for more information
 saturation support (\sees{SaturationSupport}) for more information
 on the effect of this directive.
 on the effect of this directive.
 
 
+\subsection{\var{\$SMARTLINK} : Use smartlinking}
+
+A unit that is compiled in the \var{\{\$SMARTLINK ON\}} state will be
+compiled in such a way that it can be used for smartlinking. This means that
+the unit is chopped in logical pieces: each procedure is put in it's own 
+object file, and all object files are put together in a big archive. When
+using such a unit, only the pieces of code that you really need or call, 
+will be linked in your program, thus reducing the size of your executable
+substantially. Beware that using smartlinked units slows down the
+compilation process, because a separate object file must be creayed for each
+procedure. If you have units with many functions and procedures, this can 
+be a time consuming process, even more so if you use an external assembler
+(the assembler is called to assemble each procedure or function code block).
+
+The smartlinking directive should be specified {\em before} the unit
+declaration part:
+\begin{verbatim}
+{$SMARTLINK ON}
+
+Unit MyUnit;
+
+Interface
+ ...
+\end{verbatim}
+
+This directive is equivalent to the \var{-Cx} command-line switch.
+
+\subsection{\var{\$STATIC} : Allow use of \var{Static} keyword.}
+If you specify the \var{\{\$STATIC ON\}} directive, then \var{Static}
+methods are allowed for objects. \var{Static} objects methods do not require
+a \var{Self} variable. They are equivalent to \var{Class} methods for
+classes. By default, \var{Static} methods are not allowed.
+
+This directive is equivalent to the \var{-St} command-line option.
+
 \subsection{\var{\$STOP} : Generate fatal error message}
 \subsection{\var{\$STOP} : Generate fatal error message}
 
 
 The following code
 The following code
@@ -819,6 +903,29 @@ Global directives affect the whole of the compilation process. That is why
 they also have a command - line counterpart. The command-line counterpart is
 they also have a command - line counterpart. The command-line counterpart is
 given for each of the directives.
 given for each of the directives.
 
 
+\subsection{\var{\$APPTYPE} : Specify type of application (Win32 only)}
+
+The \var{\{\$APPTYPE XXX\}} accepts one argument that can have two possible
+values : \var{GUI} or \var{CONSOLE}. It is used to tell the windows
+Operating system if an application is a console application or a graphical
+application. By default, a program compiled by \fpc is a console
+application. Running it will display a console window. Specifying the 
+\var{\{\$APPTYPE GUI\}} directive will mark the application as a graphical
+application; no console window will be opened when the application is run.
+
+Care should be taken when compiling \var{GUI} applications; the \var{Input}
+and \var{Output} files are not available in a GUI application, and
+attempting to read from or write to them will result in a run-time error.
+
+It is possible to determine the application type of a windows application
+at runtime. The \var{IsConsole} constant, declared as
+\begin{verbatim}
+Const
+  IsConsole : Boolean 
+\end{verbatim}
+contains \var{True} if the application is a console application, \var{False}
+if the application is a GUI application.
+
 \subsection{\var{\$D} or \var{\$DEBUGINFO}: Debugging symbols}
 \subsection{\var{\$D} or \var{\$DEBUGINFO}: Debugging symbols}
 
 
 When this switch is on (\var{\{\$DEBUGINFO ON\}}),
 When this switch is on (\var{\{\$DEBUGINFO ON\}}),
@@ -826,6 +933,11 @@ the compiler inserts GNU debugging information in
 the executable. The effect of this switch is the same as the command-line
 the executable. The effect of this switch is the same as the command-line
 switch \var{-g}. By default, insertion of debugging information is off.
 switch \var{-g}. By default, insertion of debugging information is off.
 
 
+\subsection{\var{\$DESCRIPTION}}
+
+This switch is recognised for compatibility only, but is ignored completely
+by the compiler. At a later stage, this switch may be activated.
+
 \subsection{\var{\$E} : Emulation of coprocessor}
 \subsection{\var{\$E} : Emulation of coprocessor}
 
 
 This directive controls the emulation of the coprocessor. There is no
 This directive controls the emulation of the coprocessor. There is no
@@ -860,17 +972,68 @@ real types are mapped to the single IEEE floating point type.
 intermix emulation code with real floating point opcodes, as
 intermix emulation code with real floating point opcodes, as
 long as the only type used is single or real.
 long as the only type used is single or real.
 
 
-
 \subsection{\var{\$G} : Generate 80286 code}
 \subsection{\var{\$G} : Generate 80286 code}
 
 
 This option is recognised for Turbo Pascal compatibility, but is ignored,
 This option is recognised for Turbo Pascal compatibility, but is ignored,
 
 
+\subsection{\var{\$INCLUDEPATH} : Specify include path.}
+
+This option serves to specify the include path, where the compiler looks for
+include files. \var{\{\$INCLUDEPATH XXX} will add \var{XXX} to the include
+path. \var{XXX} can contain one or more paths, separated by semi-colons or
+colons.
+
+for example
+\begin{verbatim}
+{$INCLUDEPATH ../inc;../i386}
+
+{$I strings.inc}
+\end{verbatim}
+
+Will add the directories \file{../inc} and \file{../i386} to the include
+path of the compiler. The compiler will look for the file \file{strings.inc}
+in both these directories, and will include the first found file. This directive is 
+equivalent to the \var{-Fi} command-line switch.
+
+Caution is in order when using this directive: If you distribute files, the 
+places of the files may not be the same as on your machine; moreover, the
+directory structure may be different. In general it would be fair to say
+that you should avoid using {\em absolute} paths, instead use {\em relative}
+paths, as in the example above. Only use this directive if you are certain
+of the places where the files reside. If you are not sure, it is better
+practice to use makefiles and makefile variables.
+ 
 \subsection{\var{\$L} or \var{\$LOCALSYMBOLS}: Local symbol information}
 \subsection{\var{\$L} or \var{\$LOCALSYMBOLS}: Local symbol information}
 
 
 This switch (not to be confused with the \var{\{\$L file\}} file linking
 This switch (not to be confused with the \var{\{\$L file\}} file linking
 directive) is recognised for Turbo Pascal compatibility, but is ignored.
 directive) is recognised for Turbo Pascal compatibility, but is ignored.
 generation of symbol information is controlled by the \var{\$D} switch.
 generation of symbol information is controlled by the \var{\$D} switch.
 
 
+\subsection{\var{\$LIBRARYPATH} : Specify library path.}
+
+This option serves to specify the library path, where the linker looks for
+static or dynamic libraries. \var{\{\$LIBRARYPATH XXX} will add \var{XXX} 
+to the library path. \var{XXX} can contain one or more paths, separated 
+by semi-colons or colons.
+
+for example
+\begin{verbatim}
+{$LIBRARYPATH /usr/X11/lib;/usr/local/lib}
+
+{$LINKLIB X11}
+\end{verbatim}
+
+Will add the directories \file{/usr/X11/lib} and \file{/usr/local/lib} to 
+the linker library path. The linker will look for the library \file{libX11.so}
+in both these directories, and use the first found file. This directive is 
+equivalent to the \var{-Fl} command-line switch.
+
+Caution is in order when using this directive: If you distribute files, the 
+places of the libraries may not be the same as on your machine; moreover, the
+directory structure may be different. In general it would be fair to say
+that you should avoid using this directive. If you are not sure, it is better
+practice to use makefiles and makefile variables.
+
 \subsection{\var{\$M} or \var{\$MEMORY}: Memory sizes}
 \subsection{\var{\$M} or \var{\$MEMORY}: Memory sizes}
 
 
 This switch can be used to set the heap and stacksize. It's format is as
 This switch can be used to set the heap and stacksize. It's format is as
@@ -917,6 +1080,33 @@ mathematics.
 This switch is recognised for Turbo Pascal compatibility, but is otherwise
 This switch is recognised for Turbo Pascal compatibility, but is otherwise
 ignored.
 ignored.
 
 
+\subsection{\var{\$OBJECTPATH} : Specify object path.}
+
+This option serves to specify the object path, where the compiler looks for
+object files. \var{\{\$OBJECTPATH XXX} will add \var{XXX} to the object
+path. \var{XXX} can contain one or more paths, separated by semi-colons or
+colons.
+
+for example
+\begin{verbatim}
+{$OBJECTPATH ../inc;../i386}
+
+{$L strings.o}
+\end{verbatim}
+
+Will add the directories \file{../inc} and \file{../i386} to the 
+object path of the compiler. The compiler will look for the file \file{strings.o}
+in both these directories, and will link the first found file in the
+program. This directive is equivalent to the \var{-Fo} command-line switch.
+
+Caution is in order when using this directive: If you distribute files, the 
+places of the files may not be the same as on your machine; moreover, the
+directory structure may be different. In general it would be fair to say
+that you should avoid using {\em absolute} paths, instead use {\em relative}
+paths, as in the example above. Only use this directive if you are certain
+of the places where the files reside. If you are not sure, it is better
+practice to use makefiles and makefile variables.
+ 
 \subsection{\var{\$S} : Stack checking}
 \subsection{\var{\$S} : Stack checking}
 The \var{\{\$S+\}} directive tells the compiler to generate stack checking
 The \var{\{\$S+\}} directive tells the compiler to generate stack checking
 code. This generates code to check if a stack overflow occurred, i.e. to see
 code. This generates code to check if a stack overflow occurred, i.e. to see
@@ -929,7 +1119,33 @@ Specifying \var{\{\$S-\}} will turn generation of stack-checking code off.
 The command-line compiler switch \var{-Ct} has the same effect as the
 The command-line compiler switch \var{-Ct} has the same effect as the
 \var{\{\$S+\}} directive.
 \var{\{\$S+\}} directive.
 
 
+\subsection{\var{\$UNITPATH} : Specify unit path.}
+
+This option serves to specify the unit path, where the compiler looks for
+unit files. \var{\{\$UNITPATH XXX\}} will add \var{XXX} to the unit
+path. \var{XXX} can contain one or more paths, separated by semi-colons or
+colons.
+
+for example
+\begin{verbatim}
+{$UNITPATH ../units;../i386/units}
+
+Uses strings;
+\end{verbatim}
+
+Will add the directories \file{../units} and \file{../i386/units} to the unit
+path of the compiler. The compiler will look for the file \file{strings.ppu}
+in both these directories, and will link the first found file in the
+program. This directive is equivalent to the \var{-Fu} command-line switch.
 
 
+Caution is in order when using this directive: If you distribute files, the 
+places of the files may not be the same as on your machine; moreover, the
+directory structure may be different. In general it would be fair to say
+that you should avoid using {\em absolute} paths, instead use {\em relative}
+paths, as in the example above. Only use this directive if you are certain
+of the places where the files reside. If you are not sure, it is better
+practice to use makefiles and makefile variables.
+ 
 \subsection{\var{\$W} or \var{\$STACKFRAMES} : Generate stackframes}
 \subsection{\var{\$W} or \var{\$STACKFRAMES} : Generate stackframes}
 
 
 The \var{\{\$W\}} switch directove controls the generation of stackframes.
 The \var{\{\$W\}} switch directove controls the generation of stackframes.