This file is indexed.

/usr/share/doc/python-lxml/html/build.html is in python-lxml-doc 2.3.2-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.7: http://docutils.sourceforge.net/" />
<title>How to build lxml from source</title>
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body>
<div class="document" id="how-to-build-lxml-from-source">
<div class="sidemenu"><ul id="lxml-section"><li><span class="section title">lxml</span><ul class="menu foreign" id="index-menu"><li class="menu title"><a href="index.html">lxml</a><ul class="submenu"><li class="menu item"><a href="index.html#introduction">Introduction</a></li><li class="menu item"><a href="index.html#documentation">Documentation</a></li><li class="menu item"><a href="index.html#download">Download</a></li><li class="menu item"><a href="index.html#mailing-list">Mailing list</a></li><li class="menu item"><a href="index.html#bug-tracker">Bug tracker</a></li><li class="menu item"><a href="index.html#license">License</a></li><li class="menu item"><a href="index.html#old-versions">Old Versions</a></li></ul></li></ul><ul class="menu foreign" id="intro-menu"><li class="menu title"><a href="intro.html">Why lxml?</a><ul class="submenu"><li class="menu item"><a href="intro.html#motto">Motto</a></li><li class="menu item"><a href="intro.html#aims">Aims</a></li></ul></li></ul><ul class="menu foreign" id="installation-menu"><li class="menu title"><a href="installation.html">Installing lxml</a><ul class="submenu"><li class="menu item"><a href="installation.html#requirements">Requirements</a></li><li class="menu item"><a href="installation.html#installation">Installation</a></li><li class="menu item"><a href="installation.html#building-lxml-from-sources">Building lxml from sources</a></li><li class="menu item"><a href="installation.html#using-lxml-with-python-libxml2">Using lxml with python-libxml2</a></li><li class="menu item"><a href="installation.html#ms-windows">MS Windows</a></li><li class="menu item"><a href="installation.html#macos-x">MacOS-X</a></li></ul></li></ul><ul class="menu foreign" id="performance-menu"><li class="menu title"><a href="performance.html">Benchmarks and Speed</a><ul class="submenu"><li class="menu item"><a href="performance.html#general-notes">General notes</a></li><li class="menu item"><a href="performance.html#how-to-read-the-timings">How to read the timings</a></li><li class="menu item"><a href="performance.html#parsing-and-serialising">Parsing and Serialising</a></li><li class="menu item"><a href="performance.html#the-elementtree-api">The ElementTree API</a></li><li class="menu item"><a href="performance.html#xpath">XPath</a></li><li class="menu item"><a href="performance.html#a-longer-example">A longer example</a></li><li class="menu item"><a href="performance.html#lxml-objectify">lxml.objectify</a></li></ul></li></ul><ul class="menu foreign" id="compatibility-menu"><li class="menu title"><a href="compatibility.html">ElementTree compatibility of lxml.etree</a></li></ul><ul class="menu foreign" id="FAQ-menu"><li class="menu title"><a href="FAQ.html">lxml FAQ - Frequently Asked Questions</a><ul class="submenu"><li class="menu item"><a href="FAQ.html#general-questions">General Questions</a></li><li class="menu item"><a href="FAQ.html#installation">Installation</a></li><li class="menu item"><a href="FAQ.html#contributing">Contributing</a></li><li class="menu item"><a href="FAQ.html#bugs">Bugs</a></li><li class="menu item"><a href="FAQ.html#id1">Threading</a></li><li class="menu item"><a href="FAQ.html#parsing-and-serialisation">Parsing and Serialisation</a></li><li class="menu item"><a href="FAQ.html#xpath-and-document-traversal">XPath and Document Traversal</a></li></ul></li></ul></li></ul><ul id="Developing with lxml-section"><li><span class="section title">Developing with lxml</span><ul class="menu foreign" id="tutorial-menu"><li class="menu title"><a href="tutorial.html">The lxml.etree Tutorial</a><ul class="submenu"><li class="menu item"><a href="tutorial.html#the-element-class">The Element class</a></li><li class="menu item"><a href="tutorial.html#the-elementtree-class">The ElementTree class</a></li><li class="menu item"><a href="tutorial.html#parsing-from-strings-and-files">Parsing from strings and files</a></li><li class="menu item"><a href="tutorial.html#namespaces">Namespaces</a></li><li class="menu item"><a href="tutorial.html#the-e-factory">The E-factory</a></li><li class="menu item"><a href="tutorial.html#elementpath">ElementPath</a></li></ul></li></ul><ul class="menu foreign" id="api index-menu"><li class="menu title"><a href="api/index.html">API reference</a></li></ul><ul class="menu foreign" id="api-menu"><li class="menu title"><a href="api.html">APIs specific to lxml.etree</a><ul class="submenu"><li class="menu item"><a href="api.html#lxml-etree">lxml.etree</a></li><li class="menu item"><a href="api.html#other-element-apis">Other Element APIs</a></li><li class="menu item"><a href="api.html#trees-and-documents">Trees and Documents</a></li><li class="menu item"><a href="api.html#iteration">Iteration</a></li><li class="menu item"><a href="api.html#error-handling-on-exceptions">Error handling on exceptions</a></li><li class="menu item"><a href="api.html#error-logging">Error logging</a></li><li class="menu item"><a href="api.html#serialisation">Serialisation</a></li><li class="menu item"><a href="api.html#cdata">CDATA</a></li><li class="menu item"><a href="api.html#xinclude-and-elementinclude">XInclude and ElementInclude</a></li><li class="menu item"><a href="api.html#write-c14n-on-elementtree">write_c14n on ElementTree</a></li></ul></li></ul><ul class="menu foreign" id="parsing-menu"><li class="menu title"><a href="parsing.html">Parsing XML and HTML with lxml</a><ul class="submenu"><li class="menu item"><a href="parsing.html#parsers">Parsers</a></li><li class="menu item"><a href="parsing.html#the-target-parser-interface">The target parser interface</a></li><li class="menu item"><a href="parsing.html#the-feed-parser-interface">The feed parser interface</a></li><li class="menu item"><a href="parsing.html#iterparse-and-iterwalk">iterparse and iterwalk</a></li><li class="menu item"><a href="parsing.html#python-unicode-strings">Python unicode strings</a></li></ul></li></ul><ul class="menu foreign" id="validation-menu"><li class="menu title"><a href="validation.html">Validation with lxml</a><ul class="submenu"><li class="menu item"><a href="validation.html#validation-at-parse-time">Validation at parse time</a></li><li class="menu item"><a href="validation.html#id1">DTD</a></li><li class="menu item"><a href="validation.html#relaxng">RelaxNG</a></li><li class="menu item"><a href="validation.html#xmlschema">XMLSchema</a></li><li class="menu item"><a href="validation.html#id2">Schematron</a></li><li class="menu item"><a href="validation.html#id3">(Pre-ISO-Schematron)</a></li></ul></li></ul><ul class="menu foreign" id="xpathxslt-menu"><li class="menu title"><a href="xpathxslt.html">XPath and XSLT with lxml</a><ul class="submenu"><li class="menu item"><a href="xpathxslt.html#xpath">XPath</a></li><li class="menu item"><a href="xpathxslt.html#xslt">XSLT</a></li></ul></li></ul><ul class="menu foreign" id="objectify-menu"><li class="menu title"><a href="objectify.html">lxml.objectify</a><ul class="submenu"><li class="menu item"><a href="objectify.html#the-lxml-objectify-api">The lxml.objectify API</a></li><li class="menu item"><a href="objectify.html#asserting-a-schema">Asserting a Schema</a></li><li class="menu item"><a href="objectify.html#objectpath">ObjectPath</a></li><li class="menu item"><a href="objectify.html#python-data-types">Python data types</a></li><li class="menu item"><a href="objectify.html#how-data-types-are-matched">How data types are matched</a></li><li class="menu item"><a href="objectify.html#what-is-different-from-lxml-etree">What is different from lxml.etree?</a></li></ul></li></ul><ul class="menu foreign" id="lxmlhtml-menu"><li class="menu title"><a href="lxmlhtml.html">lxml.html</a><ul class="submenu"><li class="menu item"><a href="lxmlhtml.html#parsing-html">Parsing HTML</a></li><li class="menu item"><a href="lxmlhtml.html#html-element-methods">HTML Element Methods</a></li><li class="menu item"><a href="lxmlhtml.html#running-html-doctests">Running HTML doctests</a></li><li class="menu item"><a href="lxmlhtml.html#creating-html-with-the-e-factory">Creating HTML with the E-factory</a></li><li class="menu item"><a href="lxmlhtml.html#working-with-links">Working with links</a></li><li class="menu item"><a href="lxmlhtml.html#forms">Forms</a></li><li class="menu item"><a href="lxmlhtml.html#cleaning-up-html">Cleaning up HTML</a></li><li class="menu item"><a href="lxmlhtml.html#html-diff">HTML Diff</a></li><li class="menu item"><a href="lxmlhtml.html#examples">Examples</a></li></ul></li></ul><ul class="menu foreign" id="cssselect-menu"><li class="menu title"><a href="cssselect.html">lxml.cssselect</a><ul class="submenu"><li class="menu item"><a href="cssselect.html#the-cssselector-class">The CSSSelector class</a></li><li class="menu item"><a href="cssselect.html#css-selectors">CSS Selectors</a></li><li class="menu item"><a href="cssselect.html#namespaces">Namespaces</a></li><li class="menu item"><a href="cssselect.html#limitations">Limitations</a></li></ul></li></ul><ul class="menu foreign" id="elementsoup-menu"><li class="menu title"><a href="elementsoup.html">BeautifulSoup Parser</a><ul class="submenu"><li class="menu item"><a href="elementsoup.html#parsing-with-the-soupparser">Parsing with the soupparser</a></li><li class="menu item"><a href="elementsoup.html#entity-handling">Entity handling</a></li><li class="menu item"><a href="elementsoup.html#using-soupparser-as-a-fallback">Using soupparser as a fallback</a></li><li class="menu item"><a href="elementsoup.html#using-only-the-encoding-detection">Using only the encoding detection</a></li></ul></li></ul><ul class="menu foreign" id="html5parser-menu"><li class="menu title"><a href="html5parser.html">html5lib Parser</a><ul class="submenu"><li class="menu item"><a href="html5parser.html#differences-to-regular-html-parsing">Differences to regular HTML parsing</a></li><li class="menu item"><a href="html5parser.html#function-reference">Function Reference</a></li></ul></li></ul></li></ul><ul id="Extending lxml-section"><li><span class="section title">Extending lxml</span><ul class="menu foreign" id="resolvers-menu"><li class="menu title"><a href="resolvers.html">Document loading and URL resolving</a><ul class="submenu"><li class="menu item"><a href="resolvers.html#xml-catalogs">XML Catalogs</a></li><li class="menu item"><a href="resolvers.html#uri-resolvers">URI Resolvers</a></li><li class="menu item"><a href="resolvers.html#document-loading-in-context">Document loading in context</a></li><li class="menu item"><a href="resolvers.html#i-o-access-control-in-xslt">I/O access control in XSLT</a></li></ul></li></ul><ul class="menu foreign" id="extensions-menu"><li class="menu title"><a href="extensions.html">Python extensions for XPath and XSLT</a><ul class="submenu"><li class="menu item"><a href="extensions.html#xpath-extension-functions">XPath Extension functions</a></li><li class="menu item"><a href="extensions.html#xslt-extension-elements">XSLT extension elements</a></li></ul></li></ul><ul class="menu foreign" id="element classes-menu"><li class="menu title"><a href="element_classes.html">Using custom Element classes in lxml</a><ul class="submenu"><li class="menu item"><a href="element_classes.html#background-on-element-proxies">Background on Element proxies</a></li><li class="menu item"><a href="element_classes.html#element-initialization">Element initialization</a></li><li class="menu item"><a href="element_classes.html#setting-up-a-class-lookup-scheme">Setting up a class lookup scheme</a></li><li class="menu item"><a href="element_classes.html#generating-xml-with-custom-classes">Generating XML with custom classes</a></li><li class="menu item"><a href="element_classes.html#id1">Implementing namespaces</a></li></ul></li></ul><ul class="menu foreign" id="sax-menu"><li class="menu title"><a href="sax.html">Sax support</a><ul class="submenu"><li class="menu item"><a href="sax.html#building-a-tree-from-sax-events">Building a tree from SAX events</a></li><li class="menu item"><a href="sax.html#producing-sax-events-from-an-elementtree-or-element">Producing SAX events from an ElementTree or Element</a></li><li class="menu item"><a href="sax.html#interfacing-with-pulldom-minidom">Interfacing with pulldom/minidom</a></li></ul></li></ul><ul class="menu foreign" id="capi-menu"><li class="menu title"><a href="capi.html">The public C-API of lxml.etree</a><ul class="submenu"><li class="menu item"><a href="capi.html#writing-external-modules-in-cython">Writing external modules in Cython</a></li><li class="menu item"><a href="capi.html#writing-external-modules-in-c">Writing external modules in C</a></li></ul></li></ul></li></ul><ul id="Developing lxml-section"><li><span class="section title">Developing lxml</span><ul class="menu current" id="build-menu"><li class="menu title"><a href="build.html">How to build lxml from source</a><ul class="submenu"><li class="menu item"><a href="build.html#cython">Cython</a></li><li class="menu item"><a href="build.html#github-git-and-hg">Github, git and hg</a></li><li class="menu item"><a href="build.html#id2">Setuptools</a></li><li class="menu item"><a href="build.html#running-the-tests-and-reporting-errors">Running the tests and reporting errors</a></li><li class="menu item"><a href="build.html#building-an-egg">Building an egg</a></li><li class="menu item"><a href="build.html#building-lxml-on-macos-x">Building lxml on MacOS-X</a></li><li class="menu item"><a href="build.html#static-linking-on-windows">Static linking on Windows</a></li><li class="menu item"><a href="build.html#building-debian-packages-from-svn-sources">Building Debian packages from SVN sources</a></li></ul></li></ul><ul class="menu foreign" id="lxml source howto-menu"><li class="menu title"><a href="lxml-source-howto.html">How to read the source of lxml</a><ul class="submenu"><li class="menu item"><a href="lxml-source-howto.html#what-is-cython">What is Cython?</a></li><li class="menu item"><a href="lxml-source-howto.html#where-to-start">Where to start?</a></li><li class="menu item"><a href="lxml-source-howto.html#lxml-etree">lxml.etree</a></li><li class="menu item"><a href="lxml-source-howto.html#python-modules">Python modules</a></li><li class="menu item"><a href="lxml-source-howto.html#lxml-objectify">lxml.objectify</a></li><li class="menu item"><a href="lxml-source-howto.html#lxml-html">lxml.html</a></li></ul></li></ul><ul class="menu foreign" id="changes 2 3 2-menu"><li class="menu title"><a href="changes-2.3.2.html">Release Changelog</a></li></ul><ul class="menu foreign" id="credits-menu"><li class="menu title"><a href="credits.html">Credits</a><ul class="submenu"><li class="menu item"><a href="credits.html#main-contributors">Main contributors</a></li><li class="menu item"><a href="credits.html#special-thanks-goes-to">Special thanks goes to:</a></li></ul></li></ul></li><li><a href="http://lxml.de/sitemap.html">Sitemap</a></li></ul></div><h1 class="title">How to build lxml from source</h1>

