diff --git a/installation/setup_shellrc.py b/installation/setup_shellrc.py index e57909b65..438aa810c 100755 --- a/installation/setup_shellrc.py +++ b/installation/setup_shellrc.py @@ -3,45 +3,50 @@ import os,sys,string,re from optparse import OptionParser -pathInfo = {\ - 'acml': '/opt/acml4.4.0', - 'fftw': './fftw', - 'msc': '/msc', - } - validShells = {\ - 'bash':['.bashrc','.bash_profile'], + 'bash':['.bashrc','.bash_profile','.bash_login','.profile'], 'csh': ['.cshrc'], } -environment = [\ - { 'name': 'DAMASK_ROOT', - 'delete':'DamaskRoot', - 'substitute':'[DamaskRoot]', - 'append': False, - }, - { 'name': 'DAMASK_BIN', - 'delete':'os.path.join(DamaskRoot,"bin")', - 'substitute':'[os.path.join(DamaskRoot,"bin")]', - 'append': False, - }, - { 'name': 'PATH', - 'delete':'"${DAMASK_BIN}"', - 'substitute':'["${DAMASK_BIN}"]', - 'append': True, - }, - { 'name': 'PYTHONPATH', - 'delete':'"${DAMASK_ROOT}/lib"', - 'substitute':'["${DAMASK_ROOT}/lib"]', - 'append': True, - }, - { 'name': 'LD_LIBRARY_PATH', - 'delete':'"acml"', # what keywords trigger item deletion from existing path - 'substitute':'[os.path.join(pathInfo["acml"],"ifort64_mp/lib"),\ - os.path.join(pathInfo["acml"],"ifort64/lib")]', # what to substitute for deleted path items - 'append': True, # whether new entries append to existing ${env} - }, - ] +env_order = ['DAMASK_ROOT','DAMASK_BIN','PATH','PYTHONPATH','LD_LIBRARY_PATH'] +environment = { 'DAMASK_ROOT': + [{'delete':'DamaskRoot', + 'substitute':'[DamaskRoot]', + 'append': False, + }, + ], + 'DAMASK_BIN': + [{'delete':'os.path.join(DamaskRoot,"bin")', + 'substitute':'[os.path.join(DamaskRoot,"bin")]', + 'append': False, + }, + ], + 'PATH': + [{'delete':'"${DAMASK_BIN}"', + 'substitute':'["${DAMASK_BIN}"]', + 'append': True, + }, + ], + 'PYTHONPATH': + [{'delete':'"${DAMASK_ROOT}/lib"', + 'substitute':'["${DAMASK_ROOT}/lib"]', + 'append': True, + }, + ], + 'LD_LIBRARY_PATH': + [{'activate': 'pathInfo["acml"]', + 'delete':'"acml"', # what keywords trigger item deletion from existing path + 'substitute':'[os.path.join(pathInfo["acml"],"ifort64_mp/lib"),\ + os.path.join(pathInfo["acml"],"ifort64/lib")]', # what to substitute for deleted path items + 'append': True, # whether new entries append to existing ${env} + }, + {'activate': 'pathInfo["lapack"]', + 'substitute':'[pathInfo["lapack"]]', # what to substitute for deleted path items + 'append': True, # whether new entries append to existing ${env} + }, + ], + } + parser = OptionParser(usage="%prog [options]", description = """ Sets up your shell resource to be compatible with DAMASK. """ + string.replace('$Id$','\n','\\n') @@ -55,6 +60,8 @@ parser.set_defaults(shell = 'bash') (options, args) = parser.parse_args() +pathInfo = {} + DamaskRoot = os.path.normpath(os.path.join(os.path.dirname(os.path.realpath(sys.argv[0])),'../')) try: # check for user-defined pathinfo file = open(os.path.join(DamaskRoot,'lib/pathinfo')) @@ -76,24 +83,41 @@ if theShell == 'bash': content = map(string.strip,rc.readlines()) rc.close() - output = [] - for var in environment: var['matched'] = False + match = {} + for var in env_order: match[var] = False + output = [] + for line in content: - for var in environment: - m = re.search(r'^(.*? %s=)([^;]*)(.*)$'%var['name'],line) + for var in env_order: + m = re.search(r'^(.*? %s=)([^;]*)(.*)$'%var,line) if m: - substitute = [path for path in m.group(2).split(':') if eval(var['delete']) not in path] + \ - eval(var['substitute']) - line = m.group(1)+':'.join(substitute)+m.group(3) - var['matched'] = True + match[var] = True + items = m.group(2).split(':') + for piece in environment[var]: + try: + if 'activate' not in piece or eval(piece['activate']) != '': + items = [path for path in items if 'delete' not in piece or eval(piece['delete']) not in path] + \ + eval(piece['substitute']) + except: + pass + line = m.group(1)+':'.join(items)+m.group(3) output.append(line) - for var in environment: - if not var['matched']: - output.append('export %s=%s'%(var['name'],':'.join({True:['${%s}'%var['name']],False:[]}[var['append']]+\ - eval(var['substitute'])))) + for var in env_order: + if not match[var]: + items = ['${%s}'%var] + for piece in environment[var]: + try: + if 'activate' not in piece or eval(piece['activate']) != '': + if piece['append']: + items += eval(piece['substitute']) + else: + items = eval(piece['substitute']) + except: + pass + output.append('export %s=%s'%(var,':'.join(items))) rc = open(os.path.join(theHome,theRC),'w') rc.write('\n'.join(output)+'\n')