blob: 4ee65e3a204d1c5836174bdbf28b265c842afb2c [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Choosing the right build system</title>
<meta http-equiv="content-type"
content="text/html; charset=ISO-8859-1">
</head>
<body>
<h1>Autotools and OpenOffice.org</h1>
draft 0.1 <a href="mailto:mh@openoffice.org">mh@openoffice.org </a>09/18/2002<br>
<br>
autoconf is the most standard build system in the OpenSource world. It automatically
configure software source code packages. These scripts can adapt the packages
to many kinds of UNIX-like systems without manual user intervention. Autoconf
creates a configuration script for a package from a template file that lists
the operating system features that the package can use, in the form of m4
macro calls. The sequence:<br>
<blockquote>./configure<br>
make<br>
make install<br>
</blockquote>
is well known for many Open Source software packages. Many times the question
come up, why OpenOffice.org is not or only partly using this standard build
system.<br>
<br>
<h2>Checking the prerequistes</h2>
one of the major tasks for a build system is to check the prerequites for
the build. Typical candidates are <br>
<ul>
<li>Build tools like compiler, linker</li>
<li>other development tools like flex, bison</li>
<li>Software development kits like jdk (Java Development Kit) or minor kits
(external libraries and header files like neon, freetype, berkerleydb)</li>
</ul>
<h2>Creating the Configuration</h2>
After all the prerequisites have been checked and validated the configuation
can be created. In the autotools environment this happens through:<br>
<ul>
<li>generation of config.h</li>
<li>generation of makefiles</li>
</ul>
In the OpenOffice.org this is done through the generation of a script file
which describes environment variables to be set after source/executing this
script file. This is a big difference and has some reasons:<br>
<ul>
<li>OpenOffice.org is used to work on a firm feature set per platform, that
means a Linux build should be on every Linux distribution the same, independent
from preinstalled development kits (see above). We see it as critical to
have binary distrubtion of a product available, which have a different feature
set provided to the user of the product. This is feasable if you are try
to adopt some source to your local configuration of your local machine, but
it's not feasable for redistribution in binary form. So we decided not to
use a dynamic created config.h (long before StarOffice went OpenSource). Also
there are not many different Unix flavours available and support at the
time the autotools were introduced. Also almost of the platform dependencies
should be coved in one Layer (SAL, System Abstraction Layer), most of the
other stuff (exception are vcl, bridges) should be system independent and
shouldn't contain any "HAVE_bla" or "#ifdef platform" conditions (in theory).</li>
<li>because OpenOffice.org/StarOffice is an end user product, we support
only well defined versions of compiler. We should not use the compiler which
we have randomly found on our machine to produce a redistribution of our product.
Almost every compiler version has different optimization bugs in it, so that
the risk of program failures is simply to high if using a unkown/untested
version of a compiler. So the usual testing of a compiler within configure,
if it is possible to create object files and so on is simply superflous and
too time consuming. This is also valid for other tools like bison, flex etc.
Of course a user should be able to choose a compiler of his own.<br>
</li>
<li>The creation of makefiles and config.h is also critical because everything
has to be recreated due to the dependency of almost every artifact to these
files (for this reason compiler cache has been created).</li>
<li>The configuration for debug, product, profiles, shared, static build
method is also hardcoded into the generated makefiles, so a mixture a debug/nondebug,
optimized/non optimized object files is not possible but necessary for a product
with the size of OpenOffice.org (e.g. it's on almost all machines not possible
to run a full debug build in a debugger, because several Gigabytes of RAM
are needed).</li>
<li>autotools implementation relies on complex macro programming (m4) this
is just a reason more not to use it. The feature set that is needed for a
OpenOffice.org build is/was not available in autotools and there were no resource
to reimplement these in autotools (many new rules for resource, idl compiler,
own resource format, many other OpenOffice.org specific tagets which are
not available in the current automake implementation).&nbsp;</li>
<li>current makefile implementions are written for dmake, there were no
resources to rewrite it in GNUmake. Are there any advantages in opposite to
dmake beside the argument that GNUmake is the "standard make" ?</li>
<li>configure is too time consuming for just setting up an build environment
(e.g. configure for binutils 2.13 lasts several minutes on a 2-3 year old
machine). OpenOffice.org developers work on several codelines
in parallel, so a long configure time is not acceptable (imagine the worst case: generation
of over 1000 makefiles or one gigantic makefile ;) ).</li>
<li>autotools are using <a
href="http://www.tip.net.au/%7Emillerp/rmch/recu-make-cons-harm.html">recursive
makefiles</a>.<br>
</li>
</ul>
<br>
<h2>Building</h2>
After configuration is done, the build of the product is coming. On a quite
modern machine (1.8 GHz Linux) the build last about 6 hours. On older machines
a build will last up to one day. For this reason no StarOffice or
OpenOffice.org developer will
build a complete Office on his own. There are centralized builds available, and
a developer will only grab part of the solver and the source of the modules
he is interested in. He changes some files and only the effected (object-)
files have to be recreated. This speeds up development cycle at lot. To set
up environment we use:<br>
<ul>
<li><a
href="http://porting.openoffice.org/source/browse/tools/solenv/bin/setsolar.pl">setsolar.pl</a>
(alias setsolar.pl 'perl ooo/solenv/bin/setsolar.pl -envroot -sourceroot
-file ~/.solar.env.$$.tmp !*; source ~/.solar.env.$$.tmp; rm -f ~/.solar.env.$$.tmp'
leeds to commands like "setsolar -pro -srx643 unxsols3" and set solver paths
to globally shared copy of solver. An extra switch -ca (copy all) create
a local enviroment, that means the solver gets copied on your local hard
disk.</li>
<li>dmake options:</li>
<ul>
<li>dmake debug=t build with debug information in the current directory</li>
<li>dmake nopt=t builds without optimization flags</li>
<li>dmake depend=t generates new dependencies</li>
<li>other options like profile=t, lint=t, linkinc=t also available</li>
</ul>
<li><a
href="http://porting.openoffice.org/source/browse/tools/solenv/bin/build.pl">build.pl
</a>tool: avoid recursive makefile and have some goodies:</li>
<ul>
<li>build -all build all dependent modules up to current module</li>
<li>build -from</li>
<li>build -since</li>
<li>build -PPn : parallel building (see also dmake -Pn)<br>
</li>
</ul>
</ul>
<br>
<h4>References:</h4>
autoconf: <a
href="http://www.gnu.org/manual/autoconf/html_mono/autoconf.html">http://www.gnu.org/manual/autoconf/html_mono/autoconf.html</a><br>
automake: <a
href="http://www.gnu.org/manual/automake/html_mono/automake.html">http://www.gnu.org/manual/automake/html_mono/automake.html<br>
</a>make: <a href="http://www.gnu.org/manual/make/html_mono/make.html">http://www.gnu.org/manual/make/html_mono/make.html</a><br>
<br>
<br>
</body>
</html>