mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-22 08:29:29 +02:00
+ Added appendix on compiling the compiler
This commit is contained in:
parent
ef66ed259d
commit
d6d6139c05
400
docs/prog.tex
400
docs/prog.tex
@ -3717,9 +3717,9 @@ consequences of this is that the type \var{Integer} is redefined as
|
||||
\newcommand{\mvar}[1]{\var{\$(#1)}}
|
||||
|
||||
\section{Introduction}
|
||||
\fpc comes with a special makefile, \file{kefile.fpc}, which can be incuded
|
||||
in any makefile you use to compile with \fpc. There is a template
|
||||
\file{Makefile} provided also. All sources from the \fpc team are copiled
|
||||
\fpc comes with a special makefile, \file{makefile.fpc}, which can be
|
||||
included in any makefile you use to compile with \fpc. There is a template
|
||||
\file{Makefile} provided also. All sources from the \fpc team are compiled
|
||||
with this system.
|
||||
|
||||
These files are installed in the following directories:
|
||||
@ -3736,7 +3736,7 @@ following places :
|
||||
\item The directory pointed to by the \var{DEFAULTFPCDIR} make variable.
|
||||
\item The current directory.
|
||||
\end{enumerate}
|
||||
Thus, setting \var{FPCMAKE} or \var{FPCDIR} as a environment string will
|
||||
Thus, setting \var{FPCMAKE} or \var{FPCDIR} as an environment string will
|
||||
ensure that \file{makefile.fpc} is always found, and will be read by all
|
||||
makefiles, derived from the template.
|
||||
|
||||
@ -3748,27 +3748,38 @@ that, some settings in the template makefile are explained.
|
||||
|
||||
The following programs are needed by the makefile to function correctly:
|
||||
\begin{description}
|
||||
\item[cp] a copy program
|
||||
\item[cp] a copy program.
|
||||
\item[date] a program that prints the date.
|
||||
\item[install] a program to install files.
|
||||
\item[make] the \file{make} program, obviously.
|
||||
\item[pwd] a program that prints the current working directory.
|
||||
\item[rm] a program to delete files.
|
||||
\end{description}
|
||||
These are standard programs on linux system, with the possible exception of
|
||||
These are standard programs on linux systems, with the possible exception of
|
||||
\file{make}. For \dos or \windowsnt, they can be found in the
|
||||
\file{gnuutils.zip} of the \fpc FTP site.
|
||||
file \file{gnuutils.zip} on the \fpc FTP site.
|
||||
|
||||
\section{Variables used by \file{makefile.fpc}}
|
||||
|
||||
Many variables affect the behaviour of the makefile. The variables can be
|
||||
split in several groups:
|
||||
\begin{description}
|
||||
\item[Required variables]
|
||||
\item[Directory variables]
|
||||
\item[Target variables]
|
||||
\item[Compiler command-line variables]
|
||||
\end{description}
|
||||
Each group will be discussed separately in the subsequent.
|
||||
|
||||
\subsection{Required variables}
|
||||
|
||||
In principle, the \var{makefile.fpc} only expects one variable to be set:
|
||||
\begin{description}
|
||||
\item[FPCDIR] This is the base directory of \fpc sources. The makefile
|
||||
expects to find a directory \file{rtl} below this directory.
|
||||
\end{description}
|
||||
|
||||
However, many variables can be set, and influence the behaviour of the
|
||||
makefile.
|
||||
\subsection{Directory variables}
|
||||
|
||||
The first set of variables controls the directories used in the makefile:
|
||||
|
||||
@ -3776,20 +3787,25 @@ The first set of variables controls the directories used in the makefile:
|
||||
\item[INC] this is a list of directories, separated by spaces, that will
|
||||
be added as include directories to the compiler command-line.
|
||||
|
||||
\item[LIBDIR] is a list of library paths, separated by spaces. They are
|
||||
\item[LIBDIR] is a list of library paths, separated by spaces. Each
|
||||
directory in the list is prepended with \var{-Fl} and added to the
|
||||
compiler options.
|
||||
|
||||
\item[NEEDLIBDIR] is a space-separated list of library paths. Each
|
||||
directory in the list is
|
||||
prepended with \var{-Fl} and added to the compiler options.
|
||||
|
||||
\item[NEEDLIBDIR] is a space-separated list of library paths. They are
|
||||
prepended with \var{-Fl} and added to the compiler options.
|
||||
\item[NEEDOBJDIR] is a list of object file directories, separated by
|
||||
spaces. Each directory in the list is prepended with \var{-Fo} and
|
||||
added to the compiler options.
|
||||
|
||||
\item[NEEDOBJDIR] is a list of directories, separated by spaces, that is
|
||||
added to the object files path, i.e. prepended with \var{-Fo}.
|
||||
\item[NEEDUNITDIR] is a list of unit directories, separated by spaces.
|
||||
Each directory in the list is prepended with \var{-Fu} and is added to the
|
||||
compiler options.
|
||||
|
||||
\item[NEEDUNITDIR] is a list of directories, separated by spaces, that are
|
||||
added to the unit path of the compiler, i.e. they get \var {-Fu} prepended.
|
||||
|
||||
\item[OBJDIR] is a list of directories, separated by spaces, that is
|
||||
added to the object files path, i.e. prepended with \var{-Fo}.
|
||||
\item[OBJDIR] is a list of object file directories, separated by spaces, that is
|
||||
added to the object files path, i.e. Each directory in the list is prepended with
|
||||
\var{-Fo}.
|
||||
|
||||
\item[OSINC] this is a space-separated list of OS-dependent directories
|
||||
that will be added as include directories to the compiler command line.
|
||||
@ -3797,16 +3813,18 @@ that will be added as include directories to the compiler command line.
|
||||
\item[PROCINC] is a space-separated list of processor-dependent directories
|
||||
that will be added as include directories to the compiler command-line.
|
||||
|
||||
\item[RTL] If \var{RTLDIR} is not set, \var{RTL} is used to construct
|
||||
\var{RTLDIR}, after which \var{RTLDIR} is added to the compiler unit
|
||||
path, with \var{-Fu} prepended. If \var{RTLDIR} is not set, it is set
|
||||
to \mvar{RTL}/\mvar{OS\_TARGET}.
|
||||
|
||||
\item[RTLDIR] Directory where the \var{RTL} unit sources are.
|
||||
If \var{RTLDIR} is not set, it is set to \mvar{RTL}/\mvar{OS\_TARGET}. \\
|
||||
If \var{RTL} is also not set, it is set to \mvar{FPCDIR}\var{/rtl/}\mvar{OS\_TARGET}.
|
||||
|
||||
\item[RTL] If \var{RTLDIR} is not set, \var{RTL} is used to construct
|
||||
\var{RTLDIR}. \var{RTLDIR} is added to the compiler unit path, with \var{-Fu}
|
||||
prepended.
|
||||
|
||||
\item[TARGETDIR] If set, this directory is added as the output directory of
|
||||
the compiler, where all unis and executables are written, i.e. it gets
|
||||
the compiler, where all units and executables are written, i.e. it gets
|
||||
\var{-FE} prepended.
|
||||
|
||||
\item[UNIT] If \var{UNITDIR} is not set, \var{UNIT} is used to construct
|
||||
@ -3825,6 +3843,8 @@ the compiler, where all units are written, i.e. it gets
|
||||
\var{-FU} prepended. This overrides \var{TARGETDIR}.
|
||||
\end{description}
|
||||
|
||||
\subsection{Target variables}
|
||||
|
||||
The second set of variables controls the targets that are constructed
|
||||
by the makefile:
|
||||
|
||||
@ -3844,6 +3864,8 @@ makefile.
|
||||
this target is built first. If successful, the zip archive will be made.
|
||||
\end{description}
|
||||
|
||||
\subsection{Compiler command-line variables}
|
||||
|
||||
The following variables control the compiler command-line:
|
||||
\begin{description}
|
||||
\item[CFGFILE] if this variable is set, it will be used as the name of the
|
||||
@ -3858,7 +3880,7 @@ Automatically determined by the makefile.
|
||||
|
||||
\item[LIBTYPE] if set to \var{shared}, then the compiler will emit a shared
|
||||
library, with name \var{LIBNAME}.If \var{LIBTYPE} is set to \var{static},
|
||||
the compiler will emit a atatic, smartlinked library,
|
||||
the compiler will emit a static, smartlinked library,
|
||||
|
||||
\item[NEEDGCCLIB] if this variable is defined, then the path to \file{libgcc}
|
||||
is added to the library path.
|
||||
@ -3867,7 +3889,8 @@ is added to the library path.
|
||||
append all directories that appear in \var{/etc/ld.so.conf} to the library path.
|
||||
|
||||
|
||||
\item[OPT] Any options that you want to the compiler command-line.
|
||||
\item[OPT] Any options that you want to pass to the compiler. The contents
|
||||
of \var{OPT} is simply added to the compiler command-line.
|
||||
|
||||
\item[OPTDEF] Are optional defines, added to the command-line of the
|
||||
compiler. They do not get \var{-d} prepended.
|
||||
@ -3883,9 +3906,18 @@ will output smartlinked units if \var{LIBTYPE} is not set to \var{shared}.
|
||||
\section{Variables set by \file{makefile.fpc}}
|
||||
|
||||
All of the following variables are only set by \var{makefile.fpc}, if
|
||||
they aren't already defined. This means that you can ovverride them by
|
||||
they aren't already defined. This means that you can override them by
|
||||
setting them on the make command line, or setting them in the makefile you
|
||||
use, BEFORE \file{makefile.fpc} is included.
|
||||
The following sets of variables are defined:
|
||||
\begin{description}
|
||||
\item[Directory variables]
|
||||
\item[Program names]
|
||||
\item[File extensions]
|
||||
item[Target files]
|
||||
\end{description}
|
||||
Each of these sets is discussed in the subsequent:
|
||||
\subsection{Directory variables}
|
||||
|
||||
The following directories are defined by the makefile:
|
||||
|
||||
@ -3894,8 +3926,8 @@ The following directories are defined by the makefile:
|
||||
available. If not, it is set to '.'.
|
||||
|
||||
\item[BASEINSTALLDIR] is the base for all directories where units are
|
||||
installed. On \linux, this is set to\\
|
||||
\mvar{PREFIXINSTALLDIR}\var{/lib/fpc/}\mvar{RELEASEVER}. On other systems,
|
||||
installed. On \linux, this is set to
|
||||
\mvar{PREFIXINSTALLDIR}\var{/lib/fpc/}\mvar{RELEASEVER}.\\ On other systems,
|
||||
it is set to \mvar{PREFIXINSTALLDIR}
|
||||
|
||||
\item[BININSTALLDIR] is set to \mvar{BASEINSTALLDIR}/\var{bin} on \linux,
|
||||
@ -3906,8 +3938,8 @@ the place where binaries are installed.
|
||||
\item[GCCLIBDIR] (\linux only) is set to the directory where \file{libgcc.a}
|
||||
is.
|
||||
|
||||
\item[LIBINSTALLDIR] is set to \mvar{BASEINSTALLDIR} on \linux, and
|
||||
\mvar{BASEINSTALLDIR}/\var{lib} on other systems.
|
||||
\item[LIBINSTALLDIR] is set to \mvar{BASEINSTALLDIR} on \linux,\\
|
||||
and \mvar{BASEINSTALLDIR}/\var{lib} on other systems.
|
||||
|
||||
\item[OTHERLIBDIR] (\linux only) is set to the full set of paths in \file{/etc/ld.so.conf}
|
||||
|
||||
@ -3929,10 +3961,12 @@ installed. It equals \mvar{UNITINSTALLDIR}/\var{static}.
|
||||
|
||||
\item[UNITINSTALLDIR] is where units will be installed. This is set to\\
|
||||
\mvar{BASEINSTALLDIR}/\mvar{UNITPREFIX} \\
|
||||
on \linux. \\On other systems, it is
|
||||
set to \\\mvar{BASEINSTALLDIR}/\mvar{UNITPREFIX}/\mvar{OS\_TARGET}.
|
||||
on \linux. On other systems, it is set to \\
|
||||
\mvar{BASEINSTALLDIR}/\mvar{UNITPREFIX}/\mvar{OS\_TARGET}.
|
||||
\end{description}
|
||||
|
||||
\subsection{Program names}
|
||||
|
||||
The following variables are program names, used in makefile targets.
|
||||
\begin{description}
|
||||
\item[AS] The assembler. Default set to \file{as}.
|
||||
@ -3949,10 +3983,11 @@ The following variables are program names, used in makefile targets.
|
||||
755} on linux.
|
||||
\item[LD] The linker. Default set to \file{ld}.
|
||||
\item[LDCONFIG] (\linux only) the program used to update the loader cache.
|
||||
\item[MKDIR] a program to create directories if the don't exist yet. Default
|
||||
\item[MKDIR] a program to create directories if they don't exist yet. Default
|
||||
set to \file{install -m 755 -d}
|
||||
\item[MOVE] a file move program. Default set to \file{mv -f}
|
||||
\item[PP] the Free Pascal compiler
|
||||
\item[PP] the Free Pascal compiler executable. Default set to
|
||||
\var{ppc386.exe}
|
||||
\item[PPAS] the name of the shell script created by the compiler if the
|
||||
\var{-s} option is specified. This command will be executed after
|
||||
compilation, if the \var{-s} option was detected among the options.
|
||||
@ -3964,6 +3999,8 @@ self-extracting compressed executables.
|
||||
this program
|
||||
\end{description}
|
||||
|
||||
\subsection{File extensions}
|
||||
|
||||
The following variables denote extensions of files. These variables include
|
||||
the \var{.} (dot) of the extension. They are appended to object names.
|
||||
|
||||
@ -3975,20 +4012,22 @@ executable startup code.
|
||||
\item[PACKAGESUFFIX] is a suffix that is appended to package names in zip
|
||||
targets. This serves so packages can be made for different OSes.
|
||||
\item[PASEXT] is the extension of pascal files used in the compile rules.
|
||||
it is determined by looking at the first \var{EXEOBJECTS} source file or
|
||||
It is determined by looking at the first \var{EXEOBJECTS} source file or
|
||||
the first \var{UNITOBJECTS} files.
|
||||
\item[PPLEXT] is the extension of shared-library unit files.
|
||||
\item[PPLEXT] is the extension of shared library unit files.
|
||||
\item[PPUEXT] is the extension of default units.
|
||||
\item[SHAREDLIBEXT] is the extension of shared libraries.
|
||||
\item[SMARTEXT] is the extension of smartlinked unit assembler files.
|
||||
\item[STATICLIBEXT] is the extension of static libraries.
|
||||
\end{description}
|
||||
|
||||
\subsection{Target files}
|
||||
|
||||
The following variables are defined to make targets and rules easier:
|
||||
|
||||
\begin{description}
|
||||
\item[COMPILER] is the compltere compiler commandline, with all options
|
||||
added, after all Makefile variables have been examined.
|
||||
\item[COMPILER] is the complete compiler commandline, with all options
|
||||
added, after all \file{Makefile} variables have been examined.
|
||||
\item[DATESTR] contains the date.
|
||||
\item[EXEFILES] is a list of executables that will be created by the
|
||||
makefile.
|
||||
@ -4007,35 +4046,44 @@ extension appended.
|
||||
|
||||
The \var{makefile.fpc} defines a series of targets, which can be called by
|
||||
your own targets. They have names that resemble default names (such as
|
||||
'all', 'clean', only they have \var{fpc\_} prepended.
|
||||
'all', 'clean'), only they have \var{fpc\_} prepended.
|
||||
|
||||
\subsection{Pattern rules}
|
||||
|
||||
The makefile makes the following pattern rules:
|
||||
\begin{description}
|
||||
\item[units] How to make a pascal unit form a pascal source file.
|
||||
\item[units] how to make a pascal unit form a pascal source file.
|
||||
\item[executables] how to make an executable from a pascal source file.
|
||||
\item[object file] how to make an object file from an assembler file.
|
||||
\end{description}
|
||||
|
||||
\subsection{Build rules}
|
||||
|
||||
The following build targets are defined:
|
||||
\begin{description}
|
||||
\item[fpc\_all] Target that builds all units and executables as well as
|
||||
\item[fpc\_all] target that builds all units and executables as well as
|
||||
loaders. If \var{DEFAULTUNITS} is defined, executables are excluded from the
|
||||
targets.
|
||||
\item[fpc\_exes] Target to make all executables in \var{EXEOBJECTS}.
|
||||
\item[fpc\_loaders] Target to make all files in \var{LOADEROBJECTS}.
|
||||
\item[fpc\_sharedlib] Target that makes all units as dynamic libraries.
|
||||
\item[fpc\_staticlib] Target that makes all units as smartlinked units.
|
||||
\item[fpc\_units] Target to make all units in \var{UNITOBJECTS}.
|
||||
\item[fpc\_exes] target to make all executables in \var{EXEOBJECTS}.
|
||||
\item[fpc\_loaders] target to make all files in \var{LOADEROBJECTS}.
|
||||
\item[fpc\_sharedlib] target that makes all units as dynamic libraries.
|
||||
\item[fpc\_staticlib] target that makes all units as smartlinked units.
|
||||
\item[fpc\_units] target to make all units in \var{UNITOBJECTS}.
|
||||
\end{description}
|
||||
|
||||
\subsection{Cleaning rules}
|
||||
|
||||
The following cleaning targets are defined:
|
||||
\begin{description}
|
||||
\item[fpc\_clean] cleans all files that result when \var{fpc\_all} was made.
|
||||
\item[fpc\_libsclean] is the same as \var{fpc\_clean}, but removes any
|
||||
\item[fpc\_libsclean] is the same as \var{fpc\_clean}, but also removes any
|
||||
shared or dynamic libraries that may have been built.
|
||||
\item[fpc\_cleanall] is the same as both previous target commands.
|
||||
\item[fpc\_cleanall] is the same as both previous target commands, but also
|
||||
deletes all object, unit and assembler files that are present.
|
||||
\end{description}
|
||||
|
||||
\subsection{archiving rules}
|
||||
|
||||
The following archiving targets are defined:
|
||||
\begin{description}
|
||||
\item[fpc\_zipinstalladd] will add to a (possibibly existing) archive file (it's
|
||||
@ -4045,21 +4093,25 @@ name is taken from \mvar{ZIPNAME}.
|
||||
The zip is made uzing the \var{ZIPEXE} program. Under \linux, a
|
||||
\file{.tar.gz} file is created.
|
||||
|
||||
|
||||
\subsection{Informative rules}
|
||||
|
||||
The following targets produce information about the makefile:
|
||||
\begin{description}
|
||||
\item[fpc\_cfginfo] Gives generl configuration information: the location of
|
||||
\item[fpc\_cfginfo] gives general configuration information: the location of
|
||||
the makefile, the compiler version, target OS, CPU.
|
||||
\item[fpc\_dirinfo] Gives the directories, used by the compiler.
|
||||
\item[fpc\_info] Executes all other info targets.
|
||||
\item[fpc\_installinfo] Gives all directories where files will be installed.
|
||||
\item[fpc\_dirinfo] gives the directories, used by the compiler.
|
||||
\item[fpc\_info] executes all other info targets.
|
||||
\item[fpc\_installinfo] gives all directories where files will be installed.
|
||||
\item[fpc\_objectinfo] lists all objects that will be made.
|
||||
\item[fpc\_toolsinfo] lists all defined tools.
|
||||
\end{description}
|
||||
|
||||
\section{Using the provided template}
|
||||
|
||||
The template makefile that comes with \fpc does nothing other than
|
||||
offering you some variables to be set for the \file{makefile.fpc}.
|
||||
After that it loads the \var{makefile.fpc} in the indixated places.
|
||||
After that it loads the \var{makefile.fpc} in the indicated places.
|
||||
|
||||
Finally it declares a set of default targets:
|
||||
\begin{description}
|
||||
@ -4087,7 +4139,7 @@ the following variables:
|
||||
You may want to set some of the following variables:
|
||||
\begin{description}
|
||||
\item[INC,PROCINC or OSINC] To indicate where include files can be found.
|
||||
\item[NEEDOPT] additional optionas added to the compile command.
|
||||
\item[NEEDOPT] additional options added to the compile command.
|
||||
\item[NEEDUNITDIR] space-separated list of directories where units that you
|
||||
need are located.
|
||||
\item[TARGETDIR,UNITTARGETDIR] where do you want executables and units to
|
||||
@ -4106,4 +4158,244 @@ found, this command will inform you of this.
|
||||
|
||||
After that, a simple 'make all' will make all units and executables.
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
% Appendix F
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
\chapter{Compiling the compiler yourself}
|
||||
\label{ch:AppF}
|
||||
|
||||
\section{Introduction}
|
||||
|
||||
The \fpc team releases at intervals a completely prepared package, with
|
||||
compiler and units all ready to use, the so-called releases. After a
|
||||
release, work on the compiler continues, bugs are fixed and features are
|
||||
added. The \fpc team doesn't make a new release whenever they change
|
||||
something in the compiler, instead the sources are available for anyone to
|
||||
use and compile. Compiled versions of RTL and compiler are also made daily,
|
||||
and put on the web.
|
||||
|
||||
There are, nevertheless, circumstances when you'll want to compile the
|
||||
compiler yourself. For instance if you made changes to compiler code,
|
||||
or when you download the compiler via CVS.
|
||||
|
||||
There are essentially 2 ways of recompiling the compiler: by hand, or using
|
||||
the makefiles. Each of these methods will be discussed.
|
||||
|
||||
\section{Before you begin}
|
||||
|
||||
To compile the compiler easily, it is best to keep the following directory
|
||||
structure (a base directory of \file{/pp/src} is supposed, but that may be
|
||||
different):
|
||||
\begin{verbatim}
|
||||
/pp/src/Makefile
|
||||
/makefile.fpc
|
||||
/rtl/linux
|
||||
/inc
|
||||
/i386
|
||||
/...
|
||||
/compiler
|
||||
\end{verbatim}
|
||||
If you want to use the makefiles, you {\em must} use the above directory
|
||||
tree.
|
||||
|
||||
The compiler and rtl source are zipped in such a way that if you unzip both
|
||||
files in the same directory (\file{/pp/src} in the above) the above
|
||||
directory tree results.
|
||||
|
||||
The \file{makefile.fpc} and \file{Makefile} come from the \file{base.zip}
|
||||
file on the ftp site. If you compile manually, you don't need them.
|
||||
|
||||
There are 2 ways to start compiling the compiler and RTL. Both ways must be
|
||||
used, depending on the situation. Usually, the RTL must be compiled first,
|
||||
before compiling the compiler, after which the compiler is compiled using
|
||||
the current compiler. In some special cases the compiler must be compiled
|
||||
first, with a previously compiled RTL.
|
||||
|
||||
How to decide which should be compiled first? In general, the answer is that
|
||||
you should compile the RTL first. There are 2 exceptions to this rule:
|
||||
\begin{enumerate}
|
||||
\item The first case is when some of the internal routines in the RTL
|
||||
have changed, or if new internal routines appeared. Since the OLD compiler
|
||||
doesn't know about these changed internal routines, it will emit function
|
||||
calls that are based on the old compiled RTL, and hence are not correct.
|
||||
Either the result will not link, or the binary will give errors.
|
||||
\item The second case is when something is added to the RTL that the
|
||||
compiler needs to know about (a new default assembler mechanism, for
|
||||
example).
|
||||
\end{enumerate}
|
||||
How to know if one of these things has occurred ? There is no way to know.
|
||||
(except by mailing the \fpc team) Iff you cannot recompile the compiler
|
||||
when you first compile the RTL, then try the other way.
|
||||
|
||||
\section{Compiling using \file{make}}
|
||||
|
||||
When compiling with \var{make} it is necessary to have the above directory
|
||||
structure. Compiling the compiler is achieved with the target \var{cycle}.
|
||||
|
||||
Under normal circumstances, recompiling the compiler is limited to the
|
||||
following instructions (assuming you start in directory \file{/pp/src}):
|
||||
\begin{verbatim}
|
||||
cd compiler
|
||||
make cycle
|
||||
\end{verbatim}
|
||||
This will work only if the \file{makefile.fpc} is installed correctly and
|
||||
if the needed tools are present in the \var{PATH}. Which tools must be
|
||||
installed can be found in appendix \ref{ch:makefile}.
|
||||
|
||||
The above instructions will do the following:
|
||||
\begin{enumerate}
|
||||
\item Using the current compiler, the RTL is compiled in the correct
|
||||
directory, which is determined by the OS you are under. e.g. under \linux,
|
||||
the rtl is compile in diretory \file{rtl/linux}.
|
||||
\item The compiler is compiled using the newly compiled RTL. If successful,
|
||||
the newly compiled compiler executable is copied to a temporary executable.
|
||||
\item Using the temporary executable from the previous step, the RTL is
|
||||
re-compiled.
|
||||
\item Using the temporary executable and the newly compiled RTL from the
|
||||
last step, the compiler is compiled again.
|
||||
\end{enumerate}
|
||||
The last two steps are repeated 3 times, until three passes have been made or
|
||||
until the generated compiler binary is equal to the binary it was compiled
|
||||
with. This process ensures that the compiler binary is correct.
|
||||
|
||||
Compiling for another target:
|
||||
When you want to compile the compiler for another target, you must specify
|
||||
the \var{OS\_TARGET} makefile variable. It can be set to the following
|
||||
values: \var{win32}, \var{go32v2}, \var{os2} and \var{linux}.
|
||||
As an example, cross-compilation for the go32v2 target from the win32 target
|
||||
is chosen:
|
||||
\begin{verbatim}
|
||||
cd compiler
|
||||
make cycle OS_TARGET=go32v2
|
||||
\end{verbatim}
|
||||
This will compile the go32v2 RTL, and compile a \var{go32v2} compiler.
|
||||
|
||||
If you want to compile a new compiler, but you want the compiler to be
|
||||
compiled first using an existing compiled RTL, you should specify the
|
||||
\var{all} target, and specify another RTL directory than the default (which
|
||||
is the \file{../rtl/\$(OS\_TARGET)} directory). For instance, assuming that
|
||||
the compiled RTL units are in \var{/pp/rtl}, you could type
|
||||
\begin{verbatim}
|
||||
cd compiler
|
||||
make clean
|
||||
make all UNITDIR=/pp/rtl
|
||||
\end{verbatim}
|
||||
|
||||
This will then compile the compiler using the RTL units in \file{/pp/rtl}.
|
||||
After this has been done, you can do the 'make cycle', starting with this
|
||||
compiler:
|
||||
\begin{verbatim}
|
||||
make cycle PP=./ppc386
|
||||
\end{verbatim}
|
||||
This will do the \var{make cycle} from above, but will start with the compiler
|
||||
that was generated by the var{make all} instruction.
|
||||
|
||||
In all cases, many options can be passed to \var{make} to influence the
|
||||
compile process. In general, the makefiles add any needed compiler options
|
||||
to the command-line, so that the RTL and compiler can be compiled. You can
|
||||
specify additional options (e.g. optimization options) by passing them in
|
||||
\var{OPT}.
|
||||
|
||||
\section{Compiling by hand}
|
||||
|
||||
Compiling by hand is difficult and tedious, but can be done. We'll treat the
|
||||
compilation of RTl and compiler separately.
|
||||
|
||||
\subsection{Compiling the RTL}
|
||||
To recompile the RTL, so a new compiler can be built, at least the following
|
||||
units must be built, in the order specified:
|
||||
\begin{enumerate}
|
||||
\item[loaders] the program stubs, that are the startup code for each pascal
|
||||
program. These files have the \file{.as} extension, because they are written
|
||||
in assembler. They must be assembled with the gnu as assembler. These stubs
|
||||
are in the OS-dependent directory, except for \linux, where they are in a
|
||||
processor dependent subdirectory of the linux directory (\file{i386} or
|
||||
\file{m68k}).
|
||||
\item[system] the \file{system} unit. This unit is named differently on different
|
||||
systems:
|
||||
\begin{itemize}
|
||||
\item Only on GO32v2, it's called \file{system}.
|
||||
\item For \linux it's called \file{syslinux}.
|
||||
\item For \windowsnt it's calles \file{syswin32}.
|
||||
\item For \ostwo it's called \file{sysos2}
|
||||
\end{itemize}
|
||||
This unit resides in the OS-depentent subirectories of the RTL.
|
||||
\item[strings] The strings unit. This unit resides in the \file{inc}
|
||||
subdirectory of the RTL.
|
||||
\item[dos] The \file{dos} unit. It resides in the OS-dependent subdirectory
|
||||
of the RTL. Possibly other units will be compiled as a consequence of trying
|
||||
to compile this unit (e.g. on \linux, the \file{linux} unit will be compiled)
|
||||
\item[objects] the objects unit. It resides in the \file{inc} subdirectory
|
||||
of the RTL.
|
||||
\end{enumerate}
|
||||
To compile these units on a i386, the following statements will do:
|
||||
\begin{verbatim}
|
||||
ppc386 -Tlinux -b- -Fi../inc -Fi../i386 -FE. -di386 -Us -Sg syslinux.pp
|
||||
ppc386 -Tlinux -b- -Fi../inc -Fi../i386 -FE. -di386 ../inc/strings.pp
|
||||
ppc386 -Tlinux -b- -Fi../inc -Fi../i386 -FE. -di386 dos.pp
|
||||
ppc386 -Tlinux -b- -Fi../inc -Fi../i386 -FE. -di386 ../inc/objects.pp
|
||||
\end{verbatim}
|
||||
These are the minimum command-line options, needed to compile the RTL.
|
||||
|
||||
For another processor, you should change the \var{i386} into the appropriate
|
||||
processor. For another operating system (target) you should change the
|
||||
\file{syslinux} in the appropriate system unit file, and you should change
|
||||
the target OS setting (\var{-T}).
|
||||
|
||||
Depending on the target OS there are other units that you may wish to
|
||||
compile, but which are not strictly needed to recompile the compiler.
|
||||
The following units are available for all plaforms:
|
||||
\begin{description}
|
||||
\item[objpas] Needed for Delphi mode. needs \var{-S2} as an option. Resides
|
||||
in the \file{inc} subdirectory.
|
||||
\item[sysutils] many utility functions, like in Delphi. Resides in the
|
||||
\file{inc} directory, and needs \var{-S2}
|
||||
\item[typinfo] functions to access RTTI information, like Delphi.
|
||||
\item[math] math functions like in Delphi.
|
||||
\item[mmx] extensions for MMX class Intel processors. Resides in
|
||||
in the \file{i386} directory.
|
||||
\item[getopts] a GNU compatible getopts unit.
|
||||
\item[heaptrc] to debug the heap.
|
||||
\end{description}
|
||||
|
||||
\subsection{Compiling the compiler}
|
||||
|
||||
Compiling the compiler can be done with one statement. It's always best to
|
||||
remove all units from the compiler directory first, so something like
|
||||
\begin{verbatim}
|
||||
rm *.ppu *.o
|
||||
\end{verbatim}
|
||||
on \linux, and on \dos
|
||||
\begin{verbatim}
|
||||
del *.ppu
|
||||
del *.o
|
||||
\end{verbatim}
|
||||
After this, the compiler can be compiled with the following command-line:
|
||||
\begin{verbatim}
|
||||
ppc386 -Tlinux -Fu../rtl/linux -di386 -dGDB pp.pas
|
||||
\end{verbatim}
|
||||
So, the minimum options are:
|
||||
\begin{enumerate}
|
||||
\item The target OS. Can be skipped if you're compiling for the same target as
|
||||
the compiler you're using.
|
||||
\item A path to an RTL. Can be skipped if a correct ppc386.cfg configuration
|
||||
is on your system. If you want to compile with the RTL you compiled first,
|
||||
this should be \file{../rtl/OS} (replace the OS with the appropriate
|
||||
operating system subdirectory of the RTL)
|
||||
\item A define with the processor you're compiling for. is required.
|
||||
\item \var{-dGDB} is not strictly needed, but is better to add since
|
||||
otherwise you won't be able to compile with debug information.
|
||||
\item \var{-Sg} is needed, some parts of the compiler use \var{goto}
|
||||
statements.
|
||||
\end{enumerate}
|
||||
So the absolute minimal command line is
|
||||
\begin{verbatim}
|
||||
ppc386 -di386 -Sg pp.pas
|
||||
\end{verbatim}
|
||||
|
||||
You can define some other command-line options, but the above are the
|
||||
minimum. A list of recognised options can be found in the source, in
|
||||
\file{pp.pas}.
|
||||
|
||||
\end{document}
|
Loading…
Reference in New Issue
Block a user