Got rid of the python.rsrc resource file. The error message strings and
dialogs are now stored in Mac/Lib, and loaded on demand through macresource.
Not only does this simplify a MacPython based on Apple's Python, but
it also makes Mac error codes come out symbolically when running command
line python (if you have Mac/Lib in your path).

The resource files are copied from Mac/Resources. The old ones will disappear
after the OS9 build procedure has been adjusted.
diff --git a/Mac/Lib/EasyDialogs.py b/Mac/Lib/EasyDialogs.py
index 52aad97..8b81063 100644
--- a/Mac/Lib/EasyDialogs.py
+++ b/Mac/Lib/EasyDialogs.py
@@ -27,6 +27,15 @@
 import string
 from Carbon.ControlAccessor import *	# Also import Controls constants
 import macfs
+import macresource
+
+_initialized = 0
+
+def _initialize():
+	global _initialized
+	if _initialized: return
+	macresource.need("DLOG", 260, "dialogs.rsrc", __name__)
+
 
 def cr2lf(text):
 	if '\r' in text:
@@ -47,7 +56,7 @@
 	
 	The MESSAGE string can be at most 255 characters long.
 	"""
-	
+	_initialize()
 	d = GetNewDialog(id, -1)
 	if not d:
 		print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
@@ -79,6 +88,7 @@
 	can be at most 255 characters long.
 	"""
 	
+	_initialize()
 	d = GetNewDialog(id, -1)
 	if not d:
 		print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
@@ -119,6 +129,7 @@
 	The PROMPT and DEFAULT strings, as well as the return value,
 	can be at most 255 characters long.
 	"""
+	_initialize()
 	d = GetNewDialog(id, -1)
 	if not d:
 		print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
@@ -161,6 +172,7 @@
 	The QUESTION string can be at most 255 characters.
 	"""
 	
+	_initialize()
 	d = GetNewDialog(id, -1)
 	if not d:
 		print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
@@ -221,6 +233,7 @@
 	def __init__(self, title="Working...", maxval=0, label="", id=263):
 		self.w = None
 		self.d = None
+		_initialize()
 		self.d = GetNewDialog(id, -1)
 		self.w = self.d.GetDialogWindow()
 		self.label(label)
@@ -391,6 +404,7 @@
 
 
 def GetArgv(optionlist=None, commandlist=None, addoldfile=1, addnewfile=1, addfolder=1, id=ARGV_ID):
+	_initialize()
 	d = GetNewDialog(id, -1)
 	if not d:
 		print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
diff --git a/Mac/Lib/buildtools.py b/Mac/Lib/buildtools.py
index a02c609..163f19a 100644
--- a/Mac/Lib/buildtools.py
+++ b/Mac/Lib/buildtools.py
@@ -353,58 +353,31 @@
 	ofp.close()
 		
 	
-	if progress:
-		progress.label("Copy resources...")
-		progress.set(20)
-	resfilename = 'python.rsrc'  # XXXX later: '%s.rsrc' % shortname
-	try:
-		output = Res.FSOpenResourceFile(
-				os.path.join(destname, 'Contents', 'Resources', resfilename), 
-				u'', WRITE)
-	except MacOS.Error:
-		fsr, dummy = Res.FSCreateResourceFile(
-				os.path.join(destname, 'Contents', 'Resources'), 
-				unicode(resfilename), '')
-		output = Res.FSOpenResourceFile(fsr, u'', WRITE)
-	
 	# Copy the resources from the target specific resource template, if any
 	typesfound, ownertype = [], None
 	try:
 		input = macresource.open_pathname(rsrcname)
 	except (MacOS.Error, ValueError):
-		pass
 		if progress:
 			progress.inc(50)
 	else:
+		if progress:
+			progress.label("Copy resources...")
+			progress.set(20)
+		resfilename = 'python.rsrc'  # XXXX later: '%s.rsrc' % shortname
+		try:
+			output = Res.FSOpenResourceFile(
+					os.path.join(destname, 'Contents', 'Resources', resfilename), 
+					u'', WRITE)
+		except MacOS.Error:
+			fsr, dummy = Res.FSCreateResourceFile(
+					os.path.join(destname, 'Contents', 'Resources'), 
+					unicode(resfilename), '')
+			output = Res.FSOpenResourceFile(fsr, u'', WRITE)
+		
 		typesfound, ownertype = copyres(input, output, [], 0, progress)
 		Res.CloseResFile(input)
