Salome HOME
Script to check Fortran compilers and libraries on current system.
[tools/install.git] / runInstall
index 2166b2ee44db6cf6408c399e225d4a2fe7c0b34d..a766b2e8ee1256dd7f92f31425a6f32fcd0c2d20 100755 (executable)
@@ -2,6 +2,12 @@
 
 """
 Installation Wizard launching script.
 
 """
 Installation Wizard launching script.
+
+This script is the part of the SALOME installation procedure.
+Author    : Vadim SANDLER, Open CASCADE SAS (vadim.sandler@opencascade.com)
+Created   : Thu Dec 18 12:01:00 2002
+Copyright : 2002-2007 CEA
+
 """
 
 __version__ = "1.0.1"
 """
 
 __version__ = "1.0.1"
@@ -12,7 +18,7 @@ warnings.filterwarnings("ignore", "", DeprecationWarning)
 
 # --- imports --- #
 import xmllib
 
 # --- imports --- #
 import xmllib
-import sys, os, string, re
+import sys, os, re
 import types
 import random
 
 import types
 import random
 
@@ -25,6 +31,12 @@ __TAG__SOURCES__    = "install sources"
 __TAG__BINARIES__   = "install binaries"
 __TAG__NATIVE__     = "use native"
 __TAG__PREINSTALL__ = "not install"
 __TAG__BINARIES__   = "install binaries"
 __TAG__NATIVE__     = "use native"
 __TAG__PREINSTALL__ = "not install"
+__TAG__BUILDSRC__   = "build sources"
+
+# --- product context definition --- #
+__CTX__SALOME__SRC__  = "salome sources"
+__CTX__SALOME__BIN__  = "salome binaries"
+__CTX__PREREQUISITE__ = "prerequisite"
 
 #------------------------------------------------------------------#
 #                                                                  #
 
 #------------------------------------------------------------------#
 #                                                                  #
@@ -349,42 +361,47 @@ class ArgParser:
 #------------------------------------------------------------------#
 
 #===================================================================
 #------------------------------------------------------------------#
 
 #===================================================================
-# class Config : general configuration options : version, OS, etc...
+# class Config : general configuration options : version, target and
+#                temporary directories, etc...
 #===================================================================
 class Config :
     """
     General configuration file options:
     - Install Wizard window caption
     - SALOME platform version
 #===================================================================
 class Config :
     """
     General configuration file options:
     - Install Wizard window caption
     - SALOME platform version
-    - Copyright and libcense info
-    - Target Linux OS version
+    - Copyright and license info
+    - Default target and temporary directories
     """
     def __init__(self,
                  theVersion   = None,
                  theCaption   = None,
                  theCopyright = None,
                  theLicense   = None,
     """
     def __init__(self,
                  theVersion   = None,
                  theCaption   = None,
                  theCopyright = None,
                  theLicense   = None,
-                 theOS        = None):
+                 thePlatforms = None,
+                 theTargetdir = None,
+                 theTmpdir    = None):
         self.version   = strip(theVersion)
         self.caption   = strip(theCaption)
         self.copyright = strip(theCopyright)
         self.license   = strip(theLicense)
         self.version   = strip(theVersion)
         self.caption   = strip(theCaption)
         self.copyright = strip(theCopyright)
         self.license   = strip(theLicense)
-        self.os        = strip(theOS)
-
-#===================================================================
-# class Path : default target, temporary directories options
-#===================================================================
-class Path :
-    """
-    Path options:
-    - default target directory
-    - default temporary directory
-    """
-    def __init__(self,
-                 theTargetdir = None,
-                 theTmpdir    = None):
+        self.platforms = strip(thePlatforms)
         self.targetdir = strip(theTargetdir)
         self.tmpdir    = strip(theTmpdir)
         self.targetdir = strip(theTargetdir)
         self.tmpdir    = strip(theTmpdir)
