mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +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) |             inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep) | ||||||
| 
 | 
 | ||||||
|         # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb) |         # 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']: |         if platform in ['osf1', 'unixware7', 'openunix8']: | ||||||
|             lib_dirs += ['/usr/ccs/lib'] |             lib_dirs += ['/usr/ccs/lib'] | ||||||
| 
 | 
 | ||||||
|  | @ -626,6 +625,179 @@ def detect_modules(self): | ||||||
|             exts.append( Extension('_md5', ['md5module.c']) ) |             exts.append( Extension('_md5', ['md5module.c']) ) | ||||||
|             exts.append( Extension('_sha1', ['sha1module.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 |         # The sqlite interface | ||||||
|         sqlite_setup_debug = False   # verbose debug prints from this script? |         sqlite_setup_debug = False   # verbose debug prints from this script? | ||||||
| 
 | 
 | ||||||
|  | @ -730,7 +902,7 @@ def detect_modules(self): | ||||||
|             if dbm_args: |             if dbm_args: | ||||||
|                 dbm_order = dbm_args[-1].split(":") |                 dbm_order = dbm_args[-1].split(":") | ||||||
|             else: |             else: | ||||||
|                 dbm_order = "ndbm:gdbm".split(":") |                 dbm_order = "ndbm:gdbm:bdb".split(":") | ||||||
|             dbmext = None |             dbmext = None | ||||||
|             for cand in dbm_order: |             for cand in dbm_order: | ||||||
|                 if cand == "ndbm": |                 if cand == "ndbm": | ||||||
|  | @ -773,6 +945,18 @@ def detect_modules(self): | ||||||
|                                     ], |                                     ], | ||||||
|                                 libraries = gdbm_libs) |                                 libraries = gdbm_libs) | ||||||
|                             break |                             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 |                         break | ||||||
|             if dbmext is not None: |             if dbmext is not None: | ||||||
|                 exts.append(dbmext) |                 exts.append(dbmext) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Georg Brandl
						Georg Brandl