]> SALOME platform Git repositories - tools/install.git/commitdiff
Salome HOME
Improve runInstall script and Install Wizard:
authorvsr <vsr@opencascade.com>
Tue, 10 Jan 2006 14:40:51 +0000 (14:40 +0000)
committervsr <vsr@opencascade.com>
Tue, 10 Jan 2006 14:40:51 +0000 (14:40 +0000)
- command line parser
- XML files parser
- fix bugs
- avoid compilation warnings
- versioning
- default target folder includes version number

bin/SALOME_InstallWizard
bin/extract_params.py [deleted file]
config.xml
config_Mandrake_10.1.xml
config_RedHat_8.0.xml
config_RedHat_9.xml
config_Scientific_3.0.5.xml
runInstall
src/SALOME_InstallWizard.cxx
src/main.cxx

index 08dae42cbd455057a4fba23fafebe666bd4e7a42..dba449bf19f9266ff0fa1d25cbb1ed2fde09a840 100755 (executable)
Binary files a/bin/SALOME_InstallWizard and b/bin/SALOME_InstallWizard differ
diff --git a/bin/extract_params.py b/bin/extract_params.py
deleted file mode 100644 (file)
index cc988dd..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-#==============================================================
-#
-#==============================================================
-def get_help_info() :
-    return "\tUsage : \n\tpython install.py [-gui|tui] [-f <xmlfile>] [-t taget_dir] [-tmp tmp_dir]\n"
-
-#==============================================================
-#
-#==============================================================
-def error_exit (str = ""):
-    import sys
-    if len(str): res = "\n" + str + "\n"
-    else : res = ""
-    print res + \
-          get_help_info() + \
-          "\nWrong parameters\n\n";
-    sys.exit(1);
-
-
-#==============================================================
-# Cheks whether the passed parameter is a key.
-#==============================================================
-def is_key ( val ):
-    import re
-    if val is not None : 
-       return re.match(r'^-[a-zA-Z]', val)
-    return 0
-
-#==============================================================
-#
-#==============================================================
-def extract_parameter ( key, args ) : 
-    import sys
-    length = len(args);
-    if ( length == 0 ) :  return None
-   
-    found = 0;
-
-    for i in range(0, length-1):
-        if  args[i] == key : 
-            if ( is_key ( args[i+1]) ) :
-               print " No value after key ", key
-                sys.exit(1);
-           
-           value = args[i+1]
-            if ( i < length - 2  and is_key ( args[i+2] ) == 0 ) : #control that only one value follows key 
-                                                              #(not a list). In this case params are correct.
-               print "Too much values after key ", key
-                sys.exit(1);
-           
-           found = 1; break;
-    
-    if (found) : 
-       return  value 
-    
-    return None
-
-
-#===============================================================
-# extracts list of values following specified 'key' from 'args[]'
-#===============================================================
-def extract_list (key, args) : 
-
-    lenght = len(args)
-    if ( args is None or lenght == 0 ):
-       error_exit()
-
-    list=[]
-    found = 0
-
-    for i in  range(0, length) :
-        if args[i] == key  : 
-            if (is_key ( args[i+1]))  : 
-                error_exit();
-           
-            for i in range (i+1, lenght):
-                if is_key(args[i]) : break
-                list.append(args[i])
-            found =1; break
-     
-    return list; #empty list is returned if no values after key
-
-
-#==============================================================
-# Method find the $key in the list and return 1 if success
-# and 0 otherwise. 
-#==============================================================
-def find_key (key, argv) :
-
-    if (not is_key(key)) : return 0
-
-    for simbol in  argv :
-        if simbol == key:
-            return 1 
-    return 0
-
-#==============================================================
-#
-#==============================================================
-def parse_parameters (args) :
-
-    if find_key('-h', args) :
-        print get_help_info();
-        import sys
-        sys.exit(0)
-        
-    xmlfile = extract_parameter("-f", args)
-    target_dir =  extract_parameter("-t", args)
-    tmp_dir = extract_parameter("-tmp", args)
-    if find_key('-tui', args):
-        is_gui = 0
-    else : is_gui = 1
-    return [xmlfile, target_dir,  tmp_dir, is_gui]
index aee06ceedf4a49cdc5019a9f6d22d82825057473..ae3ae21b22d5ce0133bea30e4f46f805fae0e094 100644 (file)
@@ -4,7 +4,7 @@
           copyright="&lt;h5>Copyright (C) 2003-2005 OPEN CASCADE,&lt;br>EADS/CCR, LIP6, CEA/DEN, CEDRAT, EDF R&amp;D,&lt;br>LEG, PRINCIPIA R&amp;D, BUREAU VERITAS&lt;/h5>"
           license="&lt;h5>GNU LGPL&lt;/h5>"
          os="Mandrake10.1"/>
-  <path targetdir="${HOME}/salome"
+  <path targetdir="${HOME}/salome_3.1.0"
         tempdir="/tmp"/>
   <product name="gcc" 
            version="3.4.1" 
index 9b401d507236d5cfddd936db89c791751ec5e648..cf5915b9f1b43e3a8ed9a465a0dc82b5f1add9b0 100755 (executable)
@@ -4,7 +4,7 @@
           copyright="&lt;h5>Copyright (C) 2003-2005 OPEN CASCADE,&lt;br>EADS/CCR, LIP6, CEA/DEN, CEDRAT, EDF R&amp;D,&lt;br>LEG, PRINCIPIA R&amp;D, BUREAU VERITAS&lt;/h5>"
           license="&lt;h5>GNU LGPL&lt;/h5>"
          os="Mandrake10.1"/>
-  <path targetdir="${HOME}/salome"
+  <path targetdir="${HOME}/salome_3.1.0"
         tempdir="/tmp"/>
   <product name="gcc" 
            version="3.4.1" 