+
+## #===================================================================
+## # class Path : default target, temporary directories options
+## #===================================================================
+## class Path :
+##     """
+##     Path options:
+##     - default target directory
+##     - default temporary directory
+##     """
+##     def __init__(self,
+##                  theTargetdir = None,
+##                  theTmpdir    = None):
+##         self.targetdir = strip(theTargetdir)
+##         self.tmpdir    = strip(theTmpdir)
         
 #==============================================================
 # class Product : pre-requisite product options
         
 #==============================================================
 # class Product : pre-requisite product options
@@ -393,6 +410,7 @@ class Product :
     """
     Product options:
     - name, version
     """
     Product options:
     - name, version
+    - target Linux OS version
     - supported installation modes and the default one
     - dependencies
     - required disk space
     - supported installation modes and the default one
     - dependencies
     - required disk space
@@ -401,6 +419,8 @@ class Product :
     """
     def __init__(self,
                  theName,
     """
     def __init__(self,
                  theName,
+                 theType               = None,
+                 theOS                 = None,
                  theVersion            = None,
                  theInstall            = None,
                  theSupportred         = None,
                  theVersion            = None,
                  theInstall            = None,
                  theSupportred         = None,
@@ -410,6 +430,8 @@ class Product :
                  theScript             = None,
                  thePickUpEnvironment  = None):
         self.name               = strip(theName)
                  theScript             = None,
                  thePickUpEnvironment  = None):
         self.name               = strip(theName)
+        self.type               = strip(theType)
+        self.os                 = strip(theOS)
         self.version            = strip(theVersion)
         self.install            = strip(theInstall)
         self.supported          = strip(theSupportred)
         self.version            = strip(theVersion)
         self.install            = strip(theInstall)
         self.supported          = strip(theSupportred)
@@ -418,7 +440,35 @@ class Product :
         self.temporarydiskspace = strip(theTemporarydiskspace)
         self.script             = strip(theScript)
         self.pickupEnv          = strip(thePickUpEnvironment)
         self.temporarydiskspace = strip(theTemporarydiskspace)
         self.script             = strip(theScript)
         self.pickupEnv          = strip(thePickUpEnvironment)
+        self.whattodo           = self.install
+        
+    def hasContext(self, ctx):
+        try:
+            return ctx in [ strip(s) for s in self.context.split(",") ]
+        except:
+            pass
+        return False
 
 
+    def setMode(self, mode):
+        if mode not in [__TAG__SOURCES__, __TAG__BINARIES__, __TAG__NATIVE__, __TAG__PREINSTALL__]:
+            return
+        try:
+            supported = [ strip(s) for s in self.supported.split(",") ]
+            if mode in supported or mode == __TAG__PREINSTALL__:
+                self.install = mode
+                self.whattodo = self.install
+            salbin = self.hasContext(__CTX__SALOME__BIN__)
+            salsrc = self.hasContext(__CTX__SALOME__SRC__)
+            if mode == __TAG__SOURCES__:
+                if salbin and not salsrc:
+                    self.install = __TAG__PREINSTALL__
+                    self.whattodo = self.install
+                elif salsrc:
+                    self.whattodo = __TAG__BUILDSRC__
+        except:
+            pass
+        return
+        
 #===================================================================
 # class ConfigParser : XML files parser implementation
 #===================================================================
 #===================================================================
 # class ConfigParser : XML files parser implementation
 #===================================================================
@@ -426,20 +476,35 @@ class ConfigParser(xmllib.XMLParser):
     """
     XML configuration files parser
     """
     """
     XML configuration files parser
     """
-    def __init__(self):
+    def __init__(self, is_force_src=False):
         xmllib.XMLParser.__init__(self)
         self.products = []
         self.currentdata = []
         xmllib.XMLParser.__init__(self)
         self.products = []
         self.currentdata = []
-        self.path = None
+##         self.path = None
         self.config = None
         self.config = None
+        self.is_force_src = is_force_src
         
     def handle_data(self, data):
         self.currentdata.append(data)
         
         
     def handle_data(self, data):
         self.currentdata.append(data)
         
