Undo Debian changes to upstream source
[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 PYSQLITE_EXPERIMENTAL = False
39
40 sources = ["src/module.c", "src/connection.c", "src/cursor.c", "src/cache.c",
41            "src/microprotocols.c", "src/prepare_protocol.c", "src/statement.c",
42            "src/util.c", "src/row.c"]
43
44 if PYSQLITE_EXPERIMENTAL:
45     sources.append("src/backup.c")
46
47 include_dirs = []
48 library_dirs = []
49 libraries = []
50 runtime_library_dirs = []
51 extra_objects = []
52 define_macros = []
53
54 long_description = \
55 """Python interface to SQLite 3
56
57 pysqlite is an interface to the SQLite 3.x embedded relational database engine.
58 It is almost fully compliant with the Python database API version 2.0 also
59 exposes the unique features of SQLite."""
60
61 if sys.platform != "win32":
62     define_macros.append(('MODULE_NAME', '"pysqlite2.dbapi2"'))
63 else:
64     define_macros.append(('MODULE_NAME', '\\"pysqlite2.dbapi2\\"'))
65
66 class DocBuilder(Command):
67     description = "Builds the documentation"
68     user_options = []
69
70     def initialize_options(self):
71         pass
72
73     def finalize_options(self):
74         pass
75
76     def run(self):
77         import os, shutil
78         try:
79             shutil.rmtree("build/doc")
80         except OSError:
81             pass
82         os.makedirs("build/doc")
83         rc = os.system("sphinx-build doc/sphinx build/doc")
84         if rc != 0:
85             print "Is sphinx installed? If not, try 'sudo easy_install sphinx'."
86
87 AMALGAMATION_ROOT = "amalgamation"
88
89 def get_amalgamation():
90     """Download the SQLite amalgamation if it isn't there, already."""
91     if os.path.exists(AMALGAMATION_ROOT):
92         return
93     os.mkdir(AMALGAMATION_ROOT)
94     print "Downloading amalgation."
95
96     # find out what's current amalgamation ZIP file
97     download_page = urllib.urlopen("http://sqlite.org/download.html").read()
98     pattern = re.compile("(sqlite-amalgamation.*?\.zip)")
99     download_file = pattern.findall(download_page)[0]
100     amalgamation_url = "http://sqlite.org/" + download_file
101
102     # and download it
103     urllib.urlretrieve(amalgamation_url, "tmp.zip")
104
105     zf = zipfile.ZipFile("tmp.zip")
106     files = ["sqlite3.c", "sqlite3.h"]
107     directory = zf.namelist()[0]
108     for fn in files:
109         print "Extracting", fn
110         outf = open(AMALGAMATION_ROOT + os.sep + fn, "wb")
111         outf.write(zf.read(directory + fn))
112         outf.close()
113     zf.close()
114     os.unlink("tmp.zip")
115
116 class AmalgamationBuilder(build):
117     description = "Build a statically built pysqlite using the amalgamtion."
118
119     def __init__(self, *args, **kwargs):
120         MyBuildExt.amalgamation = True
121         build.__init__(self, *args, **kwargs)
122
123 class MyBuildExt(build_ext):
124     amalgamation = False
125
126     def build_extension(self, ext):
127         if self.amalgamation:
128             get_amalgamation()
129             ext.define_macros.append(("SQLITE_ENABLE_FTS3", "1"))   # build with fulltext search enabled
130             ext.define_macros.append(("SQLITE_ENABLE_RTREE", "1"))   # build with fulltext search enabled
131             ext.sources.append(os.path.join(AMALGAMATION_ROOT, "sqlite3.c"))
132             ext.include_dirs.append(AMALGAMATION_ROOT)
133         build_ext.build_extension(self, ext)
134
135     def __setattr__(self, k, v):
136         # Make sure we don't link against the SQLite library, no matter what setup.cfg says
137         if self.amalgamation and k == "libraries":
138             v = None
139         self.__dict__[k] = v
140
141 def get_setup_args():
142
143     PYSQLITE_VERSION = None
144
145     version_re = re.compile('#define PYSQLITE_VERSION "(.*)"')
146     f = open(os.path.join("src", "module.h"))
147     for line in f:
148         match = version_re.match(line)
149         if match:
150             PYSQLITE_VERSION = match.groups()[0]
151             PYSQLITE_MINOR_VERSION = ".".join(PYSQLITE_VERSION.split('.')[:2])
152             break
153     f.close()
154
155     if not PYSQLITE_VERSION:
156         print "Fatal error: PYSQLITE_VERSION could not be detected!"
157         sys.exit(1)
158
159     data_files = [("pysqlite2-doc",
160                         glob.glob("doc/*.html") \
161                       + glob.glob("doc/*.txt") \
162                       + glob.glob("doc/*.css")),
163                    ("pysqlite2-doc/code",
164                         glob.glob("doc/code/*.py"))]
165
166     py_modules = ["sqlite"]
167     setup_args = dict(
168             name = "pysqlite",
169             version = PYSQLITE_VERSION,
170             description = "DB-API 2.0 interface for SQLite 3.x",
171             long_description=long_description,
172             author = "Gerhard Haering",
173             author_email = "gh@ghaering.de",
174             license = "zlib/libpng license",
175             platforms = "ALL",
176             url = "http://pysqlite.googlecode.com/",
177             download_url = "http://code.google.com/p/pysqlite/downloads/list",
178
179             # Description of the modules and packages in the distribution
180             package_dir = {"pysqlite2": "lib"},
181             packages = ["pysqlite2", "pysqlite2.test"] +
182                        (["pysqlite2.test.py25"], [])[sys.version_info < (2, 5)],
183             scripts=[],
184             data_files = data_files,
185
186             ext_modules = [Extension( name="pysqlite2._sqlite",
187                                       sources=sources,
188                                       include_dirs=include_dirs,
189                                       library_dirs=library_dirs,
190                                       runtime_library_dirs=runtime_library_dirs,
191                                       libraries=libraries,
192                                       extra_objects=extra_objects,
193                                       define_macros=define_macros
194                                       )],
195             classifiers = [
196             "Development Status :: 5 - Production/Stable",
197             "Intended Audience :: Developers",
198             "License :: OSI Approved :: zlib/libpng License",
199             "Operating System :: MacOS :: MacOS X",
200             "Operating System :: Microsoft :: Windows",
201             "Operating System :: POSIX",
202             "Programming Language :: C",
203             "Programming Language :: Python",
204             "Topic :: Database :: Database Engines/Servers",
205             "Topic :: Software Development :: Libraries :: Python Modules"],
206             cmdclass = {"build_docs": DocBuilder}
207             )
208
209     setup_args["cmdclass"].update({"build_docs": DocBuilder, "build_ext": MyBuildExt, "build_static": AmalgamationBuilder, "cross_bdist_wininst": cross_bdist_wininst.bdist_wininst})
210     return setup_args
211
212 def main():
213     setup(**get_setup_args())
214
215 if __name__ == "__main__":
216     main()