diff options
Diffstat (limited to 'Mac/Tools')
-rw-r--r-- | Mac/Tools/Doc/HelpIndexingTool/Help_Indexing_Tool_Suite.py | 110 | ||||
-rw-r--r-- | Mac/Tools/Doc/HelpIndexingTool/Miscellaneous_Standards.py | 49 | ||||
-rw-r--r-- | Mac/Tools/Doc/HelpIndexingTool/Required_Suite.py | 32 | ||||
-rw-r--r-- | Mac/Tools/Doc/HelpIndexingTool/Standard_Suite.py | 343 | ||||
-rw-r--r-- | Mac/Tools/Doc/HelpIndexingTool/__init__.py | 78 | ||||
-rw-r--r-- | Mac/Tools/Doc/HelpIndexingTool/odds_and_ends.py | 49 | ||||
-rw-r--r-- | Mac/Tools/Doc/README | 35 | ||||
-rw-r--r-- | Mac/Tools/Doc/setup.py | 214 | ||||
-rw-r--r-- | Mac/Tools/fixapplepython23.py | 119 | ||||
-rw-r--r-- | Mac/Tools/pythonw.c | 17 |
10 files changed, 1046 insertions, 0 deletions
diff --git a/Mac/Tools/Doc/HelpIndexingTool/Help_Indexing_Tool_Suite.py b/Mac/Tools/Doc/HelpIndexingTool/Help_Indexing_Tool_Suite.py new file mode 100644 index 00000000000..58d73076dfb --- /dev/null +++ b/Mac/Tools/Doc/HelpIndexingTool/Help_Indexing_Tool_Suite.py @@ -0,0 +1,110 @@ +"""Suite Help Indexing Tool Suite: Special events that just the Help Indexing Tool supports. +Level 0, version 0 + +Generated from /Developer/Applications/Apple Help Indexing Tool.app +AETE/AEUT resource version 1/1, language 0, script 0 +""" + +import aetools +import MacOS + +_code = 'HIT ' + +class Help_Indexing_Tool_Suite_Events: + + def turn_anchor_indexing(self, _object, _attributes={}, **_arguments): + """turn anchor indexing: Turns anchor indexing on or off. + Required argument: \xd2on\xd3 or \xd2off\xd3, to turn anchor indexing on or off + Keyword argument _attributes: AppleEvent attribute dictionary + """ + _code = 'HIT ' + _subcode = 'tAnc' + + if _arguments: raise TypeError, 'No optional args expected' + _arguments['----'] = _object + + + _reply, _arguments, _attributes = self.send(_code, _subcode, + _arguments, _attributes) + if _arguments.get('errn', 0): + raise aetools.Error, aetools.decodeerror(_arguments) + # XXXX Optionally decode result + if _arguments.has_key('----'): + return _arguments['----'] + + _argmap_turn_remote_root = { + 'with_root_url' : 'rURL', + } + + def turn_remote_root(self, _object, _attributes={}, **_arguments): + """turn remote root: Turn usage of remote root for content on the web on or off. If turning \xd2on\xd3, supply a string as second parameter. + Required argument: \xd2on\xd3 or \xd2off\xd3, to turn remote root on or off + Keyword argument with_root_url: The remote root to use, in the form of \xd2http://www.apple.com/help/\xd3. + Keyword argument _attributes: AppleEvent attribute dictionary + """ + _code = 'HIT ' + _subcode = 'tRem' + + aetools.keysubst(_arguments, self._argmap_turn_remote_root) + _arguments['----'] = _object + + + _reply, _arguments, _attributes = self.send(_code, _subcode, + _arguments, _attributes) + if _arguments.get('errn', 0): + raise aetools.Error, aetools.decodeerror(_arguments) + # XXXX Optionally decode result + if _arguments.has_key('----'): + return _arguments['----'] + + def use_tokenizer(self, _object, _attributes={}, **_arguments): + """use tokenizer: Tells the indexing tool which tokenizer to use. + Required argument: Specify \xd2English\xd3, \xd2European\xd3, \xd2Japanese\xd3, \xd2Korean\xd3, or \xd2Simple\xd3. + Keyword argument _attributes: AppleEvent attribute dictionary + """ + _code = 'HIT ' + _subcode = 'uTok' + + if _arguments: raise TypeError, 'No optional args expected' + _arguments['----'] = _object + + + _reply, _arguments, _attributes = self.send(_code, _subcode, + _arguments, _attributes) + if _arguments.get('errn', 0): + raise aetools.Error, aetools.decodeerror(_arguments) + # XXXX Optionally decode result + if _arguments.has_key('----'): + return _arguments['----'] + + +class application(aetools.ComponentItem): + """application - Application class """ + want = 'capp' +class _Prop_idleStatus(aetools.NProperty): + """idleStatus - """ + which = 'sIdl' + want = 'bool' +application._superclassnames = [] +application._privpropdict = { + 'idleStatus' : _Prop_idleStatus, +} +application._privelemdict = { +} + +# +# Indices of types declared in this module +# +_classdeclarations = { + 'capp' : application, +} + +_propdeclarations = { + 'sIdl' : _Prop_idleStatus, +} + +_compdeclarations = { +} + +_enumdeclarations = { +} diff --git a/Mac/Tools/Doc/HelpIndexingTool/Miscellaneous_Standards.py b/Mac/Tools/Doc/HelpIndexingTool/Miscellaneous_Standards.py new file mode 100644 index 00000000000..3cf745f9860 --- /dev/null +++ b/Mac/Tools/Doc/HelpIndexingTool/Miscellaneous_Standards.py @@ -0,0 +1,49 @@ +"""Suite Miscellaneous Standards: Useful events that aren\xd5t in any other suite +Level 0, version 0 + +Generated from /Developer/Applications/Apple Help Indexing Tool.app +AETE/AEUT resource version 1/1, language 0, script 0 +""" + +import aetools +import MacOS + +_code = 'misc' + +class Miscellaneous_Standards_Events: + + def revert(self, _object, _attributes={}, **_arguments): + """revert: Revert an object to the most recently saved version + Required argument: object to revert + Keyword argument _attributes: AppleEvent attribute dictionary + """ + _code = 'misc' + _subcode = 'rvrt' + + if _arguments: raise TypeError, 'No optional args expected' + _arguments['----'] = _object + + + _reply, _arguments, _attributes = self.send(_code, _subcode, + _arguments, _attributes) + if _arguments.get('errn', 0): + raise aetools.Error, aetools.decodeerror(_arguments) + # XXXX Optionally decode result + if _arguments.has_key('----'): + return _arguments['----'] + + +# +# Indices of types declared in this module +# +_classdeclarations = { +} + +_propdeclarations = { +} + +_compdeclarations = { +} + +_enumdeclarations = { +} diff --git a/Mac/Tools/Doc/HelpIndexingTool/Required_Suite.py b/Mac/Tools/Doc/HelpIndexingTool/Required_Suite.py new file mode 100644 index 00000000000..eb9fee00172 --- /dev/null +++ b/Mac/Tools/Doc/HelpIndexingTool/Required_Suite.py @@ -0,0 +1,32 @@ +"""Suite Required Suite: Terms that every application should support +Level 1, version 1 + +Generated from /Developer/Applications/Apple Help Indexing Tool.app +AETE/AEUT resource version 1/1, language 0, script 0 +""" + +import aetools +import MacOS + +_code = 'reqd' + +from StdSuites.Required_Suite import * +class Required_Suite_Events(Required_Suite_Events): + + pass + + +# +# Indices of types declared in this module +# +_classdeclarations = { +} + +_propdeclarations = { +} + +_compdeclarations = { +} + +_enumdeclarations = { +} diff --git a/Mac/Tools/Doc/HelpIndexingTool/Standard_Suite.py b/Mac/Tools/Doc/HelpIndexingTool/Standard_Suite.py new file mode 100644 index 00000000000..4f6604cfebe --- /dev/null +++ b/Mac/Tools/Doc/HelpIndexingTool/Standard_Suite.py @@ -0,0 +1,343 @@ +"""Suite Standard Suite: Common terms for most applications +Level 1, version 1 + +Generated from /Developer/Applications/Apple Help Indexing Tool.app +AETE/AEUT resource version 1/1, language 0, script 0 +""" + +import aetools +import MacOS + +_code = 'CoRe' + +from StdSuites.Standard_Suite import * +class Standard_Suite_Events(Standard_Suite_Events): + + _argmap_close = { + 'saving' : 'savo', + 'in_' : 'kfil', + } + + def close(self, _object, _attributes={}, **_arguments): + """close: Close an object + Required argument: the objects to close + Keyword argument saving: specifies whether or not changes should be saved before closing + Keyword argument in_: the file in which to save the object + Keyword argument _attributes: AppleEvent attribute dictionary + """ + _code = 'core' + _subcode = 'clos' + + aetools.keysubst(_arguments, self._argmap_close) + _arguments['----'] = _object + + aetools.enumsubst(_arguments, 'savo', _Enum_savo) + + _reply, _arguments, _attributes = self.send(_code, _subcode, + _arguments, _attributes) + if _arguments.get('errn', 0): + raise aetools.Error, aetools.decodeerror(_arguments) + # XXXX Optionally decode result + if _arguments.has_key('----'): + return _arguments['----'] + + def data_size(self, _object, _attributes={}, **_arguments): + """data size: Return the size in bytes of an object + Required argument: the object whose data size is to be returned + Keyword argument _attributes: AppleEvent attribute dictionary + Returns: the size of the object in bytes + """ + _code = 'core' + _subcode = 'dsiz' + + if _arguments: raise TypeError, 'No optional args expected' + _arguments['----'] = _object + + + _reply, _arguments, _attributes = self.send(_code, _subcode, + _arguments, _attributes) + if _arguments.get('errn', 0): + raise aetools.Error, aetools.decodeerror(_arguments) + # XXXX Optionally decode result + if _arguments.has_key('----'): + return _arguments['----'] + + def get(self, _object, _attributes={}, **_arguments): + """get: Get the data for an object + Required argument: the object whose data is to be returned + Keyword argument _attributes: AppleEvent attribute dictionary + Returns: The data from the object + """ + _code = 'core' + _subcode = 'getd' + + if _arguments: raise TypeError, 'No optional args expected' + _arguments['----'] = _object + + + _reply, _arguments, _attributes = self.send(_code, _subcode, + _arguments, _attributes) + if _arguments.get('errn', 0): + raise aetools.Error, aetools.decodeerror(_arguments) + # XXXX Optionally decode result + if _arguments.has_key('----'): + return _arguments['----'] + + _argmap_make = { + 'new' : 'kocl', + 'at' : 'insh', + 'with_data' : 'data', + 'with_properties' : 'prdt', + } + + def make(self, _no_object=None, _attributes={}, **_arguments): + """make: Make a new element + Keyword argument new: the class of the new element + Keyword argument at: the location at which to insert the element + Keyword argument with_data: the initial data for the element + Keyword argument with_properties: the initial values for the properties of the element + Keyword argument _attributes: AppleEvent attribute dictionary + Returns: Object specifier for the new element + """ + _code = 'core' + _subcode = 'crel' + + aetools.keysubst(_arguments, self._argmap_make) + if _no_object != None: raise TypeError, 'No direct arg expected' + + + _reply, _arguments, _attributes = self.send(_code, _subcode, + _arguments, _attributes) + if _arguments.get('errn', 0): + raise aetools.Error, aetools.decodeerror(_arguments) + # XXXX Optionally decode result + if _arguments.has_key('----'): + return _arguments['----'] + + def open(self, _object, _attributes={}, **_arguments): + """open: Open the specified object(s) + Required argument: Objects to open. Can be a list of files or an object specifier. + Keyword argument _attributes: AppleEvent attribute dictionary + """ + _code = 'aevt' + _subcode = 'odoc' + + if _arguments: raise TypeError, 'No optional args expected' + _arguments['----'] = _object + + + _reply, _arguments, _attributes = self.send(_code, _subcode, + _arguments, _attributes) + if _arguments.get('errn', 0): + raise aetools.Error, aetools.decodeerror(_arguments) + # XXXX Optionally decode result + if _arguments.has_key('----'): + return _arguments['----'] + + def print_(self, _object, _attributes={}, **_arguments): + """print: Print the specified object(s) + Required argument: Objects to print. Can be a list of files or an object specifier. + Keyword argument _attributes: AppleEvent attribute dictionary + """ + _code = 'aevt' + _subcode = 'pdoc' + + if _arguments: raise TypeError, 'No optional args expected' + _arguments['----'] = _object + + + _reply, _arguments, _attributes = self.send(_code, _subcode, + _arguments, _attributes) + if _arguments.get('errn', 0): + raise aetools.Error, aetools.decodeerror(_arguments) + # XXXX Optionally decode result + if _arguments.has_key('----'): + return _arguments['----'] + + _argmap_save = { + 'in_' : 'kfil', + 'as' : 'fltp', + } + + def save(self, _object, _attributes={}, **_arguments): + """save: save a set of objects + Required argument: Objects to save. + Keyword argument in_: the file in which to save the object(s) + Keyword argument as: the file type of the document in which to save the data + Keyword argument _attributes: AppleEvent attribute dictionary + """ + _code = 'core' + _subcode = 'save' + + aetools.keysubst(_arguments, self._argmap_save) + _arguments['----'] = _object + + + _reply, _arguments, _attributes = self.send(_code, _subcode, + _arguments, _attributes) + if _arguments.get('errn', 0): + raise aetools.Error, aetools.decodeerror(_arguments) + # XXXX Optionally decode result + if _arguments.has_key('----'): + return _arguments['----'] + + _argmap_set = { + 'to' : 'data', + } + + def set(self, _object, _attributes={}, **_arguments): + """set: Set an object\xd5s data + Required argument: the object to change + Keyword argument to: the new value + Keyword argument _attributes: AppleEvent attribute dictionary + """ + _code = 'core' + _subcode = 'setd' + + aetools.keysubst(_arguments, self._argmap_set) + _arguments['----'] = _object + + + _reply, _arguments, _attributes = self.send(_code, _subcode, + _arguments, _attributes) + if _arguments.get('errn', 0): + raise aetools.Error, aetools.decodeerror(_arguments) + # XXXX Optionally decode result + if _arguments.has_key('----'): + return _arguments['----'] + + +class application(aetools.ComponentItem): + """application - An application program """ + want = 'capp' +# element 'cwin' as ['indx', 'name', 'rele'] +# element 'docu' as ['name'] + +class window(aetools.ComponentItem): + """window - A Window """ + want = 'cwin' +class _Prop_bounds(aetools.NProperty): + """bounds - the boundary rectangle for the window """ + which = 'pbnd' + want = 'qdrt' +class _Prop_closeable(aetools.NProperty): + """closeable - Does the window have a close box? """ + which = 'hclb' + want = 'bool' +class _Prop_floating(aetools.NProperty): + """floating - Does the window float? """ + which = 'isfl' + want = 'bool' +class _Prop_index(aetools.NProperty): + """index - the number of the window """ + which = 'pidx' + want = 'long' +class _Prop_modal(aetools.NProperty): + """modal - Is the window modal? """ + which = 'pmod' + want = 'bool' +class _Prop_name(aetools.NProperty): + """name - the title of the window """ + which = 'pnam' + want = 'itxt' +class _Prop_position(aetools.NProperty): + """position - upper left coordinates of window """ + which = 'ppos' + want = 'QDpt' +class _Prop_resizable(aetools.NProperty): + """resizable - Is the window resizable? """ + which = 'prsz' + want = 'bool' +class _Prop_titled(aetools.NProperty): + """titled - Does the window have a title bar? """ + which = 'ptit' + want = 'bool' +class _Prop_visible(aetools.NProperty): + """visible - is the window visible? """ + which = 'pvis' + want = 'bool' +class _Prop_zoomable(aetools.NProperty): + """zoomable - Is the window zoomable? """ + which = 'iszm' + want = 'bool' +class _Prop_zoomed(aetools.NProperty): + """zoomed - Is the window zoomed? """ + which = 'pzum' + want = 'bool' + +class document(aetools.ComponentItem): + """document - A Document """ + want = 'docu' +class _Prop_modified(aetools.NProperty): + """modified - Has the document been modified since the last save? """ + which = 'imod' + want = 'bool' +application._superclassnames = [] +application._privpropdict = { +} +application._privelemdict = { + 'document' : document, + 'window' : window, +} +window._superclassnames = [] +window._privpropdict = { + 'bounds' : _Prop_bounds, + 'closeable' : _Prop_closeable, + 'floating' : _Prop_floating, + 'index' : _Prop_index, + 'modal' : _Prop_modal, + 'name' : _Prop_name, + 'position' : _Prop_position, + 'resizable' : _Prop_resizable, + 'titled' : _Prop_titled, + 'visible' : _Prop_visible, + 'zoomable' : _Prop_zoomable, + 'zoomed' : _Prop_zoomed, +} +window._privelemdict = { +} +document._superclassnames = [] +document._privpropdict = { + 'modified' : _Prop_modified, + 'name' : _Prop_name, +} +document._privelemdict = { +} +_Enum_savo = { + 'yes' : 'yes ', # Save objects now + 'no' : 'no ', # Do not save objects + 'ask' : 'ask ', # Ask the user whether to save +} + + +# +# Indices of types declared in this module +# +_classdeclarations = { + 'capp' : application, + 'cwin' : window, + 'docu' : document, +} + +_propdeclarations = { + 'hclb' : _Prop_closeable, + 'imod' : _Prop_modified, + 'isfl' : _Prop_floating, + 'iszm' : _Prop_zoomable, + 'pbnd' : _Prop_bounds, + 'pidx' : _Prop_index, + 'pmod' : _Prop_modal, + 'pnam' : _Prop_name, + 'ppos' : _Prop_position, + 'prsz' : _Prop_resizable, + 'ptit' : _Prop_titled, + 'pvis' : _Prop_visible, + 'pzum' : _Prop_zoomed, +} + +_compdeclarations = { +} + +_enumdeclarations = { + 'savo' : _Enum_savo, +} diff --git a/Mac/Tools/Doc/HelpIndexingTool/__init__.py b/Mac/Tools/Doc/HelpIndexingTool/__init__.py new file mode 100644 index 00000000000..5359df53c49 --- /dev/null +++ b/Mac/Tools/Doc/HelpIndexingTool/__init__.py @@ -0,0 +1,78 @@ +""" +Package generated from /Developer/Applications/Apple Help Indexing Tool.app +""" +import aetools +Error = aetools.Error +import Standard_Suite +import Help_Indexing_Tool_Suite +import odds_and_ends +import Miscellaneous_Standards +import Required_Suite + + +_code_to_module = { + 'CoRe' : Standard_Suite, + 'HIT ' : Help_Indexing_Tool_Suite, + 'Odds' : odds_and_ends, + 'misc' : Miscellaneous_Standards, + 'reqd' : Required_Suite, +} + + + +_code_to_fullname = { + 'CoRe' : ('HelpIndexingTool.Standard_Suite', 'Standard_Suite'), + 'HIT ' : ('HelpIndexingTool.Help_Indexing_Tool_Suite', 'Help_Indexing_Tool_Suite'), + 'Odds' : ('HelpIndexingTool.odds_and_ends', 'odds_and_ends'), + 'misc' : ('HelpIndexingTool.Miscellaneous_Standards', 'Miscellaneous_Standards'), + 'reqd' : ('HelpIndexingTool.Required_Suite', 'Required_Suite'), +} + +from Standard_Suite import * +from Help_Indexing_Tool_Suite import * +from odds_and_ends import * +from Miscellaneous_Standards import * +from Required_Suite import * + +def getbaseclasses(v): + if not getattr(v, '_propdict', None): + v._propdict = {} + v._elemdict = {} + for superclassname in getattr(v, '_superclassnames', []): + superclass = eval(superclassname) + getbaseclasses(superclass) + v._propdict.update(getattr(superclass, '_propdict', {})) + v._elemdict.update(getattr(superclass, '_elemdict', {})) + v._propdict.update(getattr(v, '_privpropdict', {})) + v._elemdict.update(getattr(v, '_privelemdict', {})) + +import StdSuites + +# +# Set property and element dictionaries now that all classes have been defined +# +getbaseclasses(window) +getbaseclasses(application) +getbaseclasses(document) +getbaseclasses(application) + +# +# Indices of types declared in this module +# +_classdeclarations = { + 'cwin' : window, + 'capp' : application, + 'docu' : document, + 'capp' : application, +} + + +class HelpIndexingTool(Standard_Suite_Events, + Help_Indexing_Tool_Suite_Events, + odds_and_ends_Events, + Miscellaneous_Standards_Events, + Required_Suite_Events, + aetools.TalkTo): + _signature = 'hiti' + + _moduleName = 'HelpIndexingTool' diff --git a/Mac/Tools/Doc/HelpIndexingTool/odds_and_ends.py b/Mac/Tools/Doc/HelpIndexingTool/odds_and_ends.py new file mode 100644 index 00000000000..7ee46f35cc2 --- /dev/null +++ b/Mac/Tools/Doc/HelpIndexingTool/odds_and_ends.py @@ -0,0 +1,49 @@ +"""Suite odds and ends: Things that should be in some standard suite, but aren\xd5t +Level 1, version 1 + +Generated from /Developer/Applications/Apple Help Indexing Tool.app +AETE/AEUT resource version 1/1, language 0, script 0 +""" + +import aetools +import MacOS + +_code = 'Odds' + +class odds_and_ends_Events: + + def select(self, _object=None, _attributes={}, **_arguments): + """select: Select the specified object + Required argument: the object to select + Keyword argument _attributes: AppleEvent attribute dictionary + """ + _code = 'misc' + _subcode = 'slct' + + if _arguments: raise TypeError, 'No optional args expected' + _arguments['----'] = _object + + + _reply, _arguments, _attributes = self.send(_code, _subcode, + _arguments, _attributes) + if _arguments.get('errn', 0): + raise aetools.Error, aetools.decodeerror(_arguments) + # XXXX Optionally decode result + if _arguments.has_key('----'): + return _arguments['----'] + + +# +# Indices of types declared in this module +# +_classdeclarations = { +} + +_propdeclarations = { +} + +_compdeclarations = { +} + +_enumdeclarations = { +} diff --git a/Mac/Tools/Doc/README b/Mac/Tools/Doc/README new file mode 100644 index 00000000000..4f4d53d01ea --- /dev/null +++ b/Mac/Tools/Doc/README @@ -0,0 +1,35 @@ +In this directory you can build the Python documentation in a form that +is suitable for access with Apple Help Viewer. This will enable the +"Python Documentation" menu entries in the MacPython IDE Help menu. + +Unfortunately the procedure to build the docs is not very streamlined. + +First, edit setup.py. At the top, edit MAJOR_VERSION and MINOR_VERSION, +and check that DESTDIR makes sense. The documentation will be installed +inside PythonIDE.app. + +In DocBuild.initialize_options, set self.download to True if you want to +download the docs. Set it to False if you want to build the docs from +the source tree, but this requires LaTex and lots of other stuff. +Doable, but not easy. + +Second, if you want to download the docs you may need to do a couple +more edits. The way the docs are packaged will often change between +major releases. Fiddle DocBuild.downloadDocs to make it do the right +thing (download the docs from python.org, unpack them, rename the +directory to "build/html"). + +After these edits you should be ready to roll. "pythonw setup.py build" +should download and unpack (or build) the docs. Next, it will do some +magic to make the docs indexable. Finally, it will run the Apple Help +Indexing Tool. (This last step is the reason you must use "pythonw" as +opposed to "python"). Usually it will time out while waiting for AHIT to +do its work. Wait until AHIT is done. + +Now you're ready to install with "python setup.py install". + +After this is done test your work. Fire up PythonIDE, and check that +Help->Python Documentation brings up the documentation in the Help Viewer. +Also open an IDE edit window, type something like "import sys", select +"import", and use Help->Lookup in Python Documentation to check that the +index has been generated correctly. diff --git a/Mac/Tools/Doc/setup.py b/Mac/Tools/Doc/setup.py new file mode 100644 index 00000000000..bd86a20a838 --- /dev/null +++ b/Mac/Tools/Doc/setup.py @@ -0,0 +1,214 @@ +# Build and install an Apple Help Viewer compatible version of the Python +# documentation into the framework. +# Code by Bill Fancher, with some modifications by Jack Jansen. +# +# You must run this as a two-step process +# 1. python setupDocs.py build +# 2. Wait for Apple Help Indexing Tool to finish +# 3. python setupDocs.py install +# +# To do: +# - test whether the docs are available locally before downloading +# - fix buildDocsFromSource +# - Get documentation version from sys.version, fallback to 2.2.1 +# - See if we can somehow detect that Apple Help Indexing Tool is finished +# - data_files to setup() doesn't seem the right way to pass the arguments +# +import sys, os, re +from distutils.cmd import Command +from distutils.command.build import build +from distutils.core import setup +from distutils.file_util import copy_file +from distutils.dir_util import copy_tree +from distutils.log import log +from distutils.spawn import spawn +from distutils import sysconfig, dep_util +from distutils.util import change_root +import HelpIndexingTool +import Carbon.File +import time + +MAJOR_VERSION='2.4' +MINOR_VERSION='2.4.1' +DESTDIR='/Applications/MacPython-%s/PythonIDE.app/Contents/Resources/English.lproj/PythonDocumentation' % MAJOR_VERSION + +class DocBuild(build): + def initialize_options(self): + build.initialize_options(self) + self.build_html = None + self.build_dest = None + self.download = 1 + self.doc_version = MINOR_VERSION # Only needed if download is true + + def finalize_options(self): + build.finalize_options(self) + if self.build_html is None: + self.build_html = os.path.join(self.build_base, 'html') + if self.build_dest is None: + self.build_dest = os.path.join(self.build_base, 'PythonDocumentation') + + def spawn(self, *args): + spawn(args, 1, self.verbose, self.dry_run) + + def downloadDocs(self): + workdir = os.getcwd() + # XXX Note: the next strings may change from version to version + url = 'http://www.python.org/ftp/python/doc/%s/html-%s.tar.bz2' % \ + (self.doc_version,self.doc_version) + tarfile = 'html-%s.tar.bz2' % self.doc_version + dirname = 'Python-Docs-%s' % self.doc_version + + if os.path.exists(self.build_html): + raise RuntimeError, '%s: already exists, please remove and try again' % self.build_html + os.chdir(self.build_base) + self.spawn('curl','-O', url) + self.spawn('tar', '-xjf', tarfile) + os.rename(dirname, 'html') + os.chdir(workdir) +## print "** Please unpack %s" % os.path.join(self.build_base, tarfile) +## print "** Unpack the files into %s" % self.build_html +## raise RuntimeError, "You need to unpack the docs manually" + + def buildDocsFromSource(self): + srcdir = '../../..' + docdir = os.path.join(srcdir, 'Doc') + htmldir = os.path.join(docdir, 'html') + spawn(('make','--directory', docdir, 'html'), 1, self.verbose, self.dry_run) + self.mkpath(self.build_html) + copy_tree(htmldir, self.build_html) + + def ensureHtml(self): + if not os.path.exists(self.build_html): + if self.download: + self.downloadDocs() + else: + self.buildDocsFromSource() + + def hackIndex(self): + ind_html = 'index.html' + #print 'self.build_dest =', self.build_dest + hackedIndex = file(os.path.join(self.build_dest, ind_html),'w') + origIndex = file(os.path.join(self.build_html,ind_html)) + r = re.compile('<style type="text/css">.*</style>', re.DOTALL) + hackedIndex.write(r.sub('<META NAME="AppleTitle" CONTENT="Python Documentation">',origIndex.read())) + + def hackFile(self,d,f): + origPath = os.path.join(d,f) + assert(origPath[:len(self.build_html)] == self.build_html) + outPath = os.path.join(self.build_dest, d[len(self.build_html)+1:], f) + (name, ext) = os.path.splitext(f) + if os.path.isdir(origPath): + self.mkpath(outPath) + elif ext == '.html': + if self.verbose: print 'hacking %s to %s' % (origPath,outPath) + hackedFile = file(outPath, 'w') + origFile = file(origPath,'r') + hackedFile.write(self.r.sub('<dl><dt><dd>', origFile.read())) + else: + copy_file(origPath, outPath) + + def hackHtml(self): + self.r = re.compile('<dl><dd>') + os.path.walk(self.build_html, self.visit, None) + + def visit(self, dummy, dirname, filenames): + for f in filenames: + self.hackFile(dirname, f) + + def makeHelpIndex(self): + app = '/Developer/Applications/Apple Help Indexing Tool.app' + self.spawn('open', '-a', app , self.build_dest) + print "Please wait until Apple Help Indexing Tool finishes before installing" + + def makeHelpIndex(self): + app = HelpIndexingTool.HelpIndexingTool(start=1) + app.open(Carbon.File.FSSpec(self.build_dest)) + sys.stderr.write("Waiting for Help Indexing Tool to start...") + while 1: + # This is bad design in the suite generation code! + idle = app._get(HelpIndexingTool.Help_Indexing_Tool_Suite._Prop_idleStatus()) + time.sleep(10) + if not idle: break + sys.stderr.write(".") + sys.stderr.write("\n") + sys.stderr.write("Waiting for Help Indexing Tool to finish...") + while 1: + # This is bad design in the suite generation code! + idle = app._get(HelpIndexingTool.Help_Indexing_Tool_Suite._Prop_idleStatus()) + time.sleep(10) + if idle: break + sys.stderr.write(".") + sys.stderr.write("\n") + + + def run(self): + self.ensure_finalized() + self.mkpath(self.build_base) + self.ensureHtml() + if not os.path.isdir(self.build_html): + raise RuntimeError, \ + "Can't find source folder for documentation." + self.mkpath(self.build_dest) + if dep_util.newer(os.path.join(self.build_html,'index.html'), os.path.join(self.build_dest,'index.html')): + self.mkpath(self.build_dest) + self.hackHtml() + self.hackIndex() + self.makeHelpIndex() + +class AHVDocInstall(Command): + description = "install Apple Help Viewer html files" + user_options = [('install-doc=', 'd', + 'directory to install HTML tree'), + ('root=', None, + "install everything relative to this alternate root directory"), + ] + + def initialize_options(self): + self.build_dest = None + self.install_doc = None + self.prefix = None + self.root = None + + def finalize_options(self): + self.set_undefined_options('install', + ('prefix', 'prefix'), + ('root', 'root')) +# import pdb ; pdb.set_trace() + build_cmd = self.get_finalized_command('build') + if self.build_dest == None: + build_cmd = self.get_finalized_command('build') + self.build_dest = build_cmd.build_dest + if self.install_doc == None: + self.install_doc = os.path.join(self.prefix, DESTDIR) + print 'INSTALL', self.build_dest, '->', self.install_doc + + def run(self): + self.finalize_options() + self.ensure_finalized() + print "Running Installer" + instloc = self.install_doc + if self.root: + instloc = change_root(self.root, instloc) + self.mkpath(instloc) + copy_tree(self.build_dest, instloc) + print "Installation complete" + +def mungeVersion(infile, outfile): + i = file(infile,'r') + o = file(outfile,'w') + o.write(re.sub('\$\(VERSION\)',sysconfig.get_config_var('VERSION'),i.read())) + i.close() + o.close() + +def main(): + # turn off warnings when deprecated modules are imported +## import warnings +## warnings.filterwarnings("ignore",category=DeprecationWarning) + setup(name = 'Documentation', + version = '%d.%d' % sys.version_info[:2], + cmdclass = {'install_data':AHVDocInstall, 'build':DocBuild}, + data_files = ['dummy'], + ) + +if __name__ == '__main__': + main() diff --git a/Mac/Tools/fixapplepython23.py b/Mac/Tools/fixapplepython23.py new file mode 100644 index 00000000000..ef352cedb1f --- /dev/null +++ b/Mac/Tools/fixapplepython23.py @@ -0,0 +1,119 @@ +#!/usr/bin/python +"""fixapplepython23 - Fix Apple-installed Python 2.3 (on Mac OS X 10.3) + +Python 2.3 (and 2.3.X for X<5) have the problem that building an extension +for a framework installation may accidentally pick up the framework +of a newer Python, in stead of the one that was used to build the extension. + +This script modifies the Makefile (in .../lib/python2.3/config) to use +the newer method of linking extensions with "-undefined dynamic_lookup" +which fixes this problem. + +The script will first check all prerequisites, and return a zero exit +status also when nothing needs to be fixed. +""" +import sys +import os +import gestalt + +MAKEFILE='/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/config/Makefile' +CHANGES=(( + 'LDSHARED=\t$(CC) $(LDFLAGS) -bundle -framework $(PYTHONFRAMEWORK)\n', + 'LDSHARED=\t$(CC) $(LDFLAGS) -bundle -undefined dynamic_lookup\n' + ),( + 'BLDSHARED=\t$(CC) $(LDFLAGS) -bundle -framework $(PYTHONFRAMEWORK)\n', + 'BLDSHARED=\t$(CC) $(LDFLAGS) -bundle -undefined dynamic_lookup\n' + ),( + 'CC=\t\tgcc\n', + 'CC=\t\t/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/config/PantherPythonFix/run-gcc\n' + ),( + 'CXX=\t\tc++\n', + 'CXX=\t\t/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/config/PantherPythonFix/run-g++\n' +)) + +GCC_SCRIPT='/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/config/PantherPythonFix/run-gcc' +GXX_SCRIPT='/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/config/PantherPythonFix/run-g++' +SCRIPT="""#!/bin/sh +export MACOSX_DEPLOYMENT_TARGET=10.3 +exec %s "${@}" +""" + +def findline(lines, start): + """return line starting with given string or -1""" + for i in range(len(lines)): + if lines[i][:len(start)] == start: + return i + return -1 + +def fix(makefile, do_apply): + """Fix the Makefile, if required.""" + fixed = False + lines = open(makefile).readlines() + + for old, new in CHANGES: + i = findline(lines, new) + if i >= 0: + # Already fixed + continue + i = findline(lines, old) + if i < 0: + print 'fixapplepython23: Python installation not fixed (appears broken)' + print 'fixapplepython23: missing line:', old + return 2 + lines[i] = new + fixed = True + + if fixed: + if do_apply: + print 'fixapplepython23: Fix to Apple-installed Python 2.3 applied' + os.rename(makefile, makefile + '~') + open(makefile, 'w').writelines(lines) + return 0 + else: + print 'fixapplepython23: Fix to Apple-installed Python 2.3 should be applied' + return 1 + else: + print 'fixapplepython23: No fix needed, appears to have been applied before' + return 0 + +def makescript(filename, compiler): + """Create a wrapper script for a compiler""" + dirname = os.path.split(filename)[0] + if not os.access(dirname, os.X_OK): + os.mkdir(dirname, 0755) + fp = open(filename, 'w') + fp.write(SCRIPT % compiler) + fp.close() + os.chmod(filename, 0755) + print 'fixapplepython23: Created', filename + +def main(): + # Check for -n option + if len(sys.argv) > 1 and sys.argv[1] == '-n': + do_apply = False + else: + do_apply = True + # First check OS version + if gestalt.gestalt('sysv') < 0x1030: + print 'fixapplepython23: no fix needed on MacOSX < 10.3' + sys.exit(0) + # Test that a framework Python is indeed installed + if not os.path.exists(MAKEFILE): + print 'fixapplepython23: Python framework does not appear to be installed (?), nothing fixed' + sys.exit(0) + # Check that we can actually write the file + if do_apply and not os.access(MAKEFILE, os.W_OK): + print 'fixapplepython23: No write permission, please run with "sudo"' + sys.exit(2) + # Create the shell scripts + if do_apply: + if not os.access(GCC_SCRIPT, os.X_OK): + makescript(GCC_SCRIPT, "gcc") + if not os.access(GXX_SCRIPT, os.X_OK): + makescript(GXX_SCRIPT, "g++") + # Finally fix the makefile + rv = fix(MAKEFILE, do_apply) + sys.exit(rv) + +if __name__ == '__main__': + main() diff --git a/Mac/Tools/pythonw.c b/Mac/Tools/pythonw.c new file mode 100644 index 00000000000..e70a76f846f --- /dev/null +++ b/Mac/Tools/pythonw.c @@ -0,0 +1,17 @@ +/* + * This wrapper program executes a python executable hidden inside an + * application bundle inside the Python framework. This is needed to run + * GUI code: some GUI API's don't work unless the program is inside an + * application bundle. + */ +#include <unistd.h> +#include <err.h> + +static char Python[] = PYTHONWEXECUTABLE; + +int main(int argc, char **argv) { + argv[0] = Python; + execv(Python, argv); + err(1, "execv: %s", Python); + /* NOTREACHED */ +} |