Helper routines to create standalone Python applications.
diff --git a/Mac/Lib/findmodulefiles.py b/Mac/Lib/findmodulefiles.py
new file mode 100644
index 0000000..0a55c8f
--- /dev/null
+++ b/Mac/Lib/findmodulefiles.py
@@ -0,0 +1,91 @@
+"""Findmodulefiles - Find out where modules are loaded from.
+Run findmodulefiles() after running a program with "python -i". The
+resulting file list can be given to mkfrozenresources or to a
+(non-existent) freeze-like application.
+
+findmodulefiles will create a file listing all modules and where they have
+been imported from.
+
+findunusedbuiltins takes a list of (modules, file) and prints all builtin modules
+that are _not_ in the list. The list is created by opening the findmodulefiles
+output, reading it and eval()ing that.
+
+mkpycresource takes a list of (module, file) and creates a resourcefile with all those
+modules and (optionally) a main module.
+"""
+
+def findmodulefiles(output=None):
+	"""Produce a file containing a list of (modulename, filename-or-None)
+	tuples mapping module names to source files"""
+	# Immedeately grab the names
+	import sys
+	module_names = sys.modules.keys()[:]
+	import os
+	if not output:
+		if os.name == 'mac':
+			import macfs
+			
+			output, ok = macfs.StandardPutFile('Module file listing output:')
+			if not ok: sys.exit(0)
+			output = output.as_pathname()
+	if not output:
+		output = sys.stdout
+	elif type(output) == type(''):
+		output = open(output, 'w')
+	output.write('[\n')
+	for name in module_names:
+		try:
+			source = sys.modules[name].__file__
+		except AttributeError:
+			source = None
+		else:
+			source = `source`
+		output.write('\t(%s,\t%s),\n' % (`name`, source))
+	output.write(']\n')
+	del output
+	
+def findunusedbuiltins(list):
+	"""Produce (on stdout) a list of unused builtin modules"""
+	import sys
+	dict = {}
+	for name, location in list:
+		if location == None:
+			dict[name] = 1
+	for name in sys.builtin_module_names:
+		if not dict.has_key(name):
+			print 'Unused builtin module:', name
+			
+
+def mkpycresourcefile(list, main='', dst=None):
+	"""Copy list-of-modules to resource file dst."""
+	import py_resource
+	import Res
+	import sys
+	
+	if dst == None:
+		import macfs
+		fss, ok = macfs.StandardPutFile("PYC Resource output file")
+		if not ok: sys.exit(0)
+		dst = fss.as_pathname()
+	if main == '':
+		import macfs
+		fss, ok = macfs.PromptGetFile("Main program:", "TEXT")
+		if ok:
+			main = fss.as_pathname()
+	
+	fsid = py_resource.create(dst)
+
+	if main:
+		id, name = py_resource.frompyfile(main, '__main__', preload=1)
+		print '%5d\t%s\t%s'%(id, name, main)
+	for name, location in list:
+		if not location: continue
+		if location[-3:] != '.py':
+			print '*** skipping', location
+			continue
+		id, name = py_resource.frompyfile(location, name, preload=1)
+		print '%5d\t%s\t%s'%(id, name, location)
+
+	Res.CloseResFile(fsid)
+
+