<p>To build lxml from source, you need libxml2 and libxslt properly
installed, <em>including the header files</em>.  These are likely shipped in
separate <tt class="docutils literal"><span class="pre">-dev</span></tt> or <tt class="docutils literal"><span class="pre">-devel</span></tt> packages like <tt class="docutils literal"><span class="pre">libxml2-dev</span></tt>, which
you must install before trying to build lxml.  The build process also
requires <a class="reference external" href="http://peak.telecommunity.com/DevCenter/setuptools">setuptools</a>.  The lxml source distribution comes with a
script called <tt class="docutils literal">ez_setup.py</tt> that can be used to install them.</p>
<div class="contents topic" id="contents">
<p class="topic-title first">Contents</p>
<ul class="simple">
<li><a class="reference internal" href="#cython" id="id3">Cython</a></li>
<li><a class="reference internal" href="#github-git-and-hg" id="id4">Github, git and hg</a></li>
<li><a class="reference internal" href="#id2" id="id5">Setuptools</a></li>
<li><a class="reference internal" href="#running-the-tests-and-reporting-errors" id="id6">Running the tests and reporting errors</a></li>
<li><a class="reference internal" href="#building-an-egg" id="id7">Building an egg</a></li>
<li><a class="reference internal" href="#building-lxml-on-macos-x" id="id8">Building lxml on MacOS-X</a></li>
<li><a class="reference internal" href="#static-linking-on-windows" id="id9">Static linking on Windows</a></li>
<li><a class="reference internal" href="#building-debian-packages-from-svn-sources" id="id10">Building Debian packages from SVN sources</a></li>
</ul>
</div>
<div class="section" id="cython">
<h1>Cython</h1>
<p>The lxml.etree and lxml.objectify modules are written in <a class="reference external" href="http://www.cython.org">Cython</a>.
Since we distribute the Cython-generated .c files with lxml releases,
however, you do not need Cython to build lxml from the normal release
sources.  We even encourage you to <em>not install Cython</em> for a normal
release build, as the generated C code can vary quite heavily between
Cython versions, which may or may not generate correct code for lxml.
The pre-generated release sources were tested and therefore are known
to work.</p>
<p>So, if you want a reliable build of lxml, we suggest to a) use a
source release of lxml and b) disable or uninstall Cython for the
build.</p>
<p><em>Only</em> if you are interested in building lxml from a checkout of the
developer sources (e.g. to test a bug fix that has not been release
yet) or if you want to be an lxml developer, then you do need a
working Cython installation.  You can use <a class="reference external" href="http://peak.telecommunity.com/DevCenter/EasyInstall">EasyInstall</a> to install it:</p>
<pre class="literal-block">
easy_install "Cython&gt;=0.14.1"
</pre>
<p>lxml currently requires Cython 0.14.1, later release versions should
work as well.</p>
</div>
<div class="section" id="github-git-and-hg">
<h1>Github, git and hg</h1>
<p>The lxml package is developed in a repository on <a class="reference external" href="https://github.com/lxml/">Github</a> using
<a class="reference external" href="http://mercurial.selenic.com/">Mercurial</a> and the <a class="reference external" href="http://hg-git.github.com/">hg-git</a> plugin.  You can retrieve the current
developer version using:</p>
<pre class="literal-block">
hg clone git://github.com/lxml/lxml.git lxml
</pre>
<p>This will create a directory <tt class="docutils literal">lxml</tt> and download the source into it,
including the complete development history.  Don't be afraid, the
download is fairly quick.  You can also browse the <a class="reference external" href="https://github.com/lxml/lxml">lxml repository</a>
through the web.</p>
</div>
<div class="section" id="id2">
<h1>Setuptools</h1>
<p>Usually, building lxml is done through setuptools.  Clone the source
repository as described above (or download the <a class="reference external" href="https://github.com/lxml/lxml/tarball/master">source tar-ball</a> and
unpack it) and then type:</p>
<pre class="literal-block">
python setup.py build
</pre>
<p>or:</p>
<pre class="literal-block">
python setup.py bdist_egg
</pre>
<p>If you want to test lxml from the source directory, it is better to build it
in-place like this:</p>
<pre class="literal-block">
python setup.py  build_ext -i
</pre>
<p>or, in Unix-like environments:</p>
<pre class="literal-block">
make
</pre>
<p>If you get errors about missing header files (e.g. <tt class="docutils literal">Python.h</tt> or
<tt class="docutils literal">libxml/xmlversion.h</tt>) then you need to make sure the development
packages of Python, libxml2 and libxslt are properly installed.  On
Linux distributions, they are usually called something like
<tt class="docutils literal"><span class="pre">libxml2-dev</span></tt> or <tt class="docutils literal"><span class="pre">libxslt-devel</span></tt>.  If these packages were
installed in non-standard places, try passing the following option to
setup.py to make sure the right config is found:</p>
<pre class="literal-block">
python setup.py build --with-xslt-config=/path/to/xslt-config
</pre>
<p>If this doesn't help, you may have to add the location of the header
files to the include path like:</p>
<pre class="literal-block">
python setup.py build_ext -i  -I /usr/include/libxml2
</pre>
<p>where the file is in <tt class="docutils literal">/usr/include/libxml2/libxml/xmlversion.h</tt></p>
<p>To use lxml.etree in-place, you can place lxml's <tt class="docutils literal">src</tt> directory on your
Python module search path (PYTHONPATH) and then import <tt class="docutils literal">lxml.etree</tt> to play
with it:</p>
<pre class="literal-block">
# cd lxml
# PYTHONPATH=src python
Python 2.5.1
Type "help", "copyright", "credits" or "license" for more information.
&gt;&gt;&gt; from lxml import etree
&gt;&gt;&gt;
</pre>
<p>To make sure everything gets recompiled cleanly after changes, you can
run <tt class="docutils literal">make clean</tt> or delete the file <tt class="docutils literal">src/lxml/etree.c</tt>.  Distutils
do not automatically pick up changes that affect files other than the
main file <tt class="docutils literal">src/lxml/etree.pyx</tt>.</p>
</div>
<div class="section" id="running-the-tests-and-reporting-errors">
<h1>Running the tests and reporting errors</h1>
<p>The source distribution (tgz) and the source repository contain a test
suite for lxml.  You can run it from the top-level directory:</p>
<pre class="literal-block">
python test.py
</pre>
<p>Note that the test script only tests the in-place build (see distutils
building above), as it searches the <tt class="docutils literal">src</tt> directory.  You can use the
following one-step command to trigger an in-place build and test it:</p>
<pre class="literal-block">
make test
</pre>
<p>This also runs the ElementTree and cElementTree compatibility tests.  To call
them separately, make sure you have lxml on your PYTHONPATH first, then run:</p>
<pre class="literal-block">
python selftest.py
</pre>
<p>and:</p>
<pre class="literal-block">
python selftest2.py
</pre>
<p>If the tests give failures, errors, or worse, segmentation faults, we'd really
like to know.  Please contact us on the <a class="reference external" href="http://lxml.de/mailinglist/">mailing list</a>, and please specify
the version of lxml, libxml2, libxslt and Python you were using, as well as
your operating system type (Linux, Windows, MacOs, ...).</p>
</div>
<div class="section" id="building-an-egg">
<h1>Building an egg</h1>
<p>This is the procedure to make an lxml egg for your platform (assuming
that you have <a class="reference external" href="http://peak.telecommunity.com/DevCenter/setuptools">setuptools</a> installed):</p>
<ul class="simple">
<li>Download the lxml-x.y.tar.gz release.  This contains the pregenerated C so
that you can be sure you build exactly from the release sources.  Unpack
them and cd into the resulting directory.</li>
<li>python setup.py build</li>
<li>If you're on a unixy platform, cd into <tt class="docutils literal">build/lib.your.platform</tt> and strip
any <tt class="docutils literal">.so</tt> file you find there.  This reduces the size of the egg
considerably.</li>
<li><tt class="docutils literal">python setup.py bdist_egg</tt></li>
</ul>
<p>This will put the egg into the <tt class="docutils literal">dist</tt> directory.</p>
</div>
<div class="section" id="building-lxml-on-macos-x">
<h1>Building lxml on MacOS-X</h1>
<p>Apple regularly ships new system releases with horribly outdated
system libraries.  This is specifically the case for libxml2 and
libxslt, where the system provided versions are too old to build lxml.</p>
<p>While the Unix environment in MacOS-X makes it relatively easy to
install Unix/Linux style package management tools and new software, it
actually seems to be hard to get libraries set up for exclusive usage
that MacOS-X ships in an older version.  Alternative distributions
(like macports) install their libraries in addition to the system
libraries, but the compiler and the runtime loader on MacOS still sees
the system libraries before the new libraries.  This can lead to
undebuggable crashes where the newer library seems to be loaded but
the older system library is used.</p>
<p>Apple discourages static building against libraries, which would help
working around this problem.  Apple does not ship static library
binaries with its system and several package management systems follow
this decision.  Therefore, building static binaries requires building
the dependencies first.  The <tt class="docutils literal">setup.py</tt> script does this
automatically when you call it like this:</p>
<pre class="literal-block">
python setup.py build --static-deps
</pre>
<p>This will download and build the latest versions of libxml2 and
libxslt from the official FTP download site.  If you want to use
specific versions, or want to prevent any online access, you can
download both <tt class="docutils literal">tar.gz</tt> release files yourself, place them into a
subdirectory <tt class="docutils literal">libs</tt> in the lxml distribution, and call <tt class="docutils literal">setup.py</tt>
with the desired target versions like this:</p>
<pre class="literal-block">
python setup.py build --static-deps \
       --libxml2-version=2.7.3 \
       --libxslt-version=1.1.24 \

