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 75d5a5a7bSMatthew Knepley 84b8aa89bSBarry Smith 9378f148eSBarry Smithif not hasattr(sys, 'version_info') or not sys.version_info[1] >= 2 or not sys.version_info[0] >= 2: 10495ffa62SBarry Smith print '**** You must have Python version 2.2 or higher to run config/configure.py ******' 11495ffa62SBarry Smith print '* Python is easy to install for end users or sys-admin. *' 1232077d6dSBarry Smith print '* http://www.python.org/download/ *' 1332077d6dSBarry Smith print '* *' 14495ffa62SBarry Smith print '* You CANNOT configure PETSc without Python *' 15495ffa62SBarry Smith print '* http://www.mcs.anl.gov/petsc/petsc-as/documentation/installation.html *' 1632077d6dSBarry Smith print '*********************************************************************************' 17b26a8723SBarry Smith sys.exit(4) 182fb34ac0SMatthew Knepley 1959e9bfd6SSatish Balaydef check_petsc_arch(opts): 20c43ea0feSSatish Balay # If PETSC_ARCH not specified - use script name (if not configure.py) 21c43ea0feSSatish Balay found = 0 2259e9bfd6SSatish Balay for name in opts: 23c43ea0feSSatish Balay if name.find('PETSC_ARCH=') >= 0: 24c43ea0feSSatish Balay found = 1 2559e9bfd6SSatish Balay break 2659e9bfd6SSatish Balay # If not yet specified - use the filename of script 27c43ea0feSSatish Balay if not found: 2859e9bfd6SSatish Balay filename = os.path.basename(sys.argv[0]) 297eed1879SBarry Smith if not filename.startswith('configure') and not filename.startswith('reconfigure'): 30637cc2ebSSatish Balay useName = 'PETSC_ARCH='+os.path.splitext(os.path.basename(sys.argv[0]))[0] 3159e9bfd6SSatish Balay opts.append(useName) 3259e9bfd6SSatish Balay return 334b8aa89bSBarry Smith 34*85ef4d1eSSatish Balaydef chkbrokencygwin(): 359dabcff0SSatish Balay if os.path.exists('/usr/bin/cygcheck.exe'): 369dabcff0SSatish Balay buf = os.popen('/usr/bin/cygcheck.exe -c cygwin').read() 379dabcff0SSatish Balay if buf.find('1.5.11-1') > -1: 389dabcff0SSatish Balay return 1 399dabcff0SSatish Balay else: 409dabcff0SSatish Balay return 0 419dabcff0SSatish Balay return 0 429dabcff0SSatish Balay 43*85ef4d1eSSatish Balaydef chkusingwindowspython(): 44*85ef4d1eSSatish Balay if os.path.exists('/usr/bin/cygcheck.exe'): 45*85ef4d1eSSatish Balay if sys.platform != 'cygwin': 46*85ef4d1eSSatish Balay return 1 47*85ef4d1eSSatish Balay return 0 48*85ef4d1eSSatish Balay 49*85ef4d1eSSatish Balaydef chkcygwinpythonver(): 5071384062SSatish Balay if os.path.exists('/usr/bin/cygcheck.exe'): 5171384062SSatish Balay buf = os.popen('/usr/bin/cygcheck.exe -c python').read() 52c4b7e894SSatish Balay if (buf.find('2.4') > -1) or (buf.find('2.5') > -1) or (buf.find('2.6') > -1): 5371384062SSatish Balay return 1 5471384062SSatish Balay else: 5571384062SSatish Balay return 0 5671384062SSatish Balay return 0 5771384062SSatish Balay 58836c2c52SSatish Balaydef rhl9(): 59836c2c52SSatish Balay try: 60594eb360SSatish Balay file = open('/etc/redhat-release','r') 61836c2c52SSatish Balay except: 62836c2c52SSatish Balay return 0 63836c2c52SSatish Balay try: 64836c2c52SSatish Balay buf = file.read() 65836c2c52SSatish Balay file.close() 66836c2c52SSatish Balay except: 67836c2c52SSatish Balay # can't read file - assume dangerous RHL9 68836c2c52SSatish Balay return 1 69836c2c52SSatish Balay if buf.find('Shrike') > -1: 70836c2c52SSatish Balay return 1 71836c2c52SSatish Balay else: 72836c2c52SSatish Balay return 0 73836c2c52SSatish Balay 745d5a5a7bSMatthew Knepleydef petsc_configure(configure_options): 7559e9bfd6SSatish Balay print '=================================================================================' 7659e9bfd6SSatish Balay print ' Configuring PETSc to compile on your system ' 7759e9bfd6SSatish Balay print '=================================================================================' 7859e9bfd6SSatish Balay 79c43ea0feSSatish Balay # Command line arguments take precedence (but don't destroy argv[0]) 80c43ea0feSSatish Balay sys.argv = sys.argv[:1] + configure_options + sys.argv[1:] 8159e9bfd6SSatish Balay # check PETSC_ARCH 8259e9bfd6SSatish Balay check_petsc_arch(sys.argv) 83d65f3bddSMatthew Knepley extraLogs = [] 845fb2c094SBarry Smith 85c22cdea9SBarry Smith # support a few standard configure option types 86ed6a7445SBarry Smith for l in range(0,len(sys.argv)): 87c22cdea9SBarry Smith name = sys.argv[l] 88637cc2ebSSatish Balay if name.find('enable-') >= 0: 89637cc2ebSSatish Balay sys.argv[l] = name.replace('enable-','with-') 9042351d26SSatish Balay if name.find('=') == -1: sys.argv[l] = sys.argv[l]+'=1' 91637cc2ebSSatish Balay if name.find('disable-') >= 0: 92637cc2ebSSatish Balay sys.argv[l] = name.replace('disable-','with-') 9342351d26SSatish Balay if name.find('=') == -1: sys.argv[l] = sys.argv[l]+'=0' 94c22cdea9SBarry Smith elif name.endswith('=1'): sys.argv[l].replace('=1','=0') 95637cc2ebSSatish Balay if name.find('without-') >= 0: 96637cc2ebSSatish Balay sys.argv[l] = name.replace('without-','with-') 9742351d26SSatish Balay if name.find('=') == -1: sys.argv[l] = sys.argv[l]+'=0' 98c22cdea9SBarry Smith elif name.endswith('=1'): sys.argv[l].replace('=1','=0') 99c22cdea9SBarry Smith 100adc3e427SMatthew Knepley # Check for sudo 101adc3e427SMatthew Knepley if os.getuid() == 0: 102adc3e427SMatthew Knepley print '=================================================================================' 103adc3e427SMatthew Knepley print ' *** Do not run configure as root, or using sudo. ***' 10467e28bfeSBarry Smith print ' *** Use the --with-sudo=sudo option to have ***' 10567e28bfeSBarry Smith print ' *** installs of external packages done with sudo ***' 10667e28bfeSBarry Smith print ' *** use only with --prefix= when installing in ***' 10767e28bfeSBarry Smith print ' *** system directories ***' 108adc3e427SMatthew Knepley print '=================================================================================' 109adc3e427SMatthew Knepley sys.exit(3) 110adc3e427SMatthew Knepley 1119dabcff0SSatish Balay # Check for broken cygwin 112*85ef4d1eSSatish Balay if chkbrokencygwin(): 113ec1ee742SBarry Smith print '=================================================================================' 1147d670a3cSBarry Smith print ' *** cygwin-1.5.11-1 detected. config/configure.py fails with this version ***' 1151e42869aSSatish Balay print ' *** Please upgrade to cygwin-1.5.12-1 or newer version. This can ***' 1161e42869aSSatish Balay print ' *** be done by running cygwin-setup, selecting "next" all the way.***' 117ec1ee742SBarry Smith print '=================================================================================' 1189dabcff0SSatish Balay sys.exit(3) 119d65f3bddSMatthew Knepley 120d65f3bddSMatthew Knepley # Disable threads on RHL9 121d65f3bddSMatthew Knepley if rhl9(): 122d65f3bddSMatthew Knepley sys.argv.append('--useThreads=0') 123d65f3bddSMatthew Knepley extraLogs.append('''\ 124d65f3bddSMatthew Knepley================================================================================ 125d65f3bddSMatthew Knepley *** RHL9 detected. Threads do not work correctly with this distribution *** 126d65f3bddSMatthew Knepley ****** Disabling thread usage for this run of config/configure.py ******* 127d65f3bddSMatthew Knepley================================================================================''') 128*85ef4d1eSSatish Balay # Make sure cygwin-python is used on windows 129*85ef4d1eSSatish Balay if chkusingwindowspython(): 130*85ef4d1eSSatish Balay print '=================================================================================' 131*85ef4d1eSSatish Balay print ' *** Non-cygwin python detected. Please rerun config/configure.py with cygwin-python ***' 132*85ef4d1eSSatish Balay print '=================================================================================' 133*85ef4d1eSSatish Balay sys.exit(3) 134d65f3bddSMatthew Knepley 135*85ef4d1eSSatish Balay # Threads don't work for cygwin & python-2.4, 2.5 etc.. 136*85ef4d1eSSatish Balay if chkcygwinpythonver(): 13771384062SSatish Balay sys.argv.append('--useThreads=0') 138d65f3bddSMatthew Knepley extraLogs.append('''\ 139d65f3bddSMatthew Knepley================================================================================ 140*85ef4d1eSSatish Balay** Cygwin-python-2.4/2.5 detected. Threads do not work correctly with this version * 141d65f3bddSMatthew Knepley ********* Disabling thread usage for this run of config/configure.py ********** 142d65f3bddSMatthew Knepley================================================================================''') 1439dabcff0SSatish Balay 14487282423SMatthew Knepley # Should be run from the toplevel 1455d5a5a7bSMatthew Knepley pythonDir = os.path.abspath(os.path.join('python')) 14687282423SMatthew Knepley bsDir = os.path.join(pythonDir, 'BuildSystem') 14787282423SMatthew Knepley if not os.path.isdir(pythonDir): 1485d5a5a7bSMatthew Knepley raise RuntimeError('Run configure from $PETSC_DIR, not '+os.path.abspath('.')) 14987282423SMatthew Knepley if not os.path.isdir(bsDir): 150ec1ee742SBarry Smith print '=================================================================================' 1519c4310d5SMatthew Knepley print '''++ Could not locate BuildSystem in %s/python.''' % os.getcwd() 152ec1ef0a0SSatish Balay print '''++ Downloading it using "hg clone http://hg.mcs.anl.gov/petsc/BuildSystem %s/python/BuildSystem"''' % os.getcwd() 153ec1ee742SBarry Smith print '=================================================================================' 154ec1ef0a0SSatish Balay (status,output) = commands.getstatusoutput('hg clone http://hg.mcs.anl.gov/petsc/BuildSystem python/BuildSystem') 1557d7624c9SBarry Smith if status: 1567d7624c9SBarry Smith if output.find('ommand not found') >= 0: 157ec1ee742SBarry Smith print '=================================================================================' 15859dc5438SMatthew Knepley print '''** Unable to locate hg (Mercurial) to download BuildSystem; make sure hg is in your path''' 159d688700cSSatish Balay print '''** or manually copy BuildSystem to $PETSC_DIR/python/BuildSystem from a machine where''' 16059dc5438SMatthew Knepley print '''** you do have hg installed and can clone BuildSystem. ''' 161ec1ee742SBarry Smith print '=================================================================================' 1627d7624c9SBarry Smith elif output.find('Cannot resolve host') >= 0: 163ec1ee742SBarry Smith print '=================================================================================' 164d688700cSSatish Balay print '''** Unable to download BuildSystem. You must be off the network.''' 165d688700cSSatish Balay print '''** Connect to the internet and run config/configure.py again.''' 166ec1ee742SBarry Smith print '=================================================================================' 1677d7624c9SBarry Smith else: 168ec1ee742SBarry Smith print '=================================================================================' 169d688700cSSatish Balay print '''** Unable to download BuildSystem. Please send this message to petsc-maint@mcs.anl.gov''' 170ec1ee742SBarry Smith print '=================================================================================' 1717d7624c9SBarry Smith print output 17287282423SMatthew Knepley sys.exit(3) 1734f8a5b45SBarry Smith 17487282423SMatthew Knepley sys.path.insert(0, bsDir) 1755d5a5a7bSMatthew Knepley sys.path.insert(0, pythonDir) 176e69ef9dfSMatthew Knepley import config.base 1775d5a5a7bSMatthew Knepley import config.framework 178f56be888SMatthew Knepley import cPickle 1794f8a5b45SBarry Smith 1802e22a60eSMatthew Knepley # Disable shared libraries by default 1812e22a60eSMatthew Knepley import nargs 1822e22a60eSMatthew Knepley if nargs.Arg.findArgument('with-shared', sys.argv[1:]) is None: 1832e22a60eSMatthew Knepley sys.argv.append('--with-shared=0') 1842e22a60eSMatthew Knepley 1859dd2fdb1SMatthew Knepley framework = None 1869dd2fdb1SMatthew Knepley try: 187637cc2ebSSatish Balay framework = config.framework.Framework(sys.argv[1:]+['--configModules=PETSc.Configure','--optionsModule=PETSc.compilerOptions'], loadArgDB = 0) 188d65f3bddSMatthew Knepley framework.setup() 189d65f3bddSMatthew Knepley framework.logPrint('\n'.join(extraLogs)) 190f24f64feSBarry Smith framework.configure(out = sys.stdout) 191358ebc22SMatthew Knepley framework.storeSubstitutions(framework.argDB) 192f56be888SMatthew Knepley framework.argDB['configureCache'] = cPickle.dumps(framework) 1937cfd0b05SBarry Smith import PETSc.packages 1947cfd0b05SBarry Smith for i in framework.packages: 1957cfd0b05SBarry Smith if hasattr(i,'postProcess'): 1967cfd0b05SBarry Smith i.postProcess() 1977cfd0b05SBarry Smith framework.logClear() 198dd50d019SBarry Smith return 0 199e69ef9dfSMatthew Knepley except (RuntimeError, config.base.ConfigureSetupError), e: 2007d670a3cSBarry Smith emsg = str(e) 20142351d26SSatish Balay if not emsg.endswith('\n'): emsg = emsg+'\n' 202fe09c992SBarry Smith msg ='*********************************************************************************\n'\ 203fe09c992SBarry Smith +' UNABLE to CONFIGURE with GIVEN OPTIONS (see configure.log for details):\n' \ 204fe09c992SBarry Smith +'---------------------------------------------------------------------------------------\n' \ 2057d670a3cSBarry Smith +emsg+'*********************************************************************************\n' 206e9f3bb17SBarry Smith se = '' 2079dd2fdb1SMatthew Knepley except (TypeError, ValueError), e: 2087d670a3cSBarry Smith emsg = str(e) 20942351d26SSatish Balay if not emsg.endswith('\n'): emsg = emsg+'\n' 210fe09c992SBarry Smith msg ='*********************************************************************************\n'\ 211fe09c992SBarry Smith +' ERROR in COMMAND LINE ARGUMENT to config/configure.py \n' \ 212fe09c992SBarry Smith +'---------------------------------------------------------------------------------------\n' \ 2137d670a3cSBarry Smith +emsg+'*********************************************************************************\n' 2141a02243aSBarry Smith se = '' 21596dc2fe8SMatthew Knepley except ImportError, e : 2167d670a3cSBarry Smith emsg = str(e) 21742351d26SSatish Balay if not emsg.endswith('\n'): emsg = emsg+'\n' 218fe09c992SBarry Smith msg ='*********************************************************************************\n'\ 219fe09c992SBarry Smith +' UNABLE to FIND MODULE for config/configure.py \n' \ 220fe09c992SBarry Smith +'---------------------------------------------------------------------------------------\n' \ 2217d670a3cSBarry Smith +emsg+'*********************************************************************************\n' 22296dc2fe8SMatthew Knepley se = '' 22301def6f0SMatthew Knepley except OSError, e : 22401def6f0SMatthew Knepley emsg = str(e) 22501def6f0SMatthew Knepley if not emsg.endswith('\n'): emsg = emsg+'\n' 22601def6f0SMatthew Knepley msg ='*********************************************************************************\n'\ 22701def6f0SMatthew Knepley +' UNABLE to EXECUTE BINARIES for config/configure.py \n' \ 22801def6f0SMatthew Knepley +'---------------------------------------------------------------------------------------\n' \ 22901def6f0SMatthew Knepley +emsg+'*********************************************************************************\n' 23001def6f0SMatthew Knepley se = '' 231d7d3c4beSMatthew Knepley except SystemExit, e: 232d7d3c4beSMatthew Knepley if e.code is None or e.code == 0: 233d7d3c4beSMatthew Knepley return 234fe09c992SBarry Smith msg ='*********************************************************************************\n'\ 235fe09c992SBarry Smith +' CONFIGURATION CRASH (Please send configure.log to petsc-maint@mcs.anl.gov)\n' \ 236fe09c992SBarry Smith +'*********************************************************************************\n' 237d7d3c4beSMatthew Knepley se = str(e) 238e9f3bb17SBarry Smith except Exception, e: 239fe09c992SBarry Smith msg ='*********************************************************************************\n'\ 240fe09c992SBarry Smith +' CONFIGURATION CRASH (Please send configure.log to petsc-maint@mcs.anl.gov)\n' \ 241fe09c992SBarry Smith +'*********************************************************************************\n' 242e9f3bb17SBarry Smith se = str(e) 243e9f3bb17SBarry Smith 244e9f3bb17SBarry Smith print msg 2459dd2fdb1SMatthew Knepley if not framework is None: 2469dd2fdb1SMatthew Knepley framework.logClear() 247e9f3bb17SBarry Smith if hasattr(framework, 'log'): 248f6614063SBarry Smith import traceback 249f24f64feSBarry Smith framework.log.write(msg+se) 250f24f64feSBarry Smith traceback.print_tb(sys.exc_info()[2], file = framework.log) 2512418bae5SMatthew Knepley if os.path.isfile(framework.logName+'.bkp'): 2525a74f024SMatthew Knepley if framework.debugIndent is None: 2535a74f024SMatthew Knepley framework.debugIndent = ' ' 2542418bae5SMatthew Knepley framework.logPrintDivider() 2552418bae5SMatthew Knepley framework.logPrintBox('Previous configure logs below', debugSection = None) 2562418bae5SMatthew Knepley f = file(framework.logName+'.bkp') 2572418bae5SMatthew Knepley framework.log.write(f.read()) 2582418bae5SMatthew Knepley f.close() 259e9f3bb17SBarry Smith sys.exit(1) 2605a74f024SMatthew Knepley else: 2615a74f024SMatthew Knepley print se 2625a74f024SMatthew Knepley import traceback 2635a74f024SMatthew Knepley traceback.print_tb(sys.exc_info()[2]) 2645d5a5a7bSMatthew Knepley 2655d5a5a7bSMatthew Knepleyif __name__ == '__main__': 266a030c540SBarry Smith petsc_configure([]) 267759acf64SBarry Smith 268