6a590ab4a2a434c2fdc98dd9b68491970ddff4fa
[joel/debian/python-pysqlite2.git] / setup.py
1 #-*- coding: ISO-8859-1 -*-
2 # setup.py: the distutils script
3 #
4 # Copyright (C) 2004-2007 Gerhard Häring <gh@ghaering.de>
5 #
6 # This file is part of pysqlite.
7 #
8 # This software is provided 'as-is', without any express or implied
9 # warranty.  In no event will the authors be held liable for any damages
10 # arising from the use of this software.
11 #
12 # Permission is granted to anyone to use this software for any purpose,
13 # including commercial applications, and to alter it and redistribute it
14 # freely, subject to the following restrictions:
15 #
16 # 1. The origin of this software must not be misrepresented; you must not
17 #    claim that you wrote the original software. If you use this software
18 #    in a product, an acknowledgment in the product documentation would be
19 #    appreciated but is not required.
20 # 2. Altered source versions must be plainly marked as such, and must not be
21 #    misrepresented as being the original software.
22 # 3. This notice may not be removed or altered from any source distribution.
23
24 import glob, os, re, sys
25 import urllib
26 import zipfile
27
28 from distutils.core import setup, Extension, Command
29 from distutils.command.build import build
30 from distutils.command.build_ext import build_ext
31
32 import cross_bdist_wininst
33
34 # If you need to change anything, it should be enough to change setup.cfg.
35
36 sqlite = "sqlite"
37
38 sources = ["src/module.c", "src/connection.c", "src/cursor.c", "src/cache.c",
39            "src/microprotocols.c", "src/prepare_protocol.c", "src/statement.c",
40            "src/util.c", "src/row.c"]
41
42 include_dirs = []
43 library_dirs = []
44 libraries = []
45 runtime_library_dirs = []
46 extra_objects = []
47 define_macros = []
48
49 long_description = \
50 """Python interface to SQLite 3
51
52 pysqlite is an interface to the SQLite 3.x embedded relational database engine.
53 It is almost fully compliant with the Python database API version 2.0 also
54 exposes the unique features of SQLite."""
55
56 if sys.platform != "win32":
57     define_macros.append(('MODULE_NAME', '"pysqlite2.dbapi2"'))
58 else:
59     define_macros.append(('MODULE_NAME', '\\"pysqlite2.dbapi2\\"'))
60
61 class DocBuilder(Command):
62     description = "Builds the documentation"
63     user_options = []
64
65     def initialize_options(self):
66         pass
67
68     def finalize_options(self):
69         pass
70
71     def run(self):
72         import os, shutil
73         try:
74             shutil.rmtree("build/doc")
75         except OSError:
76             pass
77         os.makedirs("build/doc")
78         rc = os.system("sphinx-build doc/sphinx build/doc")
79         if rc != 0:
80             print "Is sphinx installed? If not, try 'sudo easy_install sphinx'."
81
82 AMALGAMATION_ROOT = "amalgamation"
83
84 def get_amalgamation():
85     """Download the SQLite amalgamation if it isn't there, already."""
86     if os.path.exists(AMALGAMATION_ROOT):
87         return
88     os.mkdir(AMALGAMATION_ROOT)
89     print "Downloading amalgation."
90
91     # find out what's current amalgamation ZIP file
92     download_page = urllib.urlopen("http://sqlite.org/download.html").read()
93     pattern = re.compile("(sqlite-amalgamation.*?\.zip)")
94     download_file = pattern.findall(download_page)[0]
95     amalgamation_url = "http://sqlite.org/" + download_file
96
97     # and download it
98     urllib.urlretrieve(amalgamation_url, "tmp.zip")
99
100     zf = zipfile.ZipFile("tmp.zip")
101     files = ["sqlite3.c", "sqlite3.h"]
102     for fn in files:
103         print "Extracting", fn
104         outf = open(AMALGAMATION_ROOT + os.sep + fn, "wb")
105         outf.write(zf.read(fn))
106         outf.close()
107     zf.close()
108     os.unlink("tmp.zip")
109
110 class AmalgamationBuilder(build):
111     description = "Build a statically built pysqlite using the amalgamtion."
112
113     def __init__(self, *args, **kwargs):
114         MyBuildExt.amalgamation = True
115         build.__init__(self, *args, **kwargs)
116
117 class MyBuildExt(build_ext):
118     amalgamation = False
119
120     def build_extension(self, ext):
121         if self.amalgamation:
122             get_amalgamation()
123             ext.define_macros.append(("SQLITE_ENABLE_FTS3", "1"))   # build with fulltext search enabled
124             ext.define_macros.append(("SQLITE_ENABLE_RTREE", "1"))   # build with fulltext search enabled
125             ext.sources.append(os.path.join(AMALGAMATION_ROOT, "sqlite3.c"))
126             ext.include_dirs.append(AMALGAMATION_ROOT)
127         build_ext.build_extension(self, ext)
128
129     def __setattr__(self, k, v):
130         # Make sure we don't link against the SQLite library, no matter what setup.cfg says
131         if self.amalgamation and k == "libraries":
132             v = None
133         self.__dict__[k] = v
134
135 def get_setup_args():
136
137     PYSQLITE_VERSION = None
138
139     version_re = re.compile('#define PYSQLITE_VERSION "(.*)"')
140     f = open(os.path.join("src", "module.h"))
141     for line in f:
142         match = version_re.match(line)
143         if match:
144             PYSQLITE_VERSION = match.groups()[0]
145             PYSQLITE_MINOR_VERSION = ".".join(PYSQLITE_VERSION.split('.')[:2])
146             break
147     f.close()
148
149     if not PYSQLITE_VERSION:
150         print "Fatal error: PYSQLITE_VERSION could not be detected!"
151         sys.exit(1)
152
153     data_files = [("pysqlite2-doc",
154                         glob.glob("doc/*.html") \
155                       + glob.glob("doc/*.txt") \
156                       + glob.glob("doc/*.css")),
157                    ("pysqlite2-doc/code",
158                         glob.glob("doc/code/*.py"))]
159
160     py_modules = ["sqlite"]
161     setup_args = dict(
162             name = "pysqlite",
163             version = PYSQLITE_VERSION,
164             description = "DB-API 2.0 interface for SQLite 3.x",
165             long_description=long_description,
166             author = "Gerhard Haering",
167             author_email = "gh@ghaering.de",
168             license = "zlib/libpng license",
169             platforms = "ALL",
170             url = "http://pysqlite.googlecode.com/",
171             download_url = "http://code.google.com/p/pysqlite/downloads/list",
172
173             # Description of the modules and packages in the distribution
174             package_dir = {"pysqlite2": "lib"},
175             packages = ["pysqlite2", "pysqlite2.test"] +
176                        (["pysqlite2.test.py25"], [])[sys.version_info < (2, 5)],
177             scripts=[],
178             data_files = data_files,
179
180             ext_modules = [Extension( name="pysqlite2._sqlite",
181                                       sources=sources,
182                                       include_dirs=include_dirs,
183                                       library_dirs=library_dirs,
184                                       runtime_library_dirs=runtime_library_dirs,
185                                       libraries=libraries,
186                                       extra_objects=extra_objects,
187                                       define_macros=define_macros
188                                       )],
189             classifiers = [
190             "Development Status :: 5 - Production/Stable",
191             "Intended Audience :: Developers",
192             "License :: OSI Approved :: zlib/libpng License",
193             "Operating System :: MacOS :: MacOS X",
194             "Operating System :: Microsoft :: Windows",
195             "Operating System :: POSIX",
196             "Programming Language :: C",
197             "Programming Language :: Python",
198             "Topic :: Database :: Database Engines/Servers",
199             "Topic :: Software Development :: Libraries :: Python Modules"],
200             cmdclass = {"build_docs": DocBuilder}
201             )
202
203     setup_args["cmdclass"].update({"build_docs": DocBuilder, "build_ext": MyBuildExt, "build_static": AmalgamationBuilder, "cross_bdist_wininst": cross_bdist_wininst.bdist_wininst})
204     return setup_args
205
206 def main():
207     setup(**get_setup_args())
208
209 if __name__ == "__main__":
210     main()