sudo python setup.py install
</pre>
<p>Instead of <tt class="docutils literal">build</tt>, you can use any target, like <tt class="docutils literal">bdist_egg</tt> if
you want to use setuptools to build an installable egg.</p>
<p>Note that this also works with <a class="reference external" href="http://peak.telecommunity.com/DevCenter/EasyInstall">EasyInstall</a>.  Since you can't pass
command line options in this case, you have to use an environment
variable instead:</p>
<pre class="literal-block">
STATIC_DEPS=true easy_install lxml
</pre>
<p>Some machines may require an additional run with "sudo" to install the
package into the Python package directory:</p>
<pre class="literal-block">
STATIC_DEPS=true sudo easy_install lxml
</pre>
<p>The <tt class="docutils literal">STATICBUILD</tt> environment variable is handled equivalently to
the <tt class="docutils literal">STATIC_DEPS</tt> variable, but is used by some other extension
packages, too.</p>
</div>
<div class="section" id="static-linking-on-windows">
<h1>Static linking on Windows</h1>
<p>Most operating systems have proper package management that makes installing
current versions of libxml2 and libxslt easy.  The most famous exception is
Microsoft Windows, which entirely lacks these capabilities.  It can therefore
be interesting to statically link the external libraries into lxml.etree to
avoid having to install them separately.</p>
<p>Download lxml and all required libraries to the same directory.  The iconv,
libxml2, libxslt, and zlib libraries are all available from the ftp site
<a class="reference external" href="ftp://ftp.zlatkovic.com/pub/libxml/">ftp://ftp.zlatkovic.com/pub/libxml/</a>.</p>
<p>Your directory should now have the following files in it (although most likely
different versions):</p>
<pre class="literal-block">
iconv-1.9.1.win32.zip
libxml2-2.6.23.win32.zip
libxslt-1.1.15.win32.zip
lxml-1.0.0.tgz
zlib-1.2.3.win32.zip
</pre>
<p>Now extract each of those files in the <em>same</em> directory.  This should give you
something like this:</p>
<pre class="literal-block">
iconv-1.9.1.win32/
iconv-1.9.1.win32.zip
libxml2-2.6.23.win32/
libxml2-2.6.23.win32.zip
libxslt-1.1.15.win32/
libxslt-1.1.15.win32.zip
lxml-1.0.0/
lxml-1.0.0.tgz
zlib-1.2.3.win32/
zlib-1.2.3.win32.zip
</pre>
<p>Go to the lxml directory and edit the file <tt class="docutils literal">setup.py</tt>.  There should
be a section near the top that looks like this:</p>
<pre class="literal-block">
STATIC_INCLUDE_DIRS = []
STATIC_LIBRARY_DIRS = []
STATIC_CFLAGS = []
</pre>
<p>Change this section to something like this, but take care to use the correct
version numbers:</p>
<pre class="literal-block">
STATIC_INCLUDE_DIRS = [
       "..\\libxml2-2.6.23.win32\\include",
       "..\\libxslt-1.1.15.win32\\include",
       "..\\zlib-1.2.3.win32\\include",
       "..\\iconv-1.9.1.win32\\include"
       ]

