diff options
author | Georg Brandl <georg@python.org> | 2009-07-11 10:08:49 (GMT) |
---|---|---|
committer | Georg Brandl <georg@python.org> | 2009-07-11 10:08:49 (GMT) |
commit | 489cb4f0b98e4d04bfef9ee14f93e4bab63ffcd7 (patch) | |
tree | 68b861fb3972a07d7f81d53cdda692967ec50255 | |
parent | 97e5f281a7dd4ce7ae0d5a967d8da0623e1e1d56 (diff) | |
download | cpython-489cb4f0b98e4d04bfef9ee14f93e4bab63ffcd7.zip cpython-489cb4f0b98e4d04bfef9ee14f93e4bab63ffcd7.tar.gz cpython-489cb4f0b98e4d04bfef9ee14f93e4bab63ffcd7.tar.bz2 |
Revert r73807, which removed code to be able to build _dbm with bsddb.
-rw-r--r-- | setup.py | 188 |
1 files changed, 186 insertions, 2 deletions
@@ -363,7 +363,6 @@ class PyBuildExt(build_ext): inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep) # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb) - # XXX db is not needed anymore, should this be removed? if platform in ['osf1', 'unixware7', 'openunix8']: lib_dirs += ['/usr/ccs/lib'] @@ -626,6 +625,179 @@ class PyBuildExt(build_ext): exts.append( Extension('_md5', ['md5module.c']) ) exts.append( Extension('_sha1', ['sha1module.c']) ) + # Modules that provide persistent dictionary-like semantics. You will + # probably want to arrange for at least one of them to be available on + # your machine, though none are defined by default because of library + # dependencies. The Python module dbm/__init__.py provides an + # implementation independent wrapper for these; dbm/dumb.py provides + # similar functionality (but slower of course) implemented in Python. + + # Sleepycat^WOracle Berkeley DB interface. + # http://www.oracle.com/database/berkeley-db/db/index.html + # + # This requires the Sleepycat^WOracle DB code. The supported versions + # are set below. Visit the URL above to download + # a release. Most open source OSes come with one or more + # versions of BerkeleyDB already installed. + + max_db_ver = (4, 7) + min_db_ver = (3, 3) + db_setup_debug = False # verbose debug prints from this script? + + def allow_db_ver(db_ver): + """Returns a boolean if the given BerkeleyDB version is acceptable. + + Args: + db_ver: A tuple of the version to verify. + """ + if not (min_db_ver <= db_ver <= max_db_ver): + return False + return True + + def gen_db_minor_ver_nums(major): + if major == 4: + for x in range(max_db_ver[1]+1): + if allow_db_ver((4, x)): + yield x + elif major == 3: + for x in (3,): + if allow_db_ver((3, x)): + yield x + else: + raise ValueError("unknown major BerkeleyDB version", major) + + # construct a list of paths to look for the header file in on + # top of the normal inc_dirs. + db_inc_paths = [ + '/usr/include/db4', + '/usr/local/include/db4', + '/opt/sfw/include/db4', + '/usr/include/db3', + '/usr/local/include/db3', + '/opt/sfw/include/db3', + # Fink defaults (http://fink.sourceforge.net/) + '/sw/include/db4', + '/sw/include/db3', + ] + # 4.x minor number specific paths + for x in gen_db_minor_ver_nums(4): + db_inc_paths.append('/usr/include/db4%d' % x) + db_inc_paths.append('/usr/include/db4.%d' % x) + db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x) + db_inc_paths.append('/usr/local/include/db4%d' % x) + db_inc_paths.append('/pkg/db-4.%d/include' % x) + db_inc_paths.append('/opt/db-4.%d/include' % x) + # MacPorts default (http://www.macports.org/) + db_inc_paths.append('/opt/local/include/db4%d' % x) + # 3.x minor number specific paths + for x in gen_db_minor_ver_nums(3): + db_inc_paths.append('/usr/include/db3%d' % x) + db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x) + db_inc_paths.append('/usr/local/include/db3%d' % x) + db_inc_paths.append('/pkg/db-3.%d/include' % x) + db_inc_paths.append('/opt/db-3.%d/include' % x) + + # Add some common subdirectories for Sleepycat DB to the list, + # based on the standard include directories. This way DB3/4 gets + # picked up when it is installed in a non-standard prefix and + # the user has added that prefix into inc_dirs. + std_variants = [] + for dn in inc_dirs: + std_variants.append(os.path.join(dn, 'db3')) + std_variants.append(os.path.join(dn, 'db4')) + for x in gen_db_minor_ver_nums(4): + std_variants.append(os.path.join(dn, "db4%d"%x)) + std_variants.append(os.path.join(dn, "db4.%d"%x)) + for x in gen_db_minor_ver_nums(3): + std_variants.append(os.path.join(dn, "db3%d"%x)) + std_variants.append(os.path.join(dn, "db3.%d"%x)) + + db_inc_paths = std_variants + db_inc_paths + db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)] + + db_ver_inc_map = {} + + class db_found(Exception): pass + try: + # See whether there is a Sleepycat header in the standard + # search path. + for d in inc_dirs + db_inc_paths: + f = os.path.join(d, "db.h") + if db_setup_debug: print("db: looking for db.h in", f) + if os.path.exists(f): + f = open(f).read() + m = re.search(r"#define\WDB_VERSION_MAJOR\W(\d+)", f) + if m: + db_major = int(m.group(1)) + m = re.search(r"#define\WDB_VERSION_MINOR\W(\d+)", f) + db_minor = int(m.group(1)) + db_ver = (db_major, db_minor) + + # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug + if db_ver == (4, 6): + m = re.search(r"#define\WDB_VERSION_PATCH\W(\d+)", f) + db_patch = int(m.group(1)) + if db_patch < 21: + print("db.h:", db_ver, "patch", db_patch, + "being ignored (4.6.x must be >= 4.6.21)") + continue + + if ( (db_ver not in db_ver_inc_map) and + allow_db_ver(db_ver) ): + # save the include directory with the db.h version + # (first occurrence only) + db_ver_inc_map[db_ver] = d + if db_setup_debug: + print("db.h: found", db_ver, "in", d) + else: + # we already found a header for this library version + if db_setup_debug: print("db.h: ignoring", d) + else: + # ignore this header, it didn't contain a version number + if db_setup_debug: + print("db.h: no version number version in", d) + + db_found_vers = list(db_ver_inc_map.keys()) + db_found_vers.sort() + + while db_found_vers: + db_ver = db_found_vers.pop() + db_incdir = db_ver_inc_map[db_ver] + + # check lib directories parallel to the location of the header + db_dirs_to_check = [ + db_incdir.replace("include", 'lib64'), + db_incdir.replace("include", 'lib'), + ] + db_dirs_to_check = list(filter(os.path.isdir, db_dirs_to_check)) + + # Look for a version specific db-X.Y before an ambiguoius dbX + # XXX should we -ever- look for a dbX name? Do any + # systems really not name their library by version and + # symlink to more general names? + for dblib in (('db-%d.%d' % db_ver), + ('db%d%d' % db_ver), + ('db%d' % db_ver[0])): + dblib_file = self.compiler.find_library_file( + db_dirs_to_check + lib_dirs, dblib ) + if dblib_file: + dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ] + raise db_found + else: + if db_setup_debug: print("db lib: ", dblib, "not found") + + except db_found: + if db_setup_debug: + print("bsddb using BerkeleyDB lib:", db_ver, dblib) + print("bsddb lib dir:", dblib_dir, " inc dir:", db_incdir) + db_incs = [db_incdir] + dblibs = [dblib] + else: + if db_setup_debug: print("db: no appropriate library found") + db_incs = None + dblibs = [] + dblib_dir = None + # The sqlite interface sqlite_setup_debug = False # verbose debug prints from this script? @@ -730,7 +902,7 @@ class PyBuildExt(build_ext): if dbm_args: dbm_order = dbm_args[-1].split(":") else: - dbm_order = "ndbm:gdbm".split(":") + dbm_order = "ndbm:gdbm:bdb".split(":") dbmext = None for cand in dbm_order: if cand == "ndbm": @@ -773,6 +945,18 @@ class PyBuildExt(build_ext): ], libraries = gdbm_libs) break + elif cand == "bdb": + if db_incs is not None: + print("building dbm using bdb") + dbmext = Extension('_dbm', ['_dbmmodule.c'], + library_dirs=dblib_dir, + runtime_library_dirs=dblib_dir, + include_dirs=db_incs, + define_macros=[ + ('HAVE_BERKDB_H', None), + ('DB_DBM_HSEARCH', None), + ], + libraries=dblibs) break if dbmext is not None: exts.append(dbmext) |