mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	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.
This commit is contained in:
		
							parent
							
								
									430b1563dd
								
							
						
					
					
						commit
						dde800ec4e
					
				
					 7 changed files with 74 additions and 76 deletions
				
			
		| 
						 | 
					@ -27,6 +27,15 @@
 | 
				
			||||||
import string
 | 
					import string
 | 
				
			||||||
from Carbon.ControlAccessor import *	# Also import Controls constants
 | 
					from Carbon.ControlAccessor import *	# Also import Controls constants
 | 
				
			||||||
import macfs
 | 
					import macfs
 | 
				
			||||||
 | 
					import macresource
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_initialized = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def _initialize():
 | 
				
			||||||
 | 
						global _initialized
 | 
				
			||||||
 | 
						if _initialized: return
 | 
				
			||||||
 | 
						macresource.need("DLOG", 260, "dialogs.rsrc", __name__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def cr2lf(text):
 | 
					def cr2lf(text):
 | 
				
			||||||
	if '\r' in text:
 | 
						if '\r' in text:
 | 
				
			||||||
| 
						 | 
					@ -47,7 +56,7 @@ def Message(msg, id=260, ok=None):
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	The MESSAGE string can be at most 255 characters long.
 | 
						The MESSAGE string can be at most 255 characters long.
 | 
				
			||||||
	"""
 | 
						"""
 | 
				
			||||||
	
 | 
						_initialize()
 | 
				
			||||||
	d = GetNewDialog(id, -1)
 | 
						d = GetNewDialog(id, -1)
 | 
				
			||||||
	if not d:
 | 
						if not d:
 | 
				
			||||||
		print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
 | 
							print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
 | 
				
			||||||
| 
						 | 
					@ -79,6 +88,7 @@ def AskString(prompt, default = "", id=261, ok=None, cancel=None):
 | 
				
			||||||
	can be at most 255 characters long.
 | 
						can be at most 255 characters long.
 | 
				
			||||||
	"""
 | 
						"""
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						_initialize()
 | 
				
			||||||
	d = GetNewDialog(id, -1)
 | 
						d = GetNewDialog(id, -1)
 | 
				
			||||||
	if not d:
 | 
						if not d:
 | 
				
			||||||
		print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
 | 
							print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
 | 
				
			||||||
| 
						 | 
					@ -119,6 +129,7 @@ def AskPassword(prompt,	 default='', id=264, ok=None, cancel=None):
 | 
				
			||||||
	The PROMPT and DEFAULT strings, as well as the return value,
 | 
						The PROMPT and DEFAULT strings, as well as the return value,
 | 
				
			||||||
	can be at most 255 characters long.
 | 
						can be at most 255 characters long.
 | 
				
			||||||
	"""
 | 
						"""
 | 
				
			||||||
 | 
						_initialize()
 | 
				
			||||||
	d = GetNewDialog(id, -1)
 | 
						d = GetNewDialog(id, -1)
 | 
				
			||||||
	if not d:
 | 
						if not d:
 | 
				
			||||||
		print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
 | 
							print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
 | 
				
			||||||
| 
						 | 
					@ -161,6 +172,7 @@ def AskYesNoCancel(question, default = 0, yes=None, no=None, cancel=None, id=262
 | 
				
			||||||
	The QUESTION string can be at most 255 characters.
 | 
						The QUESTION string can be at most 255 characters.
 | 
				
			||||||
	"""
 | 
						"""
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						_initialize()
 | 
				
			||||||
	d = GetNewDialog(id, -1)
 | 
						d = GetNewDialog(id, -1)
 | 
				
			||||||
	if not d:
 | 
						if not d:
 | 
				
			||||||
		print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
 | 
							print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
 | 
				
			||||||
| 
						 | 
					@ -221,6 +233,7 @@ class ProgressBar:
 | 
				
			||||||
	def __init__(self, title="Working...", maxval=0, label="", id=263):
 | 
						def __init__(self, title="Working...", maxval=0, label="", id=263):
 | 
				
			||||||
		self.w = None
 | 
							self.w = None
 | 
				
			||||||
		self.d = None
 | 
							self.d = None
 | 
				
			||||||
 | 
							_initialize()
 | 
				
			||||||
		self.d = GetNewDialog(id, -1)
 | 
							self.d = GetNewDialog(id, -1)
 | 
				
			||||||
		self.w = self.d.GetDialogWindow()
 | 
							self.w = self.d.GetDialogWindow()
 | 
				
			||||||
		self.label(label)
 | 
							self.label(label)
 | 
				
			||||||
| 
						 | 
					@ -391,6 +404,7 @@ def _selectoption(d, optionlist, idx):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def GetArgv(optionlist=None, commandlist=None, addoldfile=1, addnewfile=1, addfolder=1, id=ARGV_ID):
 | 
					def GetArgv(optionlist=None, commandlist=None, addoldfile=1, addnewfile=1, addfolder=1, id=ARGV_ID):
 | 
				
			||||||
 | 
						_initialize()
 | 
				
			||||||
	d = GetNewDialog(id, -1)
 | 
						d = GetNewDialog(id, -1)
 | 
				
			||||||
	if not d:
 | 
						if not d:
 | 
				
			||||||
		print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
 | 
							print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -353,6 +353,14 @@ def process_common_macho(template, progress, code, rsrcname, destname, is_update
 | 
				
			||||||
	ofp.close()
 | 
						ofp.close()
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						# Copy the resources from the target specific resource template, if any
 | 
				
			||||||
 | 
						typesfound, ownertype = [], None
 | 
				
			||||||
 | 
						try:
 | 
				
			||||||
 | 
							input = macresource.open_pathname(rsrcname)
 | 
				
			||||||
 | 
						except (MacOS.Error, ValueError):
 | 
				
			||||||
 | 
							if progress:
 | 
				
			||||||
 | 
								progress.inc(50)
 | 
				
			||||||
 | 
						else:
 | 
				
			||||||
		if progress:
 | 
							if progress:
 | 
				
			||||||
			progress.label("Copy resources...")
 | 
								progress.label("Copy resources...")
 | 
				
			||||||
			progress.set(20)
 | 
								progress.set(20)
 | 
				
			||||||
| 
						 | 
					@ -367,43 +375,8 @@ def process_common_macho(template, progress, code, rsrcname, destname, is_update
 | 
				
			||||||
					unicode(resfilename), '')
 | 
										unicode(resfilename), '')
 | 
				
			||||||
			output = Res.FSOpenResourceFile(fsr, u'', WRITE)
 | 
								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:
 | 
					 | 
				
			||||||
		typesfound, ownertype = copyres(input, output, [], 0, progress)
 | 
							typesfound, ownertype = copyres(input, output, [], 0, progress)
 | 
				
			||||||
		Res.CloseResFile(input)
 | 
							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 code:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								Mac/Lib/dialogs.rsrc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Mac/Lib/dialogs.rsrc
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								Mac/Lib/errors.rsrc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Mac/Lib/errors.rsrc
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
						 | 
					@ -95,6 +95,11 @@ def open_pathname(pathname, verbose=0):
 | 
				
			||||||
			raise
 | 
								raise
 | 
				
			||||||
	return refno
 | 
						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):
 | 
					def _decode(pathname, verbose=0):
 | 
				
			||||||
	# Decode an AppleSingle resource file, return the new pathname.
 | 
						# Decode an AppleSingle resource file, return the new pathname.
 | 
				
			||||||
	newpathname = pathname + '.df.rsrc'
 | 
						newpathname = pathname + '.df.rsrc'
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,16 +37,11 @@ LDFLAGS=-F$(builddir) -framework System -framework Python -framework Carbon \
 | 
				
			||||||
	-framework Foundation
 | 
						-framework Foundation
 | 
				
			||||||
CC=cc
 | 
					CC=cc
 | 
				
			||||||
LD=cc
 | 
					LD=cc
 | 
				
			||||||
REZ=/Developer/Tools/Rez
 | 
					 | 
				
			||||||
DEREZ=/Developer/Tools/DeRez
 | 
					 | 
				
			||||||
CPMAC=/Developer/Tools/CpMac
 | 
					CPMAC=/Developer/Tools/CpMac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PYTHON=$(builddir)/python.exe
 | 
					PYTHON=$(builddir)/python.exe
 | 
				
			||||||
APPTEMPLATE=$(srcdir)/Mac/OSXResources/app
 | 
					APPTEMPLATE=$(srcdir)/Mac/OSXResources/app
 | 
				
			||||||
APPSUBDIRS=MacOS Resources Resources/English.lproj
 | 
					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
 | 
					CACHERSRC=$(srcdir)/Mac/scripts/cachersrc.py
 | 
				
			||||||
 | 
					
 | 
				
			||||||
installapps: install_PythonLauncher install_Python install_BuildApplet install_IDE install_IDLE
 | 
					installapps: install_PythonLauncher install_Python install_BuildApplet install_IDE install_IDLE
 | 
				
			||||||
| 
						 | 
					@ -94,29 +89,6 @@ install_Python: $(PYTHON)
 | 
				
			||||||
		done; \
 | 
							done; \
 | 
				
			||||||
	done
 | 
						done
 | 
				
			||||||
	$(INSTALL_PROGRAM) $(STRIPFLAG) $(PYTHON) $(APPINSTALLDIR)/Contents/MacOS/python
 | 
						$(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
 | 
					# Finally create the documentation symlink
 | 
				
			||||||
	$(LN) -fsn ../../../../English.lproj/Documentation $(APPINSTALLDIR)/Contents/Resources/English.lproj/Documentation
 | 
						$(LN) -fsn ../../../../English.lproj/Documentation $(APPINSTALLDIR)/Contents/Resources/English.lproj/Documentation
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
| 
						 | 
					@ -205,11 +177,11 @@ installmacsubtree:
 | 
				
			||||||
			echo $(INSTALL_DATA) $$i $(MACLIBDEST); \
 | 
								echo $(INSTALL_DATA) $$i $(MACLIBDEST); \
 | 
				
			||||||
		fi; \
 | 
							fi; \
 | 
				
			||||||
	done
 | 
						done
 | 
				
			||||||
##	@for i in $(MACLIBSRC)/*.rsrc; \
 | 
						@for i in $(MACLIBSRC)/*.rsrc; \
 | 
				
			||||||
##	do \
 | 
						do \
 | 
				
			||||||
##		echo $(CPMAC) $$i $$b ; \
 | 
							echo $(CPMAC) $$i $(MACLIBDEST) ; \
 | 
				
			||||||
##		$(CPMAC) $$i $$b ; \
 | 
							$(CPMAC) $$i $(MACLIBDEST) ; \
 | 
				
			||||||
##	done
 | 
						done
 | 
				
			||||||
	@for d in $(MACLIBSUBDIRS); \
 | 
						@for d in $(MACLIBSUBDIRS); \
 | 
				
			||||||
	do \
 | 
						do \
 | 
				
			||||||
		a=$(MACLIBSRC)/$$d; \
 | 
							a=$(MACLIBSRC)/$$d; \
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -81,8 +81,42 @@ char *PyMac_StrError(int err)
 | 
				
			||||||
	static char buf[256];
 | 
						static char buf[256];
 | 
				
			||||||
	Handle h;
 | 
						Handle h;
 | 
				
			||||||
	char *str;
 | 
						char *str;
 | 
				
			||||||
 | 
						static int errors_loaded;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	h = GetResource('Estr', err);
 | 
						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 ) {
 | 
						if ( h ) {
 | 
				
			||||||
		HLock(h);
 | 
							HLock(h);
 | 
				
			||||||
		str = (char *)*h;
 | 
							str = (char *)*h;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue