added Thomas H's LOADER code for importing extension (sub)modules; little tweaks
diff --git a/Mac/Lib/bundlebuilder.py b/Mac/Lib/bundlebuilder.py
index 7d58268..52d6579 100755
--- a/Mac/Lib/bundlebuilder.py
+++ b/Mac/Lib/bundlebuilder.py
@@ -141,6 +141,7 @@
 		self._copyFiles()
 		self._addMetaFiles()
 		self.postProcess()
+		self.message("Done.", 1)
 
 	def preProcess(self):
 		"""Hook for subclasses."""
@@ -200,7 +201,6 @@
 		pass
 
 
-
 if __debug__:
 	PYC_EXT = ".pyc"
 else:
@@ -228,6 +228,13 @@
 
 SITE_CO = compile(SITE_PY, "<-bundlebuilder.py->", "exec")
 
+EXT_LOADER = """\
+import imp, sys, os
+path = os.path.join(sys.path[0], "%(filename)s")
+mod = imp.load_dynamic("%(name)s", path)
+sys.modules["%(name)s"] = mod
+"""
+
 MAYMISS_MODULES = ['mac', 'os2', 'nt', 'ntpath', 'dos', 'dospath',
 	'win32api', 'ce', '_winreg', 'nturl2path', 'sitecustomize',
 	'org.python.core', 'riscos', 'riscosenviron', 'riscospath'
@@ -285,9 +292,6 @@
 	# Strip binaries.
 	strip = 0
 
-	# Found C extension modules: [(name, path), ...]
-	extensions = []
-
 	# Found Python modules: [(name, codeobject, ispkg), ...]
 	pymodules = []
 
@@ -355,7 +359,7 @@
 			mainwrapperpath = pathjoin(execdir, self.name)
 			makedirs(execdir)
 			open(mainwrapperpath, "w").write(BOOTSTRAP_SCRIPT % locals())
-			os.chmod(mainwrapperpath, 0777)
+			os.chmod(mainwrapperpath, 0775)
 
 	def postProcess(self):
 		self.addPythonModules()
@@ -374,35 +378,35 @@
 
 	def addPythonModules(self):
 		self.message("Adding Python modules", 1)
-		pymodules = self.pymodules
 
 		if USE_FROZEN:
 			# This anticipates the acceptance of this patch:
 			#   http://www.python.org/sf/642578
 			# Create a file containing all modules, frozen.
 			frozenmodules = []
-			for name, code, ispkg in pymodules:
+			for name, code, ispkg in self.pymodules:
 				if ispkg:
 					self.message("Adding Python package %s" % name, 2)
 				else:
 					self.message("Adding Python module %s" % name, 2)
 				frozenmodules.append((name, marshal.dumps(code), ispkg))
 			frozenmodules = tuple(frozenmodules)
-			relpath = "Contents/Resources/" + FROZEN_ARCHIVE
+			relpath = pathjoin("Contents", "Resources", FROZEN_ARCHIVE)
 			abspath = pathjoin(self.bundlepath, relpath)
 			f = open(abspath, "wb")
 			marshal.dump(frozenmodules, f)
 			f.close()
 			# add site.pyc
-			sitepath = pathjoin(self.bundlepath, "Contents/Resources/site" + PYC_EXT)
+			sitepath = pathjoin(self.bundlepath, "Contents", "Resources",
+					"site" + PYC_EXT)
 			writePyc(SITE_CO, sitepath)
 		else:
 			# Create individual .pyc files.
-			for name, code, ispkg in pymodules:
+			for name, code, ispkg in self.pymodules:
 				if ispkg:
 					name += ".__init__"
 				path = name.split(".")
-				path = pathjoin("Contents/Resources/", *path) + PYC_EXT
+				path = pathjoin("Contents", "Resources", *path) + PYC_EXT
 
 				if ispkg:
 					self.message("Adding Python package %s" % path, 2)
@@ -443,7 +447,6 @@
 			except ImportError:
 				self.missingModules.append(name)
 
-
 		mf.run_script(self.mainprogram)
 		modules = mf.modules.items()
 		modules.sort()
@@ -451,18 +454,21 @@
 			if mod.__file__ and mod.__code__ is None:
 				# C extension
 				path = mod.__file__
-				ext = os.path.splitext(path)[1]
-				if USE_FROZEN:  # "proper" freezing
-					# rename extensions that are submodules of packages to
-					# <packagename>.<modulename>.<ext>
-					dstpath = "Contents/Resources/" + name + ext
+				filename = os.path.basename(path)
+				if USE_FROZEN:
+					# "proper" freezing, put extensions in Contents/Resources/,
+					# freeze a tiny "loader" program. Due to Thomas Heller.
+					dstpath = pathjoin("Contents", "Resources", filename)
+					source = EXT_LOADER % {"name": name, "filename": filename}
+					code = compile(source, "<dynloader for %s>" % name, "exec")
+					mod.__code__ = code
 				else:
-					dstpath = name.split(".")
-					dstpath = pathjoin("Contents/Resources/", *dstpath) + ext
+					# just copy the file
+					dstpath = name.split(".")[:-1] + [filename]
+					dstpath = pathjoin("Contents", "Resources", *dstpath)
 				self.files.append((path, dstpath))
-				self.extensions.append((name, path, dstpath))
 				self.binaries.append(dstpath)
-			elif mod.__code__ is not None:
+			if mod.__code__ is not None:
 				ispkg = mod.__path__ is not None
 				if not USE_FROZEN or name != "site":
 					# Our site.py is doing the bootstrapping, so we must