-	
-	# Check which resource-types we should not copy from the template
-	skiptypes = []
-##	if 'vers' in typesfound: skiptypes.append('vers')
-##	if 'SIZE' in typesfound: skiptypes.append('SIZE')
-##	if 'BNDL' in typesfound: skiptypes = skiptypes + ['BNDL', 'FREF', 'icl4', 
-##			'icl8', 'ics4', 'ics8', 'ICN#', 'ics#']
-##	if not copy_codefragment:
-##		skiptypes.append('cfrg')
-##	skipowner = (ownertype <> None)
-	
-	# Copy the resources from the template
-	
-	input = Res.FSOpenResourceFile(
-			os.path.join(template, 'Contents', 'Resources', 'python.rsrc'), u'', READ)
-	if progress:
-		progress.label("Copy standard resources...")
-		progress.inc(0)
-##	dummy, tmplowner = copyres(input, output, skiptypes, 1, progress)
-	dummy, tmplowner = copyres(input, output, skiptypes, 1, None)
-		
-	Res.CloseResFile(input)
-##	if ownertype == None:
-##		raise BuildError, "No owner resource found in either resource file or template"
-	# Make sure we're manipulating the output resource file now
-	
-	Res.CloseResFile(output)
+		Res.CloseResFile(output)
 
 	if code:
 		if raw:
diff --git a/Mac/Lib/dialogs.rsrc b/Mac/Lib/dialogs.rsrc
new file mode 100644
index 0000000..711bd5b
--- /dev/null
+++ b/Mac/Lib/dialogs.rsrc
Binary files differ
diff --git a/Mac/Lib/errors.rsrc b/Mac/Lib/errors.rsrc
new file mode 100644
index 0000000..61c487e
--- /dev/null
+++ b/Mac/Lib/errors.rsrc
Binary files differ
diff --git a/Mac/Lib/macresource.py b/Mac/Lib/macresource.py
index 3a1161b..26f90940 100644
--- a/Mac/Lib/macresource.py
+++ b/Mac/Lib/macresource.py
@@ -95,6 +95,11 @@
 			raise
 	return refno
 	
+def open_error_resource():
+	"""Open the resource file containing the error code to error message
+	mapping."""
+	need('Estr', 1, filename="errors.rsrc", modname=__name__)
+	
 def _decode(pathname, verbose=0):
 	# Decode an AppleSingle resource file, return the new pathname.
 	newpathname = pathname + '.df.rsrc'
diff --git a/Mac/OSX/Makefile b/Mac/OSX/Makefile
index b28d9f2..c8d5840 100644
--- a/Mac/OSX/Makefile
+++ b/Mac/OSX/Makefile
@@ -37,16 +37,11 @@
 	-framework Foundation
 CC=cc
 LD=cc
-REZ=/Developer/Tools/Rez
-DEREZ=/Developer/Tools/DeRez
 CPMAC=/Developer/Tools/CpMac
 
 PYTHON=$(builddir)/python.exe
 APPTEMPLATE=$(srcdir)/Mac/OSXResources/app
 APPSUBDIRS=MacOS Resources Resources/English.lproj
-RESOURCEDIR=$(srcdir)/Mac/Resources
-RESOURCEFILE=python.rsrc
-RFCONVERTER=$(srcdir)/Mac/Lib/applesingle.py
 CACHERSRC=$(srcdir)/Mac/scripts/cachersrc.py
 
 installapps: install_PythonLauncher install_Python install_BuildApplet install_IDE install_IDLE
@@ -94,29 +89,6 @@
 		done; \
 	done
 	$(INSTALL_PROGRAM) $(STRIPFLAG) $(PYTHON) $(APPINSTALLDIR)/Contents/MacOS/python
