From 3aeb4c05f27936a4d334a9b230ec7ee003ce11a1 Mon Sep 17 00:00:00 2001 From: David Turner <david@freetype.org> Date: Tue, 11 Jan 2000 20:00:05 +0000 Subject: [PATCH] Added a new document to docs/internals that describes the Build System clearly. I hope this will help other developers in adding platform-detection makefiles for additional systems.. --- docs/internals/build-system.html | 359 +++++++++++++++++++++++++ docs/internals/demo-programs.png | Bin 0 -> 2935 bytes docs/internals/drivers-list.png | Bin 0 -> 1899 bytes docs/internals/library-compilation.png | Bin 0 -> 1894 bytes docs/internals/platform-detection.png | Bin 0 -> 1808 bytes 5 files changed, 359 insertions(+) create mode 100644 docs/internals/build-system.html create mode 100644 docs/internals/demo-programs.png create mode 100644 docs/internals/drivers-list.png create mode 100644 docs/internals/library-compilation.png create mode 100644 docs/internals/platform-detection.png diff --git a/docs/internals/build-system.html b/docs/internals/build-system.html new file mode 100644 index 000000000..b80f2c160 --- /dev/null +++ b/docs/internals/build-system.html @@ -0,0 +1,359 @@ +<!doctype html public "-//w3c//dtd html 4.0 transitional//en"> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> + <meta name="Author" content="David Turner"> + <meta name="GENERATOR" content="Mozilla/4.5 [fr] (Win98; I) [Netscape]"> + <title>FreeType 2 Internals - I/O Frames</title> +</head> +<body> + +<body text="#000000" + bgcolor="#FFFFFF" + link="#0000EF" + vlink="#51188E" + alink="#FF0000"> + +<center> +<h1> +FreeType 2.0 Build System</h1></center> + +<center> +<h3> +© 2000 David Turner (<a href="fichier :///david@freetype.org">david@freetype.org</a>)<br> +© 2000 The FreeType Development Team +(<a href="mailto:devel@freetype.org">devel@freetype.org</a>) +</h3></center> + +<p><br> +<hr WIDTH="100%"> +<br> +<h2>Introduction:</h2> +<ul> + This document describes the new build system that was introduced + with FreeType 2. +</ul> + +<p><hr><p> + +<h2>I. Features and Background:</h2> +<ul> + The FreeType 2 build system is a set of Makefiles and sub-Makefiles that + are used to build the library on a very large variety of systems. To + understand it properly, it must be noticed that:<p> + <ul> + <li>The build system is made of a <em>single Makefile</em>, + dispatched over several directories with the help of the + <tt>include</tt> directive. Technically speaking, it is + composed of the top-level "<tt>freetype2/Makefile</tt>" + which includes several other sub-Makefiles, whose extension + is always "<tt>.mk</tt>". Examples are:<p> + <ul> + <tt>freetype2/config/freetype.mk</tt><br> + <tt>freetype2/config/<em>system</em>/detect.mk</tt><br> + <tt>freetype2/src/<em>module</em>/rules.mk</tt><br> + etc.. + </ul> + <p> + <font size="+2" color="red"> + We <em>strongly</em> recommend the following article:<p> + <center> + <a href="http://www.pcug.org.au/~millerp/rmch/recu-make-cons-harm.html"> + Recursive Make Considered Dangerous + </a> + </center> + </font> + <p> + To understand why such a layout was chosen. + <p> + + <li>The build system works <em>exclusively</em> with + <b>GNU Make</b>. Reason is that it is the only make utility + that has all the features required to implement the build + system as described below. Moreover, it is already ported + to hundreds of various distinct platforms and is widely and + freely available. + <p> + <em>You don't need a Unix-like shell on your platform</em>. + For example, FreeType 2 already compiles on Unix, Dos, Windows + and OS/2 right "out of the box" (assuming you have GNU Make + installed). + <p> + Note that we have <em>no plans</em> to support a different + make tool, as you'll rapidly understand by reading this + document or looking at the Makefiles themselves. + <p> + </ul> + <p> + + + The build system features some important points, which are all detailed + in the following sections:<p> + <ul> + <li><b>Automatic host platform detection</b><br> + The first time the top <tt>Makefile</tt> is invoked, it will + run a series of rules to detect your platform. It will then + create a system-specific configuration sub-Makefile in the + current directory, called <b><tt>config.mk</tt></b>. You can now + invoke the top <tt>Makefile</tt> a second time to compile the + library directly. + <p> + The configuration sub-makefile can be regenerated any time + by invoking "<tt>make setup</tt>", which will re-run the + detection rules even if a <tt>config.mk</tt> is already present. + <p> + + + <li><b>User-selectable builds</b><br> + The system-specific <b><tt>config.mk</tt></b> created when + running <tt>make</tt> for the first time contains various + definitions, including compiler, compiler flags, object files + directories, etc.. However, a given platform has often several + compilers available, each with a different name and flags to be + used. Rather than trying to detect the compiler in the build + system, users can also specify which compiler they use when + running <tt>make</tt>. + <p> + For example, on Win32 platforms:<p> + <ul> + <table> + <tr valign="top"> + <td><b><tt>make setup</tt></b> + <td>Will generate a <tt>config.mk</tt> that + can be used to compile the library with + <b><tt>gcc</tt></b> (<em>which is the default + compiler for most supported platforms</em>). + + <tr valign="top"> + <td><b><tt>make setup visualc</tt></b> + <td>Will generate a different <tt>config.mk</tt> + that can be used to compile the library + with the Visual C++ command-line compiler. + + <tr valign="top"> + <td><b><tt>make setup lcc</tt></b> + <td>Will generate a different <tt>config.mk</tt> + that can be used to compile the library + with the Win32-LCC compiler. + </table> + </ul> + <p> + + + + <li><b>Automatic detection of font drivers</b><br> + FreeType is made of a "base" layer that invokes several + separately-compiled modules. Each module is a given + font driver, in charge of supporting a given font format. + <p> + The list of font drivers is located in the file + "<tt>freetype2/config/<em>system</em>/ftmodule.h</tt>", however + it can be regenerated on-demand. Adding a new module to the + FreeType source tree is thus as easy as:<p> + <ul> + <li>create a new directory in "<tt>freetype2/src</tt>" and + put the new driver's source code and sub-makefiles there. + <p> + + <li>invoke the top <tt>Makefile</tt> with target + "<tt>modules</tt>" (as in "<tt>make modules</tt>"), + as this will automatically regenerate the list of + available drivers by detecting the new directory and + its content. + </ul> + <p> + </ul> +</ul> + +<p><hr><p> + +<h2>II. Host Platform Detection</h2> +<ul> + When the top-level <tt>Makefile</tt> is invoked, it looks for a + file named <tt>config.mk</tt> in the current directory. If this + file is found, it is used to build the library + (see <a href="library">Section III</a>). + <p> + Otherwise, the file <tt>freetype2/config/detect.mk</tt> is included + and parsed. Its purpose is to:<p> + <ul> + <li>Define the <tt>PLATFORM</tt> variable, which indicates + what is the currently detected platform. It is initially + set to the default value "<tt>ansi</tt>". + <p> + + <li>It searches for a <tt>detect.mk</tt> file in all + subdirectories of <tt>freetype2/config</tt>. Each such + file is included and parsed. Each of these files must + try to detect if the host platform is a system it knows + about. If so, it changes the value of the <tt>PLATFORM</tt> + accordingly. + </ul> + <p> + This is illustrated by the following graphics :<p> + <center> + <img src="platform-detection.png" border=0> + </center> + <p> + Note that each system-specific <tt>detect.mk</tt> is in charge + of copying a valid configuration makefile to the current directory + (i.e. the one where <tt>make</tt> was invoked), depending on the + current targets. For example, the Win32 <tt>detect.mk</tt> will + be able to detect a "<tt>visualc</tt>" or "<tt>lcc</tt>" target, + as described in section I. Similarly, the OS/2 <tt>detect.mk</tt> + can detect targets like "<tt>borlandc</tt>", "<tt>watcom</tt>" + or "<tt>visualage</tt>", etc.. +</ul> + +<p><hr><p> + +<h2>III. Building the library</h2> +<ul> + When the top-level <tt>Makefile</tt> is invoked and that it finds + a <tt>config.mk</tt> file in the current directory, it defines + the variable <tt>BUILD_FREETYPE</tt>, then includes and parses the + configuration sub-makefile. + <p> + The latter defines a number of important variables that describe + the compilation process to the build system. Among other things:<p> + <ul> + <li>the extension to be used for object files and library files + (i.e. <tt>.o</tt> and <tt>.a</tt> on Unix, <tt>.obj</tt> + and <tt>.lib</tt> on Dos-Windows-OS/2, etc..). + <p> + + <li>the directory where all object files will be stored + (usually <tt>freetype2/obj</tt>), as well as the one + containing the library file (usually the same as for + objects). + <p> + + <li>the command line compiler, and its compilation flags for + indicating a new include path (usually "<tt>-I</tt>"), + a new macro declaration (usually "<tt>-D</tt>") or + the target object file (usually "<tt>-o </tt>") + </ul> + <p> + Once these variable are defined, <tt>config.mk</tt> test for the + definition of the <tt>BUILD_FREETYPE</tt> variable. If it exists, + the makefile then includes "<tt>freetype2/config/freetype.mk</tt>" + which contains the rules required to compile the library. + <p> + Note that <tt>freetype.mk</tt> also scans the subdirectories of + "<tt>freetype2/src</tt>" for a file called "<tt>rules.mk</tt>". + Each <tt>rules.mk</tt> contains, as it names suggests, the rules + required to compile a given font driver or module. + <p> + Once all this parsing is done, the library can be compiled. Usually, + each font driver is compiled as a standalone object file (e.g. + <tt>sfnt.o</tt>, <tt>truetype.o</tt> and <tt>type1.o</tt>). + <p> + This process can be illustrated by the following graphics:<p> + <center> + <img src="library-compilation.png" border=0> + </center> + <p> +</ul> + +<p><hr><p> + +<h2>IIV. Managing the list of modules</h2> +<ul> + The makefile <tt>freetype.mk</tt> only determines how to compile + each one of the modules that are located in the sub-directories of + <tt>freetype2/src</tt>. + <p> + However, when the function <tt>FT_Init_FreeType</tt> is invoked at + the start of an application, it must create a new <tt>FT_Library</tt> + object, and registers all <em>known</em> font drivers to it by + repeatly calling <tt>FT_Add_Driver</tt>. + <p> + The list of <em>known</em> drivers is located in the file + "<tt>freetype2/config/<em>system</em>/ftmodule.h</tt>", and is used + exclusively by the internal function <tt>FT_Default_Drivers</tt>. The + list in <tt>ftmodule.h</tt> must be re-generated each time you add + or remove a module from <tt>freetype2/src</tt>. + <p> + This is normally performed by invoking the top-level <tt>Makefile</tt> + with the <tt>modules</tt> target, as in:<p> + <ul> + <tt>make modules</tt> + </ul> + <p> + This will trigger a special rule that will re-generate + <tt>ftmodule.h</tt>. To do so, the Makefile will parse all module + directories for a file called "<tt>module.mk</tt>". Each + <tt>module.mk</tt> is a tiny sub-Makefile used to add a single + module to the driver list. + <p> + This is illustrated by the following graphics:<p> + <center> + <img src="drivers-list.png" border=0> + </center> + <p> + Note that the new list of modules is displayed in a very human-friendly + way after a "<tt>make modules</tt>". Here's an example with the current + source tree (on 11 Jan 2000):<p> + <ul><pre> +Regenerating the font drivers list in ./config/unix/ftmodule.h +* driver: sfnt ( pseudo-driver for TrueType & OpenType formats ) +* driver: truetype ( Windows/Mac font files with extension *.ttf or *.ttc ) +* driver: type1 ( Postscript font files with extension *.pfa or *.pfb ) +-- done -- + </pre></ul> + +</ul> + +<p><hr><p> + +<h2>V. Building the demonstration programs</h2> +<ul> + Several demonstration programs are located in the + "<tt>freetype2/demos</tt>" directory hierarchy. This directory also + includes a tiny graphics sub-system that is able to blit glyphs to + a great variety of surfaces, as well as display these in various + graphics libraries or windowed environments. + <p> + This section describes how the demonstration programs are compiled, + using the configuration <tt>freetype2/config.mk</tt> and their own + <tt>freetype2/demos/Makefile</tt>. + <p> + To compile the demonstration programs, <em>after the library</em>, + simply go to <tt>freetype2/demos</tt> then invoke GNU make with no + arguments. + <p> + The top-level Makefile will detect the <tt>config.mk</tt> in the + <em>upper</em> directory and include it. Because it doesn't define + the <tt>BUILD_FREETYPE</tt> variable, this will not force the + inclusion of <tt>freetype2/config/freetype.mk</tt> as described in + the previous section. + <p> + the <tt>Makefile</tt> will then include the makefile called + "<tt>freetype2/demos/graph/rules.mk</tt>". The graphics <tt>rules.mk</tt> + defines the rules required to compile the graphics sub-system. + <p> + Because the graphics syb-system is also designed modularly, it is able + to use any number of "modules" to display surfaces on the screen. + The graphics modules are located in the subdirectories of + <tt>freetype2/demos/config</tt>. Each such directory contains a file + named <tt>rules.mk</tt> which is in charge of:<p> + <ul> + <li>detecting wether the corresponding graphics library is + available at the time of compilation. + <p> + <li>if it is, alter the compilation rules to include the graphics + module in the build of the <tt>graph</tt> library. + </ul> + <p> + When the <tt>graph</tt> library is built in <tt>demos/obj</tt>, the + demonstration programs executables are generated by the top-level + Makefile. + <p> + This is illustrated by the following graphics:<p> + <center> + <img src="demo-programs.png" border="0"> + </center> +</ul> + +<p><hr> + diff --git a/docs/internals/demo-programs.png b/docs/internals/demo-programs.png new file mode 100644 index 0000000000000000000000000000000000000000..692b27771781184bb857b32b83645dc2934e8da8 GIT binary patch literal 2935 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 literal 0 HcmV?d00001 diff --git a/docs/internals/drivers-list.png b/docs/internals/drivers-list.png new file mode 100644 index 0000000000000000000000000000000000000000..b5a52748a5a98963738c880f8139ab42b3b8a82b GIT binary patch literal 1899 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 literal 0 HcmV?d00001 diff --git a/docs/internals/library-compilation.png b/docs/internals/library-compilation.png new file mode 100644 index 0000000000000000000000000000000000000000..a12505b01ec8bc86a90dbe21201a63ae268235dc GIT binary patch literal 1894 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 literal 0 HcmV?d00001 diff --git a/docs/internals/platform-detection.png b/docs/internals/platform-detection.png new file mode 100644 index 0000000000000000000000000000000000000000..9a504b45e7ea7c58bfb1588e3176ca6b40de9e42 GIT binary patch literal 1808 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 literal 0 HcmV?d00001