macmodulefinder.py 2.72 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
"""macmodulefinder - Find modules used in a script. Only slightly
mac-specific, really."""

import sys
import os

import directives

try:
	# This will work if we are frozen ourselves
	import modulefinder
except ImportError:
	# And this will work otherwise
	_FREEZEDIR=os.path.join(sys.prefix, ':Tools:freeze')
	sys.path.insert(0, _FREEZEDIR)
	import modulefinder

#
# Modules that must be included, and modules that need not be included
# (but are if they are found)
#
22
MAC_INCLUDE_MODULES=['site', 'macfsn']
23
MAC_MAYMISS_MODULES=['posix', 'os2', 'nt', 'ntpath', 'dos', 'dospath', 
24
		'win32api', 'ce', '_winreg',
25
		'nturl2path', 'pwd', 'sitecustomize',
26 27 28
		'org.python.core',
		'riscos', 'riscosenviron', 'riscospath'
		]
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

# An exception:
Missing="macmodulefinder.Missing"

class Module(modulefinder.Module):
	
	def gettype(self):
		"""Return type of module"""
		if self.__path__:
			return 'package'
		if self.__code__:
			return 'module'
		if self.__file__:
			return 'dynamic'
		return 'builtin'

class ModuleFinder(modulefinder.ModuleFinder):

    def add_module(self, fqname):
        if self.modules.has_key(fqname):
            return self.modules[fqname]
        self.modules[fqname] = m = Module(fqname)
        return m
        
53 54 55 56 57 58
def process(program, modules=None, module_files=None, debug=0):
	if modules is None:
		modules = []
	if module_files is None:
		module_files = []
	missing = []
59 60 61 62 63 64 65
	#
	# Add the standard modules needed for startup
	#
	modules = modules + MAC_INCLUDE_MODULES
	#
	# search the main source for directives
	#
66
	extra_modules, exclude_modules, optional_modules, extra_path = \
67 68 69 70 71 72 73
			directives.findfreezedirectives(program)
	for m in extra_modules:
		if os.sep in m:
			# It is a file
			module_files.append(m)
		else:
			modules.append(m)
74 75 76 77 78
    # collect all modules of the program
	path = sys.path[:]
	dir = os.path.dirname(program)
	path[0] = dir	# "current dir"
	path = extra_path + path
79 80 81 82 83 84 85 86 87 88 89 90 91 92
	#
	# Create the module finder and let it do its work
	#
	modfinder = ModuleFinder(path, 
			excludes=exclude_modules, debug=debug)
	for m in modules:
		modfinder.import_hook(m)
	for m in module_files:
		modfinder.load_file(m)
	modfinder.run_script(program)
	module_dict = modfinder.modules
	#
	# Tell the user about missing modules
	#
93
	maymiss = exclude_modules + optional_modules + MAC_MAYMISS_MODULES
94 95 96 97
	for m in modfinder.badmodules.keys():
		if not m in maymiss:
			if debug > 0:
				print 'Missing', m
98
			missing.append(m)
99 100 101 102 103 104 105 106 107 108 109 110 111
	#
	# Warn the user about unused builtins
	#
	for m in sys.builtin_module_names:
		if m in ('__main__', '__builtin__'):
			pass
		elif not module_dict.has_key(m):
			if debug > 0:
				print 'Unused', m
		elif module_dict[m].gettype() != 'builtin':
			# XXXX Can this happen?
			if debug > 0:
				print 'Conflict', m
112
	return module_dict, missing