mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	Revert r73807, which removed code to be able to build _dbm with bsddb.
This commit is contained in:
		
							parent
							
								
									97e5f281a7
								
							
						
					
					
						commit
						489cb4f0b9
					
				
					 1 changed files with 186 additions and 2 deletions
				
			
		
							
								
								
									
										188
									
								
								setup.py
									
										
									
									
									
								
							
							
						
						
									
										188
									
								
								setup.py
									
										
									
									
									
								
							|  | @ -363,7 +363,6 @@ def detect_modules(self): | |||
|             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 @@ def detect_modules(self): | |||
|             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 @@ def detect_modules(self): | |||
|             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 @@ def detect_modules(self): | |||
|                                     ], | ||||
|                                 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) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Georg Brandl
						Georg Brandl