diff options
author | Kali Kaneko (leap communications) <kali@leap.se> | 2017-06-22 14:54:19 +0200 |
---|---|---|
committer | Kali Kaneko (leap communications) <kali@leap.se> | 2017-06-22 14:54:19 +0200 |
commit | df0fd496fbc7dfcf468f72881e81ef6424fe39fd (patch) | |
tree | 24fb915bb70e01ddf7146eb83f5910538e80c1df /setup.py | |
parent | f12586c0fa5c8a877b4a6538d9ebb0c0a1a33745 (diff) | |
parent | f472f1a6382abc698f74a1afbb07b2274b3a3d45 (diff) |
merge master
Diffstat (limited to 'setup.py')
-rw-r--r-- | setup.py | 275 |
1 files changed, 95 insertions, 180 deletions
@@ -21,8 +21,6 @@ # 2. Altered source versions must be plainly marked as such, and must not be # misrepresented as being the original software. # 3. This notice may not be removed or altered from any source distribution. - -#import glob import os import re import sys @@ -31,14 +29,15 @@ import zipfile from types import ListType, TupleType -from distutils.core import setup, Extension, Command -#from setuptools import setup, Extension, Command from distutils.command.build import build from distutils.command.build_ext import build_ext from distutils.dep_util import newer_group from distutils.errors import DistutilsSetupError from distutils import log +import setuptools +from setuptools import Extension, Command + import cross_bdist_wininst # If you need to change anything, it should be enough to change setup.cfg. @@ -47,16 +46,23 @@ sqlite = "sqlite" PYSQLITE_EXPERIMENTAL = False -#DEV_VERSION = None -DEV_VERSION = "02" +DEV_VERSION = None + +PATCH_VERSION = None sources = ["src/module.c", "src/connection.c", "src/cursor.c", "src/cache.c", "src/microprotocols.c", "src/prepare_protocol.c", "src/statement.c", - "src/util.c", "src/row.c"] + "src/util.c", "src/row.c", "src/blob.c"] if PYSQLITE_EXPERIMENTAL: sources.append("src/backup.c") + +if sys.platform == "darwin": + # Work around clang raising hard error for unused arguments + os.environ['CFLAGS'] = "-Qunused-arguments" + print "CFLAGS", os.environ['CFLAGS'] + include_dirs = [] library_dirs = [] libraries = [] @@ -77,6 +83,18 @@ if sys.platform != "win32": else: define_macros.append(('MODULE_NAME', '\\"pysqlcipher.dbapi2\\"')) +BUNDLED = False +AMALGAMATION_ROOT = "amalgamation" + +for idx, arg in enumerate(list(sys.argv)): + if arg.startswith('--bundled'): + sys.argv.pop(idx) + BUNDLED = True + break + if arg.startswith('--amalgamation='): + AMALGAMATION_ROOT = arg.split("=",1)[1] + break + class DocBuilder(Command): description = "Builds the documentation" @@ -100,46 +118,6 @@ class DocBuilder(Command): print ("Is sphinx installed? If not, " "try 'sudo easy_install sphinx'.") -AMALGAMATION_ROOT = "amalgamation" - - -def get_amalgamation(): - """Download the SQLite amalgamation if it isn't there, already.""" - if os.path.exists(AMALGAMATION_ROOT): - return - os.mkdir(AMALGAMATION_ROOT) - print "Downloading amalgation." - - # XXX upload the amalgamation file to downloads.leap.se - amalgamation_url = ("http://futeisha.org/sqlcipher/" - "amalgamation-sqlcipher-2.1.0.zip") - - # and download it - print 'amalgamation url: %s' % (amalgamation_url,) - urllib.urlretrieve(amalgamation_url, "tmp.zip") - - zf = zipfile.ZipFile("tmp.zip") - files = ["sqlite3.c", "sqlite3.h"] - directory = zf.namelist()[0] - - for fn in files: - print "Extracting", fn - outf = open(AMALGAMATION_ROOT + os.sep + fn, "wb") - outf.write(zf.read(directory + fn)) - outf.close() - zf.close() - os.unlink("tmp.zip") - - -class AmalgamationBuilder(build): - description = ("Build a statically built pysqlcipher " - "downloading and using a sqlcipher amalgamation.") - - def __init__(self, *args, **kwargs): - MyBuildExt.amalgamation = True - MyBuildExt.static = True - build.__init__(self, *args, **kwargs) - class LibSQLCipherBuilder(build_ext): @@ -151,131 +129,55 @@ class LibSQLCipherBuilder(build_ext): build_ext.build_extension(self, ext) -class MyBuildExt(build_ext): - amalgamation = True # We want amalgamation on the default build for now - static = False +class AmalgamationBuildExt(build_ext): + + amalgamation = True def build_extension(self, ext): - if self.amalgamation: - get_amalgamation() - # build with fulltext search enabled - ext.define_macros.append( - ("SQLITE_ENABLE_FTS3", "1")) - ext.define_macros.append( - ("SQLITE_ENABLE_RTREE", "1")) - - # SQLCipher options - ext.define_macros.append( - ("SQLITE_ENABLE_LOAD_EXTENSION", "1")) - ext.define_macros.append( - ("SQLITE_HAS_CODEC", "1")) - ext.define_macros.append( - ("SQLITE_TEMP_STORE", "2")) - - ext.sources.append(os.path.join(AMALGAMATION_ROOT, "sqlite3.c")) - ext.include_dirs.append(AMALGAMATION_ROOT) - + # build with fulltext search enabled + ext.define_macros.append( + ("SQLITE_ENABLE_FTS3", "1")) + ext.define_macros.append( + ("SQLITE_ENABLE_FTS5", "1")) + ext.define_macros.append( + ("SQLITE_ENABLE_RTREE", "1")) + + # SQLCipher options + ext.define_macros.append( + ("SQLITE_ENABLE_LOAD_EXTENSION", "1")) + ext.define_macros.append( + ("SQLITE_HAS_CODEC", "1")) + ext.define_macros.append( + ("SQLITE_TEMP_STORE", "2")) + ext.define_macros.append( + ("HAVE_USLEEP", "1")) + + ext.sources.append(os.path.join(AMALGAMATION_ROOT, "sqlite3.c")) + ext.include_dirs.append(AMALGAMATION_ROOT) + + if sys.platform == "win32": + # Try to locate openssl + openssl_conf = os.environ.get('OPENSSL_CONF') + if not openssl_conf: + sys.exit('Fatal error: OpenSSL could not be detected!') + openssl = os.path.dirname(os.path.dirname(openssl_conf)) + + # Configure the compiler + ext.include_dirs.append(os.path.join(openssl, "include")) + ext.define_macros.append(("inline", "__inline")) + + # Configure the linker + if self.compiler.compiler_type == "msvc": + ext.extra_link_args.append("libeay32.lib") + ext.extra_link_args.append( + "/LIBPATH:" + os.path.join(openssl, "lib") + ) + if self.compiler.compiler_type == "mingw32": + ext.extra_link_args.append("-lcrypto") + else: ext.extra_link_args.append("-lcrypto") - if self.static: - self._build_extension(ext) - else: - build_ext.build_extension(self, ext) - - def _build_extension(self, ext): - sources = ext.sources - if sources is None or type(sources) not in (ListType, TupleType): - raise DistutilsSetupError, \ - ("in 'ext_modules' option (extension '%s'), " + - "'sources' must be present and must be " + - "a list of source filenames") % ext.name - sources = list(sources) - - ext_path = self.get_ext_fullpath(ext.name) - depends = sources + ext.depends - if not (self.force or newer_group(depends, ext_path, 'newer')): - log.debug("skipping '%s' extension (up-to-date)", ext.name) - return - else: - log.info("building '%s' extension", ext.name) - - # First, scan the sources for SWIG definition files (.i), run - # SWIG on 'em to create .c files, and modify the sources list - # accordingly. - sources = self.swig_sources(sources, ext) - - # Next, compile the source code to object files. - - # XXX not honouring 'define_macros' or 'undef_macros' -- the - # CCompiler API needs to change to accommodate this, and I - # want to do one thing at a time! - - # Two possible sources for extra compiler arguments: - # - 'extra_compile_args' in Extension object - # - CFLAGS environment variable (not particularly - # elegant, but people seem to expect it and I - # guess it's useful) - # The environment variable should take precedence, and - # any sensible compiler will give precedence to later - # command line args. Hence we combine them in order: - extra_args = ext.extra_compile_args or [] - - macros = ext.define_macros[:] - for undef in ext.undef_macros: - macros.append((undef,)) - - # XXX debug - #objects = [] - objects = self.compiler.compile(sources, - output_dir=self.build_temp, - macros=macros, - include_dirs=ext.include_dirs, - debug=self.debug, - extra_postargs=extra_args, - depends=ext.depends) - - # XXX -- this is a Vile HACK! - # - # The setup.py script for Python on Unix needs to be able to - # get this list so it can perform all the clean up needed to - # avoid keeping object files around when cleaning out a failed - # build of an extension module. Since Distutils does not - # track dependencies, we have to get rid of intermediates to - # ensure all the intermediates will be properly re-built. - # - self._built_objects = objects[:] - - # Now link the object files together into a "shared object" -- - # of course, first we have to figure out all the other things - # that go into the mix. - if ext.extra_objects: - objects.extend(ext.extra_objects) - extra_args = ext.extra_link_args or [] - - # Detect target language, if not provided - language = ext.language or self.compiler.detect_language(sources) - - #self.compiler.link_shared_object( - #objects, ext_path, - #libraries=self.get_libraries(ext), - #library_dirs=ext.library_dirs, - #runtime_library_dirs=ext.runtime_library_dirs, - #extra_postargs=extra_args, - #export_symbols=self.get_export_symbols(ext), - #debug=self.debug, - #build_temp=self.build_temp, - #target_lang=language) - - # XXX may I have a static lib please? - # hmm but then I cannot load that extension, or can I? - output_dir = os.path.sep.join(ext_path.split(os.path.sep)[:-1]) - - self.compiler.create_static_lib( - objects, - #XXX get library name ... splitting ext_path? - "sqlite", - output_dir=output_dir, - target_lang=language) + build_ext.build_extension(self, ext) def __setattr__(self, k, v): # Make sure we don't link against the SQLite @@ -299,22 +201,29 @@ def get_setup_args(): break f.close() - if DEV_VERSION: - PYSQLITE_VERSION += ".dev%s" % DEV_VERSION - if not PYSQLITE_VERSION: print "Fatal error: PYSQLITE_VERSION could not be detected!" sys.exit(1) + if DEV_VERSION: + PYSQLITE_VERSION += ".dev%s" % DEV_VERSION + + if PATCH_VERSION: + PYSQLITE_VERSION += "-%s" % PATCH_VERSION + + # Need to bump minor version, patch handled badly. + PYSQLCIPHER_VERSION = "2.6.10" + setup_args = dict( name="pysqlcipher", - version=PYSQLITE_VERSION, - #version="0.0.1", + #version=PYSQLITE_VERSION, + version=PYSQLCIPHER_VERSION, description="DB-API 2.0 interface for SQLCIPHER 3.x", long_description=long_description, author="Kali Kaneko", - author_email="kali@futeisha.org", - license="zlib/libpng", # is THIS a license? + author_email="kali@leap.se", + license="zlib/libpng", + # XXX check # It says MIT in the google project platforms="ALL", url="http://github.com/leapcode/pysqlcipher/", @@ -349,17 +258,23 @@ def get_setup_args(): cmdclass={"build_docs": DocBuilder} ) - setup_args["cmdclass"].update( + + if BUNDLED: + build_ext = AmalgamationBuildExt + else: + build_ext = LibSQLCipherBuilder + + setup_args['cmdclass'].update({'build_ext': build_ext}) + + setup_args['cmdclass'].update( {"build_docs": DocBuilder, - "build_ext": MyBuildExt, - "build_static": AmalgamationBuilder, - "build_sqlcipher": LibSQLCipherBuilder, "cross_bdist_wininst": cross_bdist_wininst.bdist_wininst}) + return setup_args def main(): - setup(**get_setup_args()) + setuptools.setup(**get_setup_args()) if __name__ == "__main__": main() |