summaryrefslogtreecommitdiff
path: root/setup.py
diff options
context:
space:
mode:
authorKali Kaneko (leap communications) <kali@leap.se>2017-06-22 14:54:19 +0200
committerKali Kaneko (leap communications) <kali@leap.se>2017-06-22 14:54:19 +0200
commitdf0fd496fbc7dfcf468f72881e81ef6424fe39fd (patch)
tree24fb915bb70e01ddf7146eb83f5910538e80c1df /setup.py
parentf12586c0fa5c8a877b4a6538d9ebb0c0a1a33745 (diff)
parentf472f1a6382abc698f74a1afbb07b2274b3a3d45 (diff)
merge master
Diffstat (limited to 'setup.py')
-rw-r--r--setup.py275
1 files changed, 95 insertions, 180 deletions
diff --git a/setup.py b/setup.py
index f1aa879..283c7f1 100644
--- a/setup.py
+++ b/setup.py
@@ -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()