index 7fe26ef9f340da0c4f35599b367e6cc950fcb86f..bf6194244e0963488d6f1662db7748f86dad220c 100755 (executable)
@@ -4,7 +4,7 @@
           copyright="&lt;h5>Copyright (C) 2003-2005 OPEN CASCADE,&lt;br>EADS/CCR, LIP6, CEA/DEN, CEDRAT, EDF R&amp;D,&lt;br>LEG, PRINCIPIA R&amp;D, BUREAU VERITAS&lt;/h5>"
           license="&lt;h5>GNU LGPL&lt;/h5>"
          os="RedHat8.0"/>
-  <path targetdir="${HOME}/salome"
+  <path targetdir="${HOME}/salome_3.1.0"
         tempdir="/tmp"/>
   <product name="gcc" 
            version="3.2" 
index 21381ed5aa5894ff04dac4908c3345568b3cb71c..d5fda68234ea493741a8710d60d197675dfca47d 100755 (executable)
@@ -4,7 +4,7 @@
           copyright="&lt;h5>Copyright (C) 2003-2005 OPEN CASCADE,&lt;br>EADS/CCR, LIP6, CEA/DEN, CEDRAT, EDF R&amp;D,&lt;br>LEG, PRINCIPIA R&amp;D, BUREAU VERITAS&lt;/h5>"
           license="&lt;h5>GNU LGPL&lt;/h5>"
          os="RedHat9"/>
-  <path targetdir="${HOME}/salome"
+  <path targetdir="${HOME}/salome_3.1.0"
         tempdir="/tmp"/>
   <product name="gcc" 
            version="3.2" 
index 878f77618d75ff589b84eba85418b16852f0d4d2..389d15c8567cdb4e0e9cdf060ec9edc3a8e39f10 100755 (executable)
@@ -4,7 +4,7 @@
           copyright="&lt;h5>Copyright (C) 2003-2005 OPEN CASCADE,&lt;br>EADS/CCR, LIP6, CEA/DEN, CEDRAT, EDF R&amp;D,&lt;br>LEG, PRINCIPIA R&amp;D, BUREAU VERITAS&lt;/h5>"
           license="&lt;h5>GNU LGPL&lt;/h5>"
          os="RedHat8.0"/>
-  <path targetdir="${HOME}/salome"
+  <path targetdir="${HOME}/salome_3.1.0"
         tempdir="/tmp"/>
   <product name="gcc" 
            version="3.2" 
index d5cf9148407153c8befed7a075e9c8ffe17b5b29..4a4796f8ec9d49e96befea1d3991293ccbfef473 100755 (executable)
@@ -5,353 +5,66 @@ warnings.filterwarnings("ignore", "", DeprecationWarning)
 
 import xmllib
 import sys, os, string, re
+from optparse import OptionParser
 
-#==============================================================
-# get_help_info
-#==============================================================
-def get_help_info() :
-    str = "\nSALOME Installation Wizard\n\n"
-    str = str + "\tUsage : \n\tInstall [-g|b] [-f <xml-file>] [-t <target-dir>] [-tmp <tmp-dir>]\n"
-    str = str + "\n"
-    str = str + " -g              Runs the Installation Wizard in the GUI mode.\n"
-    str = str + "                 In this case only <xmlfile> is taken into account \n"
-    str = str + "                 from the parameters list. This key is used by default.\n"
-    str = str + "\n"
-    str = str + " -b              Runs the Installation Wizard in the batch mode.\n"
-    str = str + "                 All the found parameters are taken in to account.\n"
-    str = str + "\n"
-    str = str + " -f <xml-file>   The configuration file to be parsed by the Installation Wizard.\n" 
-    str = str + "                 If this parameter is missed then the script tries to define\n"
-    str = str + "                 the Red Hat version and use the corresponding xml. For example,\n"
-    str = str + "                 for Red Hat 8.0 config_RedHat_8.0.xml file is supposed to be used\n"
-    str = str + "                 by default. If the appropriate xml file is not found, the config.xml\n"
-    str = str + "                 is used by default.\n"
-    str = str + "\n"
-    str = str + " -t <target-dir> The target directory the products to be installed to.\n"
-    str = str + "                 This parameter overloads the target directory described in the\n"
-    str = str + "                 configuration file.\n"
-    str = str + "\n"
-    str = str + " -tmp <tmp-dir>  The directory which should be used for the temporary files.\n"
-    str = str + "                 This parameter overloads the temporary directory described in the\n"
-    str = str + "                 configuration file.\n"
-    str = str + "\n"
-    str = str + " -h              Prints this help information.\n" 
-    return str
-
-#==============================================================
-# message finction
-#==============================================================
-def message(msg):
-    print ">>>", msg
-    
-#==============================================================
-# error_exit
-#==============================================================
-def error_exit (str = ""):
-    import sys
-    if len(str): res = "\n" + str + "\n"
-    else : res = ""
-    print res + \
-          get_help_info() 
-    sys.exit(1);
-
-
-#==============================================================
-# Cheks whether the passed parameter is a key.
-#==============================================================
-def is_key ( val ):
-    import re
-    if val is not None : 
-       return re.match(r'^-[a-zA-Z]', val)
-    return 0
-
-#==============================================================
-# From the list of parameters extracts value following 'key' 
-#==============================================================
-def extract_parameter ( key, args ) :
-    import sys
-    length = len(args);
-    if ( length == 0 ) :  return None
-   
-    found = 0;
-
-    for i in range(0, length-1):
-        if  args[i] == key : 
-            if ( is_key ( args[i+1]) ) :
-               print " No value after key ", key
-                sys.exit(1);
-           
-           value = args[i+1]
-            if ( i < length - 2  and is_key ( args[i+2] ) == 0 ) : #control that only one value follows key 
-                                                              #(not a list). In this case params are correct.
-               print "Too much values after key ", key
-                sys.exit(1);
-           
-           found = 1; break;
-    
-    if (found) : 
-       return  value 
-    
-    return None
-
-
-#===============================================================
-# Extracts list of values following specified 'key' from 'args[]'
-#===============================================================
-def extract_list (key, args) : 
-
-    lenght = len(args)
-    if ( args is None or lenght == 0 ):
-       error_exit()
-
-    list=[]
-    found = 0
-
-    for i in  range(0, length) :
-        if args[i] == key  : 
-            if (is_key ( args[i+1]))  : 
-                error_exit();
-           
-            for i in range (i+1, lenght):
-                if is_key(args[i]) : break
-                list.append(args[i])
-            found =1; break
-     
-    return list; #empty list is returned if no values after key
-
+opt_parser = None
+root_path  = None
 
