home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / MacHacksBug / Python 1.5.2c1 / Mac / scripts / ConfigurePython.py < prev    next >
Encoding:
Text File  |  2000-06-23  |  5.9 KB  |  213 lines

  1. # This python script creates Finder aliases for all the
  2. # dynamically-loaded modules that "live in" in a single
  3. # shared library.
  4. #
  5. # This is sort-of a merger between Jack's MkPluginAliases
  6. # and Guido's mkaliases.
  7. #
  8. # Jack Jansen, CWI, August 1996
  9.  
  10. import sys
  11. import os
  12. import macfs
  13. import MacOS
  14. verbose=0
  15.  
  16. SPLASH_LOCATE=512
  17. SPLASH_REMOVE=513
  18. SPLASH_CFM68K=514
  19. SPLASH_PPC=515
  20. SPLASH_NUMPY=516
  21.  
  22. ppc_goals = [
  23. ##     ("AE.ppc.slb", "toolboxmodules.ppc.slb"),
  24. ##     ("Ctl.ppc.slb", "toolboxmodules.ppc.slb"),
  25. ##     ("Dlg.ppc.slb", "toolboxmodules.ppc.slb"),
  26. ##     ("Evt.ppc.slb", "toolboxmodules.ppc.slb"),
  27. ##     ("Fm.ppc.slb", "toolboxmodules.ppc.slb"),
  28. ##     ("Help.ppc.slb", "toolboxmodules.ppc.slb"),
  29. ##     ("Icn.ppc.slb", "toolboxmodules.ppc.slb"),
  30. ##     ("Menu.ppc.slb", "toolboxmodules.ppc.slb"),
  31. ##     ("List.ppc.slb", "toolboxmodules.ppc.slb"),
  32. ##     ("Qd.ppc.slb", "toolboxmodules.ppc.slb"),
  33. ##     ("Res.ppc.slb", "toolboxmodules.ppc.slb"),
  34. ##     ("Scrap.ppc.slb", "toolboxmodules.ppc.slb"),
  35. ##     ("Snd.ppc.slb", "toolboxmodules.ppc.slb"),
  36. ##     ("Sndihooks.ppc.slb", "toolboxmodules.ppc.slb"),
  37. ##     ("TE.ppc.slb", "toolboxmodules.ppc.slb"),
  38. ##     ("Win.ppc.slb", "toolboxmodules.ppc.slb"),
  39. ## 
  40. ##     ("Cm.ppc.slb", "qtmodules.ppc.slb"),
  41. ##     ("Qt.ppc.slb", "qtmodules.ppc.slb"),
  42.  
  43. ]
  44.  
  45. cfm68k_goals = [
  46. ##     ("AE.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
  47. ##     ("Ctl.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
  48. ##     ("Dlg.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
  49. ##     ("Evt.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
  50. ##     ("Fm.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
  51. ##     ("Help.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
  52. ##     ("Icn.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
  53. ##     ("Menu.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
  54. ##     ("List.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
  55. ##     ("Qd.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
  56. ##     ("Res.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
  57. ##     ("Scrap.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
  58. ##     ("Snd.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
  59. ##     ("Sndihooks.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
  60. ##     ("TE.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
  61. ##     ("Win.CFM68K.slb", "toolboxmodules.CFM68K.slb"),
  62. ## 
  63. ##     ("Cm.CFM68K.slb", "qtmodules.CFM68K.slb"),
  64. ##     ("Qt.CFM68K.slb", "qtmodules.CFM68K.slb"),
  65. ]
  66.  
  67. def gotopluginfolder():
  68.     """Go to the plugin folder, assuming we are somewhere in the Python tree"""
  69.     import os
  70.     
  71.     while not os.path.isdir(":Mac:PlugIns"):
  72.         os.chdir("::")
  73.     os.chdir(":Mac:PlugIns")
  74.     if verbose: print "current directory is", os.getcwd()
  75.     
  76. def loadtoolboxmodules():
  77.     """Attempt to load the Res module"""
  78.     try:
  79.         import Res
  80.     except ImportError, arg:
  81.         err1 = arg
  82.         pass
  83.     else:
  84.         if verbose: print 'imported Res the standard way.'
  85.         return
  86.     
  87.     # We cannot import it. First attempt to load the cfm68k version
  88.     import imp
  89.     try:
  90.         dummy = imp.load_dynamic('Res', 'toolboxmodules.CFM68K.slb')
  91.     except ImportError, arg:
  92.         err2 = arg
  93.         pass
  94.     else:
  95.         if verbose:  print 'Loaded Res from toolboxmodules.CFM68K.slb.'
  96.         return
  97.         
  98.     # Ok, try the ppc version
  99.     try:
  100.         dummy = imp.load_dynamic('Res', 'toolboxmodules.ppc.slb')
  101.     except ImportError, arg:
  102.         err3 = arg
  103.         pass
  104.     else:
  105.         if verbose:  print 'Loaded Res from toolboxmodules.ppc.slb.'
  106.         return
  107.     
  108.     # Tough luck....
  109.     print "I cannot import the Res module, nor load it from either of"
  110.     print "toolboxmodules shared libraries. The errors encountered were:"
  111.     print "import Res:", err1
  112.     print "load from toolboxmodules.CFM68K.slb:", err2
  113.     print "load from toolboxmodules.ppc.slb:", err3
  114.     sys.exit(1)
  115.     
  116. def getextensiondirfile(fname):
  117.     import macfs
  118.     import MACFS
  119.     vrefnum, dirid = macfs.FindFolder(MACFS.kOnSystemDisk, MACFS.kExtensionFolderType, 0)
  120.     fss = macfs.FSSpec((vrefnum, dirid, fname))
  121.     return fss.as_pathname()
  122.     
  123. def mkcorealias(src, altsrc):
  124.     import string
  125.     import macostools
  126.     version = string.split(sys.version)[0]
  127.     dst = getextensiondirfile(src+ ' ' + version)
  128.     if not os.path.exists(os.path.join(sys.exec_prefix, src)):
  129.         if not os.path.exists(os.path.join(sys.exec_prefix, altsrc)):
  130.             if verbose:  print '*', src, 'not found'
  131.             return 0
  132.         src = altsrc
  133.     try:
  134.         os.unlink(dst)
  135.     except os.error:
  136.         pass
  137.     macostools.mkalias(os.path.join(sys.exec_prefix, src), dst)
  138.     if verbose:  print ' ', dst, '->', src
  139.     return 1
  140.     
  141.  
  142. def main():
  143.     MacOS.splash(SPLASH_LOCATE)
  144.     gotopluginfolder()
  145.     
  146.     loadtoolboxmodules()
  147.     
  148.     sys.path.append('::Mac:Lib')
  149.     import macostools
  150.         
  151.     # Remove old .slb aliases and collect a list of .slb files
  152.     didsplash = 0
  153.     LibFiles = []
  154.     allfiles = os.listdir(':')
  155.     if verbose:  print 'Removing old aliases...'
  156.     for f in allfiles:
  157.         if f[-4:] == '.slb':
  158.             finfo = macfs.FSSpec(f).GetFInfo()
  159.             if finfo.Flags & 0x8000:
  160.                 if not didsplash:
  161.                     MacOS.splash(SPLASH_REMOVE)
  162.                     didsplash = 1
  163.                 if verbose:  print '  Removing', f
  164.                 os.unlink(f)
  165.             else:
  166.                 LibFiles.append(f)
  167.                 if verbose:  print '  Found', f
  168.     if verbose:  print
  169.     
  170.     # Create the new PPC aliases.
  171.     didsplash = 0
  172.     if verbose:  print 'Creating PPC aliases...'
  173.     for dst, src in ppc_goals:
  174.         if src in LibFiles:
  175.             if not didsplash:
  176.                 MacOS.splash(SPLASH_PPC)
  177.                 didsplash = 1
  178.             macostools.mkalias(src, dst)
  179.             if verbose:  print ' ', dst, '->', src
  180.         else:
  181.             if verbose:  print '*', dst, 'not created:', src, 'not found'
  182.     if verbose:  print
  183.     
  184.     # Create the CFM68K aliases.
  185.     didsplash = 0
  186.     if verbose:  print 'Creating CFM68K aliases...'
  187.     for dst, src in cfm68k_goals:
  188.         if src in LibFiles:
  189.             if not didsplash:
  190.                 MacOS.splash(SPLASH_CFM68K)
  191.                 didsplash = 1
  192.             macostools.mkalias(src, dst)
  193.             if verbose:  print ' ', dst, '->', src
  194.         else:
  195.             if verbose:  print '*', dst, 'not created:', src, 'not found'
  196.     if verbose:  print
  197.             
  198.     # Create the PythonCore alias(es)
  199.     if verbose:  print 'Creating PythonCore aliases in Extensions folder...'
  200.     os.chdir('::')
  201.     n = 0
  202.     n = n + mkcorealias('PythonCore', 'PythonCore')
  203.     n = n + mkcorealias('PythonCorePPC', ':build.macppc.shared:PythonCorePPC')
  204.     n = n + mkcorealias('PythonCoreCFM68K', ':build.mac68k.shared:PythonCoreCFM68K')
  205.     
  206.     if verbose and n == 0:
  207.         sys.exit(1)
  208.             
  209. if __name__ == '__main__':
  210.     if len(sys.argv) > 1 and sys.argv[1] == '-v':
  211.         verbose = 1
  212.     main()
  213.