##// END OF EJS Templates
Support for the distutils extention 'py2exe' added....
Volker.Kleinfeld@gmx.de -
r1283:f5faab34 default
parent child Browse files
Show More
@@ -0,0 +1,74 b''
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
@@ -11,6 +11,34 b' from distutils.command.install_data impo'
11 11
12 12 import mercurial.version
13 13
14 # py2exe needs to be installed to work
15 try:
16 import py2exe
17
18 # Due to the use of demandload py2exe is not finding the modules.
19 # packagescan.getmodules creates a list of modules included in
20 # the mercurial package plus depdent modules.
21 import mercurial.packagescan
22 from py2exe.build_exe import py2exe as build_exe
23
24 class py2exe_for_demandload(build_exe):
25 """ overwrites the py2exe command class for getting the build
26 directory and for setting the 'includes' option."""
27 def initialize_options(self):
28 self.build_lib = None
29 build_exe.initialize_options(self)
30 def finalize_options(self):
31 # Get the build directory, ie. where to search for modules.
32 self.set_undefined_options('build',
33 ('build_lib', 'build_lib'))
34 # Sets the 'includes' option with the list of needed modules
35 if not self.includes:
36 self.includes = []
37 self.includes += mercurial.packagescan.getmodules(self.build_lib,'mercurial')
38 build_exe.finalize_options(self)
39 except ImportError: pass
40
41
14 42 # specify version string, otherwise 'hg identify' will be used:
15 43 version = ''
16 44
@@ -36,7 +64,9 b' try:'
36 64 ['templates/map'] +
37 65 glob.glob('templates/map-*') +
38 66 glob.glob('templates/*.tmpl'))],
39 cmdclass = { 'install_data' : install_package_data },
40 scripts=['hg', 'hgmerge'])
67 cmdclass = { 'install_data' : install_package_data,
68 'py2exe' : py2exe_for_demandload},
69 scripts=['hg', 'hgmerge'],
70 console = ['hg'])
41 71 finally:
42 72 mercurial.version.forget_version()
General Comments 0
You need to be logged in to leave comments. Login now