-#==============================================================
-# Method find the $key in the list and return 1 if success
-# and 0 otherwise. 
-#==============================================================
-def find_key (key, argv) :
-
-    if (not is_key(key)) : return 0
-
-    for simbol in  argv :
-        if simbol == key:
-            return 1 
-    return 0
-
-#==============================================================
-# Parse the list of parameters
-#==============================================================
-def parse_parameters (args) :
-
-    if find_key('-h', args) :
-        print get_help_info();
-        import sys
-        sys.exit(0)
-        
-    xmlfile = extract_parameter("-f", args)
-    target_dir =  extract_parameter("-t", args)
-    tmp_dir = extract_parameter("-tmp", args)
-    if find_key('-b', args):
-        is_gui = 0
-    else : is_gui = 1
-    return [xmlfile, target_dir,  tmp_dir, is_gui]
-
-
-#=================================================================
-# Checks boolean value: yes/no, true/false, 1/0
-#=================================================================
-def check_bool(val):
-    return str(val).strip() in ["yes","true", "1"]
-
-#=================================================================
-# The first algorithm to create the dependencies list by their level
-#=================================================================
-def get_next_level(list, products):
-    
-    import re
-    result = []
-    expr = "(" + list[0].name
-    for i in range(1, len(list)):
-        expr = expr + "|"+ list[i].name
-    
-    expr = expr + ")$"
-    #expr=re.compile(expr)
-
-    for product in products:
-        deps = re.sub(r'\s+', "", product.dependencies)
-        if re.search(expr,  deps):
-            result.append(product)
-
-    return result
-
-
-def create_levels(prods):
-    import copy
-    
-    products = copy.deepcopy(prods)
-    
-    result = {}
-    import re
-    #1. find the products with empty lists of dependencies
-    list = []
-    for product in products:
-        if len(re.sub(r'\s', "", product.dependencies)) == 0 :
-            list.append(product)
-
-    if len(list) == 0 :
-        raise RuntimeError, "Products that depend on nothing are not found"
-
-    # remove the first level products from the common list of products
-    for product in list :
-        products.remove(product)
-
-    ind = 0; 
-    result[0] = list
-
-    while (len(products)) :
-        res = get_next_level(list, products)
-        if len(res) == 0 :
-            raise RuntimeError, "Empty list of products is found"
-
-        for product in res :
-            products.remove(product)
-
-        ind = ind +1
-        result[ind] =  res
-        list = res
-            
-    str = ""
-    for i in result.keys():
-        for product in  result[i]:
-            str = str + product.name + " "
-
-    return str;
-            
-#=================================================================
-# The second algorithm
-#=================================================================
-def get_dependencies_set(prods) :
-    import copy
-    import re
-
-    products = copy.deepcopy(prods)
-    deps = ""
-    list = []
-
-    while (len(products)) :
-
-        tmplist = []
-        #find the products with empty list of dependencies
-        for product in products:
-            product.dependencies = re.sub(r'\s+$', "", product.dependencies)
-            product.dependencies = re.sub(r'^\s+', "", product.dependencies)
-           
-            if len(product.dependencies) == 0 :
-               tmplist.append(product); 
-               deps = deps + " " + product.name
-
-        list.append(tmplist)
-
-        #remove the products names from other products dependencies
-        for item in tmplist:
-            products.remove(item)
-
-            regexpr1 = "((^|,(\s+)?)"+item.name+"$|^"+item.name+"(\s+)?,(\s+)?)"
-            regexpr2 = ",(\s+)?"+item.name+"(\s+)?,(\s+)?"
-
-            for product in products:
-                product.dependencies = re.sub(r'\s+$', "", product.dependencies)
-                product.dependencies = re.sub(r'^\s+', "", product.dependencies)
-
-                product.dependencies = re.sub(regexpr1, "", product.dependencies)
-                product.dependencies = re.sub(regexpr2, ",", product.dependencies)
-
-    return deps 
-    
-#=================================================================
-# The third algorithm (same as SALOME_InstallWizard.cxx uses)
-#=================================================================
-def get_dependencies(prods) :
-    list = []
-    for product in prods:
-        if check_bool(product.disable): continue
-        
-        deps = product.dependencies.split(",")
-        for dep in deps:
-            if dep and not dep in list:
-                list.append( dep )
-                
-        if product and not product in list:
-            list.append( product.name )
-            
-    return " ".join( list )
-
-#==============================================================
-# Creates dir, returns the part of path that existed early.
-# Access may be defined.
-#==============================================================
-def create_dir (directory, access = 0777):
-    import string, os
-    dirs = string.split(directory, "/")
-    existing = ""; dir = ""
-    root = ""
-    for item in dirs:
-        if len(item) == 0:  continue
-        dir = dir + "/"+item
-        if os.path.exists(dir):
-            existing = dir
-        else:
-            os.mkdir(dir, access )
-            #root= existing + "/"+item
-            if dir == existing + "/"+item :
-                root = dir
-            #else : root = existing
-    
-    return root
+__TAG__SOURCES__    = "install sources"
+__TAG__BINARIES__   = "install binaries"
+__TAG__NATIVE__     = "use native"
+__TAG__PREINSTALL__ = "not install"
 
 #==============================================================
 # class Product 
 #==============================================================
 
 class Product :
