Mercurial > hg > mercurial-crew-with-dirclash
comparison mercurial/packagescan.py @ 1283:f5faab34f32e
Support for the distutils extention 'py2exe' added.
Description:
- If the py2exe distutils extention is installed this patch allows
building standalone exe for windows - example:
> python setup.py build --compiler=mingw32 py2exe
- The 'out of the box' py2exe is not able to resolve
the dependencies due to 'demandload'. A new helper module
of scanning the mercurial package has been added.
Changed:
- setup.py: importing py2exe and sub classing its command class
to fetch the build directory and insert the needed includes
- packagescan.py: new helper module added, that scans the distutil
build directory for modules to be included.
author | Volker.Kleinfeld@gmx.de |
---|---|
date | Tue, 20 Sep 2005 19:25:14 -0700 |
parents | |
children | 2073e5a71008 |
comparison
equal
deleted
inserted
replaced
1282:c1a507ba398b | 1283:f5faab34f32e |
---|---|
1 # packagescan.py - Helper module for identifing used modules. | |
2 # Used for the py2exe distutil. | |
3 # | |
4 # Copyright 2005 Volker Kleinfeld <Volker.Kleinfeld@gmx.de> | |
5 # | |
6 # This software may be used and distributed according to the terms | |
7 # of the GNU General Public License, incorporated herein by reference. | |
8 import glob | |
9 import os | |
10 import sys | |
11 import demandload | |
12 import ihooks | |
13 | |
14 requiredmodules = {} # Will contain the modules imported by demandload | |
15 def demandload(scope, modules): | |
16 """ fake demandload function that collects the required modules """ | |
17 for m in modules.split(): | |
18 mod = None | |
19 mod = __import__(m,scope,scope) | |
20 scope[m] = mod | |
21 requiredmodules[mod.__name__] = 1 | |
22 | |
23 def getmodules(libpath,packagename): | |
24 """ helper for finding all required modules of package <packagename> """ | |
25 # Use the package in the build directory | |
26 libpath = os.path.abspath(libpath) | |
27 sys.path.insert(0,libpath) | |
28 packdir = os.path.join(libpath,packagename) | |
29 # A normal import would not find the package in | |
30 # the build directory. ihook is used to force the import. | |
31 # After the package is imported the import scope for | |
32 # the following imports is settled. | |
33 p = importfrom(packdir) | |
34 globals()[packagename] = p | |
35 sys.modules[packagename] = p | |
36 # Fetch the python modules in the package | |
37 cwd = os.getcwd() | |
38 os.chdir(packdir) | |
39 pymodulefiles = glob.glob('*.py') | |
40 extmodulefiles = glob.glob('*.pyd') | |
41 os.chdir(cwd) | |
42 # Install a fake demandload module | |
43 sys.modules['mercurial.demandload'] = sys.modules['mercurial.packagescan'] | |
44 # Import all python modules and by that run the fake demandload | |
45 for m in pymodulefiles: | |
46 if m == '__init__.py': continue | |
47 tmp = {} | |
48 mname,ext = os.path.splitext(m) | |
49 fullname = packagename+'.'+mname | |
50 __import__(fullname,tmp,tmp) | |
51 requiredmodules[fullname] = 1 | |
52 # Import all extension modules and by that run the fake demandload | |
53 for m in extmodulefiles: | |
54 tmp = {} | |
55 mname,ext = os.path.splitext(m) | |
56 fullname = packagename+'.'+mname | |
57 __import__(fullname,tmp,tmp) | |
58 requiredmodules[fullname] = 1 | |
59 includes = requiredmodules.keys() | |
60 return includes | |
61 | |
62 def importfrom(filename): | |
63 """ | |
64 import module/package from a named file and returns the module. | |
65 It does not check on sys.modules or includes the module in the scope. | |
66 """ | |
67 loader = ihooks.BasicModuleLoader() | |
68 path, file = os.path.split(filename) | |
69 name, ext = os.path.splitext(file) | |
70 m = loader.find_module_in_dir(name, path) | |
71 if not m: | |
72 raise ImportError, name | |
73 m = loader.load_module(name, m) | |
74 return m |