+    def start_config(self, attrs):
+        self.config = Config(attrs.get('version',   None),
+                             attrs.get('caption',   None),
+                             attrs.get('copyright', None),
+                             attrs.get('license',   None),
+                             attrs.get('platforms', None),
+                             attrs.get('targetdir', None),
+                             attrs.get('tempdir',   None))
+        pass
+    
+    def end_config(self):
+        pass
+
     def start_product(self, attrs):
         if not attrs.get('name', '').strip():         return
         if check_bool(attrs.get('disable', 'false')): return
         aProduct = Product(attrs.get('name'),
     def start_product(self, attrs):
         if not attrs.get('name', '').strip():         return
         if check_bool(attrs.get('disable', 'false')): return
         aProduct = Product(attrs.get('name'),
+                           attrs.get('type',               None),
                            attrs.get('version',            None),
                            attrs.get('install',            None),
                            attrs.get('supported',          None),
                            attrs.get('version',            None),
                            attrs.get('install',            None),
                            attrs.get('supported',          None),
@@ -448,30 +513,37 @@ class ConfigParser(xmllib.XMLParser):
                            attrs.get('temporarydiskspace', None),
                            attrs.get('script',             None),
                            attrs.get('pickupenv',          None))
                            attrs.get('temporarydiskspace', None),
                            attrs.get('script',             None),
                            attrs.get('pickupenv',          None))
+        if self.is_force_src:
+            aProduct.setMode(__TAG__SOURCES__)
         self.products.append(aProduct)
         pass
 
     def end_product(self):
         pass
 
         self.products.append(aProduct)
         pass
 
     def end_product(self):
         pass
 
-    def start_config(self, attrs):
-        self.config = Config(attrs.get('version',   None),
-                             attrs.get('caption',   None),
-                             attrs.get('copyright', None),
-                             attrs.get('license',   None),
-                             attrs.get('os',        None))
+    def start_installation(self, attrs):
+##         anInstallation = Installation(attrs.get('os',                 None),
+##                                       attrs.get('type',               None),
+##                                       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))
         pass
     
         pass
     
-    def end_config(self):
+    def end_installation(self):
         pass
 
         pass
 
-    def start_path (self, attrs):
-        self.path = Path(attrs.get('targetdir', None),
-                         attrs.get('tempdir',   None))
-        pass
+##     def start_path (self, attrs):
+##         self.path = Path(attrs.get('targetdir', None),
+##                          attrs.get('tempdir',   None))
+##         pass
         
         
-    def end_path(self):
-        pass
+##     def end_path(self):
+##         pass
 
     def getProduct(self, prod):
         for product in self.products:
 
     def getProduct(self, prod):
         for product in self.products:
@@ -479,6 +551,12 @@ class ConfigParser(xmllib.XMLParser):
                 return product
         return None
 
                 return product
         return None
 
+    def getInstallation(self, os):
+        for product in self.products:
+            if product.name == prod:
+                return product
+        return None
+
 #------------------------------------------------------------------#
 #                                                                  #
 #                         SERVICE FUNCTIONS                        #
 #------------------------------------------------------------------#
 #                                                                  #
 #                         SERVICE FUNCTIONS                        #