-# Create a temporary version of the resources here
-# Note that the resource files can either be real 2-fork resource files
-# or AppleSingle encoded files.
-	@if test -s $(RESOURCEDIR)/dialogs.rsrc; then \
-		echo $(PYTHON) $(RFCONVERTER) -r $(RESOURCEDIR)/dialogs.rsrc dialogs.rsrc ;\
-		$(PYTHON) $(RFCONVERTER) -r $(RESOURCEDIR)/dialogs.rsrc dialogs.rsrc ; \
-		echo $(DEREZ) -useDF -skip ckid dialogs.rsrc > dialogs.r ; \
-		$(DEREZ) -useDF -skip ckid dialogs.rsrc > dialogs.r ; \
-	else \
-		echo $(DEREZ) -skip ckid $(RESOURCEDIR)/dialogs.rsrc > dialogs.r ; \
-		$(DEREZ) -skip ckid $(RESOURCEDIR)/dialogs.rsrc > dialogs.r ; \
-	fi
-	@if test -s $(RESOURCEDIR)/errors.rsrc; then \
-		echo $(PYTHON) $(RFCONVERTER) -r $(RESOURCEDIR)/errors.rsrc errors.rsrc ;\
-		$(PYTHON) $(RFCONVERTER) -r $(RESOURCEDIR)/errors.rsrc errors.rsrc ; \
-		echo $(DEREZ) -useDF -skip ckid errors.rsrc > errors.r ; \
-		$(DEREZ) -useDF -skip ckid errors.rsrc > errors.r ; \
-	else \
-		echo $(DEREZ) -skip ckid $(RESOURCEDIR)/errors.rsrc > errors.r ; \
-		$(DEREZ) -skip ckid $(RESOURCEDIR)/errors.rsrc > errors.r ; \
-	fi
-	$(REZ) -useDF -o $(RESOURCEFILE) dialogs.r errors.r 
-	$(INSTALL_DATA) $(RESOURCEFILE) $(APPINSTALLDIR)/Contents/Resources/$(RESOURCEFILE)
 # Finally create the documentation symlink
 	$(LN) -fsn ../../../../English.lproj/Documentation $(APPINSTALLDIR)/Contents/Resources/English.lproj/Documentation
 	
@@ -205,11 +177,11 @@
 			echo $(INSTALL_DATA) $$i $(MACLIBDEST); \
 		fi; \
 	done
-##	@for i in $(MACLIBSRC)/*.rsrc; \
-##	do \
-##		echo $(CPMAC) $$i $$b ; \
-##		$(CPMAC) $$i $$b ; \
-##	done
+	@for i in $(MACLIBSRC)/*.rsrc; \
+	do \
+		echo $(CPMAC) $$i $(MACLIBDEST) ; \
+		$(CPMAC) $$i $(MACLIBDEST) ; \
+	done
 	@for d in $(MACLIBSUBDIRS); \
 	do \
 		a=$(MACLIBSRC)/$$d; \
diff --git a/Python/mactoolboxglue.c b/Python/mactoolboxglue.c
index 13e7afa..dd42f07 100644
--- a/Python/mactoolboxglue.c
+++ b/Python/mactoolboxglue.c
@@ -81,8 +81,42 @@
 	static char buf[256];
 	Handle h;
 	char *str;
+	static int errors_loaded;
 	
 	h = GetResource('Estr', err);
+	if (!h && !errors_loaded) {
+		/*
+		** Attempt to open the resource file containing the
+		** Estr resources. We ignore all errors. We also try
+		** this only once.
+		*/
+		errors_loaded = 1;
+		PyObject *m, *rv;
+		
+		m = PyImport_ImportModule("macresource");
+		if (!m) {
+			if (Py_VerboseFlag)
+				PyErr_Print();
+			PyErr_Clear();
+		} else {
+			rv = PyObject_CallMethod(m, "open_error_resource", "");
+			if (!rv) {
+				if (Py_VerboseFlag)
+					PyErr_Print();
+				PyErr_Clear();
+			} else {
+				Py_DECREF(rv);
+				/* And try again... */
+				h = GetResource('Estr', err);
+			}
+		}
+	}
+	/*
+	** Whether the code above succeeded or not, we won't try
+	** again.
+	*/
+	errors_loaded = 1;
+		
 	if ( h ) {
 		HLock(h);
 		str = (char *)*h;