mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	Patch from Rene Liebscher, tweaked by me:
- 'export_symbol_file' (and corresponding 'def_file' in the old
    "build info" dict) are gone; warn if we see 'def_file' in the
    dict
  - the MSVC "pre-link hack" is gone -- all that stuff is now handled
    elsewhere (eg. by using 'export_symbols', etc.)
  - add 'get_export_symbols()' and 'get_libraries()' methods -- needed
    because on Windows, both of those things are a tad more complicated
    than fetching them from the Extension instance
			
			
This commit is contained in:
		
							parent
							
								
									21a4764b9a
								
							
						
					
					
						commit
						0419a4ffba
					
				
					 1 changed files with 41 additions and 44 deletions
				
			
		|  | @ -282,7 +282,9 @@ def check_extensions_list (self, extensions): | |||
| 
 | ||||
|             # Medium-easy stuff: same syntax/semantics, different names. | ||||
|             ext.runtime_library_dirs = build_info.get('rpath') | ||||
|             ext.export_symbol_file = build_info.get('def_file') | ||||
|             if build_info.has_key('def_file'): | ||||
|                 self.warn("'def_file' element of build info dict " | ||||
|                           "no longer supported") | ||||
| 
 | ||||
|             # Non-trivial stuff: 'macros' split into 'define_macros' | ||||
|             # and 'undef_macros'. | ||||
|  | @ -420,16 +422,14 @@ def build_extensions (self): | |||
|                 objects.extend (ext.extra_objects) | ||||
|             extra_args = ext.extra_link_args or [] | ||||
| 
 | ||||
|             # Bunch of fixing-up we have to do for Microsoft's linker. | ||||
|             if self.compiler.compiler_type == 'msvc': | ||||
|                 self.msvc_prelink_hack(sources, ext, extra_args) | ||||
| 
 | ||||
|             self.compiler.link_shared_object ( | ||||
|                 objects, ext_filename,  | ||||
|                 libraries=ext.libraries, | ||||
|                 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) | ||||
| 
 | ||||
|  | @ -511,44 +511,6 @@ def find_swig (self): | |||
| 
 | ||||
|     # find_swig () | ||||
|      | ||||
| 
 | ||||
|     # -- Hooks 'n hacks ------------------------------------------------ | ||||
| 
 | ||||
|     def msvc_prelink_hack (self, sources, ext, extra_args): | ||||
| 
 | ||||
|         # XXX this is a kludge!  Knowledge of specific compilers or | ||||
|         # platforms really doesn't belong here; in an ideal world, the | ||||
|         # CCompiler interface would provide access to everything in a | ||||
|         # compiler/linker system needs to build Python extensions, and | ||||
|         # we would just do everything nicely and cleanly through that | ||||
|         # interface.  However, this is a not an ideal world and the | ||||
|         # CCompiler interface doesn't handle absolutely everything. | ||||
|         # Thus, kludges like this slip in occasionally.  (This is no | ||||
|         # excuse for committing more platform- and compiler-specific | ||||
|         # kludges; they are to be avoided if possible!) | ||||
| 
 | ||||
|         def_file = ext.export_symbol_file | ||||
| 
 | ||||
|         if def_file is not None: | ||||
|             extra_args.append ('/DEF:' + def_file) | ||||
|         else: | ||||
|             modname = string.split (ext.name, '.')[-1] | ||||
|             extra_args.append('/export:init%s' % modname) | ||||
| 
 | ||||
|         # The MSVC linker generates .lib and .exp files, which cannot be | ||||
|         # suppressed by any linker switches. The .lib files may even be | ||||
|         # needed! Make sure they are generated in the temporary build | ||||
|         # directory. Since they have different names for debug and release | ||||
|         # builds, they can go into the same directory. | ||||
|         implib_file = os.path.join ( | ||||
|             self.implib_dir, | ||||
|             self.get_ext_libname (ext.name)) | ||||
|         extra_args.append ('/IMPLIB:' + implib_file) | ||||
|         self.mkpath (os.path.dirname (implib_file)) | ||||
| 
 | ||||
|     # msvc_prelink_hack () | ||||
| 
 | ||||
| 
 | ||||
|     # -- Name generators ----------------------------------------------- | ||||
|     # (extension names, filenames, whatever) | ||||
| 
 | ||||
|  | @ -579,4 +541,39 @@ def get_ext_libname (self, ext_name): | |||
|             return apply (os.path.join, ext_path) + '_d.lib' | ||||
|         return apply (os.path.join, ext_path) + '.lib' | ||||
| 
 | ||||
| 
 | ||||
|     def get_export_symbols (self, ext): | ||||
|         """Return the list of symbols that a shared extension has to | ||||
|         export.  This either uses 'ext.export_symbols' or, if it's not | ||||
|         provided, "init" + module_name.  Only relevant on Windows, where | ||||
|         the .pyd file (DLL) must export the module "init" function. | ||||
|         """ | ||||
| 
 | ||||
|         # XXX what if 'export_symbols' defined but it doesn't contain | ||||
|         # "init" + module_name?  Should we add it? warn? or just carry | ||||
|         # on doing nothing? | ||||
| 
 | ||||
|         if ext.export_symbols is None: | ||||
|             return ["init" + string.split(ext.name,'.')[-1]] | ||||
|         else: | ||||
|             return ext.export_symbols | ||||
| 
 | ||||
|     def get_libraries (self, ext): | ||||
|         """Return the list of libraries to link against when building a | ||||
|         shared extension.  On most platforms, this is just 'ext.libraries'; | ||||
|         on Windows, we add the Python library (eg. python20.dll). | ||||
|         """ | ||||
|         # The python library is always needed on Windows.  For MSVC, this | ||||
|         # is redundant, since the library is mentioned in a pragma in | ||||
|         # config.h that MSVC groks.  The other Windows compilers all seem | ||||
|         # to need it mentioned explicitly, though, so that's what we do. | ||||
|         if sys.platform == "win32":  | ||||
|             pythonlib = ("python%d%d" % | ||||
|                  (sys.hexversion >> 24, (sys.hexversion >> 16) & 0xff)) | ||||
|             # don't extend ext.libraries, it may be shared with other | ||||
|             # extensions, it is a reference to the original list | ||||
|             return ext.libraries + [pythonlib] | ||||
|         else: | ||||
|             return ext.libraries | ||||
| 
 | ||||
| # class build_ext | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Greg Ward
						Greg Ward