15d5a5a7bSMatthew Knepley#!/usr/bin/env python 25d5a5a7bSMatthew Knepleyimport os 35d5a5a7bSMatthew Knepleyimport sys 44f8a5b45SBarry Smithimport commands 5a1eda5bfSSatish Balay# to load ~/.pythonrc.py before inserting correct BuildSystem to path 6a1eda5bfSSatish Balayimport user 77c9abfe7SSatish BalayextraLogs = [] 8b0b472b0SSatish Balaypetsc_arch = '' 94b8aa89bSBarry Smith 1044b0d7f9SSatish Balay# Use en_US as language so that BuildSystem parses compiler messages in english 119b436e4bSSatish Balayif 'LC_LOCAL' in os.environ and os.environ['LC_LOCAL'] != '' and os.environ['LC_LOCAL'] != 'en_US' and os.environ['LC_LOCAL']!= 'en_US.UTF-8': os.environ['LC_LOCAL'] = 'en_US.UTF-8' 129b436e4bSSatish Balayif 'LANG' in os.environ and os.environ['LANG'] != '' and os.environ['LANG'] != 'en_US' and os.environ['LANG'] != 'en_US.UTF-8': os.environ['LANG'] = 'en_US.UTF-8' 1344b0d7f9SSatish Balay 14378f148eSBarry Smithif not hasattr(sys, 'version_info') or not sys.version_info[1] >= 2 or not sys.version_info[0] >= 2: 15495ffa62SBarry Smith print '**** You must have Python version 2.2 or higher to run config/configure.py ******' 16495ffa62SBarry Smith print '* Python is easy to install for end users or sys-admin. *' 1732077d6dSBarry Smith print '* http://www.python.org/download/ *' 1832077d6dSBarry Smith print '* *' 19495ffa62SBarry Smith print '* You CANNOT configure PETSc without Python *' 20495ffa62SBarry Smith print '* http://www.mcs.anl.gov/petsc/petsc-as/documentation/installation.html *' 2132077d6dSBarry Smith print '*********************************************************************************' 22b26a8723SBarry Smith sys.exit(4) 232fb34ac0SMatthew Knepley 24*ccb279e1SMatthew Knepleydef check_for_option_mistakes(opts): 25*ccb279e1SMatthew Knepley for name in opts: 26*ccb279e1SMatthew Knepley if name.find('_') >= 0: 27*ccb279e1SMatthew Knepley exception = False 28*ccb279e1SMatthew Knepley for exc in ['superlu_dist', 'PETSC_ARCH', 'PETSC_DIR', 'CXX_CXXFLAGS', 'LD_SHARED', 'CC_LINKER_FLAGS', 'CXX_LINKER_FLAGS', 'FC_LINKER_FLAGS', 'AR_FLAGS', 'C_VERSION', 'CXX_VERSION', 'FC_VERSION']: 29*ccb279e1SMatthew Knepley if name.find(exc) >= 0: 30*ccb279e1SMatthew Knepley exception = True 31*ccb279e1SMatthew Knepley if not exception: 32*ccb279e1SMatthew Knepley raise ValueError('The option '+name+' should probably be '+name.replace('_', '-')); 33*ccb279e1SMatthew Knepley return 34*ccb279e1SMatthew Knepley 3559e9bfd6SSatish Balaydef check_petsc_arch(opts): 36c43ea0feSSatish Balay # If PETSC_ARCH not specified - use script name (if not configure.py) 37b0b472b0SSatish Balay global petsc_arch 38c43ea0feSSatish Balay found = 0 3959e9bfd6SSatish Balay for name in opts: 40c43ea0feSSatish Balay if name.find('PETSC_ARCH=') >= 0: 41b0b472b0SSatish Balay petsc_arch=name.split('=')[1] 42c43ea0feSSatish Balay found = 1 4359e9bfd6SSatish Balay break 4459e9bfd6SSatish Balay # If not yet specified - use the filename of script 45c43ea0feSSatish Balay if not found: 4659e9bfd6SSatish Balay filename = os.path.basename(sys.argv[0]) 477eed1879SBarry Smith if not filename.startswith('configure') and not filename.startswith('reconfigure'): 48b0b472b0SSatish Balay petsc_arch=os.path.splitext(os.path.basename(sys.argv[0]))[0] 49b0b472b0SSatish Balay useName = 'PETSC_ARCH='+petsc_arch 5059e9bfd6SSatish Balay opts.append(useName) 511937db7aSSatish Balay return 0 524b8aa89bSBarry Smith 5385ef4d1eSSatish Balaydef chkbrokencygwin(): 549dabcff0SSatish Balay if os.path.exists('/usr/bin/cygcheck.exe'): 559dabcff0SSatish Balay buf = os.popen('/usr/bin/cygcheck.exe -c cygwin').read() 569dabcff0SSatish Balay if buf.find('1.5.11-1') > -1: 571937db7aSSatish Balay print '=================================================================================' 581937db7aSSatish Balay print ' *** cygwin-1.5.11-1 detected. config/configure.py fails with this version ***' 591937db7aSSatish Balay print ' *** Please upgrade to cygwin-1.5.12-1 or newer version. This can ***' 601937db7aSSatish Balay print ' *** be done by running cygwin-setup, selecting "next" all the way.***' 611937db7aSSatish Balay print '=================================================================================' 621937db7aSSatish Balay sys.exit(3) 639dabcff0SSatish Balay return 0 649dabcff0SSatish Balay 6585ef4d1eSSatish Balaydef chkusingwindowspython(): 661937db7aSSatish Balay if os.path.exists('/usr/bin/cygcheck.exe') and sys.platform != 'cygwin': 671937db7aSSatish Balay print '=================================================================================' 681937db7aSSatish Balay print ' *** Non-cygwin python detected. Please rerun config/configure.py with cygwin-python ***' 691937db7aSSatish Balay print '=================================================================================' 701937db7aSSatish Balay sys.exit(3) 7185ef4d1eSSatish Balay return 0 7285ef4d1eSSatish Balay 7385ef4d1eSSatish Balaydef chkcygwinpythonver(): 7471384062SSatish Balay if os.path.exists('/usr/bin/cygcheck.exe'): 7571384062SSatish Balay buf = os.popen('/usr/bin/cygcheck.exe -c python').read() 76c4b7e894SSatish Balay if (buf.find('2.4') > -1) or (buf.find('2.5') > -1) or (buf.find('2.6') > -1): 771937db7aSSatish Balay sys.argv.append('--useThreads=0') 781937db7aSSatish Balay extraLogs.append('''\ 791937db7aSSatish Balay================================================================================ 801937db7aSSatish Balay** Cygwin-python-2.4/2.5 detected. Threads do not work correctly with this version * 811937db7aSSatish Balay ********* Disabling thread usage for this run of config/configure.py ********** 821937db7aSSatish Balay================================================================================''') 8371384062SSatish Balay return 0 8471384062SSatish Balay 851937db7aSSatish Balaydef chkrhl9(): 861937db7aSSatish Balay if os.path.exists('/etc/redhat-release'): 87836c2c52SSatish Balay try: 88594eb360SSatish Balay file = open('/etc/redhat-release','r') 89836c2c52SSatish Balay buf = file.read() 90836c2c52SSatish Balay file.close() 91836c2c52SSatish Balay except: 92836c2c52SSatish Balay # can't read file - assume dangerous RHL9 931937db7aSSatish Balay buf = 'Shrike' 94836c2c52SSatish Balay if buf.find('Shrike') > -1: 951937db7aSSatish Balay sys.argv.append('--useThreads=0') 961937db7aSSatish Balay extraLogs.append('''\ 971937db7aSSatish Balay================================================================================ 981937db7aSSatish Balay *** RHL9 detected. Threads do not work correctly with this distribution *** 991937db7aSSatish Balay ****** Disabling thread usage for this run of config/configure.py ******* 1001937db7aSSatish Balay================================================================================''') 101836c2c52SSatish Balay return 0 102836c2c52SSatish Balay 103da58527dSSatish Balaydef check_broken_configure_log_links(): 104da58527dSSatish Balay '''Sometime symlinks can get broken if the original files are deleted. Delete such broken links''' 105da58527dSSatish Balay import os 106da58527dSSatish Balay for logfile in ['configure.log','configure.log.bkp']: 107da58527dSSatish Balay if os.path.islink(logfile) and not os.path.isfile(logfile): os.remove(logfile) 108da58527dSSatish Balay return 109da58527dSSatish Balay 110da1d79b4SSatish Balaydef move_configure_log(framework): 111da1d79b4SSatish Balay '''Move configure.log to PETSC_ARCH/conf - and update configure.log.bkp in both locations appropriately''' 112b0b472b0SSatish Balay global petsc_arch 113b0b472b0SSatish Balay 114b0b472b0SSatish Balay if hasattr(framework,'arch'): petsc_arch = framework.arch 115b0b472b0SSatish Balay if hasattr(framework,'logName'): curr_file = framework.logName 116b0b472b0SSatish Balay else: curr_file = 'configure.log' 117b0b472b0SSatish Balay 118b0b472b0SSatish Balay if petsc_arch: 119da1d79b4SSatish Balay import shutil 120da1d79b4SSatish Balay import os 121b0b472b0SSatish Balay 122b0b472b0SSatish Balay # Just in case - confdir is not created 123b0b472b0SSatish Balay conf_dir = os.path.join(petsc_arch,'conf') 124b0b472b0SSatish Balay if not os.path.isdir(petsc_arch): os.mkdir(petsc_arch) 125b0b472b0SSatish Balay if not os.path.isdir(conf_dir): os.mkdir(conf_dir) 126b0b472b0SSatish Balay 127da1d79b4SSatish Balay curr_bkp = curr_file + '.bkp' 128b0b472b0SSatish Balay new_file = os.path.join(conf_dir,curr_file) 129da1d79b4SSatish Balay new_bkp = new_file + '.bkp' 130da1d79b4SSatish Balay 131da1d79b4SSatish Balay # Keep backup in $PETSC_ARCH/conf location 132da1d79b4SSatish Balay if os.path.isfile(new_bkp): os.remove(new_bkp) 133da1d79b4SSatish Balay if os.path.isfile(new_file): os.rename(new_file,new_bkp) 134da58527dSSatish Balay if os.path.isfile(curr_file): shutil.move(curr_file,new_file) 135da58527dSSatish Balay if os.path.isfile(new_file): os.symlink(new_file,curr_file) 136da1d79b4SSatish Balay # If the old bkp is using the same PETSC_ARCH/conf - then update bkp link 137da1d79b4SSatish Balay if os.path.realpath(curr_bkp) == os.path.realpath(new_file): 138da58527dSSatish Balay if os.path.isfile(curr_bkp): os.remove(curr_bkp) 139da58527dSSatish Balay if os.path.isfile(new_bkp): os.symlink(new_bkp,curr_bkp) 140da1d79b4SSatish Balay return 141da1d79b4SSatish Balay 1425d5a5a7bSMatthew Knepleydef petsc_configure(configure_options): 14359e9bfd6SSatish Balay print '=================================================================================' 14459e9bfd6SSatish Balay print ' Configuring PETSc to compile on your system ' 14559e9bfd6SSatish Balay print '=================================================================================' 14659e9bfd6SSatish Balay 147c43ea0feSSatish Balay # Command line arguments take precedence (but don't destroy argv[0]) 148c43ea0feSSatish Balay sys.argv = sys.argv[:1] + configure_options + sys.argv[1:] 149*ccb279e1SMatthew Knepley check_for_option_mistakes(sys.argv) 15059e9bfd6SSatish Balay # check PETSC_ARCH 15159e9bfd6SSatish Balay check_petsc_arch(sys.argv) 152da58527dSSatish Balay check_broken_configure_log_links() 1535fb2c094SBarry Smith 154c22cdea9SBarry Smith # support a few standard configure option types 155ed6a7445SBarry Smith for l in range(0,len(sys.argv)): 156c22cdea9SBarry Smith name = sys.argv[l] 157637cc2ebSSatish Balay if name.find('enable-') >= 0: 158193cd51eSMatthew Knepley if name.find('=') == -1: 159193cd51eSMatthew Knepley sys.argv[l] = name.replace('enable-','with-')+'=1' 160193cd51eSMatthew Knepley else: 161193cd51eSMatthew Knepley head, tail = name.split('=', 1) 162193cd51eSMatthew Knepley sys.argv[l] = head.replace('enable-','with-')+'='+tail 163637cc2ebSSatish Balay if name.find('disable-') >= 0: 164193cd51eSMatthew Knepley if name.find('=') == -1: 165193cd51eSMatthew Knepley sys.argv[l] = name.replace('disable-','with-')+'=0' 166193cd51eSMatthew Knepley else: 167193cd51eSMatthew Knepley head, tail = name.split('=', 1) 168193cd51eSMatthew Knepley if tail == '1': tail = '0' 169193cd51eSMatthew Knepley sys.argv[l] = head.replace('disable-','with-')+'='+tail 170637cc2ebSSatish Balay if name.find('without-') >= 0: 171193cd51eSMatthew Knepley if name.find('=') == -1: 172193cd51eSMatthew Knepley sys.argv[l] = name.replace('without-','with-')+'=0' 173193cd51eSMatthew Knepley else: 174193cd51eSMatthew Knepley head, tail = name.split('=', 1) 175193cd51eSMatthew Knepley if tail == '1': tail = '0' 176193cd51eSMatthew Knepley sys.argv[l] = head.replace('without-','with-')+'='+tail 177adc3e427SMatthew Knepley 1789dabcff0SSatish Balay # Check for broken cygwin 1791937db7aSSatish Balay chkbrokencygwin() 180d65f3bddSMatthew Knepley # Disable threads on RHL9 1811937db7aSSatish Balay chkrhl9() 18285ef4d1eSSatish Balay # Make sure cygwin-python is used on windows 1831937db7aSSatish Balay chkusingwindowspython() 18485ef4d1eSSatish Balay # Threads don't work for cygwin & python-2.4, 2.5 etc.. 1851937db7aSSatish Balay chkcygwinpythonver() 1869dabcff0SSatish Balay 18787282423SMatthew Knepley # Should be run from the toplevel 188dbca6d9dSSatish Balay configDir = os.path.abspath('config') 189f8833479SBarry Smith bsDir = os.path.join(configDir, 'BuildSystem') 190f8833479SBarry Smith if not os.path.isdir(configDir): 1915d5a5a7bSMatthew Knepley raise RuntimeError('Run configure from $PETSC_DIR, not '+os.path.abspath('.')) 19287282423SMatthew Knepley if not os.path.isdir(bsDir): 193ec1ee742SBarry Smith print '=================================================================================' 194dbca6d9dSSatish Balay print '''++ Could not locate BuildSystem in %s.''' % configDir 1954564aff7SMatthew Knepley print '''++ Downloading it using "hg clone http://hg.mcs.anl.gov/petsc/BuildSystem %s"''' % bsDir 196ec1ee742SBarry Smith print '=================================================================================' 1974564aff7SMatthew Knepley (status,output) = commands.getstatusoutput('hg clone http://petsc.cs.iit.edu/petsc/BuildSystem '+ bsDir) 1987d7624c9SBarry Smith if status: 1997d7624c9SBarry Smith if output.find('ommand not found') >= 0: 200ec1ee742SBarry Smith print '=================================================================================' 20159dc5438SMatthew Knepley print '''** Unable to locate hg (Mercurial) to download BuildSystem; make sure hg is in your path''' 202ab21cac3SMatthew Knepley print '''** or manually copy BuildSystem to $PETSC_DIR/config/BuildSystem from a machine where''' 20359dc5438SMatthew Knepley print '''** you do have hg installed and can clone BuildSystem. ''' 204ec1ee742SBarry Smith print '=================================================================================' 2057d7624c9SBarry Smith elif output.find('Cannot resolve host') >= 0: 206ec1ee742SBarry Smith print '=================================================================================' 207d688700cSSatish Balay print '''** Unable to download BuildSystem. You must be off the network.''' 208d688700cSSatish Balay print '''** Connect to the internet and run config/configure.py again.''' 209ec1ee742SBarry Smith print '=================================================================================' 2107d7624c9SBarry Smith else: 211ec1ee742SBarry Smith print '=================================================================================' 212d688700cSSatish Balay print '''** Unable to download BuildSystem. Please send this message to petsc-maint@mcs.anl.gov''' 213ec1ee742SBarry Smith print '=================================================================================' 2147d7624c9SBarry Smith print output 21587282423SMatthew Knepley sys.exit(3) 2164f8a5b45SBarry Smith 21787282423SMatthew Knepley sys.path.insert(0, bsDir) 218f8833479SBarry Smith sys.path.insert(0, configDir) 219e69ef9dfSMatthew Knepley import config.base 2205d5a5a7bSMatthew Knepley import config.framework 221f56be888SMatthew Knepley import cPickle 2224f8a5b45SBarry Smith 2232e22a60eSMatthew Knepley # Disable shared libraries by default 2242e22a60eSMatthew Knepley import nargs 2252e22a60eSMatthew Knepley if nargs.Arg.findArgument('with-shared', sys.argv[1:]) is None: 2262e22a60eSMatthew Knepley sys.argv.append('--with-shared=0') 2272e22a60eSMatthew Knepley 2289dd2fdb1SMatthew Knepley framework = None 2299dd2fdb1SMatthew Knepley try: 2301a784507SMatthew Knepley framework = config.framework.Framework(['--configModules=PETSc.Configure','--optionsModule=PETSc.compilerOptions']+sys.argv[1:], loadArgDB = 0) 231d65f3bddSMatthew Knepley framework.setup() 232d65f3bddSMatthew Knepley framework.logPrint('\n'.join(extraLogs)) 233f24f64feSBarry Smith framework.configure(out = sys.stdout) 234358ebc22SMatthew Knepley framework.storeSubstitutions(framework.argDB) 235f56be888SMatthew Knepley framework.argDB['configureCache'] = cPickle.dumps(framework) 2367cfd0b05SBarry Smith import PETSc.packages 2377cfd0b05SBarry Smith for i in framework.packages: 2387cfd0b05SBarry Smith if hasattr(i,'postProcess'): 2397cfd0b05SBarry Smith i.postProcess() 2407cfd0b05SBarry Smith framework.logClear() 241eefa2c0fSBarry Smith framework.closeLog() 242da1d79b4SSatish Balay move_configure_log(framework) 243dd50d019SBarry Smith return 0 244e69ef9dfSMatthew Knepley except (RuntimeError, config.base.ConfigureSetupError), e: 2457d670a3cSBarry Smith emsg = str(e) 24642351d26SSatish Balay if not emsg.endswith('\n'): emsg = emsg+'\n' 247fe09c992SBarry Smith msg ='*********************************************************************************\n'\ 248fe09c992SBarry Smith +' UNABLE to CONFIGURE with GIVEN OPTIONS (see configure.log for details):\n' \ 249fe09c992SBarry Smith +'---------------------------------------------------------------------------------------\n' \ 2507d670a3cSBarry Smith +emsg+'*********************************************************************************\n' 251e9f3bb17SBarry Smith se = '' 2529dd2fdb1SMatthew Knepley except (TypeError, ValueError), e: 2537d670a3cSBarry Smith emsg = str(e) 25442351d26SSatish Balay if not emsg.endswith('\n'): emsg = emsg+'\n' 255fe09c992SBarry Smith msg ='*********************************************************************************\n'\ 256fe09c992SBarry Smith +' ERROR in COMMAND LINE ARGUMENT to config/configure.py \n' \ 257fe09c992SBarry Smith +'---------------------------------------------------------------------------------------\n' \ 2587d670a3cSBarry Smith +emsg+'*********************************************************************************\n' 2591a02243aSBarry Smith se = '' 26096dc2fe8SMatthew Knepley except ImportError, e : 2617d670a3cSBarry Smith emsg = str(e) 26242351d26SSatish Balay if not emsg.endswith('\n'): emsg = emsg+'\n' 263fe09c992SBarry Smith msg ='*********************************************************************************\n'\ 264fe09c992SBarry Smith +' UNABLE to FIND MODULE for config/configure.py \n' \ 265fe09c992SBarry Smith +'---------------------------------------------------------------------------------------\n' \ 2667d670a3cSBarry Smith +emsg+'*********************************************************************************\n' 26796dc2fe8SMatthew Knepley se = '' 26801def6f0SMatthew Knepley except OSError, e : 26901def6f0SMatthew Knepley emsg = str(e) 27001def6f0SMatthew Knepley if not emsg.endswith('\n'): emsg = emsg+'\n' 27101def6f0SMatthew Knepley msg ='*********************************************************************************\n'\ 27201def6f0SMatthew Knepley +' UNABLE to EXECUTE BINARIES for config/configure.py \n' \ 27301def6f0SMatthew Knepley +'---------------------------------------------------------------------------------------\n' \ 27401def6f0SMatthew Knepley +emsg+'*********************************************************************************\n' 27501def6f0SMatthew Knepley se = '' 276d7d3c4beSMatthew Knepley except SystemExit, e: 277d7d3c4beSMatthew Knepley if e.code is None or e.code == 0: 278d7d3c4beSMatthew Knepley return 279fe09c992SBarry Smith msg ='*********************************************************************************\n'\ 280b1dada7fSMatthew Knepley +' CONFIGURATION FAILURE (Please send configure.log to petsc-maint@mcs.anl.gov)\n' \ 281fe09c992SBarry Smith +'*********************************************************************************\n' 282d7d3c4beSMatthew Knepley se = str(e) 283e9f3bb17SBarry Smith except Exception, e: 284fe09c992SBarry Smith msg ='*********************************************************************************\n'\ 285fe09c992SBarry Smith +' CONFIGURATION CRASH (Please send configure.log to petsc-maint@mcs.anl.gov)\n' \ 286fe09c992SBarry Smith +'*********************************************************************************\n' 287e9f3bb17SBarry Smith se = str(e) 288e9f3bb17SBarry Smith 289e9f3bb17SBarry Smith print msg 2909dd2fdb1SMatthew Knepley if not framework is None: 2919dd2fdb1SMatthew Knepley framework.logClear() 292e9f3bb17SBarry Smith if hasattr(framework, 'log'): 293f6614063SBarry Smith import traceback 294b1dada7fSMatthew Knepley try: 295f24f64feSBarry Smith framework.log.write(msg+se) 296f24f64feSBarry Smith traceback.print_tb(sys.exc_info()[2], file = framework.log) 297da1d79b4SSatish Balay move_configure_log(framework) 298b1dada7fSMatthew Knepley except: 299b1dada7fSMatthew Knepley pass 300e9f3bb17SBarry Smith sys.exit(1) 3015a74f024SMatthew Knepley else: 3025a74f024SMatthew Knepley print se 3035a74f024SMatthew Knepley import traceback 3045a74f024SMatthew Knepley traceback.print_tb(sys.exc_info()[2]) 305da1d79b4SSatish Balay move_configure_log(framework) 3065d5a5a7bSMatthew Knepley 3075d5a5a7bSMatthew Knepleyif __name__ == '__main__': 308a030c540SBarry Smith petsc_configure([]) 309759acf64SBarry Smith 310