-    def __init__(self, theName,
+    def __init__(self,
+                 theName,
                  theVersion            = None,
                  theInstall            = None,
                  theSupportred         = None,
-                 theDisable            = None,
                  theDependencies       = None,
                  theInstalldiskspace   = None,
                  theTemporarydiskspace = None,
                  theScript             = None,
                  thePickUpEnvironment  = None):
-        
-
-        self.name               = theName
-        self.version            = theVersion
-        self.install            = theInstall
-        self.supported          = theSupportred
-        self.disable            = theDisable
-        self.dependencies       = theDependencies
-        self.installdiskspace   = theInstalldiskspace
-        self.temporarydiskspace = theTemporarydiskspace
-        self.script             = theScript
-        self.pickupEnv          = thePickUpEnvironment
+        self.name               = strip(theName)
+        self.version            = strip(theVersion)
+        self.install            = strip(theInstall)
+        self.supported          = strip(theSupportred)
+        self.dependencies       = strip(theDependencies)
+        self.installdiskspace   = strip(theInstalldiskspace)
+        self.temporarydiskspace = strip(theTemporarydiskspace)
+        self.script             = strip(theScript)
+        self.pickupEnv          = strip(thePickUpEnvironment)
 
 #===================================================================
 # class Config
 #===================================================================
 class Config :
-    def __init__(self, theVersion='', theCaption='', theCopyright='', theLicense='', theOS=''):
-        self.version   = theVersion
-        self.caption   = theCaption
-        self.copyright = theCopyright
-        self.license   = theLicense
-        self.os        = theOS
-
+    def __init__(self,
+                 theVersion   = None,
+                 theCaption   = None,
+                 theCopyright = None,
+                 theLicense   = None,
+                 theOS        = None):
+        self.version   = strip(theVersion)
+        self.caption   = strip(theCaption)
+        self.copyright = strip(theCopyright)
+        self.license   = strip(theLicense)
+        self.os        = strip(theOS)
 
 #===================================================================
 # class Path
 #===================================================================
 class Path :
-    def __init__(self, theTargetdir=".", theTmpdir="."):
-        self.targetdir = theTargetdir
-        self.tmpdir    = theTmpdir
-
+    def __init__(self,
+                 theTargetdir = None,
+                 theTmpdir    = None):
+        self.targetdir = strip(theTargetdir)
+        self.tmpdir    = strip(theTmpdir)
         
 #===================================================================
 # class ConfigParser
@@ -368,36 +81,38 @@ class ConfigParser(xmllib.XMLParser):
         self.currentdata.append(data)
         
     def start_product(self, attrs):
-        aProduct = Product(attrs['name'],
-                           attrs['version'],
-                           attrs['install'],
-                           attrs['supported'],
-                           attrs['disable'],
-                           attrs['dependancies'],
-                           attrs['installdiskspace'],
-                           attrs['temporarydiskspace'],
-                           attrs['script'])
-
-        if attrs.has_key( 'pickupenv' ):
-            aProduct.pickupEnv = attrs['pickupenv']
-
+        if not attrs.get('name', '').strip():         return
+        if check_bool(attrs.get('disable', 'false')): return
+        aProduct = Product(attrs.get('name'),
+                           attrs.get('version',            None),
+                           attrs.get('install',            None),
+                           attrs.get('supported',          None),
+                           attrs.get('dependancies',       None),
+                           attrs.get('installdiskspace',   None),
+                           attrs.get('temporarydiskspace', None),
+                           attrs.get('script',             None),
+                           attrs.get('pickupenv',          None))
         self.products.append(aProduct)
+        pass
 
     def end_product(self):
         pass
 
     def start_config(self, attrs):
-        self.config = Config(attrs['version'],
-                             attrs['caption'],
-                             attrs['copyright'],
-                             attrs['license'],
-                             attrs['os'])
+        self.config = Config(attrs.get('version',   None),
+                             attrs.get('caption',   None),
+                             attrs.get('copyright', None),
+                             attrs.get('license',   None),
+                             attrs.get('os',        None))
+        pass
+    
     def end_config(self):
         pass
 
     def start_path (self, attrs):
-        self.path = Path(attrs['targetdir'],
-                         attrs['tempdir'])
+        self.path = Path(attrs.get('targetdir', None),
+                         attrs.get('tempdir',   None))
+        pass
         
     def end_path(self):
         pass
@@ -408,84 +123,303 @@ class ConfigParser(xmllib.XMLParser):
                 return product
         return None
 
+#==============================================================
+# message: prints diagnostic information
+#==============================================================
+def message(msg):
+    if msg.strip():
+        print ">>>", msg
+    pass
+
+#==============================================================
+# warning: prints warning
+#==============================================================
+def warning(msg):
+    if msg.strip():
+        print ""
+        print msg
+        print ""
+    pass
+
+#==============================================================
+# error_exit : prints (optionally) error string, then prints
+#              help information and quits
+#==============================================================
+def error_exit(msg = "", print_help = True):
+    # print error message
+    if len(msg.strip()):
+        print ""
+        print msg
+        print ""
+    # print help information
+    if print_help:
+        global opt_parser
+        if opt_parser:
+            opt_parser.print_help() 
+            print ""
+    # cleaning 
+    clean_all()
+    # quit
+    sys.exit(1);
+    pass
+
+#==============================================================
+# clean_all : performs system cleaning before exiting
+#==============================================================
+def clean_all():
+    global root_path
+    remove_dir(root_path)
+    pass
+
+#==============================================================
+# parse_parameters : parses command line arguments
+#==============================================================
+def parse_parameters():
+    global opt_parser
+    opt_parser = OptionParser(add_help_option=False)
+    help_str  = "Runs the Installation Wizard in the GUI mode [default].\n"
+    help_str += "In this case only -f option is taken into account. "
+    help_str += "Other options are ignored."
+    opt_parser.add_option("-g",
+                          "--gui",
+                          action="store_true",
+                          dest="gui",
+                          default=True,
+                          help=help_str)
+    help_str  = "Runs the Installation Wizard in the TUI mode."
+    opt_parser.add_option("-b",
+                          "--batch",
+                          action="store_false",
+                          dest="gui",
+                          help=help_str)
+    help_str  = "The configuration xml file.\n"
+    help_str += "If this parameter is missing, then the program tries to define the "
+    help_str += "Linux platform and use the corresponding xml file. For example, "
+    help_str += "for Red Hat 8.0 config_RedHat_8.0.xml file is used in this case."
+    help_str += "If program fails to define target Linux platform or the corresponding "
+    help_str += "xml file is not provided with the Installation Wizard, then default "
+    help_str += "config.xml file is used."
+    opt_parser.add_option("-f",
+                          "--file",
+                          action="store",
+                          dest="xmlfile",
+                          metavar="FILE",
+                          help=help_str)
+    help_str  = "The target directory the products to be installed to.\n"
+    help_str += "When used this parameter overrides the default target directory "
+    help_str += "defined in the configuration xml file."
+    opt_parser.add_option("-d",
+                          "--target",
+                          action="store",
+                          dest="target_dir",
+                          metavar="DIR",
+                          help=help_str)
+    help_str  = "The directory used for temporary files.\n"
+    help_str += "When used this parameter overrides the default temporary directory "
+    help_str += "defined in the configuration xml file."
+    opt_parser.add_option("-t",
+                          "--tmp",
+                          action="store",
+                          dest="tmp_dir",
+                          metavar="DIR",
+                          help=help_str)
+    help_str  = "Prints this help and quits."
+    opt_parser.add_option("-v",
+                          "--version",
+                          action="store_true",
+                          help=help_str)
+    help_str  = "Prints version information and quits."
+    opt_parser.add_option("-h",
+                          "--help",
+                          action="store_true",
+                          help=help_str)
+    (options, args) = opt_parser.parse_args()
+    if options.help:
+        # print help info and quit
+        print "\nSALOME Installation Wizard\n"
+        opt_parser.print_help()
+        print ""
+        sys.exit(0)
+    if options.version:
+        # print version info and quit
+        print ""
+        cmd = "./bin/SALOME_InstallWizard --version"
+        os.system(cmd)
+        print ""
+        sys.exit(0)
+    return [options.xmlfile, options.target_dir, options.tmp_dir, options.gui]
+
+#=================================================================
+# strip : removes spaces at the beginning and at eh end of the 
+#         <param> if it is of string type
+#=================================================================
+def strip(param):
+    import types
+    if type(param) == types.StringType:
+        return param.strip()
+    return param
+    
+#=================================================================
+# check_bool : checks boolean value: yes/no, true/false, 1/0
+#=================================================================
+def check_bool(val):
+    if str(val).lower().strip() in ["yes","true", "1"]:
+        return True
+    if str(val).lower().strip() in ["no","false", "0"]:
+        return False
+    try:
+        val = int(val)
+        return val != 0
+    except:
+        pass
+    return False
+
+#=================================================================
+# get_dependencies : extract products dependencies
+#=================================================================
+def get_dependencies(prods):
+    list = []
+    for product in prods:
+        deps = product.dependencies.split(",")
+        for dep in deps:
+            if dep and not dep in list:
+                list.append( dep )
+                
+        if product and not product in list:
+            list.append( product.name )
+            
+    return " ".join( list )
+
+#==============================================================
+# create_dir : creates a directory with (optional) permissions,
+#              returns the part of path that existed before
+#              directory creation; exits with error if access
+#              is denied
+#==============================================================
+def create_dir(directory, access = 0777):
+    import string, os
+    dirs = string.split(directory, "/")
+    existing = "";
+    dir = ""
+    root = ""
+    for subdir in dirs:
+        if len(subdir) == 0:  continue
+        dir = "%s/%s"%(dir, subdir)
+        if os.path.exists(dir):
+            existing = dir
+        else:
+            try:
+                os.mkdir(dir, access)
+            except:
+                error_exit("Can't create directory: %s.\nAccess is denied."%directory)
+            if dir == "%s/%s"%(existing, subdir):
+                root = dir
+    return root
+
+#==============================================================
+# substituteVars : performes environment variables substistution
+#                  the given string; if varibale is not defined
+#                  it is substituted by the empty string
+#==============================================================
+def substituteVars(str):
+    str = os.path.expanduser(str)
+    str = os.path.expandvars(str)
+    return str
+
 #================================================================
-# get the path using file name
+# get_program_path : gets program's directory path
+#                    (and performs 'cd' command there) 
 #================================================================
-def get_current_path(file_name):
-    path = "."; where = string.rfind(file_name,'/');
-    if (where != -1):
-        path = (file_name)[: where]
-        os.chdir(path);
-    path = os.getcwd() + "/"
-    return path
+def get_program_path():
+    path = os.path.dirname(sys.argv[0])
+    if path:
+        os.chdir(path)
+    return os.getcwd()
 
 #================================================================
-# checks dir existing 
+# check_dir : checks directory existence
 #================================================================
 def check_dir(dir):
-    if (os.path.islink(dir)) :
-        native_dir = os.readlink(dir)
-        if not os.path.exists(native_dir) :
-            print "Invalid link " + dir + ". The directory " + native_dir + " a link points to does not exist."
-            return 0 # problem
-    else :
+    if (os.path.islink(dir)):
+        realpath = os.path.realpath(dir)
+        if not os.path.exists(realpath):
+            msg = "Invalid link %s.\nThe directory %s a link points to does not exist."%(dir,realpath)
+            error_exit(msg, False)
+    else:
         if not os.path.exists(dir):
-            print "Directory " + dir + " does not exist"
-            return 0
-    return 1
+            msg = "Directory %s does not exist."%dir
+            error_exit(msg, False)
+    pass
 
 #===============================================================
-# Checks the disk space. Exit from interpreter if there is no
-# enough disk space.
+# check_disk_space : checks the disk space;
+#                    quits if there is no enough disk space
 #===============================================================
-def check_disk_space(products, script_dir, target_dir, tmp_dir):
-    import re, string, os
+def check_disk_space(products, scripts_dir, target_dir, tmp_dir):
     install_space = 0
     temporary_space = 0
-    for product in products :
-        product.install = re.sub(r'^\s+', "", product.install)
-        product.install = re.sub(r'\s+$', "", product.install)
-        
-        if check_bool(product.disable) or product.install == "use native" or product.install == "not install":
+    for product in products:
+        if product.install in [__TAG__NATIVE__, __TAG__PREINSTALL__]:
             continue
-        spaces = string.split( product.installdiskspace,',')
+        spaces = string.split(product.installdiskspace, ',')
         prod_space = spaces[0]
-        if (len(spaces) == 2 ) and (product.install == "install binaries") :
+        if (len(spaces) > 1 ) and (product.install == __TAG__SOURCES__):
             prod_space = spaces[1]
         install_space = install_space + string.atoi(prod_space)
-        temporary_space = temporary_space + string.atoi(product.temporarydiskspace)
-    res = os.system(scripts_dir + "checkSize.sh" + " " + target_dir + " " + str(install_space))
+        if product.install == __TAG__SOURCES__:
+            temporary_space = max(temporary_space, string.atoi(product.temporarydiskspace))
+
+    res = os.system("%s/%s %s %d"%(scripts_dir, "checkSize.sh", target_dir, install_space))
     if res:
-        print "There is no enough space to install the products."
-        return 0
+        msg = "There is no enough space to install the products."
+        error_exit(msg, False)
     
-    res = os.system(scripts_dir + "checkSize.sh" + " " + tmp_dir + " " + str(temporary_space))
+    res = os.system("%s/%s %s %d"%(scripts_dir, "checkSize.sh", tmp_dir, temporary_space))
     if res:
-        print "There is no enough space for tmp directory."
-        return 0
-    
-    return 1
+        msg = "There is no enough space for temporary directory."
+        error_exit(msg, False)
+    pass
  
 #===============================================================
-# Removes temporary directory
+# remove_dir : removes temporary directory
 #===============================================================
-def remove_dir( rem_path = "" ):
-    if len( rem_path ) and os.path.exists( rem_path ):
-        os.system( "rm -rf " + rem_path )
+def remove_dir(path):
+    if path and os.path.exists(path):
+        os.system("rm -rf " + path)
     pass
-    
+
+#==============================================================
+# has_binaries : returns True if some product is installed from
+#                binaries
+#===============================================================
+def has_binaries(products):
+    for product in products:
+        if product.install == __TAG__BINARIES__:
+            return True
+    return False
+
+#==============================================================
+# has_sources : returns True if some product is installed from
+#               sources
+#===============================================================
+def has_sources(products):
+    for product in products:
+        if product.install == __TAG__SOURCES__:
+            return True
+    return False
+
 #================================================================
 # main
 #================================================================
     
 if __name__ == "__main__":
-    
-    cur_dir = get_current_path(sys.argv[0])
-   
-    [xml_file, target_dir, tmp_dir, is_gui]  = parse_parameters(sys.argv)
+    # get program dir
+    cur_dir = get_program_path()
+    # parse command line
+    [xml_file, target_dir, tmp_dir, is_gui] = parse_parameters()
 
-    # define xml file -----------------
-    if (xml_file is None) :
+    # define xml file to be used
+    if (xml_file is None):
         plt_name = ""
         plt_ver  = ""
         xml_file_name = "config.xml"
@@ -504,45 +438,42 @@ if __name__ == "__main__":
             plt_name = "Debian"
             plt_ver = open("/etc/debian_version").readline().strip()
         _xml_file_name = "config_%s_%s.xml"%(plt_name, plt_ver)
-        if plt_name and plt_ver and os.path.exists(cur_dir + _xml_file_name):
+        if plt_name and plt_ver and os.path.exists("%s/%s"%(cur_dir, _xml_file_name)):
             xml_file_name = _xml_file_name
         else:
-            print ""
-            print "Not supported Linux platform!"
-            print "Trying to use default configuration!"
-            print ""
+            msg  = "Not supported Linux platform!\n"
+            msg += "Trying to use default configuration file!"
+            warning(msg)
 
-        xml_file = cur_dir +  xml_file_name
+        xml_file = "%s/%s"%(cur_dir, xml_file_name)
 
     if not xml_file or not os.path.exists(xml_file):
-        msg  = "Configuration file %s is not found!"%xml_file
-        msg += "\nTry to run with -f <xmlfile> option."
+        msg = "Configuration file %s is not found!"%xml_file
         error_exit(msg)
 
     if not os.access(xml_file, os.R_OK):
-        print "There is no read access for %s file!"%xml_file
-        sys.exit(1)
+        msg = "There is no read access for %s file!"%xml_file
+        error_exit(msg)
 
     #---- GUI ----------------
+
     if is_gui : 
         env = os.environ
         if not env.has_key("PATH") :
             env["PATH"] = ""
         if not env.has_key("LD_LIBRARY_PATH") :
-            env["LD_LIBRARY_PATH"] ""
+            env["LD_LIBRARY_PATH"] = ""
 
-        env["LD_LIBRARY_PATH"] =  ".:" +  env["LD_LIBRARY_PATH"]
-        env["PATH"] = ".:"+ env["PATH"]
+        env["LD_LIBRARY_PATH"] =  ".:" + env["LD_LIBRARY_PATH"]
+        env["PATH"] = ".:" + env["PATH"]
 
-        sys.exit(os.system("cd " + cur_dir + "; ./bin/SALOME_InstallWizard " + xml_file +"&"))
-        
-        
+        cmd = "./bin/SALOME_InstallWizard %s &"%xml_file
+        sys.exit(os.system(cmd))
 
     #-----  TUI ---------------------
 
-    #print xml_file, target_dir, tmp_dir, is_gui
-
-    message("Parsing xml config file: " + xml_file)
+    # parse XML file -----------
+    message("Parsing XML configuration file: %s"%xml_file)
     filehandle = open(xml_file)
     data = filehandle.read()
     filehandle.close()
@@ -550,103 +481,114 @@ if __name__ == "__main__":
     parser.feed(data)
     parser.close()
 
-    # definitions :
-    # map
-    what_to_do = { "install sources"  : "install_source",
-                   "install binaries" : "install_binary",
-                   "use native"       : "try_native",
-                   "not install"      : "try_preinstalled"}
-    # define tmp dir  -----------
-    if tmp_dir is None:
-        tmp_dir = parser.path.tmpdir
-    if tmp_dir is None or tmp_dir == "":
-        tmp_dir = "/tmp"
-    import random
-    tmp_dir = tmp_dir + "/INSTALLWORK" + str(random.randint(10000,100000))
-    root_path = ""
-    if not os.path.exists(tmp_dir):
-        message("Creating temporary directory: " + tmp_dir); root_path = create_dir(tmp_dir, 0755) ; 
-    if not os.path.exists(tmp_dir):
-        error_exit("Invalid temporary directory " + tmp_dir + ". Use -tmp key to set directory or correct xml file\n\n")
-
-    if not os.access(tmp_dir, os.W_OK) :
-        str = "There is no write permissions for directory " + tmp_dir + ". Use -tmp key to set temporary directory or correct xml file"
-        error_exit(str)
-        
-    # define target dir  --------
+    # actions map
+    what_to_do = { __TAG__SOURCES__    : "install_source",
+                   __TAG__BINARIES__   : "install_binary",
+                   __TAG__NATIVE__     : "try_native",
+                   __TAG__PREINSTALL__ : "try_preinstalled"}
+    # source directory map
+    bin_dir = ""
+    if parser.config.os:
+        bin_dir += "/%s"%parser.config.os
+    subdir = { __TAG__SOURCES__    : "SOURCES",
+               __TAG__BINARIES__   : "BINARIES" + bin_dir,
+               __TAG__NATIVE__     : "",
+               __TAG__PREINSTALL__ : ""}
+
+    # check scripts directory -----------
+    scripts_dir = "%s/%s"%(cur_dir, "config_files")
+    check_dir(scripts_dir)
+
+    # check products archives directories -----------
+    has_bin = has_binaries(parser.products)
+    has_src = has_sources(parser.products)
+    source_dir = "%s/%s"%(cur_dir, "Products")
+
+    if has_src or has_bin:
+        check_dir(source_dir)
+
+    if has_src:
+        check_dir("%s/%s"%(source_dir,subdir[__TAG__SOURCES__]))
+
+    if has_bin:
+        check_dir("%s/%s"%(source_dir,subdir[__TAG__BINARIES__]))
+
+    # check/create target dir -----------
     if target_dir is None:
         target_dir = parser.path.targetdir
+    target_dir = substituteVars(target_dir)
+
+    message("Creating target directory: " + target_dir)
+    create_dir(target_dir, 0755)
 
     if not os.path.exists(target_dir):
-        message("Creating target directory: " + target_dir); create_dir(target_dir, 0755)
-    if not os.path.exists(target_dir):
-        error_exit("Invalid target directory " + target_dir + ". Use -t key to set directory or correct xml file\n\n")
+        error_exit("Invalid target directory: " + target_dir)
 
     if not os.access(target_dir, os.W_OK) :
-        str = "There is no write permissions for directory " + target_dir + ". Use -t key to set target directory or correct xml file."
-        error_exit(str)
-
-    # define products dir ------------
-    source_dir =  cur_dir + "Products" ; 
-    if not check_dir(source_dir):
-        remove_dir(root_path)
-        sys.exit(1)
-       
-    subdir = {"install sources"  : "SOURCES",
-              "install binaries" : "BINARIES/"+parser.config.os,
-              "use native"       : "",
-              "not install"      : ""}
-
-
-    #  define scripts dir ------------
-    scripts_dir = cur_dir + "config_files/"
-    if not check_dir(scripts_dir):
-        remove_dir(root_path)
-        sys.exit(1)
-    os.chdir(scripts_dir)
+        error_exit("There is no write permissions for the directory: " + target_dir)
+
+    # check/create temporary dir -----------
+    if tmp_dir is None:
+        tmp_dir = parser.path.tmpdir
+    if not tmp_dir:
+        tmp_dir = "/tmp"
+    tmp_dir = substituteVars(tmp_dir)
+    import random
+    tmp_dir = "%s/INSTALLWORK%d"%(tmp_dir, random.randint(10000,100000))
 
-    #list_of_dep =  create_levels(parser.products)
-    #list_of_dep =  get_dependencies_set(parser.products)
-    list_of_dep =  get_dependencies(parser.products)
+    message("Creating temporary directory: " + tmp_dir)
+    root_path = create_dir(tmp_dir, 0755)
+   
+    if not os.path.exists(tmp_dir):
+        error_exit("Invalid temporary directory: " + tmp_dir)
 
+    if not os.access(tmp_dir, os.W_OK) :
+        error_exit("There is no write permissions for the directory: " + tmp_dir)
+        
+    # check available disk space
     message("Checking available disk space")
-    if check_disk_space(parser.products, scripts_dir, target_dir, tmp_dir) :
-
-        message("Starting...")
-        # install products
-        for product in parser.products :
+    check_disk_space(parser.products, scripts_dir, target_dir, tmp_dir)
 
-            if check_bool(product.disable): continue
+    # change current directory
+    os.chdir(scripts_dir)
 
-            message("Processing " + product.name + "...")
-            cmd = scripts_dir +  product.script + " " + \
-                  what_to_do[product.install]+ " " + \
-                  tmp_dir + " " + \
-                  source_dir + "/" + subdir[product.install] + " " + \
-                  target_dir + " " + \
-                  '"' + list_of_dep + '"' + " " + \
-                  product.name
+    # get dependencies list
+    list_of_dep = get_dependencies(parser.products)
 
+    # starting
+    message("Starting ...")
+    
+    # install products
+    for product in parser.products:
+        message("... processing %s ..."%product.name)
+        cmd = '%s/%s %s %s %s/%s %s "%s" %s'%(scripts_dir,
+                                              product.script,
+                                              what_to_do[product.install],
+                                              tmp_dir,
+                                              source_dir,
+                                              subdir[product.install],
+                                              target_dir,
+                                              list_of_dep,
+                                              product.name)
+        res = os.system(cmd)
+
+    # pickup environment
+    message("Creating environment files")
+    for product in parser.products :
+        if check_bool(product.pickupEnv):
+            cmd = '%s/%s pickup_env %s %s/%s %s "%s" %s'%(scripts_dir,
+                                                          product.script,
+                                                          tmp_dir,
+                                                          source_dir,
+                                                          subdir[product.install],
+                                                          target_dir,
+                                                          list_of_dep,
+                                                          product.name)
             res = os.system(cmd)
-            #if res : break; # try_preinstalled can return 1
-
-        # pickup environment
-        message("Creating environment files")
-        for product in parser.products :
-
-            if check_bool(product.disable): continue
-
-            if check_bool(product.pickupEnv):
-                cmd = scripts_dir +  product.script + " " + \
-                      "pickup_env " + \
-                      tmp_dir + " " + \
-                      source_dir + "/" + subdir[product.install] + " " + \
-                      target_dir + " " + \
-                      '"' + list_of_dep + '"' + " " + \
-                      product.name
-                
-                res = os.system(cmd)
 
+    # clean temporary directory
     message("Cleaning temporary directory")
-    remove_dir(root_path)
+    clean_all()
+    # finishing
     message("Finished!")
+    pass
index b6c2aafad0c1a84c3eb780ff9faeae9ff1aa2828..3968afcca35da5b990725dfb1b8ab8429f43657f 100644 (file)
@@ -793,7 +793,7 @@ void SALOME_InstallWizard::setupReadmePage()
   readme = new QTextEdit( readmePage );
   readme->setReadOnly( true );
   readme->setTextFormat( PlainText );
-  readme->setFont( QFont( "Fixed", 10 ) );
+  readme->setFont( QFont( "Fixed", 12 ) );
   readme->setUndoRedoEnabled ( false );
   QWhatsThis::add( readme, tr( "Displays README information" ) );
   QToolTip::add  ( readme, tr( "Displays README information" ) );
index 63cfd193db20d3bb4df6020c685743591e55ea62..e828213558a23c3756e3b589989752a186fd5ce1 100644 (file)
 #include <qfile.h>
 #include <qmessagebox.h>
 
+#define __IW_VERSION__ 0x010000
+
 // ================================================================
 /*!
  *  MessageOutput
  *  Qt's messages handler funcion
  */
 // ================================================================
-void MessageOutput( QtMsgType type, const char *msg )
+void MessageOutput( QtMsgType type, 
+#ifdef QT_DEBUG
+                   const char* msg
+#else
+                   const char*
+#endif
+                   )
 {
   switch ( type ) {
   case QtDebugMsg:
@@ -42,10 +50,30 @@ void MessageOutput( QtMsgType type, const char *msg )
 int main( int argc, char **argv )
 {
   qInstallMsgHandler( MessageOutput );
+
+  QString xmlFileName;
+  for( int i = 1; i < argc; i++ ) {
+    QString a = QString( argv[i] );
+    if ( a == "--version" || a == "-v" ) {
+      printf("SALOME Installation Wizard version %d.%d.%d ",
+            ( __IW_VERSION__ >> 16 ) & 0xFF,
+            ( __IW_VERSION__ >>  8 ) & 0xFF,
+            ( __IW_VERSION__       ) & 0xFF );
+      printf("(Qt version %d.%d.%d)\n",
+            ( QT_VERSION >> 16 ) & 0xFF,
+            ( QT_VERSION >> 8  ) & 0xFF,
+            ( QT_VERSION       ) & 0xFF );
+      return 0;
+    }
+    if ( xmlFileName.isEmpty() )
+      xmlFileName = a;
+  }
+  if ( xmlFileName.isEmpty() )
+    xmlFileName = "config.xml";
+
   QApplication a( argc, argv );
-  a.setFont( QFont("Helvetica", 9 ) );
-  QString xmlFileName( argc == 2 ? argv[1] : "config.xml" );
-  
+  a.setFont( QFont( "Sans", 12 ) );
+
   int result = -1;
   QFile xmlfile(xmlFileName);
   if ( xmlfile.exists() ) {