STATIC_LIBRARY_DIRS = [
       "..\\libxml2-2.6.23.win32\\lib",
       "..\\libxslt-1.1.15.win32\\lib",
       "..\\zlib-1.2.3.win32\\lib",
       "..\\iconv-1.9.1.win32\\lib"
       ]

STATIC_CFLAGS = []
</pre>
<p>Add any CFLAGS you might consider useful to the third list.  Now you
should be able to pass the <tt class="docutils literal"><span class="pre">--static</span></tt> option to setup.py and
everything should work well.  Try calling:</p>
<pre class="literal-block">
python setup.py bdist_wininst --static
</pre>
<p>This will create a windows installer in the <tt class="docutils literal">pkg</tt> directory.</p>
</div>
<div class="section" id="building-debian-packages-from-svn-sources">
<h1>Building Debian packages from SVN sources</h1>
<p><a class="reference external" href="http://thread.gmane.org/gmane.comp.python.lxml.devel/1239/focus=1249">Andreas Pakulat</a> proposed the following approach.</p>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">apt-get</span> source lxml</tt></li>
<li>remove the unpacked directory</li>
<li>tar.gz the lxml SVN version and replace the orig.tar.gz that lies in the
directory</li>
<li>check md5sum of created tar.gz file and place new sum and size in dsc file</li>
<li>do <tt class="docutils literal"><span class="pre">dpkg-source</span> <span class="pre">-x</span> <span class="pre">lxml-[VERSION].dsc</span></tt> and cd into the newly created directory</li>
<li>run <tt class="docutils literal">dch <span class="pre">-i</span></tt> and add a comment like "use trunk version", this will
increase the debian version number so apt/dpkg won't get confused</li>
<li>run <tt class="docutils literal"><span class="pre">dpkg-buildpackage</span> <span class="pre">-rfakeroot</span> <span class="pre">-us</span> <span class="pre">-uc</span></tt> to build the package</li>
</ul>
<p>In case <tt class="docutils literal"><span class="pre">dpkg-buildpackage</span></tt> tells you that some dependecies are missing, you
can either install them manually or run <tt class="docutils literal"><span class="pre">apt-get</span> <span class="pre">build-dep</span> lxml</tt>.</p>
<p>That will give you .deb packages in the parent directory which can be
installed using <tt class="docutils literal">dpkg <span class="pre">-i</span></tt>.</p>
</div>
</div>
<div class="footer">
<hr class="footer" />
Generated on: 2011-11-11.

</div>
</body>
</html>