85 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
| """
 | |
| 
 | |
| """
 | |
| 
 | |
| import py
 | |
| import sys
 | |
| 
 | |
| log = py.log.get("dynpkg", 
 | |
|                  info=py.log.STDOUT, 
 | |
|                  debug=py.log.STDOUT,
 | |
|                  command=None) # py.log.STDOUT)
 | |
| 
 | |
| from distutils import util
 | |
| 
 | |
| class DistPython: 
 | |
|     def __init__(self, location=None, python=None): 
 | |
|         if python is None:
 | |
|             python = py.std.sys.executable
 | |
|         self.python = python
 | |
|         if location is None:
 | |
|             location = py.path.local()
 | |
|         self.location = location 
 | |
|         self.plat_specifier = '.%s-%s' % (util.get_platform(), sys.version[0:3])
 | |
| 
 | |
|     def clean(self):
 | |
|         out = self._exec("clean -a")
 | |
|         #print out
 | |
| 
 | |
|     def build(self):
 | |
|         out = self._exec("build")
 | |
|         #print out
 | |
| 
 | |
|     def _exec(self, cmd):
 | |
|         python = self.python 
 | |
|         old = self.location.chdir()
 | |
|         try:
 | |
|             cmd = "%(python)s setup.py %(cmd)s" % locals()
 | |
|             log.command(cmd)
 | |
|             out = py.process.cmdexec(cmd)
 | |
|         finally:
 | |
|             old.chdir()
 | |
|         return out 
 | |
| 
 | |
|     def get_package_path(self, pkgname):
 | |
|         pkg = self._get_package_path(pkgname) 
 | |
|         if pkg is None:
 | |
|             #self.clean()
 | |
|             self.build()
 | |
|             pkg = self._get_package_path(pkgname)
 | |
|         assert pkg is not None 
 | |
|         return pkg 
 | |
| 
 | |
|     def _get_package_path(self, pkgname):
 | |
|         major, minor = py.std.sys.version_info[:2]
 | |
|         #assert major >=2 and minor in (3,4,5)
 | |
|         suffix = "%s.%s" %(major, minor)
 | |
|         location = self.location
 | |
|         for base in [location.join('build', 'lib'),
 | |
|                      location.join('build', 'lib'+ self.plat_specifier)]:
 | |
|             if base.check(dir=1):
 | |
|                 for pkg in base.visit(lambda x: x.check(dir=1)):
 | |
|                     if pkg.basename == pkgname:
 | |
|                         # 
 | |
|                         if pkg.dirpath().basename ==  'lib'+ self.plat_specifier or \
 | |
|                            pkg.dirpath().basename == 'lib':
 | |
|                             return pkg
 | |
| 
 | |
| def setpkg(finalpkgname, distdir):
 | |
|     assert distdir.check(dir=1)
 | |
|     dist = DistPython(distdir) 
 | |
|     pkg = dist.get_package_path(finalpkgname) 
 | |
|     assert pkg.check(dir=1)
 | |
|     sys.path.insert(0, str(pkg.dirpath()))
 | |
|     try:
 | |
|         modname = pkg.purebasename
 | |
|         if modname in sys.modules:
 | |
|             log.debug("removing from sys.modules:", modname)
 | |
|             del sys.modules[modname]
 | |
|         sys.modules[modname] = mod = __import__(modname) 
 | |
|     finally: 
 | |
|         sys.path[0] # XXX
 | |
|     log.info("module is at", mod.__file__) 
 | |
|     return mod 
 | |
|  
 |