@@ -600,9 +678,6 @@ def parse_parameters():
     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 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",
     opt_parser.add_option("-f",
                           "--file",
                           action="store",
@@ -698,7 +773,7 @@ def create_dir(directory, access = 0777):
     directory creation; exits with error if access
     is denied.
     """
     directory creation; exits with error if access
     is denied.
     """
-    dirs = string.split(directory, "/")
+    dirs = directory.split("/")
     existing = "";
     dir = ""
     root = ""
     existing = "";
     dir = ""
     root = ""
@@ -765,7 +840,7 @@ def check_dir(dir):
 # check_disk_space : checks the disk space;
 #                    quits 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, scripts_dir, target_dir, tmp_dir):
+def check_disk_space(products, scripts_dir, target_dir, tmp_dir, is_force_src=False):
     """
     Checks if there is enough disk space to install products.
     Quits with error if there is no enough disk space.
     """
     Checks if there is enough disk space to install products.
     Quits with error if there is no enough disk space.
@@ -775,13 +850,23 @@ def check_disk_space(products, scripts_dir, target_dir, tmp_dir):
     for product in products:
         if product.install in [__TAG__NATIVE__, __TAG__PREINSTALL__]:
             continue
     for product in products:
         if product.install in [__TAG__NATIVE__, __TAG__PREINSTALL__]:
             continue
-        spaces = string.split(product.installdiskspace, ',')
-        prod_space = spaces[0]
-        if (len(spaces) > 1 ) and (product.install == __TAG__SOURCES__):
-            prod_space = spaces[1]
-        install_space = install_space + string.atoi(prod_space)
+        prod_space = 0
+        try:
+            spaces = product.installdiskspace.split(',')
+            prod_space = int( spaces[0] )
+            if len( spaces ) > 1 and product.install == __TAG__SOURCES__ and not is_force_src:
+                prod_space = int( spaces[1] )
+        except:
+            pass
+        install_space = install_space + prod_space
         if product.install == __TAG__SOURCES__:
         if product.install == __TAG__SOURCES__:
-            temporary_space = max(temporary_space, string.atoi(product.temporarydiskspace))
+            tmp_space = 0
+            try:
+                tmp_space = int( product.temporarydiskspace )
+            except:
+                pass
+            temporary_space = max( temporary_space, tmp_space )
+        pass
 
     res = os.system("%s/%s %s %d"%(scripts_dir, "checkSize.sh", target_dir, install_space))
     if res:
 
     res = os.system("%s/%s %s %d"%(scripts_dir, "checkSize.sh", target_dir, install_space))
     if res:
@@ -846,63 +931,97 @@ def get_tmp_dir(dir):
         if not os.path.exists( tmp_dir ):
             return tmp_dir
     return "%s/%s%d"%(dir, dir_prefix, random.randint(range_bottom,range_top))
         if not os.path.exists( tmp_dir ):
             return tmp_dir
     return "%s/%s%d"%(dir, dir_prefix, random.randint(range_bottom,range_top))
-    
+
+#==============================================================
+# get_current_platform : gets name, version and bit of 
+#                        the current user's Linux platform
+#===============================================================
+def get_current_platform():
+    """
+    Gets name, version and bit of
+    the current user's Linux platform.
+    """
+    plt_name = ""; plt_ver  = ""; plt_bit  = ""
+    if os.path.exists("/etc/issue"):
+        data = open("/etc/issue").readline()
+        res = re.search(r'(.*)[L|l]inux.*release\s+([\d.]*)', data)
+        if not res:
+            # Debian identification
+            res = re.search(r'(.*)GNU/Linux\s+([\d.]*)', data)
+        if res:
+            plt_name = "".join(res.group(1).split())
+            plt_ver  = res.group(2)
+            if re.search(r'x86_64', data):
+                plt_bit  = "_64"
+                pass
+            pass
+        pass
+
+    return plt_name, plt_ver, plt_bit
+
+#==============================================================
+# check_xml_file : checks XML file existence and readability
+#===============================================================
+def check_xml_file(xml_file):
+    """
+    Checks XML file existence and readability.
+    """
+    if not os.path.isfile(xml_file):
+        msg = "Configuration file %s is not found!"%xml_file
+        error_exit(msg, False)
+
+    if not os.access(xml_file, os.R_OK):
+        msg = "There is no read access for %s file!"%xml_file
+        error_exit(msg, False)
+    pass
+
+#==============================================================
+# get_supported_plts : gets map of supported Linux platforms and
+#                      corresponding configuration files
+#===============================================================
+def get_supported_platforms(xml_file=None):
+    """
+    Gets map of supported Linux platforms and
+    corresponding configuration files.
+    """
+    platforms_map = {}
+    xml_file_list = list()
+    if xml_file:
+        xml_file_list = [ xml_file ]
+    else:
+        entry_list = os.listdir(get_program_path())
+        for entry in entry_list:
+            if re.search(r'(.*).xml', entry):
+                xml_file_list.append(os.path.abspath(entry))
+    for an_xml_file in xml_file_list: # XML files parsing
+        check_xml_file(an_xml_file)
+        filehandle = open(an_xml_file)
+        data = filehandle.read()
+        filehandle.close()
+        parser = ConfigParser()
+        parser.feed(data)
+        parser.close()
+        if parser.config.platforms is not None:
+            for plt in parser.config.platforms.split(","):
+                if not plt or plt in platforms_map.keys(): continue
+##                 print "plt = %s, xml = %s"%(strip(plt), an_xml_file)
+                platforms_map[strip(plt)] = an_xml_file
+    return platforms_map
+
 #------------------------------------------------------------------#
 #                                                                  #
 #                    EXECUTION STARTS HERE                         #
 #                                                                  #
 #------------------------------------------------------------------#
 #------------------------------------------------------------------#
 #                                                                  #
 #                    EXECUTION STARTS HERE                         #
 #                                                                  #
 #------------------------------------------------------------------#
-    
+
 if __name__ == "__main__":
 if __name__ == "__main__":
-    # get program dir
-    cur_dir = get_program_path()
     # parse command line
     [xml_file, target_dir, tmp_dir, is_gui] = parse_parameters()
     # parse command line
     [xml_file, target_dir, tmp_dir, is_gui] = parse_parameters()
-
-    # define xml file to be used
-    if (xml_file is None):
-        plt_name = ""
-        plt_ver  = ""
-        xml_file_name = "config.xml"
-        if os.path.exists("/etc/redhat-release"):
-            # - Red Hat Linux 8.0
-            # - Red Hat Linux 9
-            # - Mandrake Linux 10.1
-            # - Scientific Linux 3.0.5
-           # - Mandriva 2006.0
-            data = open("/etc/redhat-release").readline()
-           res = re.search(r'(.*)[L|l]inux.*release\s+([\d.]*)', data)
-           if res:
-                plt_name = "".join(res.group(1).split())
-                plt_ver  = res.group(2)
-        elif os.path.exists("/etc/debian_version"):
-            # - Debian 3.1
-            plt_name = "Debian"
-            plt_ver = open("/etc/debian_version").readline().strip()
-        elif os.path.exists("/etc/mandriva-release"):
-            # - Mandriva 2006 (an additional check if above check fails)
-            data = open("/etc/mandriva-release").readline()
-           res = re.search(r'(.*)[L|l]inux.*release\s+([\d.]*)', data)
-           if res:
-                plt_name = "".join(res.group(1).split())
-                plt_ver  = res.group(2)
-        _xml_file_name = "config_%s_%s.xml"%(plt_name, plt_ver)
-        if plt_name and plt_ver and os.path.exists("%s/%s"%(cur_dir, _xml_file_name)):
-            xml_file_name = _xml_file_name
-        else:
-            msg  = "Not supported Linux platform!\n"
-            msg += "Trying to use default configuration file!"
-            warning(msg)
-
-        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
-        error_exit(msg)
-
-    if not os.access(xml_file, os.R_OK):
-        msg = "There is no read access for %s file!"%xml_file
-        error_exit(msg)
+    if xml_file:   xml_file   = os.path.abspath(xml_file)
+    if target_dir: target_dir = os.path.abspath(target_dir)
+    if tmp_dir:    tmp_dir    = os.path.abspath(tmp_dir)
+    # get program dir
+    cur_dir = get_program_path()
 
     #---- GUI ----------------
 
 
     #---- GUI ----------------
 
@@ -916,7 +1035,9 @@ if __name__ == "__main__":
         env["LD_LIBRARY_PATH"] =  ".:" + env["LD_LIBRARY_PATH"]
         env["PATH"] = ".:" + env["PATH"]
 
         env["LD_LIBRARY_PATH"] =  ".:" + env["LD_LIBRARY_PATH"]
         env["PATH"] = ".:" + env["PATH"]
 
-        cmd = "./bin/SALOME_InstallWizard --file %s"%xml_file
+        cmd = "./bin/SALOME_InstallWizard"
+        if xml_file is not None:
+            cmd += " --file %s"%xml_file
         if target_dir is not None:
             cmd += " --target %s"%target_dir
         if tmp_dir is not None:
         if target_dir is not None:
             cmd += " --target %s"%target_dir
         if tmp_dir is not None:
@@ -925,13 +1046,34 @@ if __name__ == "__main__":
         sys.exit(os.system(cmd))
 
     #-----  TUI ---------------------
         sys.exit(os.system(cmd))
 
     #-----  TUI ---------------------
+    
+    # get program dir
+    cur_dir = get_program_path()
+
+    # get current Linux platform
+    plt_name = ""; plt_ver  = ""; plt_bit  = ""
+    plt_name, plt_ver, plt_bit = get_current_platform()
+    full_plt_name = plt_name + plt_ver + plt_bit
+    print "full_plt_name = %s" % full_plt_name
+    
+    # get supported Linux platforms
+    supported_plts_map = get_supported_platforms(xml_file)
+    # check: whether the current platform is supported
+    if supported_plts_map.has_key(full_plt_name):
+        # define xml file to be used
+        xml_file = supported_plts_map.get(full_plt_name, "")
+        print "set xml_file = %s" % os.path.basename(xml_file)
+        pass
+    else:
+        msg  = "Not supported Linux platform!\n"
+        warning(msg)
 
     # parse XML file -----------
     message("Parsing XML configuration file: %s"%xml_file)
     filehandle = open(xml_file)
     data = filehandle.read()
     filehandle.close()
 
     # parse XML file -----------
     message("Parsing XML configuration file: %s"%xml_file)
     filehandle = open(xml_file)
     data = filehandle.read()
     filehandle.close()
-    parser = ConfigParser()
+    parser = ConfigParser(is_force_src)
     parser.feed(data)
     parser.close()
 
     parser.feed(data)
     parser.close()
 
@@ -939,7 +1081,8 @@ if __name__ == "__main__":
     what_to_do = { __TAG__SOURCES__    : "install_source",
                    __TAG__BINARIES__   : "install_binary",
                    __TAG__NATIVE__     : "try_native",
     what_to_do = { __TAG__SOURCES__    : "install_source",
                    __TAG__BINARIES__   : "install_binary",
                    __TAG__NATIVE__     : "try_native",
-                   __TAG__PREINSTALL__ : "try_preinstalled"}
+                   __TAG__PREINSTALL__ : "try_preinstalled",
+                   __TAG__BUILDSRC__   : "install_source_and_build"}
     # source directory map
     bin_dir = ""
     if parser.config.os:
     # source directory map
     bin_dir = ""
     if parser.config.os:
@@ -1000,7 +1143,7 @@ if __name__ == "__main__":
         
     # check available disk space -----------
     message("Checking available disk space")
         
     # check available disk space -----------
     message("Checking available disk space")
-    check_disk_space(parser.products, scripts_dir, target_dir, tmp_dir)
+    check_disk_space(parser.products, scripts_dir, target_dir, tmp_dir, is_force_src)
 
     # change current directory -----------
     os.chdir(scripts_dir)
 
     # change current directory -----------
     os.chdir(scripts_dir)
@@ -1016,7 +1159,7 @@ if __name__ == "__main__":
         message("... processing %s ..."%product.name)
         cmd = '%s/%s %s %s %s/%s %s "%s" %s'%(scripts_dir,
                                               product.script,
         message("... processing %s ..."%product.name)
         cmd = '%s/%s %s %s %s/%s %s "%s" %s'%(scripts_dir,
                                               product.script,
-                                              what_to_do[product.install],
+                                              what_to_do[product.whattodo],
                                               tmp_dir,
                                               source_dir,
                                               subdir[product.install],
                                               tmp_dir,
                                               source_dir,
                                               subdir[product.install],