install.py

changeset 0
de9c2efb9d02
child 12
1d8dd9706f46
diff -r 000000000000 -r de9c2efb9d02 install.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/install.py	Mon Dec 28 16:03:33 2009 +0000
@@ -0,0 +1,801 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2002-2009 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+# This is the install script for eric4.
+
+"""
+Installation script for the eric4 IDE and all eric4 related tools.
+"""
+
+import sys
+import os
+import re
+import compileall
+import py_compile
+import glob
+import shutil
+import fnmatch
+import distutils.sysconfig
+
+# Define the globals.
+progName = None
+modDir = None
+pyModDir = None
+platBinDir = None
+distDir = None
+apisDir = None
+doCleanup = True
+doCompile = True
+cfg = {}
+progLanguages = ["Python", "Ruby"]
+
+def usage(rcode = 2):
+    """
+    Display a usage message and exit.
+
+    @param rcode the return code passed back to the calling process.
+    """
+    global progName, platBinDir, modDir, distDir, apisDir
+
+    print
+    print "Usage:"
+    print "    %s [-chxz] [-a dir] [-b dir] [-d dir] [-f file] [-i dir]" % (progName)
+    print "where:"
+    print "    -h        display this help message"
+    print "    -a dir    where the API files will be installed"
+    if apisDir:
+        print "              (default: %s)" % (apisDir)
+    else:
+        print "              (no default value)"
+    print "    -b dir    where the binaries will be installed"
+    print "              (default: %s)" % (platBinDir)
+    print "    -d dir    where eric4 python files will be installed"
+    print "              (default: %s)" % (modDir)
+    print "    -f file   configuration file naming the various installation paths"
+    if not sys.platform.startswith("win"):
+        print "    -i dir    temporary install prefix"
+        print "              (default: %s)" % (distDir)
+    print "    -x        don't perform dependency checks (use on your own risk)"
+    print "    -c        don't cleanup old installation first"
+    print "    -z        don't compile the installed python files"
+    print
+    print "The file given to the -f option must be valid Python code defining a"
+    print "dictionary called 'cfg' with the keys 'ericDir', 'ericPixDir', 'ericIconDir',"
+    print "'ericDTDDir', 'ericCSSDir', 'ericStylesDir', 'ericDocDir', 'ericExamplesDir',"
+    print "'ericTranslationsDir', 'ericTemplatesDir', 'ericCodeTemplatesDir',"
+    print "'ericOthersDir','bindir', 'mdir' and 'apidir."
+    print "These define the directories for the installation of the various parts of"\
+          " eric4."
+
+    sys.exit(rcode)
+
+
+def initGlobals():
+    """
+    Sets the values of globals that need more than a simple assignment.
+    """
+    global platBinDir, modDir, pyModDir, apisDir
+
+    if sys.platform.startswith("win"):
+        platBinDir = sys.exec_prefix
+        if platBinDir.endswith("\\"):
+            platBinDir = platBinDir[:-1]
+    else:
+        platBinDir = "/usr/local/bin"
+
+    modDir = distutils.sysconfig.get_python_lib(True)
+    pyModDir = modDir
+    
+    try:
+        from PyQt4 import pyqtconfig
+        qtDataDir = pyqtconfig._pkg_config["qt_data_dir"]
+    except (AttributeError, ImportError):
+        qtDataDir = None
+    if qtDataDir:
+        apisDir = os.path.join(qtDataDir, "qsci", "api")
+    else:
+        apisDir = None
+
+
+def copyToFile(name, text):
+    """
+    Copy a string to a file.
+
+    @param name the name of the file.
+    @param text the contents to copy to the file.
+    """
+    f = open(name,"w")
+    f.write(text)
+    f.close()
+
+
+def wrapperName(dname, wfile):
+    """
+    Create the platform specific name for the wrapper script.
+    
+    @param dname name of the directory to place the wrapper into
+    @param wfile basename (without extension) of the wrapper script
+    @return the name of the wrapper script
+    """
+    if sys.platform.startswith("win"):
+        wname = dname + "\\" + wfile + ".bat"
+    else:
+        wname = dname + "/" + wfile
+
+    return wname
+
+
+def createPyWrapper(pydir, wfile):
+    """
+    Create an executable wrapper for a Python script.
+
+    @param pydir the name of the directory where the Python script will eventually
+        be installed
+    @param wfile the basename of the wrapper
+    @return the platform specific name of the wrapper
+    """
+    # all kinds of Windows systems
+    if sys.platform.startswith("win"):
+        wname = wfile + ".bat"
+        wrapper = \
+'''@"%s\\pythonw" "%s\\%s.py" %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9
+''' % (platBinDir, pydir, wfile)
+
+    # Mac OS X
+    elif sys.platform == "darwin":
+        wname = wfile
+        wrapper = \
+'''#!/bin/sh
+
+exec "%s/bin/pythonw" "%s/%s.py" "$@"
+''' % (sys.exec_prefix, pydir, wfile)
+
+    # *nix systems
+    else:
+        wname = wfile
+        wrapper = \
+'''#!/bin/sh
+
+exec "%s" "%s/%s.py" "$@"
+''' % (sys.executable, pydir, wfile)
+
+    copyToFile(wname, wrapper)
+    os.chmod(wname, 0755)
+
+    return wname
+
+
+def copyTree(src, dst, filters, excludeDirs=[]):
+    """
+    Copy Python, translation, documentation, wizards configuration,
+    designer template files and DTDs of a directory tree.
+    
+    @param src name of the source directory
+    @param dst name of the destination directory
+    @param filters list of filter pattern determining the files to be copied
+    @param excludeDirs list of (sub)directories to exclude from copying
+    """
+    try:
+        names = os.listdir(src)
+    except OSError:
+        return      # ignore missing directories (most probably the i18n directory)
+    
+    for name in names:
+        srcname = os.path.join(src, name)
+        dstname = os.path.join(dst, name)
+        for filter in filters:
+            if fnmatch.fnmatch(srcname, filter):
+                if not os.path.isdir(dst):
+                    os.makedirs(dst)
+                shutil.copy2(srcname, dstname)
+                break
+        else:
+            if os.path.isdir(srcname) and not srcname in excludeDirs:
+                copyTree(srcname, dstname, filters)
+
+
+def createGlobalPluginsDir():
+    """
+    Create the global plugins directory, if it doesn't exist.
+    """
+    global cfg, distDir
+    
+    pdir = os.path.join(cfg['mdir'], "eric4plugins")
+    fname = os.path.join(pdir, "__init__.py")
+    if not os.path.exists(fname):
+        if not os.path.exists(pdir):
+            os.mkdir(pdir,  0755)
+        f = open(fname, "wb")
+        f.write(\
+'''# -*- coding: utf-8 -*-
+
+"""
+Package containing the global plugins.
+"""
+'''        
+        )
+        f.close()
+
+
+def cleanUp():
+    """
+    Uninstall the old eric files.
+    """
+    try:
+        from eric4config import getConfig
+    except ImportError:
+        # eric4 wasn't installed previously
+        return
+    
+    global pyModDir, progLanguages
+    
+    # Remove the wrapper scripts
+    rem_wnames = [
+        "eric4-api", "eric4-compare",
+        "eric4-configure", "eric4-diff",
+        "eric4-doc", "eric4-helpviewer",
+        "eric4-qregexp", "eric4-re", 
+        "eric4-trpreviewer", "eric4-uipreviewer",
+        "eric4-unittest", "eric4",
+        "eric4-tray", "eric4-editor", 
+        "eric4-plugininstall", "eric4-pluginuninstall", 
+        "eric4-pluginrepository", "eric4-sqlbrowser", 
+        "eric4-webbrowser", 
+    ]
+    for rem_wname in rem_wnames:
+        rwname = wrapperName(getConfig('bindir'), rem_wname)
+        if os.path.exists(rwname):
+            os.remove(rwname)
+    
+    # Cleanup our config file
+    for name in ['eric4config.py', 'eric4config.pyc']:
+        e4cfile = os.path.join(pyModDir, name)
+        if os.path.exists(e4cfile):
+            os.remove(e4cfile)
+        
+    # Cleanup the install directories
+    for name in ['ericExamplesDir', 'ericDocDir', 'ericDTDDir', 'ericCSSDir',
+                 'ericIconDir', 'ericPixDir', 'ericDir', 'ericTemplatesDir',
+                 'ericCodeTemplatesDir', 'ericOthersDir', 'ericStylesDir']:
+        if os.path.exists(getConfig(name)):
+            shutil.rmtree(getConfig(name), True)
+    
+    # Cleanup translations
+    for name in glob.glob(os.path.join(getConfig('ericTranslationsDir'), 'eric4_*.qm')):
+        if os.path.exists(name):
+            os.remove(name)
+    
+    # Cleanup API files
+    try:
+        apidir = getConfig('apidir')
+        for progLanguage in progLanguages:
+            for name in getConfig('apis'):
+                apiname = os.path.join(apidir, progLanguage, name)
+                if os.path.exists(apiname):
+                    os.remove(apiname)
+    except AttributeError:
+        pass
+
+
+def installEric():
+    """
+    Actually perform the installation steps.
+    """
+    global distDir, doCleanup, cfg, progLanguages
+    
+    # Create the platform specific wrappers.
+    wnames = []
+    wnames.append(createPyWrapper(cfg['ericDir'], "eric4-api"))
+    wnames.append(createPyWrapper(cfg['ericDir'], "eric4-compare"))
+    wnames.append(createPyWrapper(cfg['ericDir'], "eric4-configure"))
+    wnames.append(createPyWrapper(cfg['ericDir'], "eric4-diff"))
+    wnames.append(createPyWrapper(cfg['ericDir'], "eric4-doc"))
+    wnames.append(createPyWrapper(cfg['ericDir'], "eric4-webbrowser"))
+    wnames.append(createPyWrapper(cfg['ericDir'], "eric4-qregexp"))
+    wnames.append(createPyWrapper(cfg['ericDir'], "eric4-re"))
+    wnames.append(createPyWrapper(cfg['ericDir'], "eric4-trpreviewer"))
+    wnames.append(createPyWrapper(cfg['ericDir'], "eric4-uipreviewer"))
+    wnames.append(createPyWrapper(cfg['ericDir'], "eric4-unittest"))
+    wnames.append(createPyWrapper(cfg['ericDir'], "eric4-tray"))
+    wnames.append(createPyWrapper(cfg['ericDir'], "eric4-editor"))
+    wnames.append(createPyWrapper(cfg['ericDir'], "eric4-plugininstall"))
+    wnames.append(createPyWrapper(cfg['ericDir'], "eric4-pluginuninstall"))
+    wnames.append(createPyWrapper(cfg['ericDir'], "eric4-pluginrepository"))
+    wnames.append(createPyWrapper(cfg['ericDir'], "eric4-sqlbrowser"))
+    wnames.append(createPyWrapper(cfg['ericDir'], "eric4"))
+    
+    # set install prefix, if not None
+    if distDir:
+        for key in cfg.keys():
+            cfg[key] = os.path.normpath(distDir + os.sep + cfg[key])
+    
+    try:
+        # Install the files
+        # make the install directories
+        for key in cfg.keys():
+            if not os.path.isdir(cfg[key]):
+                os.makedirs(cfg[key])
+        
+        # copy the eric4 config file
+        if distDir:
+            shutil.copy('eric4config.py', cfg['mdir'])
+            if os.path.exists('eric4config.pyc'):
+                shutil.copy('eric4config.pyc', cfg['mdir'])
+        else:
+            shutil.copy('eric4config.py', modDir)
+            if os.path.exists('eric4config.pyc'):
+                shutil.copy('eric4config.pyc', modDir)
+        
+        # copy the eric4.pth file
+        if distDir:
+            shutil.copy('eric%seric4.pth' % os.sep, cfg['mdir'])
+        else:
+            shutil.copy('eric%seric4.pth' % os.sep, modDir)
+        
+        # copy the various parts of eric4
+        copyTree('eric', cfg['ericDir'], ['*.py', '*.pyc', '*.pyo', '*.pyw'], 
+            ['eric%sExamples' % os.sep])
+        copyTree('eric', cfg['ericDir'], ['*.rb'], 
+            ['eric%sExamples' % os.sep])
+        copyTree('eric%sPlugins' % os.sep, '%s%sPlugins' % (cfg['ericDir'], os.sep), 
+            ['*.png'])
+        copyTree('eric%sDocumentation' % os.sep, cfg['ericDocDir'], ['*.html', '*.qch'])
+        copyTree('eric%sDTDs' % os.sep, cfg['ericDTDDir'], ['*.dtd'])
+        copyTree('eric%sCSSs' % os.sep, cfg['ericCSSDir'], ['*.css'])
+        copyTree('eric%sStyles' % os.sep, cfg['ericStylesDir'], ['*.qss'])
+        copyTree('eric%si18n' % os.sep, cfg['ericTranslationsDir'], ['*.qm'])
+        copyTree('eric%sicons' % os.sep, cfg['ericIconDir'], ['*.png', 'LICENSE*.*'])
+        copyTree('eric%spixmaps' % os.sep, cfg['ericPixDir'], ['*.png', '*.xpm', '*.ico'])
+        copyTree('eric%sDesignerTemplates' % os.sep, cfg['ericTemplatesDir'], ['*.tmpl'])
+        copyTree('eric%sCodeTemplates' % os.sep, cfg['ericCodeTemplatesDir'], ['*.tmpl'])
+        copyTree('eric%sExamples' % os.sep, cfg['ericExamplesDir'], 
+                 ['*.py', '*.pyc', '*.pyo'])
+        
+        # copy the wrappers
+        for wname in wnames:
+            shutil.copy(wname, cfg['bindir'])
+        
+        # copy the license file
+        shutil.copy('eric%sLICENSE.GPL3' % os.sep, cfg['ericDir'])
+        
+        # create the global plugins directory
+        createGlobalPluginsDir()
+        
+    except IOError, msg:
+        sys.stderr.write('IOError: %s\nTry install as root.\n' % msg)
+        sys.exit(7)
+    
+    # copy some text files to the doc area
+    for name in ["LICENSE.GPL3", "THANKS", "changelog"]:
+        try:
+            shutil.copy('eric%s%s' % (os.sep, name), cfg['ericDocDir'])
+        except EnvironmentError:
+            print "Could not install 'eric%s%s'." % (os.sep, name)
+    for name in glob.glob(os.path.join('eric', 'README*.*')):
+        try:
+            shutil.copy(name, cfg['ericDocDir'])
+        except EnvironmentError:
+            print "Could not install 'eric%s%s'." % (os.sep, name)
+   
+    # copy some more stuff
+    for name in ['default.e4k']:
+        try:
+            shutil.copy('eric%s%s' % (os.sep, name), cfg['ericOthersDir'])
+        except EnvironmentError:
+            print "Could not install 'eric%s%s'." % (os.sep, name)
+    
+    # install the API file
+    for progLanguage in progLanguages:
+        apidir = os.path.join(cfg['apidir'], progLanguage.lower())
+        if not os.path.exists(apidir):
+            os.makedirs(apidir)
+        for apiName in glob.glob(os.path.join("eric", "APIs", progLanguage, "*.api")):
+            try:
+                shutil.copy(apiName, apidir)
+            except EnvironmentError:
+                print "Could not install '%s'." % apiName
+
+
+def createInstallConfig():
+    """
+    Create the installation config dictionary.
+    """
+    global modDir, platBinDir, cfg, apisDir
+        
+    ericdir = os.path.join(modDir, "eric4")
+    cfg = {
+        'ericDir'              : ericdir,
+        'ericPixDir'           : os.path.join(ericdir, "pixmaps"),
+        'ericIconDir'          : os.path.join(ericdir, "icons"),
+        'ericDTDDir'           : os.path.join(ericdir, "DTDs"),
+        'ericCSSDir'           : os.path.join(ericdir, "CSSs"),
+        'ericStylesDir'        : os.path.join(ericdir, "Styles"),
+        'ericDocDir'           : os.path.join(ericdir, "Documentation"),
+        'ericExamplesDir'      : os.path.join(ericdir, "Examples"),
+        'ericTranslationsDir'  : os.path.join(ericdir, "i18n"),
+        'ericTemplatesDir'     : os.path.join(ericdir, "DesignerTemplates"),
+        'ericCodeTemplatesDir' : os.path.join(ericdir, 'CodeTemplates'),
+        'ericOthersDir'        : ericdir,
+        'bindir'               : platBinDir,
+        'mdir'                 : modDir,
+    }
+    if apisDir:
+        cfg['apidir'] = apisDir
+    else:
+        cfg['apidir'] = os.path.join(ericdir, "api")
+configLength = 15
+    
+def createConfig():
+    """
+    Create a config file with the respective config entries.
+    """
+    global cfg
+    
+    apis = []
+    for progLanguage in progLanguages:
+        for apiName in glob.glob(os.path.join("eric", "APIs", progLanguage, "*.api")):
+            apis.append(os.path.basename(apiName))
+    
+    fn = 'eric4config.py'
+    config = \
+"""# -*- coding: utf-8 -*-
+#
+# This module contains the configuration of the individual eric4 installation
+#
+
+_pkg_config = {
+    'ericDir'              : r'%s',
+    'ericPixDir'           : r'%s',
+    'ericIconDir'          : r'%s',
+    'ericDTDDir'           : r'%s',
+    'ericCSSDir'           : r'%s',
+    'ericStylesDir'        : r'%s',
+    'ericDocDir'           : r'%s',
+    'ericExamplesDir'      : r'%s',
+    'ericTranslationsDir'  : r'%s',
+    'ericTemplatesDir'     : r'%s',
+    'ericCodeTemplatesDir' : r'%s',
+    'ericOthersDir'        : r'%s',
+    'bindir'               : r'%s',
+    'mdir'                 : r'%s',
+    'apidir'               : r'%s',
+    'apis'                 : %s,
+}
+
+def getConfig(name):
+    '''
+    Module function to get a configuration value.
+
+    @param name the name of the configuration value (string).
+    '''
+    try:
+        return _pkg_config[name]
+    except KeyError:
+        pass
+
+    raise AttributeError, '"%%s" is not a valid configuration value' %% name
+""" % (cfg['ericDir'], cfg['ericPixDir'], cfg['ericIconDir'], 
+       cfg['ericDTDDir'], cfg['ericCSSDir'], 
+       cfg['ericStylesDir'], cfg['ericDocDir'],
+       cfg['ericExamplesDir'], cfg['ericTranslationsDir'],
+       cfg['ericTemplatesDir'],
+       cfg['ericCodeTemplatesDir'], cfg['ericOthersDir'],
+       cfg['bindir'], cfg['mdir'], 
+       cfg['apidir'], apis)
+    copyToFile(fn, config)
+
+def doDependancyChecks():    
+    """
+    Perform some dependency checks.
+    """
+    print 'Checking dependencies'
+    
+    # perform dependency checks
+    if sys.version_info < (2, 6, 0):
+        print 'Sorry, you must have Python 2.6.0 or higher.'
+        sys.exit(5)
+    if sys.version_info > (2, 9, 9):
+        print 'Sorry, eric4 requires Python 2 for running.'
+        sys.exit(5)
+    print "Python Version: %d.%d.%d" % sys.version_info[:3]
+    
+    try:
+        from PyQt4.QtCore import qVersion, PYQT_VERSION
+    except ImportError, msg:
+        print 'Sorry, please install PyQt4.'
+        print 'Error: %s' % msg
+        sys.exit(1)
+    print "Found PyQt"
+    
+    try:
+        from PyQt4 import Qsci
+    except ImportError, msg:
+        print "Sorry, please install QScintilla2 and"
+        print "it's PyQt4 wrapper."
+        print 'Error: %s' % msg
+        sys.exit(1)
+    print "Found QScintilla2"
+    
+    # check version of Qt
+    qtMajor = int(qVersion().split('.')[0])
+    qtMinor = int(qVersion().split('.')[1])
+    if qtMajor < 4 or (qtMajor == 4 and qtMinor < 5):
+        print 'Sorry, you must have Qt version 4.5.0 or higher.'
+        sys.exit(2)
+    print "Qt Version: %s" % qVersion()
+    
+    #check version of PyQt
+    from PyQt4.QtCore import PYQT_VERSION_STR
+    pyqtVersion = PYQT_VERSION_STR
+    # always assume, that snapshots are new enough
+    if pyqtVersion.find("snapshot-") == -1:
+        while pyqtVersion.count('.') < 2:
+            pyqtVersion += '.0'
+        (maj, min, pat) = pyqtVersion.split('.')
+        maj = int(maj)
+        min = int(min)
+        pat = int(pat)
+        if maj < 4 or (maj == 4 and min < 7):
+            print 'Sorry, you must have PyQt 4.7.0 or higher or' \
+                  ' a recent snapshot release.'
+            sys.exit(3)
+    print "PyQt Version: ", pyqtVersion
+    
+    #check version of QScintilla
+    from PyQt4.Qsci import QSCINTILLA_VERSION_STR
+    scintillaVersion = QSCINTILLA_VERSION_STR
+    # always assume, that snapshots are new enough
+    if scintillaVersion.find("snapshot-") == -1:
+        while scintillaVersion.count('.') < 2:
+            scintillaVersion += '.0'
+        (maj, min, pat) = scintillaVersion.split('.')
+        maj = int(maj)
+        min = int(min)
+        pat = int(pat)
+        if maj < 2 or (maj == 2 and min < 4):
+            print 'Sorry, you must have QScintilla 2.4.0 or higher or' \
+                  ' a recent snapshot release.'
+            sys.exit(4)
+    print "QScintilla Version: ", QSCINTILLA_VERSION_STR
+    print "All dependencies ok."
+    print
+
+def compileUiFiles():
+    """
+    Compile the .ui files to Python sources.
+    """
+    try:
+        from PyQt4.uic import compileUiDir
+    except ImportError:
+        from PyQt4.uic import compileUi
+        
+        def compileUiDir(dir, recurse = False, map = None, **compileUi_args):
+            """
+            Creates Python modules from Qt Designer .ui files in a directory or
+            directory tree.
+            
+            Note: This function is a modified version of the one found in PyQt4.
+
+            @param dir Name of the directory to scan for files whose name ends with
+                '.ui'. By default the generated Python module is created in the same
+                directory ending with '.py'.
+            @param recurse flag indicating that any sub-directories should be scanned.
+            @param map an optional callable that is passed the name of the directory
+                containing the '.ui' file and the name of the Python module that will be
+                created. The callable should return a tuple of the name of the directory
+                in which the Python module will be created and the (possibly modified)
+                name of the module.
+            @param compileUi_args any additional keyword arguments that are passed to
+                the compileUi() function that is called to create each Python module.
+            """
+            def compile_ui(ui_dir, ui_file):
+                """
+                Local function to compile a single .ui file.
+                
+                @param ui_dir directory containing the .ui file (string)
+                @param ui_file file name of the .ui file (string)
+                """
+                # Ignore if it doesn't seem to be a .ui file.
+                if ui_file.endswith('.ui'):
+                    py_dir = ui_dir
+                    py_file = ui_file[:-3] + '.py'
+
+                    # Allow the caller to change the name of the .py file or generate
+                    # it in a different directory.
+                    if map is not None:
+                        py_dir, py_file = map(py_dir, py_file)
+
+                    # Make sure the destination directory exists.
+                    try:
+                        os.makedirs(py_dir)
+                    except:
+                        pass
+
+                    ui_path = os.path.join(ui_dir, ui_file)
+                    py_path = os.path.join(py_dir, py_file)
+
+                    ui_file = open(ui_path, 'r')
+                    py_file = open(py_path, 'w')
+
+                    try:
+                        compileUi(ui_file, py_file, **compileUi_args)
+                    finally:
+                        ui_file.close()
+                        py_file.close()
+
+            if recurse:
+                for root, _, files in os.walk(dir):
+                    for ui in files:
+                        compile_ui(root, ui)
+            else:
+                for ui in os.listdir(dir):
+                    if os.path.isfile(os.path.join(dir, ui)):
+                        compile_ui(dir, ui)
+    
+    def pyName(py_dir, py_file):
+        """
+        Local function to create the Python source file name for the compiled .ui file.
+        
+        @param py_dir suggested name of the directory (string)
+        @param py_file suggested name for the compile source file (string)
+        @return tuple of directory name (string) and source file name (string)
+        """
+        return py_dir, "Ui_%s" % py_file
+    
+    compileUiDir("eric", True, pyName)
+
+def main(argv):
+    """
+    The main function of the script.
+
+    @param argv the list of command line arguments.
+    """
+    import getopt
+
+    # Parse the command line.
+    global progName, modDir, doCleanup, doCompile, distDir, cfg, apisDir
+    progName = os.path.basename(argv[0])
+
+    initGlobals()
+
+    try:
+        if sys.platform.startswith("win"):
+            optlist, args = getopt.getopt(argv[1:],"chxza:b:d:f:")
+        else:
+            optlist, args = getopt.getopt(argv[1:],"chxza:b:d:f:i:")
+    except getopt.GetoptError:
+        usage()
+
+    global platBinDir
+    
+    depChecks = True
+
+    for opt, arg in optlist:
+        if opt == "-h":
+            usage(0)
+        elif opt == "-a":
+            apisDir = arg
+        elif opt == "-b":
+            platBinDir = arg
+        elif opt == "-d":
+            modDir = arg
+        elif opt == "-i":
+            distDir = os.path.normpath(arg)
+        elif opt == "-x":
+            depChecks = False
+        elif opt == "-c":
+            doCleanup = False
+        elif opt == "-z":
+            doCompile = False
+        elif opt == "-f":
+            try:
+                execfile(arg, globals())
+                if len(cfg) != configLength:
+                    print "The configuration dictionary in '%s' is incorrect. Aborting"\
+                        % arg
+                    sys.exit(6)
+            except:
+                cfg = {}
+    
+    if len(cfg) == 0:
+        createInstallConfig()
+    
+    if depChecks:
+        doDependancyChecks()
+    
+    # get rid of development config file, if it exists
+    try:
+        os.remove(os.path.join("eric", "eric4config.py"))
+    except EnvironmentError:
+        pass
+    
+    # cleanup old installation
+    try:
+        if doCleanup:
+            if distDir:
+                shutil.rmtree(distDir, True)
+            else:
+                cleanUp()
+    except IOError, msg:
+        sys.stderr.write('IOError: %s\nTry install as root.\n' % msg)
+
+    # Create a config file and delete the default one
+    createConfig()
+
+    # Compile .ui files
+    print "Compiling user interface files..."
+    compileUiFiles()
+    
+    if doCompile:
+        print "\nCompiling source files..."
+        if distDir:
+            compileall.compile_dir("eric", 
+                                   ddir = os.path.join(distDir, modDir, cfg['ericDir']), 
+                                   rx = re.compile("Python3"), 
+                                   quiet = True)
+            py_compile.compile("eric4config.py", 
+                               dfile = os.path.join(distDir, modDir, "eric4config.py"))
+        else:
+            compileall.compile_dir("eric", 
+                                   ddir = os.path.join(modDir, cfg['ericDir']), 
+                                   rx = re.compile("Python3"), 
+                                   quiet = True)
+            py_compile.compile("eric4config.py", 
+                               dfile = os.path.join(modDir, "eric4config.py"))
+    print "\nInstalling eric4 ..."
+    installEric()
+    print "\nInstallation complete."
+    print
+    
+    # check PyXML version and output a message for broken PyXML (< 0.8.6)
+    try:
+        import _xmlplus
+        v = _xmlplus.version_info
+        if v < (0, 8, 6):
+            from eric4.patch_pyxml import isPatched, patchPyXML
+            if not isPatched():
+                print "NOTE:"
+                print "    Found PyXML %d.%d.%d, which needs a patch to work correctly" % \
+                    (v[0], v[1], v[2])
+                print "    with foreign characters. Please see 'README-PyXML.txt' for"
+                print "    details."
+                res = raw_input("    Shall pyXML be patched now (y/n)? ")
+                if res in ["Y", "y"]:
+                    patchPyXML()
+    except ImportError:
+        pass
+    
+    #check version of PyQt
+    from PyQt4.QtCore import PYQT_VERSION_STR
+    pyqtVersion = PYQT_VERSION_STR
+    # always assume, that snapshots are new enough
+    if pyqtVersion.find("snapshot-") == -1:
+        while pyqtVersion.count('.') < 2:
+            pyqtVersion += '.0'
+        (maj, min, pat) = pyqtVersion.split('.')
+        maj = int(maj)
+        min = int(min)
+        pat = int(pat)
+        if min < 5:
+            print
+            print "You have to patch PyQt QNetworkAccessManager."
+            print "See the patches directory for details."
+    
+    print
+    if sys.platform.startswith("win"):
+        raw_input("Press enter to continue...")
+    
+    
+if __name__ == "__main__":
+    try:
+        main(sys.argv)
+    except SystemExit:
+        raise
+    except:
+        print \
+"""An internal error occured.  Please report all the output of the program,
+including the following traceback, to eric5-bugs@eric-ide.python-projects.org.
+"""
+        raise

eric ide

mercurial