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 10378f148eSBarry Smithif not hasattr(sys, 'version_info') or not sys.version_info[1] >= 2 or not sys.version_info[0] >= 2: 11495ffa62SBarry Smith print '**** You must have Python version 2.2 or higher to run config/configure.py ******' 12495ffa62SBarry Smith print '* Python is easy to install for end users or sys-admin. *' 1332077d6dSBarry Smith print '* http://www.python.org/download/ *' 1432077d6dSBarry Smith print '* *' 15495ffa62SBarry Smith print '* You CANNOT configure PETSc without Python *' 16495ffa62SBarry Smith print '* http://www.mcs.anl.gov/petsc/petsc-as/documentation/installation.html *' 1732077d6dSBarry Smith print '*********************************************************************************' 18b26a8723SBarry Smith sys.exit(4) 192fb34ac0SMatthew Knepley 2059e9bfd6SSatish Balaydef check_petsc_arch(opts): 21c43ea0feSSatish Balay # If PETSC_ARCH not specified - use script name (if not configure.py) 22b0b472b0SSatish Balay global petsc_arch 23c43ea0feSSatish Balay found = 0 2459e9bfd6SSatish Balay for name in opts: 25c43ea0feSSatish Balay if name.find('PETSC_ARCH=') >= 0: 26b0b472b0SSatish Balay petsc_arch=name.split('=')[1] 27c43ea0feSSatish Balay found = 1 2859e9bfd6SSatish Balay break 2959e9bfd6SSatish Balay # If not yet specified - use the filename of script 30c43ea0feSSatish Balay if not found: 3159e9bfd6SSatish Balay filename = os.path.basename(sys.argv[0]) 327eed1879SBarry Smith if not filename.startswith('configure') and not filename.startswith('reconfigure'): 33b0b472b0SSatish Balay petsc_arch=os.path.splitext(os.path.basename(sys.argv[0]))[0] 34b0b472b0SSatish Balay useName = 'PETSC_ARCH='+petsc_arch 3559e9bfd6SSatish Balay opts.append(useName) 361937db7aSSatish Balay return 0 374b8aa89bSBarry Smith 3885ef4d1eSSatish Balaydef chkbrokencygwin(): 399dabcff0SSatish Balay if os.path.exists('/usr/bin/cygcheck.exe'): 409dabcff0SSatish Balay buf = os.popen('/usr/bin/cygcheck.exe -c cygwin').read() 419dabcff0SSatish Balay if buf.find('1.5.11-1') > -1: 421937db7aSSatish Balay print '=================================================================================' 431937db7aSSatish Balay print ' *** cygwin-1.5.11-1 detected. config/configure.py fails with this version ***' 441937db7aSSatish Balay print ' *** Please upgrade to cygwin-1.5.12-1 or newer version. This can ***' 451937db7aSSatish Balay print ' *** be done by running cygwin-setup, selecting "next" all the way.***' 461937db7aSSatish Balay print '=================================================================================' 471937db7aSSatish Balay sys.exit(3) 489dabcff0SSatish Balay return 0 499dabcff0SSatish Balay 5085ef4d1eSSatish Balaydef chkusingwindowspython(): 511937db7aSSatish Balay if os.path.exists('/usr/bin/cygcheck.exe') and sys.platform != 'cygwin': 521937db7aSSatish Balay print '=================================================================================' 531937db7aSSatish Balay print ' *** Non-cygwin python detected. Please rerun config/configure.py with cygwin-python ***' 541937db7aSSatish Balay print '=================================================================================' 551937db7aSSatish Balay sys.exit(3) 5685ef4d1eSSatish Balay return 0 5785ef4d1eSSatish Balay 5885ef4d1eSSatish Balaydef chkcygwinpythonver(): 5971384062SSatish Balay if os.path.exists('/usr/bin/cygcheck.exe'): 6071384062SSatish Balay buf = os.popen('/usr/bin/cygcheck.exe -c python').read() 61c4b7e894SSatish Balay if (buf.find('2.4') > -1) or (buf.find('2.5') > -1) or (buf.find('2.6') > -1): 621937db7aSSatish Balay sys.argv.append('--useThreads=0') 631937db7aSSatish Balay extraLogs.append('''\ 641937db7aSSatish Balay================================================================================ 651937db7aSSatish Balay** Cygwin-python-2.4/2.5 detected. Threads do not work correctly with this version * 661937db7aSSatish Balay ********* Disabling thread usage for this run of config/configure.py ********** 671937db7aSSatish Balay================================================================================''') 6871384062SSatish Balay return 0 6971384062SSatish Balay 701937db7aSSatish Balaydef chkrhl9(): 711937db7aSSatish Balay if os.path.exists('/etc/redhat-release'): 72836c2c52SSatish Balay try: 73594eb360SSatish Balay file = open('/etc/redhat-release','r') 74836c2c52SSatish Balay buf = file.read() 75836c2c52SSatish Balay file.close() 76836c2c52SSatish Balay except: 77836c2c52SSatish Balay # can't read file - assume dangerous RHL9 781937db7aSSatish Balay buf = 'Shrike' 79836c2c52SSatish Balay if buf.find('Shrike') > -1: 801937db7aSSatish Balay sys.argv.append('--useThreads=0') 811937db7aSSatish Balay extraLogs.append('''\ 821937db7aSSatish Balay================================================================================ 831937db7aSSatish Balay *** RHL9 detected. Threads do not work correctly with this distribution *** 841937db7aSSatish Balay ****** Disabling thread usage for this run of config/configure.py ******* 851937db7aSSatish Balay================================================================================''') 86836c2c52SSatish Balay return 0 87836c2c52SSatish Balay 88*da58527dSSatish Balaydef check_broken_configure_log_links(): 89*da58527dSSatish Balay '''Sometime symlinks can get broken if the original files are deleted. Delete such broken links''' 90*da58527dSSatish Balay import os 91*da58527dSSatish Balay for logfile in ['configure.log','configure.log.bkp']: 92*da58527dSSatish Balay if os.path.islink(logfile) and not os.path.isfile(logfile): os.remove(logfile) 93*da58527dSSatish Balay return 94*da58527dSSatish Balay 95da1d79b4SSatish Balaydef move_configure_log(framework): 96da1d79b4SSatish Balay '''Move configure.log to PETSC_ARCH/conf - and update configure.log.bkp in both locations appropriately''' 97b0b472b0SSatish Balay global petsc_arch 98b0b472b0SSatish Balay 99b0b472b0SSatish Balay if hasattr(framework,'arch'): petsc_arch = framework.arch 100b0b472b0SSatish Balay if hasattr(framework,'logName'): curr_file = framework.logName 101b0b472b0SSatish Balay else: curr_file = 'configure.log' 102b0b472b0SSatish Balay 103b0b472b0SSatish Balay if petsc_arch: 104da1d79b4SSatish Balay import shutil 105da1d79b4SSatish Balay import os 106b0b472b0SSatish Balay 107b0b472b0SSatish Balay # Just in case - confdir is not created 108b0b472b0SSatish Balay conf_dir = os.path.join(petsc_arch,'conf') 109b0b472b0SSatish Balay if not os.path.isdir(petsc_arch): os.mkdir(petsc_arch) 110b0b472b0SSatish Balay if not os.path.isdir(conf_dir): os.mkdir(conf_dir) 111b0b472b0SSatish Balay 112da1d79b4SSatish Balay curr_bkp = curr_file + '.bkp' 113b0b472b0SSatish Balay new_file = os.path.join(conf_dir,curr_file) 114da1d79b4SSatish Balay new_bkp = new_file + '.bkp' 115da1d79b4SSatish Balay 116da1d79b4SSatish Balay # Keep backup in $PETSC_ARCH/conf location 117da1d79b4SSatish Balay if os.path.isfile(new_bkp): os.remove(new_bkp) 118da1d79b4SSatish Balay if os.path.isfile(new_file): os.rename(new_file,new_bkp) 119*da58527dSSatish Balay if os.path.isfile(curr_file): shutil.move(curr_file,new_file) 120*da58527dSSatish Balay if os.path.isfile(new_file): os.symlink(new_file,curr_file) 121da1d79b4SSatish Balay # If the old bkp is using the same PETSC_ARCH/conf - then update bkp link 122da1d79b4SSatish Balay if os.path.realpath(curr_bkp) == os.path.realpath(new_file): 123*da58527dSSatish Balay if os.path.isfile(curr_bkp): os.remove(curr_bkp) 124*da58527dSSatish Balay if os.path.isfile(new_bkp): os.symlink(new_bkp,curr_bkp) 125da1d79b4SSatish Balay return 126da1d79b4SSatish Balay 1275d5a5a7bSMatthew Knepleydef petsc_configure(configure_options): 12859e9bfd6SSatish Balay print '=================================================================================' 12959e9bfd6SSatish Balay print ' Configuring PETSc to compile on your system ' 13059e9bfd6SSatish Balay print '=================================================================================' 13159e9bfd6SSatish Balay 132c43ea0feSSatish Balay # Command line arguments take precedence (but don't destroy argv[0]) 133c43ea0feSSatish Balay sys.argv = sys.argv[:1] + configure_options + sys.argv[1:] 13459e9bfd6SSatish Balay # check PETSC_ARCH 13559e9bfd6SSatish Balay check_petsc_arch(sys.argv) 136*da58527dSSatish Balay check_broken_configure_log_links() 1375fb2c094SBarry Smith 138c22cdea9SBarry Smith # support a few standard configure option types 139ed6a7445SBarry Smith for l in range(0,len(sys.argv)): 140c22cdea9SBarry Smith name = sys.argv[l] 141637cc2ebSSatish Balay if name.find('enable-') >= 0: 142193cd51eSMatthew Knepley if name.find('=') == -1: 143193cd51eSMatthew Knepley sys.argv[l] = name.replace('enable-','with-')+'=1' 144193cd51eSMatthew Knepley else: 145193cd51eSMatthew Knepley head, tail = name.split('=', 1) 146193cd51eSMatthew Knepley sys.argv[l] = head.replace('enable-','with-')+'='+tail 147637cc2ebSSatish Balay if name.find('disable-') >= 0: 148193cd51eSMatthew Knepley if name.find('=') == -1: 149193cd51eSMatthew Knepley sys.argv[l] = name.replace('disable-','with-')+'=0' 150193cd51eSMatthew Knepley else: 151193cd51eSMatthew Knepley head, tail = name.split('=', 1) 152193cd51eSMatthew Knepley if tail == '1': tail = '0' 153193cd51eSMatthew Knepley sys.argv[l] = head.replace('disable-','with-')+'='+tail 154637cc2ebSSatish Balay if name.find('without-') >= 0: 155193cd51eSMatthew Knepley if name.find('=') == -1: 156193cd51eSMatthew Knepley sys.argv[l] = name.replace('without-','with-')+'=0' 157193cd51eSMatthew Knepley else: 158193cd51eSMatthew Knepley head, tail = name.split('=', 1) 159193cd51eSMatthew Knepley if tail == '1': tail = '0' 160193cd51eSMatthew Knepley sys.argv[l] = head.replace('without-','with-')+'='+tail 161adc3e427SMatthew Knepley 1629dabcff0SSatish Balay # Check for broken cygwin 1631937db7aSSatish Balay chkbrokencygwin() 164d65f3bddSMatthew Knepley # Disable threads on RHL9 1651937db7aSSatish Balay chkrhl9() 16685ef4d1eSSatish Balay # Make sure cygwin-python is used on windows 1671937db7aSSatish Balay chkusingwindowspython() 16885ef4d1eSSatish Balay # Threads don't work for cygwin & python-2.4, 2.5 etc.. 1691937db7aSSatish Balay chkcygwinpythonver() 1709dabcff0SSatish Balay 17187282423SMatthew Knepley # Should be run from the toplevel 172dbca6d9dSSatish Balay configDir = os.path.abspath('config') 173f8833479SBarry Smith bsDir = os.path.join(configDir, 'BuildSystem') 174f8833479SBarry Smith if not os.path.isdir(configDir): 1755d5a5a7bSMatthew Knepley raise RuntimeError('Run configure from $PETSC_DIR, not '+os.path.abspath('.')) 17687282423SMatthew Knepley if not os.path.isdir(bsDir): 177ec1ee742SBarry Smith print '=================================================================================' 178dbca6d9dSSatish Balay print '''++ Could not locate BuildSystem in %s.''' % configDir 179dbca6d9dSSatish Balay print '''++ Downloading it using "hg clone http://hg.mcs.anl.gov/petsc/BuildSystem %s"''' % bsDir 180ec1ee742SBarry Smith print '=================================================================================' 181dbca6d9dSSatish Balay (status,output) = commands.getstatusoutput('hg clone http://petsc.cs.iit.edu/petsc/BuildSystem '+ bsDir) 1827d7624c9SBarry Smith if status: 1837d7624c9SBarry Smith if output.find('ommand not found') >= 0: 184ec1ee742SBarry Smith print '=================================================================================' 18559dc5438SMatthew Knepley print '''** Unable to locate hg (Mercurial) to download BuildSystem; make sure hg is in your path''' 186ab21cac3SMatthew Knepley print '''** or manually copy BuildSystem to $PETSC_DIR/config/BuildSystem from a machine where''' 18759dc5438SMatthew Knepley print '''** you do have hg installed and can clone BuildSystem. ''' 188ec1ee742SBarry Smith print '=================================================================================' 1897d7624c9SBarry Smith elif output.find('Cannot resolve host') >= 0: 190ec1ee742SBarry Smith print '=================================================================================' 191d688700cSSatish Balay print '''** Unable to download BuildSystem. You must be off the network.''' 192d688700cSSatish Balay print '''** Connect to the internet and run config/configure.py again.''' 193ec1ee742SBarry Smith print '=================================================================================' 1947d7624c9SBarry Smith else: 195ec1ee742SBarry Smith print '=================================================================================' 196d688700cSSatish Balay print '''** Unable to download BuildSystem. Please send this message to petsc-maint@mcs.anl.gov''' 197ec1ee742SBarry Smith print '=================================================================================' 1987d7624c9SBarry Smith print output 19987282423SMatthew Knepley sys.exit(3) 2004f8a5b45SBarry Smith 20187282423SMatthew Knepley sys.path.insert(0, bsDir) 202f8833479SBarry Smith sys.path.insert(0, configDir) 203e69ef9dfSMatthew Knepley import config.base 2045d5a5a7bSMatthew Knepley import config.framework 205f56be888SMatthew Knepley import cPickle 2064f8a5b45SBarry Smith 2072e22a60eSMatthew Knepley # Disable shared libraries by default 2082e22a60eSMatthew Knepley import nargs 2092e22a60eSMatthew Knepley if nargs.Arg.findArgument('with-shared', sys.argv[1:]) is None: 2102e22a60eSMatthew Knepley sys.argv.append('--with-shared=0') 2112e22a60eSMatthew Knepley 2129dd2fdb1SMatthew Knepley framework = None 2139dd2fdb1SMatthew Knepley try: 2141a784507SMatthew Knepley framework = config.framework.Framework(['--configModules=PETSc.Configure','--optionsModule=PETSc.compilerOptions']+sys.argv[1:], loadArgDB = 0) 215d65f3bddSMatthew Knepley framework.setup() 216d65f3bddSMatthew Knepley framework.logPrint('\n'.join(extraLogs)) 217f24f64feSBarry Smith framework.configure(out = sys.stdout) 218358ebc22SMatthew Knepley framework.storeSubstitutions(framework.argDB) 219f56be888SMatthew Knepley framework.argDB['configureCache'] = cPickle.dumps(framework) 2207cfd0b05SBarry Smith import PETSc.packages 2217cfd0b05SBarry Smith for i in framework.packages: 2227cfd0b05SBarry Smith if hasattr(i,'postProcess'): 2237cfd0b05SBarry Smith i.postProcess() 2247cfd0b05SBarry Smith framework.logClear() 225eefa2c0fSBarry Smith framework.closeLog() 226da1d79b4SSatish Balay move_configure_log(framework) 227dd50d019SBarry Smith return 0 228e69ef9dfSMatthew Knepley except (RuntimeError, config.base.ConfigureSetupError), e: 2297d670a3cSBarry Smith emsg = str(e) 23042351d26SSatish Balay if not emsg.endswith('\n'): emsg = emsg+'\n' 231fe09c992SBarry Smith msg ='*********************************************************************************\n'\ 232fe09c992SBarry Smith +' UNABLE to CONFIGURE with GIVEN OPTIONS (see configure.log for details):\n' \ 233fe09c992SBarry Smith +'---------------------------------------------------------------------------------------\n' \ 2347d670a3cSBarry Smith +emsg+'*********************************************************************************\n' 235e9f3bb17SBarry Smith se = '' 2369dd2fdb1SMatthew Knepley except (TypeError, ValueError), e: 2377d670a3cSBarry Smith emsg = str(e) 23842351d26SSatish Balay if not emsg.endswith('\n'): emsg = emsg+'\n' 239fe09c992SBarry Smith msg ='*********************************************************************************\n'\ 240fe09c992SBarry Smith +' ERROR in COMMAND LINE ARGUMENT to config/configure.py \n' \ 241fe09c992SBarry Smith +'---------------------------------------------------------------------------------------\n' \ 2427d670a3cSBarry Smith +emsg+'*********************************************************************************\n' 2431a02243aSBarry Smith se = '' 24496dc2fe8SMatthew Knepley except ImportError, e : 2457d670a3cSBarry Smith emsg = str(e) 24642351d26SSatish Balay if not emsg.endswith('\n'): emsg = emsg+'\n' 247fe09c992SBarry Smith msg ='*********************************************************************************\n'\ 248fe09c992SBarry Smith +' UNABLE to FIND MODULE for config/configure.py \n' \ 249fe09c992SBarry Smith +'---------------------------------------------------------------------------------------\n' \ 2507d670a3cSBarry Smith +emsg+'*********************************************************************************\n' 25196dc2fe8SMatthew Knepley se = '' 25201def6f0SMatthew Knepley except OSError, e : 25301def6f0SMatthew Knepley emsg = str(e) 25401def6f0SMatthew Knepley if not emsg.endswith('\n'): emsg = emsg+'\n' 25501def6f0SMatthew Knepley msg ='*********************************************************************************\n'\ 25601def6f0SMatthew Knepley +' UNABLE to EXECUTE BINARIES for config/configure.py \n' \ 25701def6f0SMatthew Knepley +'---------------------------------------------------------------------------------------\n' \ 25801def6f0SMatthew Knepley +emsg+'*********************************************************************************\n' 25901def6f0SMatthew Knepley se = '' 260d7d3c4beSMatthew Knepley except SystemExit, e: 261d7d3c4beSMatthew Knepley if e.code is None or e.code == 0: 262d7d3c4beSMatthew Knepley return 263fe09c992SBarry Smith msg ='*********************************************************************************\n'\ 264fe09c992SBarry Smith +' CONFIGURATION CRASH (Please send configure.log to petsc-maint@mcs.anl.gov)\n' \ 265fe09c992SBarry Smith +'*********************************************************************************\n' 266d7d3c4beSMatthew Knepley se = str(e) 267e9f3bb17SBarry Smith except Exception, e: 268fe09c992SBarry Smith msg ='*********************************************************************************\n'\ 269fe09c992SBarry Smith +' CONFIGURATION CRASH (Please send configure.log to petsc-maint@mcs.anl.gov)\n' \ 270fe09c992SBarry Smith +'*********************************************************************************\n' 271e9f3bb17SBarry Smith se = str(e) 272e9f3bb17SBarry Smith 273e9f3bb17SBarry Smith print msg 2749dd2fdb1SMatthew Knepley if not framework is None: 2759dd2fdb1SMatthew Knepley framework.logClear() 276e9f3bb17SBarry Smith if hasattr(framework, 'log'): 277f6614063SBarry Smith import traceback 278f24f64feSBarry Smith framework.log.write(msg+se) 279f24f64feSBarry Smith traceback.print_tb(sys.exc_info()[2], file = framework.log) 280da1d79b4SSatish Balay move_configure_log(framework) 281e9f3bb17SBarry Smith sys.exit(1) 2825a74f024SMatthew Knepley else: 2835a74f024SMatthew Knepley print se 2845a74f024SMatthew Knepley import traceback 2855a74f024SMatthew Knepley traceback.print_tb(sys.exc_info()[2]) 286da1d79b4SSatish Balay move_configure_log(framework) 2875d5a5a7bSMatthew Knepley 2885d5a5a7bSMatthew Knepleyif __name__ == '__main__': 289a030c540SBarry Smith petsc_configure([]) 290759acf64SBarry Smith 291