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 2459e9bfd6SSatish Balaydef check_petsc_arch(opts): 25c43ea0feSSatish Balay # If PETSC_ARCH not specified - use script name (if not configure.py) 26b0b472b0SSatish Balay global petsc_arch 27c43ea0feSSatish Balay found = 0 2859e9bfd6SSatish Balay for name in opts: 29c43ea0feSSatish Balay if name.find('PETSC_ARCH=') >= 0: 30b0b472b0SSatish Balay petsc_arch=name.split('=')[1] 31c43ea0feSSatish Balay found = 1 3259e9bfd6SSatish Balay break 3359e9bfd6SSatish Balay # If not yet specified - use the filename of script 34c43ea0feSSatish Balay if not found: 3559e9bfd6SSatish Balay filename = os.path.basename(sys.argv[0]) 367eed1879SBarry Smith if not filename.startswith('configure') and not filename.startswith('reconfigure'): 37b0b472b0SSatish Balay petsc_arch=os.path.splitext(os.path.basename(sys.argv[0]))[0] 38b0b472b0SSatish Balay useName = 'PETSC_ARCH='+petsc_arch 3959e9bfd6SSatish Balay opts.append(useName) 401937db7aSSatish Balay return 0 414b8aa89bSBarry Smith 4285ef4d1eSSatish Balaydef chkbrokencygwin(): 439dabcff0SSatish Balay if os.path.exists('/usr/bin/cygcheck.exe'): 449dabcff0SSatish Balay buf = os.popen('/usr/bin/cygcheck.exe -c cygwin').read() 459dabcff0SSatish Balay if buf.find('1.5.11-1') > -1: 461937db7aSSatish Balay print '=================================================================================' 471937db7aSSatish Balay print ' *** cygwin-1.5.11-1 detected. config/configure.py fails with this version ***' 481937db7aSSatish Balay print ' *** Please upgrade to cygwin-1.5.12-1 or newer version. This can ***' 491937db7aSSatish Balay print ' *** be done by running cygwin-setup, selecting "next" all the way.***' 501937db7aSSatish Balay print '=================================================================================' 511937db7aSSatish Balay sys.exit(3) 529dabcff0SSatish Balay return 0 539dabcff0SSatish Balay 5485ef4d1eSSatish Balaydef chkusingwindowspython(): 551937db7aSSatish Balay if os.path.exists('/usr/bin/cygcheck.exe') and sys.platform != 'cygwin': 561937db7aSSatish Balay print '=================================================================================' 571937db7aSSatish Balay print ' *** Non-cygwin python detected. Please rerun config/configure.py with cygwin-python ***' 581937db7aSSatish Balay print '=================================================================================' 591937db7aSSatish Balay sys.exit(3) 6085ef4d1eSSatish Balay return 0 6185ef4d1eSSatish Balay 6285ef4d1eSSatish Balaydef chkcygwinpythonver(): 6371384062SSatish Balay if os.path.exists('/usr/bin/cygcheck.exe'): 6471384062SSatish Balay buf = os.popen('/usr/bin/cygcheck.exe -c python').read() 65c4b7e894SSatish Balay if (buf.find('2.4') > -1) or (buf.find('2.5') > -1) or (buf.find('2.6') > -1): 661937db7aSSatish Balay sys.argv.append('--useThreads=0') 671937db7aSSatish Balay extraLogs.append('''\ 681937db7aSSatish Balay================================================================================ 691937db7aSSatish Balay** Cygwin-python-2.4/2.5 detected. Threads do not work correctly with this version * 701937db7aSSatish Balay ********* Disabling thread usage for this run of config/configure.py ********** 711937db7aSSatish Balay================================================================================''') 7271384062SSatish Balay return 0 7371384062SSatish Balay 741937db7aSSatish Balaydef chkrhl9(): 751937db7aSSatish Balay if os.path.exists('/etc/redhat-release'): 76836c2c52SSatish Balay try: 77594eb360SSatish Balay file = open('/etc/redhat-release','r') 78836c2c52SSatish Balay buf = file.read() 79836c2c52SSatish Balay file.close() 80836c2c52SSatish Balay except: 81836c2c52SSatish Balay # can't read file - assume dangerous RHL9 821937db7aSSatish Balay buf = 'Shrike' 83836c2c52SSatish Balay if buf.find('Shrike') > -1: 841937db7aSSatish Balay sys.argv.append('--useThreads=0') 851937db7aSSatish Balay extraLogs.append('''\ 861937db7aSSatish Balay================================================================================ 871937db7aSSatish Balay *** RHL9 detected. Threads do not work correctly with this distribution *** 881937db7aSSatish Balay ****** Disabling thread usage for this run of config/configure.py ******* 891937db7aSSatish Balay================================================================================''') 90836c2c52SSatish Balay return 0 91836c2c52SSatish Balay 92da58527dSSatish Balaydef check_broken_configure_log_links(): 93da58527dSSatish Balay '''Sometime symlinks can get broken if the original files are deleted. Delete such broken links''' 94da58527dSSatish Balay import os 95da58527dSSatish Balay for logfile in ['configure.log','configure.log.bkp']: 96da58527dSSatish Balay if os.path.islink(logfile) and not os.path.isfile(logfile): os.remove(logfile) 97da58527dSSatish Balay return 98da58527dSSatish Balay 99da1d79b4SSatish Balaydef move_configure_log(framework): 100da1d79b4SSatish Balay '''Move configure.log to PETSC_ARCH/conf - and update configure.log.bkp in both locations appropriately''' 101b0b472b0SSatish Balay global petsc_arch 102b0b472b0SSatish Balay 103b0b472b0SSatish Balay if hasattr(framework,'arch'): petsc_arch = framework.arch 104b0b472b0SSatish Balay if hasattr(framework,'logName'): curr_file = framework.logName 105b0b472b0SSatish Balay else: curr_file = 'configure.log' 106b0b472b0SSatish Balay 107b0b472b0SSatish Balay if petsc_arch: 108da1d79b4SSatish Balay import shutil 109da1d79b4SSatish Balay import os 110b0b472b0SSatish Balay 111b0b472b0SSatish Balay # Just in case - confdir is not created 112b0b472b0SSatish Balay conf_dir = os.path.join(petsc_arch,'conf') 113b0b472b0SSatish Balay if not os.path.isdir(petsc_arch): os.mkdir(petsc_arch) 114b0b472b0SSatish Balay if not os.path.isdir(conf_dir): os.mkdir(conf_dir) 115b0b472b0SSatish Balay 116da1d79b4SSatish Balay curr_bkp = curr_file + '.bkp' 117b0b472b0SSatish Balay new_file = os.path.join(conf_dir,curr_file) 118da1d79b4SSatish Balay new_bkp = new_file + '.bkp' 119da1d79b4SSatish Balay 120da1d79b4SSatish Balay # Keep backup in $PETSC_ARCH/conf location 121da1d79b4SSatish Balay if os.path.isfile(new_bkp): os.remove(new_bkp) 122da1d79b4SSatish Balay if os.path.isfile(new_file): os.rename(new_file,new_bkp) 123da58527dSSatish Balay if os.path.isfile(curr_file): shutil.move(curr_file,new_file) 124da58527dSSatish Balay if os.path.isfile(new_file): os.symlink(new_file,curr_file) 125da1d79b4SSatish Balay # If the old bkp is using the same PETSC_ARCH/conf - then update bkp link 126da1d79b4SSatish Balay if os.path.realpath(curr_bkp) == os.path.realpath(new_file): 127da58527dSSatish Balay if os.path.isfile(curr_bkp): os.remove(curr_bkp) 128da58527dSSatish Balay if os.path.isfile(new_bkp): os.symlink(new_bkp,curr_bkp) 129da1d79b4SSatish Balay return 130da1d79b4SSatish Balay 1315d5a5a7bSMatthew Knepleydef petsc_configure(configure_options): 13259e9bfd6SSatish Balay print '=================================================================================' 13359e9bfd6SSatish Balay print ' Configuring PETSc to compile on your system ' 13459e9bfd6SSatish Balay print '=================================================================================' 13559e9bfd6SSatish Balay 136c43ea0feSSatish Balay # Command line arguments take precedence (but don't destroy argv[0]) 137c43ea0feSSatish Balay sys.argv = sys.argv[:1] + configure_options + sys.argv[1:] 13859e9bfd6SSatish Balay # check PETSC_ARCH 13959e9bfd6SSatish Balay check_petsc_arch(sys.argv) 140da58527dSSatish Balay check_broken_configure_log_links() 1415fb2c094SBarry Smith 142c22cdea9SBarry Smith # support a few standard configure option types 143ed6a7445SBarry Smith for l in range(0,len(sys.argv)): 144c22cdea9SBarry Smith name = sys.argv[l] 145637cc2ebSSatish Balay if name.find('enable-') >= 0: 146193cd51eSMatthew Knepley if name.find('=') == -1: 147193cd51eSMatthew Knepley sys.argv[l] = name.replace('enable-','with-')+'=1' 148193cd51eSMatthew Knepley else: 149193cd51eSMatthew Knepley head, tail = name.split('=', 1) 150193cd51eSMatthew Knepley sys.argv[l] = head.replace('enable-','with-')+'='+tail 151637cc2ebSSatish Balay if name.find('disable-') >= 0: 152193cd51eSMatthew Knepley if name.find('=') == -1: 153193cd51eSMatthew Knepley sys.argv[l] = name.replace('disable-','with-')+'=0' 154193cd51eSMatthew Knepley else: 155193cd51eSMatthew Knepley head, tail = name.split('=', 1) 156193cd51eSMatthew Knepley if tail == '1': tail = '0' 157193cd51eSMatthew Knepley sys.argv[l] = head.replace('disable-','with-')+'='+tail 158637cc2ebSSatish Balay if name.find('without-') >= 0: 159193cd51eSMatthew Knepley if name.find('=') == -1: 160193cd51eSMatthew Knepley sys.argv[l] = name.replace('without-','with-')+'=0' 161193cd51eSMatthew Knepley else: 162193cd51eSMatthew Knepley head, tail = name.split('=', 1) 163193cd51eSMatthew Knepley if tail == '1': tail = '0' 164193cd51eSMatthew Knepley sys.argv[l] = head.replace('without-','with-')+'='+tail 165adc3e427SMatthew Knepley 1669dabcff0SSatish Balay # Check for broken cygwin 1671937db7aSSatish Balay chkbrokencygwin() 168d65f3bddSMatthew Knepley # Disable threads on RHL9 1691937db7aSSatish Balay chkrhl9() 17085ef4d1eSSatish Balay # Make sure cygwin-python is used on windows 1711937db7aSSatish Balay chkusingwindowspython() 17285ef4d1eSSatish Balay # Threads don't work for cygwin & python-2.4, 2.5 etc.. 1731937db7aSSatish Balay chkcygwinpythonver() 1749dabcff0SSatish Balay 17587282423SMatthew Knepley # Should be run from the toplevel 176dbca6d9dSSatish Balay configDir = os.path.abspath('config') 177f8833479SBarry Smith bsDir = os.path.join(configDir, 'BuildSystem') 178f8833479SBarry Smith if not os.path.isdir(configDir): 1795d5a5a7bSMatthew Knepley raise RuntimeError('Run configure from $PETSC_DIR, not '+os.path.abspath('.')) 18087282423SMatthew Knepley if not os.path.isdir(bsDir): 181ec1ee742SBarry Smith print '=================================================================================' 182dbca6d9dSSatish Balay print '''++ Could not locate BuildSystem in %s.''' % configDir 183*4564aff7SMatthew Knepley print '''++ Downloading it using "hg clone http://hg.mcs.anl.gov/petsc/BuildSystem %s"''' % bsDir 184ec1ee742SBarry Smith print '=================================================================================' 185*4564aff7SMatthew Knepley (status,output) = commands.getstatusoutput('hg clone http://petsc.cs.iit.edu/petsc/BuildSystem '+ bsDir) 1867d7624c9SBarry Smith if status: 1877d7624c9SBarry Smith if output.find('ommand not found') >= 0: 188ec1ee742SBarry Smith print '=================================================================================' 18959dc5438SMatthew Knepley print '''** Unable to locate hg (Mercurial) to download BuildSystem; make sure hg is in your path''' 190ab21cac3SMatthew Knepley print '''** or manually copy BuildSystem to $PETSC_DIR/config/BuildSystem from a machine where''' 19159dc5438SMatthew Knepley print '''** you do have hg installed and can clone BuildSystem. ''' 192ec1ee742SBarry Smith print '=================================================================================' 1937d7624c9SBarry Smith elif output.find('Cannot resolve host') >= 0: 194ec1ee742SBarry Smith print '=================================================================================' 195d688700cSSatish Balay print '''** Unable to download BuildSystem. You must be off the network.''' 196d688700cSSatish Balay print '''** Connect to the internet and run config/configure.py again.''' 197ec1ee742SBarry Smith print '=================================================================================' 1987d7624c9SBarry Smith else: 199ec1ee742SBarry Smith print '=================================================================================' 200d688700cSSatish Balay print '''** Unable to download BuildSystem. Please send this message to petsc-maint@mcs.anl.gov''' 201ec1ee742SBarry Smith print '=================================================================================' 2027d7624c9SBarry Smith print output 20387282423SMatthew Knepley sys.exit(3) 2044f8a5b45SBarry Smith 20587282423SMatthew Knepley sys.path.insert(0, bsDir) 206f8833479SBarry Smith sys.path.insert(0, configDir) 207e69ef9dfSMatthew Knepley import config.base 2085d5a5a7bSMatthew Knepley import config.framework 209f56be888SMatthew Knepley import cPickle 2104f8a5b45SBarry Smith 2112e22a60eSMatthew Knepley # Disable shared libraries by default 2122e22a60eSMatthew Knepley import nargs 2132e22a60eSMatthew Knepley if nargs.Arg.findArgument('with-shared', sys.argv[1:]) is None: 2142e22a60eSMatthew Knepley sys.argv.append('--with-shared=0') 2152e22a60eSMatthew Knepley 2169dd2fdb1SMatthew Knepley framework = None 2179dd2fdb1SMatthew Knepley try: 2181a784507SMatthew Knepley framework = config.framework.Framework(['--configModules=PETSc.Configure','--optionsModule=PETSc.compilerOptions']+sys.argv[1:], loadArgDB = 0) 219d65f3bddSMatthew Knepley framework.setup() 220d65f3bddSMatthew Knepley framework.logPrint('\n'.join(extraLogs)) 221f24f64feSBarry Smith framework.configure(out = sys.stdout) 222358ebc22SMatthew Knepley framework.storeSubstitutions(framework.argDB) 223f56be888SMatthew Knepley framework.argDB['configureCache'] = cPickle.dumps(framework) 2247cfd0b05SBarry Smith import PETSc.packages 2257cfd0b05SBarry Smith for i in framework.packages: 2267cfd0b05SBarry Smith if hasattr(i,'postProcess'): 2277cfd0b05SBarry Smith i.postProcess() 2287cfd0b05SBarry Smith framework.logClear() 229eefa2c0fSBarry Smith framework.closeLog() 230da1d79b4SSatish Balay move_configure_log(framework) 231dd50d019SBarry Smith return 0 232e69ef9dfSMatthew Knepley except (RuntimeError, config.base.ConfigureSetupError), e: 2337d670a3cSBarry Smith emsg = str(e) 23442351d26SSatish Balay if not emsg.endswith('\n'): emsg = emsg+'\n' 235fe09c992SBarry Smith msg ='*********************************************************************************\n'\ 236fe09c992SBarry Smith +' UNABLE to CONFIGURE with GIVEN OPTIONS (see configure.log for details):\n' \ 237fe09c992SBarry Smith +'---------------------------------------------------------------------------------------\n' \ 2387d670a3cSBarry Smith +emsg+'*********************************************************************************\n' 239e9f3bb17SBarry Smith se = '' 2409dd2fdb1SMatthew Knepley except (TypeError, ValueError), e: 2417d670a3cSBarry Smith emsg = str(e) 24242351d26SSatish Balay if not emsg.endswith('\n'): emsg = emsg+'\n' 243fe09c992SBarry Smith msg ='*********************************************************************************\n'\ 244fe09c992SBarry Smith +' ERROR in COMMAND LINE ARGUMENT to config/configure.py \n' \ 245fe09c992SBarry Smith +'---------------------------------------------------------------------------------------\n' \ 2467d670a3cSBarry Smith +emsg+'*********************************************************************************\n' 2471a02243aSBarry Smith se = '' 24896dc2fe8SMatthew Knepley except ImportError, e : 2497d670a3cSBarry Smith emsg = str(e) 25042351d26SSatish Balay if not emsg.endswith('\n'): emsg = emsg+'\n' 251fe09c992SBarry Smith msg ='*********************************************************************************\n'\ 252fe09c992SBarry Smith +' UNABLE to FIND MODULE for config/configure.py \n' \ 253fe09c992SBarry Smith +'---------------------------------------------------------------------------------------\n' \ 2547d670a3cSBarry Smith +emsg+'*********************************************************************************\n' 25596dc2fe8SMatthew Knepley se = '' 25601def6f0SMatthew Knepley except OSError, e : 25701def6f0SMatthew Knepley emsg = str(e) 25801def6f0SMatthew Knepley if not emsg.endswith('\n'): emsg = emsg+'\n' 25901def6f0SMatthew Knepley msg ='*********************************************************************************\n'\ 26001def6f0SMatthew Knepley +' UNABLE to EXECUTE BINARIES for config/configure.py \n' \ 26101def6f0SMatthew Knepley +'---------------------------------------------------------------------------------------\n' \ 26201def6f0SMatthew Knepley +emsg+'*********************************************************************************\n' 26301def6f0SMatthew Knepley se = '' 264d7d3c4beSMatthew Knepley except SystemExit, e: 265d7d3c4beSMatthew Knepley if e.code is None or e.code == 0: 266d7d3c4beSMatthew Knepley return 267fe09c992SBarry Smith msg ='*********************************************************************************\n'\ 268b1dada7fSMatthew Knepley +' CONFIGURATION FAILURE (Please send configure.log to petsc-maint@mcs.anl.gov)\n' \ 269fe09c992SBarry Smith +'*********************************************************************************\n' 270d7d3c4beSMatthew Knepley se = str(e) 271e9f3bb17SBarry Smith except Exception, e: 272fe09c992SBarry Smith msg ='*********************************************************************************\n'\ 273fe09c992SBarry Smith +' CONFIGURATION CRASH (Please send configure.log to petsc-maint@mcs.anl.gov)\n' \ 274fe09c992SBarry Smith +'*********************************************************************************\n' 275e9f3bb17SBarry Smith se = str(e) 276e9f3bb17SBarry Smith 277e9f3bb17SBarry Smith print msg 2789dd2fdb1SMatthew Knepley if not framework is None: 2799dd2fdb1SMatthew Knepley framework.logClear() 280e9f3bb17SBarry Smith if hasattr(framework, 'log'): 281f6614063SBarry Smith import traceback 282b1dada7fSMatthew Knepley try: 283f24f64feSBarry Smith framework.log.write(msg+se) 284f24f64feSBarry Smith traceback.print_tb(sys.exc_info()[2], file = framework.log) 285da1d79b4SSatish Balay move_configure_log(framework) 286b1dada7fSMatthew Knepley except: 287b1dada7fSMatthew Knepley pass 288e9f3bb17SBarry Smith sys.exit(1) 2895a74f024SMatthew Knepley else: 2905a74f024SMatthew Knepley print se 2915a74f024SMatthew Knepley import traceback 2925a74f024SMatthew Knepley traceback.print_tb(sys.exc_info()[2]) 293da1d79b4SSatish Balay move_configure_log(framework) 2945d5a5a7bSMatthew Knepley 2955d5a5a7bSMatthew Knepleyif __name__ == '__main__': 296a030c540SBarry Smith petsc_configure([]) 297759acf64SBarry Smith 298