#!/usr/bin/env python

#-------------------------------------------------------------------------------
# Library modules import
#-------------------------------------------------------------------------------

import os, re, sys, os.path, shutil
#import string
import time, getpass

#
#

def main():


    #
    #
    # install
    # -------
    setup          = Setup()


class Setup:
        
    def __init__(self):

        #
        # Init

        shutil.copy('setup','setup_ini')
        resume = open('resume', mode='w')
        startTime = time.asctime()
        resume.write('Start time: '+startTime+'\n')
        name = ' '.join(os.uname())
        resume.write('Computer name: '+name+'\n')
        user = getpass.getuser()
        resume.write('User name: '+user+'\n')       
        
        self.installFunctions={}
        self.installFunctions['zlib']    = self.installZLIB
        self.installFunctions['metis']   = self.installMETIS
        self.installFunctions['mpi']     = self.installMPI
        self.installFunctions['cgns']    = self.installCGNS
        self.installFunctions['hdf']     = self.installHDF
        self.installFunctions['med']     = self.installMED
        self.installFunctions['tcltktix']= self.installTCLTKTIX
        self.installFunctions['python']  = self.installPYTHON
        self.installFunctions['libxml']  = self.installLIBXML
        self.installFunctions['bft']     = self.installBFT
        self.installFunctions['fvm']     = self.installFVM
        self.installFunctions['ecs']     = self.installECS
        self.installFunctions['syr_cs']  = self.installSYRCS
        self.installFunctions['ics']     = self.installICS
        self.installFunctions['ncs']     = self.installNCS
        
        self.installPath    = os.path.dirname(os.getcwd())

        self.readSetup()

        self.install = {}
        for library in self.libraries:
            self.install[library] = 'nok'

        for library in self.libraries:
            apply(self.installFunctions[library])
            self.install[library] = 'ok'
            self.report()            

        self.prepareValid()

        endTime = time.asctime()
        resume.write('End time: '+endTime+'\n')
        resume.write('\n')
        resume.close()

        os.system('env > tmp; cat resume tmp > tmp2; mv tmp2 resume; rm tmp')
        

    def readSetup(self):

        #
        # Init
        self.path = {}
        self.name = {}

        self.usage = []
        self.libraries = []

        self.listDef = [ 'nom_arch','compC','compF']
        self.listLib = ['zlib','metis','mpi','cgns','hdf','med',
                 'tcltktix','python','libxml','bft','fvm','ecs','syr_cs','syrthes','ics','ncs']


        for lib in self.listDef:
            self.name[lib] = ''
        for lib in self.listLib:
            self.path[lib] = ''
            self.name[lib] = ''
        #
        # setup file reading
        #
        try:
            setupFile = file('setup', mode='r')
        except IOError:
            print 'Error : opening setup file'
            sys.exit(1)
        
        while 1 :
            line = setupFile.readline()
            if (line == '') :
                break

            if line[0] == '#' :
                continue
        
            list = line.split()

            if list[0]=='nom_arch' :
                try:
                    self.arch = list[1]
                except:
                    arch = os.uname()
                    self.arch = arch[0]
                print '\nInstallation of Code_Saturne elements on architecture '+self.arch
                print '\n\n'
            elif list[0]=='compC' :
                self.name[list[0]] = list[1]
            elif list[0]=='compF' :
                self.name[list[0]] = list[1]
            else :
                try:
                    self.path[list[0]] = list[1]        
                    self.name[list[0]] = list[2]
                    if list[3]=='yes' :
                        self.usage.append(list[0])
                    if list[4]=='yes' :
                        self.libraries.append(list[0])               
                except:
                    pass   
    

    def installZLIB(self):

        nameLib = self.name['zlib']
        srcPath = self.installPath+'/src/'+nameLib
        buildPath = srcPath+'.build/arch/'+self.arch
        namePath = self.installPath+'/opt/'+nameLib
        optPath = namePath+'/arch/'+self.arch

        print '\nInstallation of '+self.name['zlib']+' on architecture '+self.arch+'\n'

        if os.path.isdir(srcPath+'.build') :
            shutil.rmtree(srcPath+'.build')

        if os.path.isdir(optPath) :
            shutil.rmtree(optPath)

        os.makedirs(buildPath)        
        os.chdir(buildPath)

        files = os.listdir(srcPath)
        for file in files :
            try:
                shutil.copytree(srcPath+'/'+file,buildPath+'/'+file)
            except:
                shutil.copy(srcPath+'/'+file,buildPath+'/'+file)

        error = os.system('./configure --prefix='+optPath)
        if error != 0 :
            print "Error during configure of "+nameLib
            sys.exit(1)
        error = os.system('make')
        if error != 0 :
            print "Error during make of "+nameLib
            sys.exit(1)
        error = os.system('make install')
        if error != 0 :
            print "Error during make install of "+nameLib
            sys.exit(1)
        
        self.path['zlib'] = namePath
        os.chdir(self.installPath+'/Install')
        

    def installMETIS(self):

        nameLib = self.name['metis']
        srcPath = self.installPath+'/src/'+nameLib
        namePath = self.installPath+'/opt/'+nameLib
        optPath = namePath+'/arch/'+self.arch
        incPath = namePath+'/include'
        docPath = namePath+'/doc'
        binPath = optPath+'/bin'
        libPath = optPath+'/lib'

        print '\nInstallation of '+self.name['metis']+' on architecture '+self.arch+'\n'
        
        os.chdir(srcPath)
        error = os.system('make')
        if error != 0 :
            print "Error during make of "+nameLib
            sys.exit(1)

        if os.path.isdir(optPath) :
            shutil.rmtree(optPath)

        if not os.path.isdir(incPath) :
            os.makedirs(incPath)
            
        files = os.listdir(srcPath+'/Lib')
        for file in files :
            if file.find('.h') >= 0 : 
                shutil.copy(srcPath+'/Lib/'+file,incPath+'/'+file)

        if not os.path.isdir(docPath) :
            os.makedirs(docPath)
            
        files = os.listdir(srcPath+'/Doc')
        for file in files :
            try:
                shutil.copytree(srcPath+'/Doc/'+file,docPath+'/'+file)
            except:
                shutil.copy(srcPath+'/Doc/'+file,docPath+'/'+file)

        if not os.path.isdir(binPath) :
            os.makedirs(binPath)
            
        binFiles = ['graphchk','kmetis','mesh2dual','mesh2nodal','oemetis',
                    'onmetis','partdmesh','partnmesh','pmetis']
        try:
            for binFile in binFiles :
                shutil.move(srcPath+'/'+binFile,binPath+'/'+binFile)
        except:
            for binFile in binFiles :
                shutil.copy(srcPath+'/'+binFile,binPath+'/'+binFile)

        if not os.path.isdir(libPath) :
            os.makedirs(libPath)
            
        libFile = 'libmetis.a'
        try:
            shutil.move(srcPath+'/'+libFile,libPath+'/'+libFile)
        except:
            shutil.copy(srcPath+'/'+libFile,libPath+'/'+libFile)

        os.system('make clean')

        self.path['metis'] = namePath
        os.chdir(self.installPath+'/Install')

        

    def installMPI(self):

        nameLib = self.name['mpi']
        srcPath = self.installPath+'/src/'+nameLib
        buildPath = srcPath+'.build/arch/'+self.arch
        namePath = self.installPath+'/opt/'+nameLib
        optPath = namePath+'/arch/'+self.arch

        print '\nInstallation of '+self.name['mpi']+' on architecture '+self.arch+'\n'
        
        if os.path.isdir(srcPath+'.build') :
            shutil.rmtree(srcPath+'.build')

        if os.path.isdir(optPath) :
            shutil.rmtree(optPath)

        os.makedirs(buildPath)
        os.chdir(buildPath)

        error = os.system(srcPath+'/configure --prefix='+optPath+' CC=\"'
                          +self.name['compC']+'\"')
        if error != 0 :
            print "Error during configure of "+nameLib
            sys.exit(1)
        error = os.system('make')
        if error != 0 :
            print "Error during make of "+nameLib
            sys.exit(1)
        error = os.system('make install')
        if error != 0 :
            print "Error during make install of "+nameLib
            sys.exit(1)
            
        os.system('make distclean')

        self.path['mpi'] = namePath
        os.chdir(self.installPath+'/Install')

        

    def installCGNS(self):

        nameLib = self.name['cgns']
        srcPath = self.installPath+'/src/'+nameLib
        buildPath = srcPath+'.build/arch/'+self.arch
        namePath = self.installPath+'/opt/'+nameLib
        optPath = namePath+'/arch/'+self.arch

        print '\nInstallation of '+self.name['cgns']+' on architecture '+self.arch+'\n'
        
        if os.path.isdir(srcPath+'.build') :
            shutil.rmtree(srcPath+'.build')

        if os.path.isdir(optPath) :
            shutil.rmtree(optPath)        

        os.makedirs(buildPath)
        os.chdir(buildPath)

        files = os.listdir(srcPath)
        for file in files :
            try:
                shutil.copytree(srcPath+'/'+file,buildPath+'/'+file)
            except:
                shutil.copy(srcPath+'/'+file,buildPath+'/'+file)
        
        error = os.system(srcPath+'/configure --prefix='+optPath+' --enable-64bit --enable-lfs CC=\"'
                          +self.name['compC']+'\"')
        if error != 0 :
            print "Error during configure of "+nameLib
            sys.exit(1)
        error = os.system('make')
        if error != 0 :
            print "Error during make of "+nameLib
            sys.exit(1)

        if not os.path.isdir(optPath+'/lib') :
            os.makedirs(optPath+'/lib')

        if not os.path.isdir(optPath+'/include') :  
            os.makedirs(optPath+'/include')
            
        error = os.system('make install')
        if error != 0 :
            print "Error during make install of "+nameLib
            sys.exit(1)

        self.path['cgns'] = namePath
        os.chdir(self.installPath+'/Install')

        

    def installHDF(self):

        nameLib = self.name['hdf']
        srcPath = self.installPath+'/src/'+nameLib
        buildPath = srcPath+'.build/arch/'+self.arch
        namePath = self.installPath+'/opt/'+nameLib
        optPath = namePath+'/arch/'+self.arch
        
        print '\nInstallation of '+self.name['hdf']+' on architecture '+self.arch+'\n'
        
        zlibPath = self.path['zlib']+'/arch/'+self.arch

        withZlib = ''
        for lib in self.usage :
            if lib == 'zlib' :
                withZlib = ' --with-zlib='+zlibPath        

        if os.path.isdir(srcPath+'.build') :
            shutil.rmtree(srcPath+'.build')

        if os.path.isdir(optPath) :
            shutil.rmtree(optPath)
            
        os.makedirs(buildPath)
        os.chdir(buildPath)

        if  self.arch == 'IRIX64' :
            files = os.listdir(srcPath)
            for file in files :
                try:
                    shutil.copytree(srcPath+'/'+file,buildPath+'/'+file)
                except:
                    shutil.copy(srcPath+'/'+file,buildPath+'/'+file)
                
        error = os.system(srcPath+'/configure --prefix='+optPath+' --enable-production CC=\"'
                          +self.name['compC']+'\"')
        if error != 0 :
            print "Error during configure of "+nameLib
            sys.exit(1)

        error = os.system('make')
        if error != 0 :
            print "Error during make of "+nameLib
            sys.exit(1)
        error = os.system('make install')
        if error != 0 :
            print "Error during make install of "+nameLib
            sys.exit(1)

        os.system('make distclean')

        self.path['hdf'] = namePath
        os.chdir(self.installPath+'/Install')



    def installMED(self):

        nameLib = self.name['med']
        srcPath = self.installPath+'/src/'+nameLib
        buildPath = srcPath+'.build/arch/'+self.arch
        namePath = self.installPath+'/opt/'+nameLib
        optPath = namePath+'/arch/'+self.arch

        print '\nInstallation of '+self.name['med']+' on architecture '+self.arch+'\n'
        
        hdfPath = self.path['hdf']+'/arch/'+self.arch

        withHdf = ''
        for lib in self.usage :
            if lib == 'hdf' :
                withHdf = ' --with-hdf5='+hdfPath  

        if os.path.isdir(srcPath+'.build') :
            shutil.rmtree(srcPath+'.build')

        if os.path.isdir(optPath) :
            shutil.rmtree(optPath)        

        os.makedirs(buildPath)
        os.chdir(buildPath)

        files = os.listdir(srcPath)
        for file in files :
            try:
                shutil.copytree(srcPath+'/'+file,buildPath+'/'+file)
            except:
                shutil.copy(srcPath+'/'+file,buildPath+'/'+file)
        error = os.system('./configure --prefix='+optPath+withHdf+
                          ' --disable-int64 CC=\"'+self.name['compC']+
                          '\" FC=\"'+self.name['compF']+'\"')
        if error != 0 :
            print "Error during configure of "+nameLib
            sys.exit(1)
        error = os.system('make')
        if error != 0 :
            print "Error during make of "+nameLib
            sys.exit(1)
        error = os.system('make install')
        if error != 0 :
            print "Error during make install of "+nameLib
            sys.exit(1)
                
        os.system('make distclean')

        self.path['med'] = namePath
        os.chdir(self.installPath+'/Install')



    def installTCLTKTIX(self):

        nameLib = self.name['tcltktix']
        nameTcl = self.name['tcltktix']+'/tcl8.4.14'
        nameTk  = self.name['tcltktix']+'/tk8.4.0'
        nameTix = self.name['tcltktix']+'/tix-8.4.14'

        namePath = self.installPath+'/opt/'+nameLib
        optPath = namePath+'/arch/'+self.arch

        print '\nInstallation of '+nameLib+' on architecture '+self.arch+'\n'

        print '\n  Installation of '+nameTcl+' on architecture '+self.arch+'\n'
        
        if os.path.isdir(optPath) :
            shutil.rmtree(optPath)  
                
        srcPath = self.installPath+'/src/'+nameTcl        
        os.chdir(srcPath)
        
        os.system('make distclean')
        os.system('rm -f config.*')
        
        error = os.system(srcPath+'/unix/configure --prefix='+optPath+
                  ' --enable-gcc --enable-shared')
        if error != 0 :
            print "Error during configure of "+nameTcl
            sys.exit(1)
        
        error = os.system('make')
        if error != 0 :
            print "Error during make of "+nameTcl
            sys.exit(1)
        error = os.system('make install')
        if error != 0 :
            print "Error during make install of "+nameTcl
            sys.exit(1)


        print '\n  Installation of '+nameTk+' on architecture '+self.arch+'\n'

        srcPath = self.installPath+'/src/'+nameTk
        os.chdir(srcPath)

        os.system('make distclean')
        os.system('rm -f config.*')
        
        error = os.system(srcPath+'/unix/configure --prefix='+optPath+
                  ' --with-tcl='+optPath+'/lib'+
                  ' --enable-gcc --enable-shared')
        if error != 0 :
            print "Error during configure of "+nameTk
            sys.exit(1)
        
        error = os.system('make')
        if error != 0 :
            print "Error during make of "+nameTk
            sys.exit(1)
        error = os.system('make install')
        if error != 0 :
            print "Error during make install of "+nameTk
            sys.exit(1)

        print '\n  Installation of '+nameTix+' on architecture '+self.arch+'\n'
        
        srcPath = self.installPath+'/src/'+nameTix
        os.chdir(srcPath+'/unix')
        
        os.system('make distclean')
        os.system('rm -f config.*')

        error = os.system(srcPath+'/unix/configure --prefix='+optPath+
                  ' --with-tclconfig='+optPath+'/lib'+
                  ' --with-tkconfig='+optPath+'/lib'+
                  ' --with-tclinclude='+optPath+'/include'+
                  ' --with-tkinclude='+optPath+'/include'+
                  ' --enable-gcc')
        if error != 0 :
            print "Error during configure of "+nameTix
            sys.exit(1)

        tkversion = 'tk8.3'
        os.chdir(srcPath+'/unix/'+tkversion)

        error = os.system(srcPath+'/unix/'+tkversion+'/configure --prefix='+optPath+
                  ' --with-tclconfig='+optPath+'/lib'+
                  ' --with-tkconfig='+optPath+'/lib'+
                  ' --with-tclinclude='+optPath+'/include'+
                  ' --with-tkinclude='+optPath+'/include'+
                  ' --enable-gcc --enable-shared')     
        if error != 0 :
            print "Error during configure of "+nameLib
            sys.exit(1)

        error = os.system('make')
        if error != 0 :
            print "Error during make of "+nameLib
            sys.exit(1)
        os.chdir(srcPath+'/unix')
        error = os.system('make install')
        if error != 0 :
            print "Error during make install of "+nameLib
            sys.exit(1)
        
        self.path['tcltktix'] = namePath
        os.chdir(self.installPath+'/Install')



    def installPYTHON(self):

        nameLib = self.name['python']

        srcPath = self.installPath+'/src/'+nameLib
        namePath = self.installPath+'/opt/'+nameLib
        optPath = namePath+'/arch/'+self.arch
        buildPath = srcPath+'/build'
        versionPath = srcPath+'/Python-2.4.1'

        print '\nInstallation of '+self.name['python']+' on architecture '+self.arch+'\n'
        
        tcltktixPath = self.path['tcltktix']+'/arch/'+self.arch
        libtixPath = tcltktixPath+'/lib'

        if os.path.isdir(buildPath) :
            shutil.rmtree(buildPath)

        if os.path.isdir(optPath) :
            shutil.rmtree(optPath)

        os.makedirs(buildPath+'/'+self.arch)
        
        os.chdir(srcPath)

        # adjust tcl tk tix libraries location in Setup.*
        try:
            setupFile = file(srcPath+'/Setup.'+self.arch, mode='r')
        except IOError:
            print "Error : opening "+srcPath+'/Setup.'+self.arch
            sys.exit(1)

        setupTmp = open(srcPath+'/Setup.'+self.arch+'.tmp', mode='w')

        while 1 :
            line = setupFile.readline()
            if (line == '') :
                break
                
            keyword = '/home/saturne/opt/tcl8.3/arch/'+self.arch
            kw = re.compile(keyword)           
            line = kw.sub(tcltktixPath, line)

            setupTmp.write(line)

        setupFile.close()
        setupTmp.close()

        os.rename(srcPath+'/Setup.'+self.arch+'.tmp',srcPath+'/Setup.'+self.arch)
        
        os.chdir(buildPath+'/'+self.arch)

        
        error = os.system(versionPath+'/configure --prefix='+optPath)
        if error != 0 :
            print "Error during configure of "+nameLib
            sys.exit(1)

        try:
            os.environ['LD_LIBRARY_PATH'] = libtixPath+':'+os.environ['LD_LIBRARY_PATH']
        except:
            os.environ['LD_LIBRARY_PATH'] = libtixPath

        shutil.copy(srcPath+'/Setup.'+self.arch,buildPath+'/'+self.arch+'/Modules/Setup')
        
        error = os.system('make install')
        if error != 0 :
            print "Error during make install of "+nameLib
            sys.exit(1)
        
        os.system('make distclean')        

        self.path['python'] = optPath
        os.chdir(self.installPath+'/Install')
        
        

    def installLIBXML(self):

        nameLib = self.name['libxml'] 
        
        srcPath = self.installPath+'/src/'+nameLib+'/src'        
        buildPath = self.installPath+'/src/'+nameLib+'/build/arch/'+self.arch
        namePath = self.installPath+'/opt/'+nameLib
        optPath = namePath+'/arch/'+self.arch

        print '\nInstallation of '+self.name['libxml']+' on architecture '+self.arch+'\n'
        
        if os.path.isdir(self.installPath+'/src/'+nameLib+'/build') :
            shutil.rmtree(self.installPath+'/src/'+nameLib+'/build')

        if os.path.isdir(optPath) :
            shutil.rmtree(optPath)

        os.makedirs(buildPath)
        os.chdir(buildPath)
        
        error = os.system(srcPath+'/configure --prefix='+namePath+
                          ' --exec-prefix='+optPath+' --srcdir='+srcPath+
                          ' --with-ftp=no CC=\"'+self.name['compC']+'\"')
        if error != 0 :
            print "Error during configure of "+nameLib
            sys.exit(1)

        error = os.system('make')
        if error != 0 :
            print "Error during make of "+nameLib
            sys.exit(1)
        error = os.system('make install')
        if error != 0 :
            print "Error during make install of "+nameLib
            sys.exit(1)

        self.path['libxml'] = namePath
        os.chdir(self.installPath+'/Install')

            

    def installBFT(self):

        nameLib = self.name['bft']
        srcPath = self.installPath+'/src/'+nameLib
        buildPath = srcPath+'.build/arch/'+self.arch
        namePath = self.installPath+'/opt/'+nameLib
        optPath = namePath+'/arch/'+self.arch

        print '\nInstallation of '+self.name['bft']+' on architecture '+self.arch+'\n'
        
        zlibPath = self.path['zlib']+'/arch/'+self.arch

        withIncZlib = ''
        withLibZlib = ''
        for lib in self.usage :
            if lib == 'zlib' :
                withIncZlib = ' CPP_ADD=-I'+zlibPath+'/include'
                withLibZlib = ' LD_ADD=-L'+zlibPath+'/lib' 

        if os.path.isdir(srcPath+'.build') :
            shutil.rmtree(srcPath+'.build')

        if os.path.isdir(optPath) :
            shutil.rmtree(optPath)        

        os.makedirs(buildPath)
        os.chdir(buildPath)

        if self.arch == 'IRIX64' :
            files = os.listdir(srcPath)
            for file in files :
                try:
                    shutil.copytree(srcPath+'/'+file,buildPath+'/'+file)
                except:
                    shutil.copy(srcPath+'/'+file,buildPath+'/'+file)

        error = os.system(srcPath+'/configure --prefix='+optPath+
                          ' CC=\"'+self.name['compC']+'\"')
        if error != 0 :
            print "Error during configure of "+nameLib
            sys.exit(1)
        error = os.system('make')
        if error != 0 :
            print "Error during make of "+nameLib
            sys.exit(1)
        error = os.system('make install')
        if error != 0 :
            print "Error during make install of "+nameLib
            sys.exit(1)
                
        os.system('make distclean')

        self.path['bft'] = namePath
        os.chdir(self.installPath+'/Install')

        

    def installFVM(self):
        
        nameLib = self.name['fvm']
        srcPath = self.installPath+'/src/'+nameLib
        buildPath = srcPath+'.build/arch/'+self.arch
        namePath = self.installPath+'/opt/'+nameLib
        optPath = namePath+'/arch/'+self.arch
        
        bftPath = self.path['bft']+'/arch/'+self.arch
        mpiPath = self.path['mpi']+'/arch/'+self.arch
        cgnsPath = self.path['cgns']+'/arch/'+self.arch
        hdf5Path = self.path['hdf']+'/arch/'+self.arch
        medPath = self.path['med']+'/arch/'+self.arch

        print '\nInstallation of '+self.name['fvm']+' on architecture '+self.arch+'\n'
        
        withBft = ''
        withMpi = ''
        withGgns = ''
        withHdf5 = ''
        withMed = ''
        
        for lib in self.usage :
            if lib == 'bft' :
                withBft = ' --with-bft-prefix='+bftPath
            if lib == 'mpi' and self.name['compC'] != 'mpicc' :
                withMpi = ' --with-mpi-prefix='+mpiPath
            if lib == 'cgns' :
                withCgns = ' --with-cgns-prefix='+cgnsPath
            if lib == 'hdf' :
                withHdf5 = ' --with-hdf5-prefix='+hdf5Path
            if lib == 'med' :
                withMed = ' --with-med-prefix='+medPath

        if os.path.isdir(self.installPath+'/src/'+nameLib+'.build') :
            shutil.rmtree(self.installPath+'/src/'+nameLib+'.build')

        if os.path.isdir(optPath) :
            shutil.rmtree(optPath)

        os.makedirs(buildPath)
        os.chdir(buildPath)

        error = os.system(srcPath+'/configure --prefix='+optPath+withBft+withMpi+withCgns+withHdf5+withMed+
                          ' CC=\"'+self.name['compC']+'\"')
        if error != 0 :
            print "Error during configure of "+nameLib
            sys.exit(1)
        error = os.system('make')
        if error != 0 :
            print "Error during make of "+nameLib
            sys.exit(1)
        error = os.system('make install')
        if error != 0 :
            print "Error during make install of "+nameLib
            sys.exit(1)
                
        os.system('make distclean')

        self.path['fvm'] = namePath
        os.chdir(self.installPath+'/Install')    



    def installECS(self):

        nameLib = self.name['ecs']
        
        srcPath = self.installPath+'/Enveloppe/'+nameLib
        optPath = srcPath+'/arch/'+self.arch

        print '\nInstallation of '+self.name['ecs']+' on architecture '+self.arch+'\n'
        
        bftPath   = self.path['bft']+'/arch/'+self.arch
        cgnsPath  = self.path['cgns']+'/arch/'+self.arch
        hdfPath   = self.path['hdf']+'/arch/'+self.arch
        medPath   = self.path['med']+'/arch/'+self.arch
        metisPath = self.path['metis']+'/arch/'+self.arch
        mpiPath   = self.path['mpi']+'/arch/'+self.arch

        withBft   = ''
        withCgns  = ''
        withHdf   = ''
        withMed   = ''
        withMetis = ''
        withMetisExec = ''
        withMpi   = ''
        for lib in self.usage :
            if lib == 'bft' :
                withBft   = ' --with-bft-prefix='+bftPath
            if lib == 'cgns' :
                withCgns  = ' --with-cgns-prefix='+cgnsPath
            if lib == 'hdf' :
                withHdf   = ' --with-hdf5-prefix='+hdfPath
            if lib == 'med' :
                withMed   = ' --with-med-prefix='+medPath
            if lib == 'metis' :
                withMetis =     ' --with-metis-prefix='+self.installPath+'/opt/'+self.name['metis']
                withMetisExec = ' --with-metis-exec-prefix='+metisPath
            if lib == 'mpi' and self.name['compC'] != 'mpicc' :
                withMpi   = ' --with-mpi-prefix='+mpiPath      

        if os.path.isdir(optPath) :
            shutil.rmtree(optPath)        

        os.chdir(srcPath)

        error = os.system(srcPath+'/configure --prefix='+optPath+
                      withBft+withCgns+withHdf+withMed+withMetis+withMetisExec+withMpi+
                          ' CC=\"'+self.name['compC']+'\"')
        if error != 0 :
            print "Error during configure of "+nameLib
            sys.exit(1)
        error = os.system('make')
        if error != 0 :
            print "Error during make of "+nameLib
            sys.exit(1)
        error = os.system('make install')
        if error != 0 :
            print "Error during make install of "+nameLib
            sys.exit(1)
                
        os.system('make distclean')

        self.path['ecs'] = srcPath
        os.chdir(self.installPath+'/Install')

        

    def installSYRCS(self):
        
        nameLib = self.name['syr_cs']
        
        srcPath = self.installPath+'/src/'+nameLib
        binPath = srcPath+'/bin'
        buildPath = srcPath+'/build/'+self.arch
        namePath = self.installPath+'/opt/'+nameLib
        optPath = namePath+'/lib/'+self.arch

        print '\nInstallation of '+self.name['syr_cs']+' on architecture '+self.arch+'\n'
        
        mpiPath = self.path['mpi']+'/arch/'+self.arch

        if os.path.isdir(self.installPath+'/src/'+nameLib+'/build') :
            shutil.rmtree(self.installPath+'/src/'+nameLib+'/build')

        if os.path.isdir(optPath) :
            shutil.rmtree(optPath)
        
        os.makedirs(buildPath)
        os.chdir(buildPath)

        binFiles = os.listdir(binPath)
        for binFile in binFiles :
            if binFile.find('Makefile') >= 0 :
                os.link(binPath+'/Makefile',buildPath+'/Makefile')
 
        # adjust variable DIR_SYR_CS in Makefile
        try:
            makeFile = open(buildPath+'/Makefile', mode='r')
        except IOError:
            print 'Error : opening '+buildPath+'/Makefile'
            sys.exit(1)

        makeTmp = open(buildPath+'/Makefile.tmp', mode='w')

        while 1 :
            line = makeFile.readline()
            if (line == '') :
                break
              
            keyword = 'DIR_SYR_CS'
            kw = re.compile('^[ ]*'+keyword)
            lineVar = kw.match(line)
            if lineVar :
                line = keyword+'='+srcPath+'\n'

            keyword = '\$\(NOM_ARCH\)'
            kw = re.compile(keyword)           
            line = kw.sub(self.arch, line)

            makeTmp.write(line)
    
        makeFile.close()
        makeTmp.close()

        os.rename(buildPath+'/Makefile.tmp',buildPath+'/Makefile')

        # adjust Syrthes location and -isystem in macros*.mk
        try:
            macrosFile = open(binPath+'/macros_'+self.arch+'.mk', mode='r')
        except IOError:
            print 'Error : opening '+binPath+'/macros_'+self.arch+'.mk'
            sys.exit(1)

        macrosTmp = open(binPath+'/macros_'+self.arch+'.mk.tmp', mode='w')

        filetmp = open('tmp.c', mode='w')
        filetmp.write('main(){\n return 0; \n}\n')
        filetmp.close()
        try:
            os.system('gcc -isystem . tmp.c')
            test = True
        except:
            test = False

        while 1 :
            line = macrosFile.readline()
            if (line == '') :
                break

            keyword = 'SYR_HOME'
            kw = re.compile('^[ ]*'+keyword)
            lineVar = kw.match(line)
            if lineVar :
                line = keyword+'='+self.path['syrthes']+'\n'

            keyword = 'MED_HOME'
            kw = re.compile('^[ ]*'+keyword)
            lineVar = kw.match(line)
            if lineVar :
                line = keyword+'='+self.path['med']+'\n'

            keyword = 'HDF_HOME'
            kw = re.compile('^[ ]*'+keyword)
            lineVar = kw.match(line)
            if lineVar :
                line = keyword+'='+self.path['hdf']+'\n'

            keyword = 'MPI_HOME'
            kw = re.compile('^[ ]*'+keyword)
            lineVar = kw.match(line)
            if lineVar :
                line = keyword+'='+mpiPath+'\n'

            if not test :
                keyword = 'MPI_INC'
                kw = re.compile('^[ ]*'+keyword+'.*'+'isystem')
                lineVar = kw.match(line)
                if lineVar :
                    line = keyword+'='+'-I$(MPI_HOME)/include \n'

            keyword = '\$\(NOM_ARCH\)'
            kw = re.compile(keyword)            
            line = kw.sub(self.arch, line)

            macrosTmp.write(line)

        macrosFile.close()
        macrosTmp.close()

        os.rename(binPath+'/macros_'+self.arch+'.mk.tmp',binPath+'/macros_'+self.arch+'.mk')
        os.remove('tmp.c')

        error = os.system('make lib')
        if error != 0 :
            print "Error during make lib of "+nameLib
            sys.exit(1)
        error = os.system('make install')
        if error != 0 :
            print "Error during make install of "+nameLib
            sys.exit(1)

        os.chdir(self.installPath)

        if not os.path.isdir(namePath) :
            os.makedirs(namePath)

        if not os.path.isdir(namePath+'/bin'):
            os.makedirs(namePath+'/bin')

        if not os.path.isdir(namePath+'/include'):  
            os.makedirs(namePath+'/include')

        if not os.path.isdir(namePath+'/lib'):  
            os.makedirs(namePath+'/lib')
            
        os.chdir(srcPath)

        files = os.listdir(srcPath+'/lib')
        for file in files :
            try:
                shutil.copytree(srcPath+'/lib/'+file,namePath+'/lib/'+file)
            except:
                shutil.copy(srcPath+'/lib/'+file,namePath+'/lib/'+file)

        files = os.listdir(srcPath+'/bin')
        for file in files :
            try:
                shutil.copytree(srcPath+'/bin/'+file,namePath+'/bin/'+file)
            except:
                shutil.copy(srcPath+'/bin/'+file,namePath+'/bin/'+file)

        files = os.listdir(srcPath+'/include')
        for file in files :
            try:
                shutil.copytree(srcPath+'/include/'+file,namePath+'/include/'+file)
            except:
                shutil.copy(srcPath+'/include/'+file,namePath+'/include/'+file)
       
        self.path['syr_cs'] = namePath
        os.chdir(self.installPath+'/Install')

        

    def installICS(self):

        nameLib = self.name['ics']
        srcPath = self.installPath+'/Interface/'+nameLib

        print '\nInstallation of '+self.name['ics']+' on architecture '+self.arch+'\n'
        
        pythonPath = self.path['python']

        try:
            guiFile = file(srcPath+'/ics.py', mode='r')
        except IOError:
            print 'Error : opening '+srcPath+'/SaturneGUI'
            print '        Code_Saturne GUI not available'
            sys.exit(1)
            
        self.path['ics'] = srcPath
        os.chdir(self.installPath+'/Install')

    def installNCS(self):
        
        nameLib = self.name['ncs']
        srcPath = self.installPath+'/Noyau/'+nameLib
        binPath = srcPath+'/bin'
        buildPath = srcPath+'/build'

        print '\nInstallation of '+self.name['ncs']+' on architecture '+self.arch+'\n'
        
        compCPath = self.name['compC']
        compFPath = self.name['compF']
        bftPath = self.path['bft']+'/arch/'+self.arch
        fvmPath = self.path['fvm']+'/arch/'+self.arch
        mpiPath = self.path['mpi']+'/arch/'+self.arch
        libxmlPath = self.path['libxml']+'/arch/'+self.arch
        tcltktixPath = self.path['tcltktix']+'/arch/'+self.arch
        pythonPath = self.path['python']

        activeMpi = 0
        activeXml = 0
        for lib in self.usage :
            if lib == 'mpi' :
                activeMpi = 1
            if lib == 'libxml' :
                activeXml = 1                

        os.chdir(binPath)

        if os.path.isdir(buildPath) :
            shutil.rmtree(buildPath)

        # adjust libraries location and -isystem in macros*.mk
        try:
            macrosFile = file(binPath+'/macros_'+self.arch+'.mk', mode='r')
        except IOError:
            print 'Error : opening '+binPath+'/macros_'+self.arch+'.mk'
            sys.exit(1)

        macrosTmp = open(binPath+'/macros_'+self.arch+'.mk.tmp', mode='w')

        filetmp = open('tmp.c', mode='w')
        filetmp.write('main(){\n return 0; \n}\n')
        filetmp.close()
        try:
            os.system('gcc -isystem . tmp.c')
            test = True
        except:
            test = False

        while 1 :
            line = macrosFile.readline()
            if (line == '') :
                break

            keyword = 'BFT_HOME '
            kw = re.compile('^[ ]*'+keyword)
            lineVar = kw.match(line)
            if lineVar :
                line = keyword+'= '+bftPath+'\n'

            keyword = 'FVM_HOME '
            kw = re.compile('^[ ]*'+keyword)
            lineVar = kw.match(line)
            if lineVar :
                line = keyword+'= '+fvmPath+'\n'

            keyword = 'MPI '
            kw = re.compile('^[ ]*'+keyword)
            lineVar = kw.match(line)
            if lineVar :
                line = keyword+'= '+str(activeMpi)+'\n'
                
            keyword = 'MPI_HOME '
            kw = re.compile('^[ ]*'+keyword)
            lineVar = kw.match(line)
            if lineVar :
                line = keyword+'= '+mpiPath+'\n'

            if not test :
                keyword = 'MPI_INC '
                kw = re.compile('^[ ]*'+keyword+'.*'+'isystem')
                lineVar = kw.match(line)
                if lineVar :
                    line = keyword+'= '+'-I$(MPI_HOME)/include \n'

            keyword = 'XML '
            kw = re.compile('^[ ]*'+keyword)
            lineVar = kw.match(line)
            if lineVar :
                line = keyword+'= '+str(activeXml)+'\n'
                
            keyword = 'XML_HOME '
            kw = re.compile('^[ ]*'+keyword)
            lineVar = kw.match(line)
            if lineVar :
                line = keyword+'= '+self.path['libxml']+'\n'

            keyword = 'CCOMP '
            kw = re.compile('^[ ]*'+keyword)
            lineVar = kw.match(line)
            if lineVar :
                line = keyword+'= '+compCPath+' \n'
                    
            keyword = 'FTNCOMP '
            kw = re.compile('^[ ]*'+keyword)
            lineVar = kw.match(line)
            if lineVar :
                line = keyword+'= '+compFPath+' \n'

            keyword = 'LDEDL '
            kw = re.compile('^[ ]*'+keyword)
            lineVar = kw.match(line)
            if lineVar :
                line = keyword+'= '+compFPath+' \n'

            macrosTmp.write(line)

        macrosFile.close()
        macrosTmp.close()

        os.rename(binPath+'/macros_'+self.arch+'.mk.tmp',binPath+'/macros_'+self.arch+'.mk')


        # adjust environment variables in cs_profile
        try:
            profileFile = file(binPath+'/cs_profile', mode='r')
        except IOError:
            print 'Error : opening '+binPath+'/cs_profile'
            sys.exit(1)

        profileTmp = file(binPath+'/cs_profile.tmp', mode='w')

        while 1 :
            line = profileFile.readline()
            if (line == '') :
                break

            keyword = 'CS_HOME='
            kw = re.compile('^[ ]*'+keyword)            
            lineVar = kw.match(line)
            if lineVar :
                line = keyword+self.installPath+'/Noyau/'+self.name['ncs']+'\n'
                
            os.environ['CS_HOME'] = self.installPath+'/Noyau/'+self.name['ncs']

            keyword = 'ECS_HOME='
            kw = re.compile('^[ ]*'+keyword)
            lineVar = kw.match(line)
            if lineVar :
                line = keyword+self.installPath+'/Enveloppe/'+self.name['ecs']+'\n'
                
            os.environ['ECS_HOME'] = self.installPath+'/Enveloppe/'+self.name['ecs']

            keyword = 'CSGUI_HOME='
            kw = re.compile('^[ ]*'+keyword)
            lineVar = kw.match(line)
            if lineVar :
                line = keyword+self.installPath+'/Interface/'+self.name['ics']+'\n'
                
            os.environ['CSGUI_HOME'] = self.installPath+'/Interface/'+self.name['ics']

            keyword = 'SYRCS_HOME='
            kw = re.compile('^[ ]*'+keyword)
            lineVar = kw.match(line)
            if lineVar :
                line = keyword+self.installPath+'/opt/'+self.name['syr_cs']+'\n'
                
            os.environ['SYRCS_HOME'] = self.installPath+'/opt/'+self.name['syr_cs']

            keyword = 'CS_MPI_PATH='
            kw = re.compile('^[ ]*'+keyword)
            lineVar = kw.match(line)
            if lineVar :
                line = keyword+mpiPath+'/bin\n'
                
            os.environ['CS_MPI_PATH'] = mpiPath

            keyword = 'LD_LIBRARY_PATH='
            kw = re.compile('^[ ]*'+keyword)
            lineVar = kw.match(line)
            if lineVar :
                line = keyword+'.:'+tcltktixPath+'/lib:'+libxmlPath+'/lib:$LD_LIBRARY_PATH \n'

            os.environ['LD_LIBRARY_PATH'] = '.:'+tcltktixPath+'/lib:'+libxmlPath+'/lib:$LD_LIBRARY_PATH'

            profileTmp.write(line)

        profileFile.close()
        profileTmp.close()

        os.rename(binPath+'/cs_profile.tmp',binPath+'/cs_profile')
        

        os.system('. ./cs_profile; ecs -h')
        
        os.system('. ./cs_profile; ./lance_install')
        
        os.system('. ./cs_profile; ./lance_install DOC')

        self.path['ncs'] = srcPath
        os.chdir(self.installPath+'/Install')


    def report(self):
        #
        # setup file update
        #
        setupFile = file('setup', mode='w')

        setupFile.write('#--------------------------------------------------------\n')
        setupFile.write('# Architecture Name\n')
        setupFile.write('#--------------------------------------------------------\n')
        setupFile.write('#nom_arch  linux_MPICH   <- for specific architecture\n')
        setupFile.write('#nom_arch                <- leave empty for automatic default\n')
        setupFile.write('#                           value (based on uname)\n')
        setupFile.write('nom_arch '+self.arch+'\n#\n')

        setupFile.write('#--------------------------------------------------------\n')
        setupFile.write('# C compiler                                             \n')
        setupFile.write('#--------------------------------------------------------\n')
        lib='compC'
        setupFile.write(lib+'   '+self.name[lib]+"\n#\n")
        
        setupFile.write('#--------------------------------------------------------\n')
        setupFile.write('# Fortran compiler                                       \n')
        setupFile.write('#--------------------------------------------------------\n')
        lib='compF'
        setupFile.write(lib+'   '+self.name[lib]+"\n#\n")
        
        setupFile.write('#--------------------------------------------------------\n')
        setupFile.write('#  Name     Path        NameLib       Usage       Install\n')
        setupFile.write('#--------------------------------------------------------\n')        

        for lib in self.listLib:
            use = "no"
            for lib1 in self.usage:
                if lib1 == lib:
                    use = "yes"
                    
            install = "no"
            if lib in self.libraries :
                install = "yes"
                if self.install[lib] == 'ok':
                    install = "no"
            
            setupFile.write(lib+'   '+self.path[lib]+'   '+self.name[lib]+'   '+use+'   '+install+"\n")    
        
        setupFile.close()


    def prepareValid(self):

        nameLib = self.name['ncs']
        srcPath = self.installPath+'/Noyau/'+nameLib
        binPath = srcPath+'/bin'
        baseRefPath = self.installPath+'/Validation'
        baseTestPath = self.installPath+'/test_Validation'
        if os.path.isdir(baseTestPath) :
            shutil.rmtree(baseTestPath)        
        os.makedirs(baseTestPath)
        
        withMpi = 'no'
        for lib in self.usage :
            if lib == 'mpi' :
                withMpi = 'yes'
        
        #
        # autovalid.xml update
        #
        try:
            autoFile = file(binPath+'/autovalid.xml', mode='r')
        except IOError:
            print 'Error : opening '+binPath+'/autovalid.xml'
            sys.exit(1)

        autoTmp = file( baseTestPath+'/autovalid.xml.tmp', mode='w')

        while 1 :
            line = autoFile.readline()
            if (line == '') :
                break

            keyword = '<referencepath>'
            kw = re.compile('^[ ]*'+keyword)
            lineVar = kw.match(line)
            if lineVar :
                line = '  <referencepath>'+baseRefPath+'</referencepath>\n'


            if withMpi :
                keyword = "<case label='CAS1-2PROCS'"
                kw = re.compile('^[ ]*'+keyword)
                lineVar = kw.match(line)
                if lineVar :
                    line = "<case label='CAS1-2PROCS' status='on' compute='on'>\n"

            autoTmp.write(line)

        autoFile.close()
        autoTmp.close()

        os.rename( baseTestPath+'/autovalid.xml.tmp', baseTestPath+'/autovalid.xml')

        print 'It is suggested to test Code_Saturne installation with ./lance_valid.sh'
        
        print 'Thank you for choosing Code_Saturne'       
        
        
    
if __name__ == '__main__':
	main()





syntax highlighted by Code2HTML, v. 0.9.1